3 import java.awt.AWTException;
\r
4 import java.awt.BorderLayout;
\r
5 import java.awt.Color;
\r
6 import java.awt.Component;
\r
7 import java.awt.Cursor;
\r
8 import java.awt.Dimension;
\r
9 import java.awt.Point;
\r
10 import java.awt.Rectangle;
\r
11 import java.awt.Robot;
\r
12 import java.awt.event.ComponentAdapter;
\r
13 import java.awt.event.ComponentEvent;
\r
14 import java.awt.event.ComponentListener;
\r
15 import java.awt.event.MouseAdapter;
\r
16 import java.awt.event.MouseEvent;
\r
17 import java.awt.event.MouseListener;
\r
18 import java.io.File;
\r
19 import java.util.ArrayList;
\r
20 import java.util.Calendar;
\r
21 import java.util.GregorianCalendar;
\r
22 import java.util.regex.Matcher;
\r
23 import java.util.regex.Pattern;
\r
25 import javax.swing.JComponent;
\r
26 import javax.swing.JLabel;
\r
27 import javax.swing.JLayeredPane;
\r
28 import javax.swing.JPanel;
\r
29 import javax.swing.JScrollPane;
\r
30 import javax.swing.JSplitPane;
\r
31 import javax.swing.JTree;
\r
32 import javax.swing.JViewport;
\r
33 import javax.swing.SpringLayout;
\r
34 import javax.swing.border.LineBorder;
\r
35 import javax.swing.event.MouseInputListener;
\r
36 import javax.swing.event.TreeExpansionEvent;
\r
37 import javax.swing.event.TreeExpansionListener;
\r
38 import javax.swing.event.TreeSelectionEvent;
\r
39 import javax.swing.event.TreeSelectionListener;
\r
40 import javax.swing.tree.DefaultMutableTreeNode;
\r
41 import javax.swing.tree.TreeNode;
\r
42 import javax.swing.tree.TreePath;
\r
43 import javax.swing.tree.TreeSelectionModel;
\r
44 import javax.swing.tree.DefaultTreeModel;
\r
46 import tainavi.TVProgram.ProgSubtype;
\r
47 import tainavi.TVProgram.ProgType;
\r
48 import tainavi.TVProgramIterator.IterationType;
\r
49 import tainavi.VWMainWindow.MWinTab;
\r
54 * @since 3.15.4β {@link Viewer}から分離
\r
56 public abstract class AbsPaperView extends JPanel implements TickTimerListener,HDDRecorderListener {
\r
58 private static final long serialVersionUID = 1L;
\r
60 public static String getViewName() { return "新聞形式"; }
\r
62 public void setDebug(boolean b) { debug = b; }
\r
63 private static boolean debug = false;
\r
66 /*******************************************************************************
\r
68 ******************************************************************************/
\r
70 protected abstract Env getEnv();
\r
71 protected abstract Bounds getBoundsEnv();
\r
72 protected abstract PaperColorsMap getPaperColorMap();
\r
73 protected abstract ChannelSort getChannelSort();
\r
75 protected abstract TVProgramList getTVProgramList();
\r
76 protected abstract HDDRecorderList getRecorderList();
\r
78 protected abstract StatusWindow getStWin();
\r
79 protected abstract StatusTextArea getMWin();
\r
81 protected abstract AbsReserveDialog getReserveDialog();
\r
82 protected abstract Component getParentComponent();
\r
84 protected abstract void ringBeep();
\r
86 // クラス内のイベントから呼び出されるもの
\r
91 protected abstract void onShown();
\r
95 protected abstract void onHidden();
\r
100 protected abstract void showPopupForTraceProgram(
\r
101 final JComponent comp,
\r
102 final ProgDetailList tvd, final String keyword, final int threshold,
\r
103 final int x, final int y, final int h
\r
107 * 予約マーク・予約枠を更新してほしい
\r
109 protected abstract void updateReserveDisplay();
\r
114 protected abstract void addToPickup(final ProgDetailList tvd);
\r
116 protected abstract boolean isTabSelected(MWinTab tab);
\r
117 protected abstract void setSelectedTab(MWinTab tab);
\r
119 protected abstract boolean isFullScreen();
\r
121 * ページャーコンボボックスを更新してほしい
\r
123 protected abstract void setPagerEnabled(boolean b);
\r
124 protected abstract int getPagerCount();
\r
125 protected abstract int getSelectedPagerIndex();
\r
126 protected abstract void setSelectedPagerIndex(int idx);
\r
127 protected abstract void setPagerItems(TVProgramIterator pli, int curindex);
\r
129 protected abstract String getExtensionMark(ProgDetailList tvd);
\r
130 protected abstract String getOptionMark(ProgDetailList tvd);
\r
131 protected abstract String getPostfixMark(ProgDetailList tvd);
\r
134 * ツリーペーンの幅の変更を保存してほしい
\r
136 protected abstract void setDividerEnvs(int loc);
\r
140 /*******************************************************************************
\r
142 ******************************************************************************/
\r
145 private final Env env = getEnv();
\r
146 private final Bounds bounds = getBoundsEnv();
\r
147 private final PaperColorsMap pColors = getPaperColorMap();
\r
148 private final ChannelSort chsort = getChannelSort();
\r
150 private final TVProgramList tvprograms = getTVProgramList();
\r
151 private final HDDRecorderList recorders = getRecorderList();
\r
153 private final StatusWindow StWin = getStWin(); // これは起動時に作成されたまま変更されないオブジェクト
\r
154 private final StatusTextArea MWin = getMWin(); // これは起動時に作成されたまま変更されないオブジェクト
\r
155 private final AbsReserveDialog rD = getReserveDialog(); // これは起動時に作成されたまま変更されないオブジェクト
\r
157 private final Component parent = getParentComponent(); // これは起動時に作成されたまま変更されないオブジェクト
\r
160 private void StdAppendMessage(String message) { System.out.println(message); }
\r
161 private void StdAppendError(String message) { System.err.println(message); }
\r
162 //private void StWinSetVisible(boolean b) { StWin.setVisible(b); }
\r
163 //private void StWinSetLocationCenter(Component frame) { CommonSwingUtils.setLocationCenter(frame, (VWStatusWindow)StWin); }
\r
167 /*******************************************************************************
\r
169 ******************************************************************************/
\r
171 private final String MSGID = "["+getViewName()+"] ";
\r
172 private final String ERRID = "[ERROR]"+MSGID;
\r
173 private final String DBGID = "[DEBUG]"+MSGID;
\r
175 private final int DASHBORDER_LENGTH = 6; // ダッシュの長さ
\r
176 private final int DASHBORDER_SPACE = 4; // ダッシュの間隔
\r
178 private static final String TreeExpRegFile_Paper = "env"+File.separator+"tree_expand_paper.xml";
\r
180 private static final int TIMEBAR_START = Viewer.TIMEBAR_START;
\r
183 private static final String TUNERLABEL_PICKUP = "PICKUP";
\r
188 * 現在時刻追従スクロールで日付がかわったかどうかを確認するための情報を保持する
\r
190 private String prevDT4Now = CommonUtils.getDate529(0,true);
\r
191 private String prevDT4Tree = prevDT4Now;
\r
196 private int framebuffersize = 512;
\r
199 /*******************************************************************************
\r
201 ******************************************************************************/
\r
205 private JDetailPanel jTextPane_detail = null;
\r
206 private JSplitPane jSplitPane_view = null;
\r
207 private JPanel jPanel_tree = null;
\r
208 private JScrollPane jScrollPane_tree_top = null;
\r
209 private JTreeLabel jLabel_tree = null;
\r
210 private JScrollPane jScrollPane_tree = null;
\r
211 private JTree jTree_tree = null;
\r
212 private JScrollPane jScrollPane_space_main = null;
\r
213 private JLayeredPane jLayeredPane_space_main_view = null;
\r
214 private ArrayList<JTaggedLayeredPane> jLayeredPane_space_main_view_byDate = null;
\r
215 private JLayeredPane jLayeredPane_space_main_view_byMakeshift = null;
\r
216 private JPanel jPanel_space_top_view = null;
\r
217 private JPanel jPanel_space_side_view = null;
\r
218 private JViewport vport = null;
\r
220 private final JTimeline jLabel_timeline = new JTimeline();
\r
222 private DefaultMutableTreeNode paperRootNode = null; // 新聞形式のツリー
\r
223 private DefaultMutableTreeNode dateNode = null;
\r
224 private DefaultMutableTreeNode dgNode = null;
\r
225 private DefaultMutableTreeNode bsNode = null;
\r
226 private DefaultMutableTreeNode csNode = null;
\r
227 private DefaultMutableTreeNode centerNode = null;
\r
228 private DefaultMutableTreeNode passedNode = null;
\r
230 private DefaultMutableTreeNode defaultNode = null;
\r
234 // 番組枠をしまっておくバッファ(newが遅いので一回作ったら捨てない)
\r
235 private ArrayList<JTXTButton> frameUsed = new ArrayList<JTXTButton>(); // 画面に表示されている番組枠
\r
236 private ArrayList<JTXTButton> frameUnused = new ArrayList<JTXTButton>(); // 未使用の予備
\r
237 private ArrayList<JTXTButton> frameUsedByDate = new ArrayList<JTXTButton>(); // 高速描画時の日付別ペーンに表示されている番組枠。高速描画時も、過去ログはframeUsedが使われる
\r
239 // 予約枠をしまっておくバッファ(検索用)
\r
240 private ArrayList<JRMLabel> reserveBorders = new ArrayList<JRMLabel>();
\r
243 TreeExpansionReg ter = null;
\r
245 DefaultMutableTreeNode nowNode = null;
\r
248 private boolean timer_now_enabled = false;
\r
250 private IterationType cur_tuner = null;
\r
254 private final DashBorder dborder = new DashBorder(Color.RED,env.getMatchedBorderThickness(),DASHBORDER_LENGTH,DASHBORDER_SPACE);
\r
255 private final LineBorder lborder = new ChippedBorder(Color.BLACK,1);
\r
257 private float paperHeightZoom = 1.0F;
\r
262 private class JTimeline extends JLabel {
\r
264 private static final long serialVersionUID = 1L;
\r
266 private int minpos = 0;
\r
268 public int setMinpos(int x, int minpos, float multiplier) {
\r
269 if ( minpos >= 0 ) {
\r
270 this.minpos = minpos;
\r
273 int timeline = Math.round(this.minpos*multiplier);
\r
274 this.setLocation(x,timeline);
\r
280 /*******************************************************************************
\r
282 ******************************************************************************/
\r
284 public AbsPaperView() {
\r
288 this.setLayout(new BorderLayout());
\r
289 this.add(getJTextPane_detail(), BorderLayout.PAGE_START);
\r
290 this.add(getJSplitPane_view(), BorderLayout.CENTER);
\r
292 // タブが開いたり閉じたりしたときの処理
\r
293 this.addComponentListener(cl_shownhidden);
\r
298 /*******************************************************************************
\r
300 ******************************************************************************/
\r
302 // 主に他のクラスから呼び出されるメソッド
\r
304 public String getFrameBufferStatus() { return String.format("%d/%d",frameUsed.size(),framebuffersize); }
\r
309 public void jumpToNow() {
\r
310 if ( nowNode != null ) {
\r
311 TreePath tp = new TreePath(nowNode.getPath());
\r
312 jTree_tree.setSelectionPath(null);
\r
313 jTree_tree.setSelectionPath(tp);
\r
318 * リスト形式・本体予約一覧からの目的の番組へジャンプ
\r
320 public boolean jumpToBangumi(String center, String startdt) {
\r
323 if ( env.isPagerEnabled() ) {
\r
324 setPagerEnabled(true);
\r
331 GregorianCalendar c = CommonUtils.getCalendar(startdt);
\r
332 String adate = CommonUtils.getDate(c);
\r
333 String atime = CommonUtils.getTime(c);
\r
334 String adate529 = CommonUtils.getDate529(c,true);
\r
336 // 指定日付に移動して放送局の位置を確認する
\r
337 TVProgramIterator pli = redrawByDateWithCenter(center,adate529);
\r
338 if ( pli == null ) {
\r
340 MWin.appendError(ERRID+"ジャンプ先の日付がみつかりません: "+adate529);
\r
346 if ( ! isTabSelected(MWinTab.PAPER) ) {
\r
347 setSelectedTab(MWinTab.PAPER);
\r
351 int crindex = pli.getIndex(center);
\r
352 if ( crindex == -1 ) {
\r
353 MWin.appendError(ERRID+"「"+center+"」は有効な放送局ではありません");
\r
359 if ( env.isPagerEnabled() ) {
\r
360 int idx = env.getPageIndex(1+crindex);
\r
361 x = (crindex - idx*env.getCenterPerPage()) * bounds.getBangumiColumnWidth();
\r
364 x = crindex * bounds.getBangumiColumnWidth();
\r
371 Matcher ma = Pattern.compile("^(\\d\\d):(\\d\\d)$").matcher(atime);
\r
373 h = Integer.valueOf(ma.group(1));
\r
374 m = Integer.valueOf(ma.group(2));
\r
376 if (adate529.equals(adate)) {
\r
377 if (h < TIMEBAR_START) {
\r
385 y = Math.round((float)((h-TIMEBAR_START)*60+m)*bounds.getPaperHeightMultiplier()*paperHeightZoom);
\r
389 // Viewのサイズ変更をJavaまかせにすると実際に表示されるまで変更されないので明示的に変更しておく
\r
390 Dimension dm = vport.getView().getPreferredSize();
\r
391 vport.setViewSize(dm);
\r
394 Point pos = new Point(0, 0);
\r
395 //vport.setViewPosition(pos);
\r
397 Rectangle ra = vport.getViewRect();
\r
398 pos.x = x + bounds.getBangumiColumnWidth()/2 - ra.width/2;
\r
399 pos.y = y - ra.height/4;
\r
401 // ViewのサイズがViewPortのサイズより小さい場合はsetViewPosition()が正しく動作しないので0にする
\r
402 if (pos.x < 0 || dm.width < ra.width) {
\r
405 else if ((dm.width - ra.width) < pos.x) {
\r
406 pos.x = dm.width - ra.width;
\r
409 if (pos.y < 0 || dm.height < ra.height) {
\r
412 else if ((dm.height - ra.height) < pos.y) {
\r
413 pos.y = dm.height - ra.height;
\r
416 vport.setViewPosition(pos);
\r
421 Point sc = vport.getLocationOnScreen();
\r
422 Point pos = vport.getViewPosition();
\r
424 Point loc = new Point();
\r
425 loc.x = sc.x + (x + bounds.getBangumiColumnWidth()/2) - pos.x;
\r
426 loc.y = sc.y + (y + Math.round(5*bounds.getPaperHeightMultiplier()*paperHeightZoom)) - pos.y;
\r
429 Robot robo = new Robot();
\r
430 robo.mouseMove(loc.x,loc.y);
\r
432 } catch (AWTException e) {
\r
433 e.printStackTrace();
\r
443 public boolean redrawByPager() {
\r
445 //JTreeLabel.Nodes node = jLabel_tree.getNode();
\r
446 String value = jLabel_tree.getValue();
\r
448 if ( value != null ) {
\r
449 if ( JTreeLabel.Nodes.NOW.getLabel().equals(value) ) {
\r
450 redrawByNow(cur_tuner);
\r
453 redrawByDate(value, cur_tuner);
\r
464 * @see #putReserveBorder(String, String, int)
\r
466 public void updateReserveBorder(String center) {
\r
468 // 予約の赤枠を表示する(上:日付別表示中、下:放送局別表示中)
\r
470 JTreeLabel.Nodes node = jLabel_tree.getNode();
\r
471 String value = jLabel_tree.getValue();
\r
480 IterationType sTyp;
\r
483 sTyp = IterationType.TERRA;
\r
486 sTyp = IterationType.BS;
\r
489 sTyp = IterationType.CS;
\r
492 sTyp = IterationType.ALL;
\r
498 if ( JTreeLabel.Nodes.NOW.getLabel().equals(dt) ) {
\r
499 dt = CommonUtils.getDate529(0,true);
\r
502 TVProgramIterator pli = tvprograms.getIterator().build(chsort.getClst(), sTyp);
\r
504 // ページャーが有効なら表示すべきページ番号を取得する
\r
506 int colmax = pli.size();
\r
508 if ( env.isPagerEnabled() ) {
\r
509 int selectedpage = getSelectedPagerIndex(); // 予約枠の描画なのだから、ページ移動の必要はないはずだ
\r
510 if ( selectedpage >= 0 ) {
\r
511 colmin = env.getCenterPerPage() * selectedpage;
\r
512 colmax = colmin + env.getCenterPerPage()-1;
\r
513 divider = env.getCenterPerPage();
\r
516 StWin.appendError(ERRID+"ページャーコンボボックスが不正です: "+selectedpage);
\r
521 if ( center != null ) {
\r
523 int cnt = pli.getIndex(center);
\r
524 if ( colmin <= cnt && cnt <= colmax ) {
\r
525 int col = (divider==0) ? (cnt) : (cnt % divider);
\r
526 putReserveBorder(dt, center, col);
\r
532 for ( ProgList pl : pli ) {
\r
534 if ( cnt < colmin ) {
\r
537 else if ( cnt > colmax ) {
\r
541 int col = (divider==0) ? (cnt) : (cnt % divider);
\r
543 putReserveBorder(dt, pl.Center, col);
\r
552 if (center != null && ! center.equals(value)) {
\r
556 if (center == null) {
\r
561 TVProgramIterator pli = tvprograms.getIterator().build(chsort.getClst(), IterationType.ALL);
\r
562 int cnt = tvprograms.getIterator().getIndex(center);
\r
564 MWin.appendError(ERRID+"「"+center+"」は有効な放送局ではありません");
\r
567 ProgList pl = pli.getP();
\r
568 for (int col=0; col<pl.pdate.size(); col++) {
\r
570 putReserveBorder(pl.pdate.get(col).Date, center, col);
\r
584 public void updateBangumiColumns() {
\r
585 for (JTXTButton b : frameUsed ) {
\r
586 ProgDetailList tvd = b.getInfo();
\r
587 if ( tvd.type == ProgType.PROG ) {
\r
588 if (bounds.getShowMatchedBorder() && b.isStandby()) {
\r
589 if ( b.getBorder() != dborder )
\r
590 b.setBorder(dborder);
\r
593 if ( b.getBorder() != lborder )
\r
594 b.setBorder(lborder);
\r
601 * 予約待機赤枠の描画(ツールバーからのトグル操作)
\r
603 public boolean toggleMatchBorder() {
\r
606 bounds.setShowMatchedBorder( ! bounds.getShowMatchedBorder());
\r
608 _updPBorders(env, bounds, frameUsed);
\r
610 if ( env.getDrawcacheEnable() ) {
\r
611 _updPBorders(env, bounds, frameUsedByDate);
\r
614 return bounds.getShowMatchedBorder();
\r
619 * 新聞枠の拡縮(ツールバーからの操作)
\r
621 public void setZoom(int n) {
\r
622 paperHeightZoom = n * 0.01F;
\r
623 updateBounds(env, bounds);
\r
630 public void clearPanel() {
\r
636 for ( JRMLabel b : reserveBorders) {
\r
637 jLayeredPane_space_main_view.remove(b);
\r
639 reserveBorders.clear();
\r
642 if (jLabel_timeline != null && jLayeredPane_space_main_view != null) {
\r
643 jLayeredPane_space_main_view.remove(jLabel_timeline);
\r
646 // 時間枠・日付枠・放送局枠の初期化
\r
647 jPanel_space_top_view.removeAll();
\r
648 redrawTimebar(jPanel_space_side_view);
\r
651 //paper.jLabel_tree.setText("");
\r
656 * <P>高速描画ONの場合は、主ペーンのほかに複数の日付別ペーンが作成されるのでどれを利用するか選択する。
\r
657 * @param pane : nullの場合、主ペーンを選択する。過去ログは常にnullで。
\r
658 * @see #jLayeredPane_space_main_view_byMakeshift 主ペーン
\r
659 * @see #jLayeredPane_space_main_view_byDate 日付別ペーン
\r
661 private void selectMainView(JLayeredPane pane) {
\r
664 Point p = vport.getViewPosition();
\r
666 if (pane == null) {
\r
668 StdAppendMessage(MSGID+"番組枠描画バッファをリセット: "+frameUsed.size()+"/"+framebuffersize);
\r
669 for (int i=frameUsed.size()-1; i>=0; i--) {
\r
670 JTXTButton b = frameUsed.remove(i);
\r
671 b.setToolTipText(null);
\r
673 frameUnused.add(b);
\r
674 //jLayeredPane_space_main_view_byMakeshift.remove(b); // 削除しちゃダメよ?
\r
677 if (jLayeredPane_space_main_view == jLayeredPane_space_main_view_byMakeshift) {
\r
680 jScrollPane_space_main.setViewportView(jLayeredPane_space_main_view = jLayeredPane_space_main_view_byMakeshift);
\r
683 if (jLayeredPane_space_main_view == pane) {
\r
686 jScrollPane_space_main.setViewportView(jLayeredPane_space_main_view = pane);
\r
690 vport.setViewPosition(p);
\r
696 private void startTimer() {
\r
697 timer_now_enabled = true;
\r
703 private boolean stopTimer() {
\r
705 jLabel_timeline.setVisible(false);
\r
706 return (timer_now_enabled = false);
\r
710 * サイドツリーの「現在日時」を選択する
\r
712 public void selectTreeDefault() {
\r
713 if ( defaultNode != null ) jTree_tree.setSelectionPath(new TreePath(defaultNode.getPath()));
\r
717 * サイドツリーの現在選択中のノードを再度選択して描画しなおす
\r
719 public void reselectTree() {
\r
720 String[] names = new String[] { jLabel_tree.getNode().getLabel(), jLabel_tree.getValue() };
\r
721 TreeNode[] nodes = ter.getSelectedPath(paperRootNode, names, 0);
\r
722 if (nodes != null) {
\r
723 TreePath tp = new TreePath(nodes);
\r
724 if ( tp != null ) {
\r
726 Point vp = vport.getViewPosition(); //= SwingUtilities.convertPoint(vport,0,0,label);
\r
728 jTree_tree.setSelectionPath(null);
\r
729 jTree_tree.setSelectionPath(tp);
\r
731 if (vp.x != 0 && vp.y != 0) {
\r
732 jLayeredPane_space_main_view.scrollRectToVisible(new Rectangle(vp, vport.getSize()));
\r
741 public void setExpandTree() {
\r
742 jSplitPane_view.setDividerLocation(bounds.getTreeWidthPaper());
\r
743 jScrollPane_tree.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
\r
744 jScrollPane_tree.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
\r
750 public void setCollapseTree() {
\r
751 jSplitPane_view.setDividerLocation(bounds.getMinDivLoc());
\r
752 jScrollPane_tree.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
\r
753 jScrollPane_tree.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
\r
757 * サイドツリーの展開状態を設定ファイルに保存(鯛ナビ終了時に呼び出される)
\r
759 public void saveTreeExpansion() {
\r
764 * 画面上部の番組詳細領域の表示のON/OFF
\r
766 public void setDetailVisible(boolean aFlag) {
\r
767 jTextPane_detail.setVisible(aFlag);
\r
773 public Component getCenterPane() {
\r
774 return jPanel_space_top_view;
\r
780 public Component getTimebarPane() {
\r
781 return jPanel_space_side_view;
\r
787 public Component getCurrentPane() {
\r
788 return jLayeredPane_space_main_view;
\r
794 public String getCurrentView() {
\r
795 return jLabel_tree.getView();
\r
799 * 高速描画ONの場合に日付別ペーンを一気に全部描画する
\r
801 public void buildMainViewByDate() {
\r
803 if (env.getDebug()) System.out.println(DBGID+"CALLED buildMainViewByDate()");
\r
805 if (jLayeredPane_space_main_view_byMakeshift == null) {
\r
806 jLayeredPane_space_main_view_byMakeshift = new JLayeredPane();
\r
807 for (int i=0; i<framebuffersize; i++) {
\r
808 JTXTButton b2 = new JTXTButton();
\r
810 jLayeredPane_space_main_view_byMakeshift.add(b2);
\r
811 jLayeredPane_space_main_view_byMakeshift.setLayer(b2, 0);
\r
814 b2.addMouseListener(ml_risepopup);
\r
815 b2.addMouseMotionListener(ml_risepopup);
\r
816 frameUnused.add(b2);
\r
818 StdAppendMessage(MSGID+"番組枠描画バッファを初期化: "+framebuffersize);
\r
822 if (env.isPagerEnabled() || ! env.getDrawcacheEnable()) {
\r
823 jLayeredPane_space_main_view_byDate = null;
\r
827 jLayeredPane_space_main_view_byDate = new ArrayList<JTaggedLayeredPane>();
\r
828 frameUsedByDate = new ArrayList<JTXTButton>();
\r
829 new SwingBackgroundWorker(true) {
\r
832 protected Object doWorks() throws Exception {
\r
834 int dogDays = (env.getExpandTo8())?(8):(7);
\r
836 for ( int y=0; y < dogDays; y++ ) {
\r
837 jLayeredPane_space_main_view_byDate.add(new JTaggedLayeredPane());
\r
839 for ( int y=0; y < dogDays; y++ ) {
\r
840 String day = CommonUtils.getDate529(y*86400,true);
\r
842 jLayeredPane_space_main_view_byDate.get(y).setTagstr(day);
\r
844 StWin.appendMessage(MSGID+"番組表を構築します:"+day);
\r
845 redrawByDate(day,IterationType.ALL);
\r
851 protected void doFinally() {
\r
859 private void stopTreeListener() {
\r
860 jTree_tree.removeTreeSelectionListener(tsl_nodeselected);
\r
866 private void startTreeListener() {
\r
867 jTree_tree.addTreeSelectionListener(tsl_nodeselected);
\r
873 public void redrawTreeByDate() {
\r
875 stopTreeListener();
\r
876 TreePath tp = jTree_tree.getSelectionPath();
\r
878 _redrawTreeByDate(dateNode);
\r
879 _redrawTreeByDate(dgNode);
\r
880 _redrawTreeByDate(bsNode);
\r
881 _redrawTreeByDate(csNode);
\r
883 jTree_tree.setSelectionPath(tp);
\r
884 jTree_tree.updateUI();
\r
885 startTreeListener();
\r
888 private void _redrawTreeByDate(DefaultMutableTreeNode parent) {
\r
890 // ★★★ でふぉるとのーど ★★★
\r
891 DefaultMutableTreeNode nNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.NOW.getLabel());
\r
892 if ( parent == dateNode ) {
\r
894 defaultNode = nNode;
\r
897 parent.removeAllChildren();
\r
899 int dogDays = (env.getExpandTo8())?(8):(7);
\r
900 for ( int i=0; i<dogDays; i++ ) {
\r
901 parent.add(new DefaultMutableTreeNode(CommonUtils.getDate529(i*86400, true)));
\r
908 public void redrawTreeByCenter() {
\r
910 stopTreeListener();
\r
911 TreePath tp = jTree_tree.getSelectionPath();
\r
913 centerNode.removeAllChildren();
\r
914 TVProgramIterator pli = tvprograms.getIterator();
\r
915 pli.build(chsort.getClst(), IterationType.ALL);
\r
916 for ( ProgList pl : pli ) {
\r
917 centerNode.add(new DefaultMutableTreeNode(pl.Center));
\r
920 jTree_tree.setSelectionPath(tp);
\r
921 jTree_tree.updateUI();
\r
922 startTreeListener();
\r
928 public void redrawTreeByPassed() {
\r
930 stopTreeListener();
\r
931 TreePath tp = jTree_tree.getSelectionPath();
\r
933 passedNode.removeAllChildren();
\r
934 if ( env.getUsePassedProgram() ) {
\r
935 String[] dd = new PassedProgram().getDateList(env.getPassedLogLimit());
\r
936 for ( int i=1; i<dd.length && i<=env.getPassedLogLimit(); i++ ) {
\r
937 passedNode.add(new DefaultMutableTreeNode(dd[i]));
\r
941 jTree_tree.setSelectionPath(tp);
\r
942 jTree_tree.updateUI();
\r
943 startTreeListener();
\r
949 private void redrawTimebar(JPanel jp)
\r
953 float phm60 = 60.0F * bounds.getPaperHeightMultiplier() * paperHeightZoom;
\r
955 for (int row=0; row<24; row++) {
\r
957 int hour = row+TIMEBAR_START;
\r
959 JTimebarLabel b0 = new JTimebarLabel(Integer.toString(hour));
\r
961 if ( hour >=6 && hour <= 11 ) {
\r
962 b0.setBackground(env.getTimebarColor());
\r
964 else if ( hour >=12 && hour <= 17 ) {
\r
965 b0.setBackground(env.getTimebarColor2());
\r
967 else if ( hour >=18 && hour <= 23 ) {
\r
968 b0.setBackground(env.getTimebarColor3());
\r
971 b0.setBackground(env.getTimebarColor4());
\r
973 b0.setOpaque(true);
\r
974 b0.setBorder(lborder);
\r
975 b0.setHorizontalAlignment(JLabel.CENTER);
\r
979 (int) Math.ceil((float)row*phm60),
\r
980 bounds.getTimebarColumnWidth(),
\r
981 (int) Math.ceil(phm60));
\r
986 Dimension d = jp.getMaximumSize();
\r
987 d.width = bounds.getTimebarColumnWidth();
\r
988 d.height = (int) Math.ceil(24*phm60);
\r
989 jp.setPreferredSize(d);
\r
996 * @see #redrawByDate(String, IterationType)
\r
998 private void redrawByNow(final IterationType tuner) {
\r
1004 redrawByDate(CommonUtils.getDate529(0,true),tuner);
\r
1007 jLabel_timeline.setVisible(true);
\r
1008 Dimension dm = jLayeredPane_space_main_view.getPreferredSize();
\r
1009 //dm.height = Math.round(1*bounds.getPaperHeightMultiplier()*paperHeightZoom);
\r
1011 jLabel_timeline.setBorder(new LineBorder(Color.RED,2));
\r
1012 jLabel_timeline.setBackground(Color.RED);
\r
1013 jLabel_timeline.setOpaque(true);
\r
1014 jLabel_timeline.setBounds(0, 0, dm.width, dm.height);
\r
1015 jLayeredPane_space_main_view.add(jLabel_timeline);
\r
1016 jLayeredPane_space_main_view.setLayer(jLabel_timeline, 2);
\r
1019 setTimelinePos(true);
\r
1021 // 新しいタイマーの作成(1分ごとに線を移動する)
\r
1027 * @see #_redrawByDateWithCenter(String, String, IterationType)
\r
1029 private TVProgramIterator redrawByDate(String date, IterationType tuner) {
\r
1030 return _redrawByDateWithCenter(null,date,tuner);
\r
1034 * 日付別に表を作成する(ページャーが有効な場合は指定の放送局のあるページを開く)
\r
1035 * @see #_redrawByDateWithCenter(String, String, IterationType)
\r
1037 private TVProgramIterator redrawByDateWithCenter(String center, String date) {
\r
1040 String ndate529 = CommonUtils.getDate529(0, true);
\r
1043 IterationType tuner;
\r
1044 JTreeLabel.Nodes node;
\r
1045 if ( ndate529.compareTo(date) > 0 ) {
\r
1046 tuner = IterationType.PASSED;
\r
1047 node = JTreeLabel.Nodes.PASSED;
\r
1050 tuner = IterationType.ALL;
\r
1051 node = JTreeLabel.Nodes.DATE;
\r
1054 if ( tuner == IterationType.PASSED ) {
\r
1056 PassedProgram passed = tvprograms.getPassed();
\r
1057 if ( ! passed.loadAllCenters(date) ) {
\r
1058 System.err.println(ERRID+"過去ログの取得に失敗しました: "+date);
\r
1064 TVProgramIterator pli = _redrawByDateWithCenter(center, date, tuner);
\r
1066 getJTree_tree().getSelectionModel().setSelectionPath(null); // 選択は解除する
\r
1068 jLabel_tree.setView(node, date);
\r
1075 * @see #redrawByDate(String, IterationType)
\r
1076 * @see #redrawByDateWithCenter(String, String)
\r
1078 private TVProgramIterator _redrawByDateWithCenter(String center, String date, IterationType tuner) {
\r
1080 if (env.getDebug()) System.out.println(DBGID+"CALLED redrawByDate() date="+date+" IterationType="+tuner);
\r
1085 cur_tuner = tuner;
\r
1087 if (date == null) {
\r
1092 TVProgramIterator pli = tvprograms.getIterator().build(chsort.getClst(),tuner);
\r
1098 boolean drawPrograms = true;
\r
1099 if ( tuner != IterationType.ALL || env.isPagerEnabled() || ! env.getDrawcacheEnable() ) {
\r
1100 selectMainView(null);
\r
1104 boolean nopane = true;
\r
1105 for ( JTaggedLayeredPane tlp : jLayeredPane_space_main_view_byDate ) {
\r
1106 if ( tlp.getTagstr().equals(date) ) {
\r
1107 selectMainView(tlp);
\r
1108 if ( tlp.getComponentCountInLayer(0) > 0 ) {
\r
1110 drawPrograms = false;
\r
1118 selectMainView(null);
\r
1124 int colmax = pli.size();
\r
1126 if ( env.isPagerEnabled() ) {
\r
1128 int selectedpage = getSelectedPagerIndex();
\r
1130 if ( center == null ) {
\r
1131 // とび先の指定がないのでもともと選択されていたページを再度選択したい
\r
1132 if ( selectedpage == -1 ) {
\r
1137 int maxindex = env.getPageIndex(pli.size());
\r
1138 if ( selectedpage > maxindex ) {
\r
1139 // ページ数かわったら、インデックスがはみだしちゃった
\r
1145 // 特定の日付の特定の放送局を表示したい
\r
1146 int crindex = pli.getIndex(center);
\r
1147 if ( crindex == -1 ) {
\r
1149 MWin.appendError(ERRID+"「"+center+"」は有効な放送局ではありません");
\r
1153 selectedpage = env.getPageIndex(1+crindex);
\r
1157 colmin = env.getCenterPerPage() * selectedpage;
\r
1158 colmax = colmin + (env.getCenterPerPage()-1);
\r
1159 divider = env.getCenterPerPage();
\r
1161 // ページャーコンボボックスの書き換え
\r
1162 setPagerItems(pli,env.getPageIndex(1+colmin));
\r
1166 //setPagerEnabled(true);
\r
1169 if (env.getDebug()) System.out.println(DBGID+"[描画開始] ch_start="+colmin+" ch_end="+colmax+" ch_size="+pli.size());
\r
1172 dborder.setDashColor(env.getMatchedBorderColor());
\r
1173 dborder.setThickness(env.getMatchedBorderThickness());
\r
1179 jPanel_space_top_view.setLayout(null);
\r
1182 for ( ProgList pl : pli ) {
\r
1186 if ( cnt < colmin ) {
\r
1189 else if ( cnt > colmax ) {
\r
1193 col = (divider==0) ? (cnt) : (cnt % divider);
\r
1195 //TVProgram tvp = tvprograms.get(pli.getSiteId());
\r
1197 //if (env.getDebug()) System.out.println(DBGID+"[描画中] "+pl.Center+" min="+colmin+" max="+colmax+" cnt="+cnt+" col="+col+" siteid="+siteid);
\r
1200 JLabel b1 = new JLabel(pl.Center);
\r
1201 b1.setOpaque(true);
\r
1202 b1.setBackground(pl.BgColor);
\r
1203 b1.setBorder(lborder);
\r
1204 b1.setHorizontalAlignment(JLabel.CENTER);
\r
1205 b1.setBounds(bounds.getBangumiColumnWidth()*col, 0, bounds.getBangumiColumnWidth(), bounds.getBangumiColumnHeight());
\r
1206 b1.addMouseListener(cnMouseAdapter);
\r
1207 jPanel_space_top_view.add(b1);
\r
1210 if (tuner != IterationType.PASSED) {
\r
1211 putReserveBorder(date, pl.Center, col);
\r
1215 if (drawPrograms == true) {
\r
1216 putBangumiColumns(pl, col, date);
\r
1220 ++col; // 描画後にパネルサイズの変更にも使う
\r
1222 if ( ! env.getDrawcacheEnable()) {
\r
1223 // 番組枠描画バッファサイズの上限を確認する
\r
1224 if (framebuffersize < frameUsed.size()) {
\r
1225 framebuffersize = frameUsed.size();
\r
1226 StdAppendMessage(MSGID+"番組枠描画バッファの上限を変更: "+frameUsed.size()+"/"+framebuffersize);
\r
1231 //jPanel_space_top_view.setPreferredSize(new Dimension(bounds.getTimebarColumnWidth()+cnt*bounds.getBangumiColumnWidth(),bounds.getBangumiColumnHeight()));
\r
1232 jPanel_space_top_view.setPreferredSize(new Dimension(col*bounds.getBangumiColumnWidth(),bounds.getBangumiColumnHeight()));
\r
1233 jPanel_space_top_view.updateUI();
\r
1235 jLayeredPane_space_main_view.setPreferredSize(new Dimension(bounds.getBangumiColumnWidth()*col,Math.round(24*60*bounds.getPaperHeightMultiplier()*paperHeightZoom)));
\r
1237 if (env.getDebug()) System.out.println(DBGID+"END redrawByDate() date="+date+" IterationType="+tuner);
\r
1246 private void redrawByCenter(String center)
\r
1252 if ( env.isPagerEnabled() ) {
\r
1253 setPagerEnabled(false);
\r
1258 selectMainView(null);
\r
1260 jPanel_space_top_view.setLayout(null);
\r
1262 for (int a=0; a<tvprograms.size(); a++) {
\r
1264 TVProgram tvp = tvprograms.get(a);
\r
1266 if (tvp.getType() != ProgType.PROG) {
\r
1270 for (ProgList pl : tvp.getCenters()) {
\r
1271 if (pl.enabled == true && pl.Center.equals(center)) {
\r
1273 for (int centerid=0; centerid<pl.pdate.size(); centerid++)
\r
1275 ProgDateList pcl = pl.pdate.get(centerid);
\r
1277 JTXTLabel b1 = new JTXTLabel();
\r
1278 GregorianCalendar c = CommonUtils.getCalendar(pcl.Date);
\r
1279 if ( c != null ) {
\r
1280 String date = CommonUtils.getDate(c);
\r
1281 b1.setValue(date);
\r
1282 b1.setText(date.substring(5));
\r
1283 b1.setOpaque(true);
\r
1284 if ( c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY ) {
\r
1285 b1.setBackground(new Color(90,90,255));
\r
1287 else if ( c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY ) {
\r
1288 b1.setBackground(new Color(255,90,90));
\r
1291 b1.setBackground(new Color(180,180,180));
\r
1294 b1.setBorder(lborder);
\r
1295 b1.setHorizontalAlignment(JLabel.CENTER);
\r
1296 b1.setBounds(bounds.getBangumiColumnWidth()*centerid, 0, bounds.getBangumiColumnWidth(), bounds.getBangumiColumnHeight());
\r
1297 b1.addMouseListener(tbMouseAdapter);
\r
1298 jPanel_space_top_view.add(b1);
\r
1300 //jPanel_space_top_view.setPreferredSize(new Dimension(bounds.getTimebarColumnWidth()+bounds.getBangumiColumnWidth()*tvprogram.getPlist().get(x).pcenter.size(),bounds.getBangumiColumnHeight()));
\r
1301 jPanel_space_top_view.setPreferredSize(new Dimension(bounds.getBangumiColumnWidth()*pl.pdate.size(),bounds.getBangumiColumnHeight()));
\r
1302 jPanel_space_top_view.updateUI();
\r
1307 putBangumiColumns(pl, -1, null);
\r
1311 for (int progid=0; progid<pl.pdate.size(); progid++) {
\r
1312 putReserveBorder(pl.pdate.get(progid).Date, pl.Center, progid);
\r
1316 jLayeredPane_space_main_view.setPreferredSize(new Dimension(tvp.getCenters().get(0).pdate.size()*bounds.getBangumiColumnWidth(),Math.round(24*60*bounds.getPaperHeightMultiplier()*paperHeightZoom)));
\r
1317 //jScrollPane_space_main.updateUI();
\r
1324 // 番組枠描画バッファサイズの上限を確認する
\r
1325 if (framebuffersize < frameUsed.size()) {
\r
1326 framebuffersize = frameUsed.size();
\r
1327 StdAppendMessage(MSGID+"番組枠描画バッファの上限を変更: "+frameUsed.size()+"/"+framebuffersize);
\r
1334 * @see #updateReserveBorder(String)
\r
1336 private void putReserveBorder(String date, String Center, int q) {
\r
1338 // 古いマークの削除(一見取りこぼしがあるように見えるが無問題)
\r
1339 for (int i=reserveBorders.size()-1; i>=0; i--) {
\r
1340 JRMLabel rb = reserveBorders.get(i);
\r
1341 if ( rb.getDate().equals(date) && rb.getCenter().equals(Center) ) {
\r
1342 rb.setVisible(false);
\r
1343 jLayeredPane_space_main_view.remove(rb);
\r
1344 reserveBorders.remove(i);
\r
1349 JRMLabel.setColumnWidth(bounds.getBangumiColumnWidth());
\r
1350 JRMLabel.setHeightMultiplier(bounds.getPaperHeightMultiplier() * paperHeightZoom);
\r
1353 GregorianCalendar cal = CommonUtils.getCritCalendar(date);
\r
1354 String topDateTime = CommonUtils.getDateTime(cal);
\r
1355 cal.add(Calendar.DATE, 1);
\r
1356 String bottomDateTime = CommonUtils.getDateTime(cal);
\r
1359 String passedCritDateTime = CommonUtils.getCritDateTime(env.getDisplayPassedReserve());
\r
1361 // ツールバーで選択されている実レコーダ
\r
1362 String myself = ( env.getEffectComboToPaper() ) ? (getSelectedRecorderId()) : (null);
\r
1365 drawReserveBorders(date, Center, q, topDateTime, bottomDateTime, passedCritDateTime, myself);
\r
1368 drawPickupBorders(date, Center, q, topDateTime, bottomDateTime, passedCritDateTime, TUNERLABEL_PICKUP);
\r
1370 private void drawReserveBorders(String date, String Center, int q, String topDateTime, String bottomDateTime, String passedCritDateTime, String myself) {
\r
1371 if ( myself == HDDRecorder.SELECTED_PICKUP ) {
\r
1374 for ( HDDRecorder recorder : getSelectedRecorderList() ) {
\r
1375 for ( ReserveList r : recorder.getReserves()) {
\r
1377 // 「実行のみ表示」で無効な予約は表示しない
\r
1378 if ( env.getDisplayOnlyExecOnEntry() && ! r.getExec() ) {
\r
1383 if ( r.getCh_name() == null ) {
\r
1384 if ( r.getChannel() == null ) {
\r
1385 // CHコードすらないのはバグだろう
\r
1386 System.err.println(ERRID+"予約情報にCHコードが設定されていません。バグの可能性があります。 recid="+recorder.Myself()+" chname="+r.getCh_name());
\r
1392 if (r.getCh_name().equals(Center)) {
\r
1395 ArrayList<String> starts = new ArrayList<String>();
\r
1396 ArrayList<String> ends = new ArrayList<String>();
\r
1397 CommonUtils.getStartEndList(starts, ends, r);
\r
1400 for ( int j=0; j<starts.size(); j++ ) {
\r
1401 if ( passedCritDateTime.compareTo(ends.get(j)) > 0 ) {
\r
1402 // 過去情報の表示が制限されている場合
\r
1406 drawBorder(date,Center,topDateTime,bottomDateTime,starts.get(j),ends.get(j),r.getRec_min(),r.getTuner(),recorder.getColor(r.getTuner()),r.getExec(),q);
\r
1412 private void drawPickupBorders(String date, String Center, int q, String topDateTime, String bottomDateTime, String passedCritDateTime, String tuner) {
\r
1413 for ( ProgList pl : tvprograms.getPickup().getCenters() ) {
\r
1414 if ( ! pl.Center.equals(Center) ) {
\r
1417 for ( ProgDateList pcl : pl.pdate ) {
\r
1418 for ( ProgDetailList tvd : pcl.pdetail ) {
\r
1419 if ( passedCritDateTime.compareTo(tvd.endDateTime) > 0 ) {
\r
1420 // 過去情報の表示が制限されている場合
\r
1424 drawBorder(date,Center,topDateTime,bottomDateTime,tvd.startDateTime,tvd.endDateTime,tvd.length,tuner,env.getPickedColor(),false,q);
\r
1429 private void drawBorder(String date, String Center, String topDateTime, String bottomDateTime, String startDateTime, String endDateTime, String recmin, String tuner, String bordercol, boolean exec, int col) {
\r
1430 drawBorder(date, Center, topDateTime, bottomDateTime, startDateTime, endDateTime, Integer.valueOf(recmin), tuner, CommonUtils.str2color(bordercol), exec, col);
\r
1432 private void drawBorder(String date, String Center, String topDateTime, String bottomDateTime, String startDateTime, String endDateTime, int recmin, String tuner, Color bordercol, boolean exec, int col) {
\r
1434 GregorianCalendar ca = CommonUtils.getCalendar(startDateTime);
\r
1435 int ahh = ca.get(Calendar.HOUR_OF_DAY);
\r
1436 int amm = ca.get(Calendar.MINUTE);
\r
1440 if (topDateTime.compareTo(startDateTime) <= 0 && startDateTime.compareTo(bottomDateTime) < 0) {
\r
1442 row = ahh - TIMEBAR_START;
\r
1446 row = row*60 + amm;
\r
1449 else if (startDateTime.compareTo(topDateTime) < 0 && topDateTime.compareTo(endDateTime) < 0) {
\r
1450 // 表示開始位置が番組の途中にある
\r
1452 length = recmin - (TIMEBAR_START*60 - ahh*60 - amm);
\r
1459 // 重複予約の場合のエンコーダマーク表示位置の調整
\r
1462 for (int k=0; k<reserveBorders.size(); k++) {
\r
1463 JRMLabel rb = reserveBorders.get(k);
\r
1464 if ( rb.getDate().equals(date) && rb.getCenter().equals(Center) ) {
\r
1465 int drow = rb.getVRow() - row;
\r
1466 int dlen = rb.getVHeight() - length;
\r
1467 if ( rb.getVColumn() == col && ((drow == 0 && dlen == 0) || ((drow == 1 || drow == -1) && (dlen == 0 || dlen == -1 || dlen == 1))) ) {
\r
1474 JRMLabel rb = new JRMLabel();
\r
1477 rb.setVerticalAlignment(JLabel.BOTTOM);
\r
1478 rb.setHorizontalAlignment(JLabel.RIGHT);
\r
1480 else if (rc == 1) {
\r
1481 rb.setVerticalAlignment(JLabel.BOTTOM);
\r
1482 rb.setHorizontalAlignment(JLabel.LEFT);
\r
1485 rb.setVerticalAlignment(JLabel.TOP);
\r
1486 rb.setHorizontalAlignment(JLabel.RIGHT);
\r
1489 // エンコーダの区別がないものは"■"を表示する
\r
1490 rb.setEncBackground(bordercol);
\r
1491 rb.setBorder(new LineBorder(bordercol,4));
\r
1492 if ( tuner != null && tuner.equals(TUNERLABEL_PICKUP) ) {
\r
1493 rb.setEncForeground(env.getPickedFontColor());
\r
1495 else if ( exec ) {
\r
1496 rb.setEncForeground(env.getExecOnFontColor());
\r
1499 rb.setEncForeground(env.getExecOffFontColor());
\r
1501 if (tuner == null || tuner.equals("")) {
\r
1502 rb.setEncoder("■");
\r
1505 rb.setEncoder(tuner);
\r
1510 rb.setCenter(Center);
\r
1513 jLayeredPane_space_main_view.add(rb);
\r
1514 jLayeredPane_space_main_view.setLayer(rb,1);
\r
1515 rb.setVBounds(col, row, 1, length);
\r
1516 rb.setVisible(true);
\r
1518 reserveBorders.add(rb);
\r
1524 * @param cnt -1:放送局別表示、>=0:日付表示
\r
1526 private void putBangumiColumns(ProgList pl, int cnt, String date) {
\r
1527 int ymax = pl.pdate.size();
\r
1529 for ( int dateid=0; dateid < ymax; dateid++ ) {
\r
1530 ProgDateList pcl = pl.pdate.get(dateid);
\r
1533 if ( ! pcl.Date.equals(date) ) {
\r
1540 else if ( cnt == -1 ) {
\r
1546 int zmax = pcl.pdetail.size();
\r
1547 for ( int progid=0; progid<zmax; progid++ ) {
\r
1548 ProgDetailList tvd = pcl.pdetail.get(progid);
\r
1549 if ( progid != 0 ) {
\r
1551 String[] st = tvd.start.split(":",2);
\r
1552 if ( st.length == 2 ) {
\r
1553 int ahh = Integer.valueOf(st[0]);
\r
1554 int amm = Integer.valueOf(st[1]);
\r
1555 if ( CommonUtils.isLateNight(ahh) ) {
\r
1558 row = (ahh-TIMEBAR_START)*60+amm;
\r
1561 // 「番組情報がありません」は前の番組枠のお尻に
\r
1566 // その日の最初のエントリは5:00以前の場合もあるので強制0スタート
\r
1571 putBangumiColumnSub(tvd, row, col);
\r
1573 // 「番組情報がありません」用に保存
\r
1574 pEnd = row + tvd.length;
\r
1578 private void putBangumiColumnSub(ProgDetailList tvd, int row, int col) {
\r
1581 JTXTButton b2 = null;
\r
1582 if (jLayeredPane_space_main_view == jLayeredPane_space_main_view_byMakeshift && ! frameUnused.isEmpty()) {
\r
1583 b2 = frameUnused.remove(frameUnused.size()-1);
\r
1584 //b2.setVisible(true); // JTXTButton.clear()内でsetVisible(false)しているので
\r
1588 b2 = new JTXTButton();
\r
1589 jLayeredPane_space_main_view.add(b2);
\r
1590 jLayeredPane_space_main_view.setLayer(b2, 0);
\r
1593 b2.addMouseListener(ml_risepopup);
\r
1594 b2.addMouseMotionListener(ml_risepopup);
\r
1596 if (jLayeredPane_space_main_view == jLayeredPane_space_main_view_byMakeshift) {
\r
1597 frameUsed.add(b2);
\r
1600 // 裏描画は十分遅いのでb2をUnusedキャッシュには入れず都度生成で構わない
\r
1601 frameUsedByDate.add(b2);
\r
1607 JTXTButton.setColumnWidth(bounds.getBangumiColumnWidth());
\r
1608 JTXTButton.setHeightMultiplier(bounds.getPaperHeightMultiplier() * paperHeightZoom);
\r
1610 b2.setBackground(pColors.get(tvd.genre));
\r
1611 if (bounds.getShowMatchedBorder() && b2.isStandby() ) {
\r
1612 b2.setBorder(dborder);
\r
1615 b2.setBorder(lborder);
\r
1619 b2.setVBounds(col,row,1,tvd.length);
\r
1622 if ( env.getTooltipEnable() == true && ! tvd.title.equals("") && ! tvd.start.equals("") ) {
\r
1624 int tlen = bounds.getTooltipWidth();
\r
1625 for (int i=0; i<tvd.title.length(); i+=tlen) {
\r
1626 t += tvd.title.substring(i, (i+tlen<tvd.title.length())?(i+tlen):(tvd.title.length()))+"<BR>";
\r
1629 int dlen = tlen+2;
\r
1630 for (int i=0; i<tvd.detail.length(); i+=dlen) {
\r
1631 d += " "+tvd.detail.substring(i, (i+dlen<tvd.detail.length())?(i+dlen):(tvd.detail.length()))+"<BR>";
\r
1633 String e = getExtensionMark(tvd);
\r
1634 b2.setToolTipText(("<html>"+tvd.start+" <FONT COLOR=RED><EM>"+e+"</EM></FONT><BR> <FONT COLOR=BLUE><STRONG><U>"+t+"</U></STRONG></FONT>"+d+"</html>"));
\r
1640 * @param minpos : MINPOS.RESET=初回、MINPOS.UPDATE=自動更新時
\r
1642 private int setTimelinePos(boolean reset) {
\r
1643 if ( vport != null && jLabel_timeline != null && jLabel_timeline.isVisible() ) {
\r
1645 int correct = 0; // 24:00-28:59迄は前日の日付になる
\r
1646 GregorianCalendar c = CommonUtils.getCalendar(0);
\r
1647 if ( CommonUtils.isLateNight(c) ) {
\r
1648 c.add(Calendar.DATE, -1);
\r
1652 Point vp = vport.getViewPosition();
\r
1653 Point tp = jLabel_timeline.getLocation();
\r
1656 int minpos_new = (c.get(Calendar.HOUR_OF_DAY)-TIMEBAR_START+correct)*60+c.get(Calendar.MINUTE);
\r
1657 int timeline_vpos = jLabel_timeline.setMinpos(0, minpos_new, bounds.getPaperHeightMultiplier()*paperHeightZoom);
\r
1659 // ビューポートの位置(05:30まではスクロールしないよ)
\r
1660 if ( env.getTimerbarScrollEnable() && minpos_new >= 30 ) {
\r
1663 Rectangle ra = vport.getViewRect();
\r
1664 ra.y = Math.round(timeline_vpos - (float)bounds.getTimelinePosition() * bounds.getPaperHeightMultiplier() * paperHeightZoom);
\r
1665 vport.setViewPosition(new Point(ra.x, ra.y));
\r
1669 vp.y += (timeline_vpos - tp.y);
\r
1670 vport.setViewPosition(vp);
\r
1674 jLabel_timeline.updateUI();
\r
1676 return minpos_new;
\r
1683 /*******************************************************************************
\r
1685 ******************************************************************************/
\r
1688 * ツールバーでレコーダの選択イベントが発生
\r
1691 public void valueChanged(HDDRecorderSelectionEvent e) {
\r
1692 if (debug) System.out.println(DBGID+"recorder selection rised");
\r
1694 // 選択中のレコーダ情報を保存する
\r
1695 src_recsel = (HDDRecorderSelectable) e.getSource();
\r
1698 updateReserveBorder(null);
\r
1701 private String getSelectedRecorderId() {
\r
1702 return ( src_recsel!=null ? src_recsel.getSelectedId() : null );
\r
1705 private HDDRecorderList getSelectedRecorderList() {
\r
1706 return ( src_recsel!=null ? src_recsel.getSelectedList() : null );
\r
1709 private HDDRecorderSelectable src_recsel;
\r
1713 * レコーダ情報の変更イベントが発生
\r
1716 public void stateChanged(HDDRecorderChangeEvent e) {
\r
1717 // テーブルをリフレッシュする処理
\r
1723 /*******************************************************************************
\r
1725 ******************************************************************************/
\r
1731 public void timerRised(TickTimerRiseEvent e) {
\r
1733 String curDT = CommonUtils.getDate529(0,true);
\r
1735 if ( prevDT4Tree != null && ! prevDT4Tree.equals(curDT) ) {
\r
1736 // 日付が変わったらツリーを書き換える
\r
1737 redrawTreeByDate();
\r
1738 redrawTreeByPassed();
\r
1739 prevDT4Tree = curDT;
\r
1742 if ( timer_now_enabled ) {
\r
1744 if (prevDT4Now != null && ! prevDT4Now.equals(curDT)) {
\r
1746 StdAppendError(MSGID+"日付が変わったので番組表を切り替えます("+CommonUtils.getDateTime(0)+")");
\r
1747 redrawByNow(cur_tuner);
\r
1751 setTimelinePos(false);
\r
1755 prevDT4Now = curDT;
\r
1760 * タブを開いたり閉じたりしたときに動くリスナー
\r
1762 private ComponentListener cl_shownhidden = new ComponentAdapter() {
\r
1764 public void componentShown(ComponentEvent e) {
\r
1767 for ( TVProgram tvp : tvprograms ) {
\r
1772 for ( HDDRecorder recorder : recorders ) {
\r
1773 recorder.refreshReserves();
\r
1779 setPagerEnabled(true);
\r
1783 public void componentHidden(ComponentEvent e) {
\r
1787 setPagerEnabled(false);
\r
1792 * 番組枠につけるマウス操作のリスナー
\r
1794 private final MouseInputListener ml_risepopup = new MouseInputListener() {
\r
1796 private final Cursor defCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
\r
1797 private final Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
\r
1798 private final Point pp = new Point();
\r
1800 private Color bgcolor = null;
\r
1803 public void mouseClicked(MouseEvent e) {
\r
1806 Point p = e.getPoint();
\r
1809 JTXTButton b = (JTXTButton) e.getSource();
\r
1810 ProgDetailList tvd = b.getInfo();
\r
1812 if (e.getButton() == MouseEvent.BUTTON3) {
\r
1813 if (e.getClickCount() == 1) {
\r
1814 // 右シングルクリックでメニューの表示
\r
1815 showPopupForTraceProgram(b, tvd, tvd.title, TraceKey.noFazzyThreshold, p.x, p.y, e.getY());
\r
1818 else if (e.getButton() == MouseEvent.BUTTON1) {
\r
1820 if (tvd.type == ProgType.PASSED) {
\r
1821 if (e.getClickCount() == 2) {
\r
1822 MWin.appendMessage(MSGID+"過去ログでダブルクリックは利用できません");
\r
1829 if (e.getClickCount() == 2) {
\r
1830 // 左ダブルクリックで予約ウィンドウを開く
\r
1831 openReserveDialog(tvd);
\r
1834 else if (e.getButton() == MouseEvent.BUTTON2) {
\r
1840 private void openReserveDialog(ProgDetailList tvd) {
\r
1842 // レコーダが登録されていない場合はなにもしない
\r
1843 if (recorders.size() == 0) {
\r
1848 CommonSwingUtils.setLocationCenter(parent,rD);
\r
1850 // サブタイトルを番組追跡の対象から外す
\r
1851 boolean succeeded = false;
\r
1852 if ( ! env.getSplitEpno() && env.getTraceOnlyTitle() ) {
\r
1853 succeeded = rD.open(tvd,tvd.title,TraceKey.defaultFazzyThreshold);
\r
1856 succeeded = rD.open(tvd);
\r
1860 rD.setVisible(true);
\r
1866 if (rD.isReserved()) {
\r
1867 updateReserveDisplay();
\r
1868 updateReserveBorder(tvd.center);
\r
1876 public void mouseEntered(MouseEvent e) {
\r
1878 JTXTButton b = (JTXTButton) e.getSource();
\r
1879 ProgDetailList tvd = b.getInfo();
\r
1881 if ( env.getEnableHighlight() ) {
\r
1882 bgcolor = ((JTXTButton)e.getSource()).getBackground();
\r
1883 ((JTXTButton)e.getSource()).setBackground(env.getHighlightColor());
\r
1885 jTextPane_detail.setLabel(tvd.start,tvd.end,tvd.title);
\r
1886 jTextPane_detail.setText(tvd.detail+"\n"+tvd.getAddedDetail());
\r
1890 public void mouseExited(MouseEvent e) {
\r
1891 if ( env.getEnableHighlight() ) {
\r
1892 ((JTXTButton)e.getSource()).setBackground(bgcolor);
\r
1897 public void mouseDragged(final MouseEvent e) {
\r
1898 Point cp = e.getLocationOnScreen();
\r
1899 Point vp = vport.getViewPosition(); //= SwingUtilities.convertPoint(vport,0,0,label);
\r
1900 vp.translate(pp.x-cp.x, pp.y-cp.y);
\r
1901 jLayeredPane_space_main_view.scrollRectToVisible(new Rectangle(vp, vport.getSize()));
\r
1902 pp.setLocation(cp);
\r
1906 public void mousePressed(MouseEvent e) {
\r
1907 pp.setLocation(e.getLocationOnScreen());
\r
1908 jLayeredPane_space_main_view.setCursor(hndCursor);
\r
1912 public void mouseReleased(MouseEvent e) {
\r
1913 jLayeredPane_space_main_view.setCursor(defCursor);
\r
1917 public void mouseMoved(MouseEvent e) {
\r
1922 * サイドツリーにつけるリスナー(ツリーの展開状態を記憶する)
\r
1924 private final TreeExpansionListener tel_nodeexpansion = new TreeExpansionListener() {
\r
1927 public void treeExpanded(TreeExpansionEvent event) {
\r
1932 public void treeCollapsed(TreeExpansionEvent event) {
\r
1938 * サイドツリーにつけるリスナー(クリックで描画実行)
\r
1940 private final TreeSelectionListener tsl_nodeselected = new TreeSelectionListener() {
\r
1942 public void valueChanged(TreeSelectionEvent e){
\r
1944 TreePath path = jTree_tree.getSelectionPath();
\r
1946 if ( path != null && path.getPathCount() == 2 ) {
\r
1951 if ( path != null && path.getPathCount() == 3 ) {
\r
1953 if (env.getDebug()) System.out.println(DBGID+"SELECTED treeSelListner "+path);
\r
1957 JTreeLabel.Nodes node = JTreeLabel.Nodes.getNode(path.getPathComponent(1).toString());
\r
1958 String value = path.getLastPathComponent().toString();
\r
1962 if ( JTreeLabel.Nodes.NOW.getLabel().equals(value) ) {
\r
1964 redrawByNow(IterationType.ALL);
\r
1967 redrawByDate(value,IterationType.ALL);
\r
1969 if ( env.isPagerEnabled() ) {
\r
1970 setPagerEnabled(true);
\r
1974 if ( JTreeLabel.Nodes.NOW.getLabel().equals(value) ) {
\r
1975 redrawByNow(IterationType.TERRA);
\r
1978 redrawByDate(value,IterationType.TERRA);
\r
1980 if ( env.isPagerEnabled() ) {
\r
1981 setPagerEnabled(true);
\r
1985 if ( JTreeLabel.Nodes.NOW.getLabel().equals(value) ) {
\r
1986 redrawByNow(IterationType.BS);
\r
1989 redrawByDate(path.getLastPathComponent().toString(),IterationType.BS);
\r
1991 if ( env.isPagerEnabled() ) {
\r
1992 setPagerEnabled(true);
\r
1996 if ( JTreeLabel.Nodes.NOW.getLabel().equals(value) ) {
\r
1997 redrawByNow(IterationType.CS);
\r
2000 redrawByDate(path.getLastPathComponent().toString(),IterationType.CS);
\r
2002 if ( env.isPagerEnabled() ) {
\r
2003 setPagerEnabled(true);
\r
2007 redrawByCenter(value);
\r
2008 if ( env.isPagerEnabled() ) {
\r
2009 setPagerEnabled(false);
\r
2013 PassedProgram passed = tvprograms.getPassed();
\r
2014 if ( passed.loadAllCenters(value) ) {
\r
2015 redrawByDate(value, IterationType.PASSED);
\r
2018 MWin.appendError(ERRID+"過去ログが存在しません: "+value);
\r
2021 if ( env.isPagerEnabled() ) {
\r
2022 setPagerEnabled(true);
\r
2029 jLabel_tree.setView(node, value);
\r
2033 // なんかおかしいのでデフォルト選択にまわす
\r
2034 CommonUtils.printStackTrace();
\r
2035 MWin.appendError(ERRID+"バグの可能性あり");
\r
2036 //redrawByNow(IterationType.ALL);
\r
2037 //jLabel_tree.setView(JTreeLabel.Nodes.DATE, JTreeLabel.Nodes.NOW.getLabel());
\r
2042 * フルスクリーン時にツリーを隠したりするの
\r
2044 private final MouseListener ml_treehide = new MouseAdapter() {
\r
2045 public void mouseEntered(MouseEvent e) {
\r
2046 if (isFullScreen()) {
\r
2048 //StdAppendMessage("Show tree (N)");
\r
2051 public void mouseExited(MouseEvent e) {
\r
2052 if (isFullScreen()) {
\r
2053 setCollapseTree();
\r
2054 //StdAppendMessage("Hide tree (N)");
\r
2060 * 放送局名につけるリスナー(ダブルクリックで一週間表示にジャンプ)
\r
2062 private final MouseAdapter cnMouseAdapter = new MouseAdapter() {
\r
2064 private Color bgcolor = null;
\r
2066 public void mouseExited(MouseEvent e) {
\r
2067 ((JLabel)e.getSource()).setBackground(bgcolor);
\r
2069 public void mouseEntered(MouseEvent e) {
\r
2070 bgcolor = ((JLabel)e.getSource()).getBackground();
\r
2071 ((JLabel)e.getSource()).setBackground(new Color(180,180,255));
\r
2074 public void mouseClicked(MouseEvent e) {
\r
2075 if (e.getButton() == MouseEvent.BUTTON1) {
\r
2076 if (e.getClickCount() == 2) {
\r
2077 if ( cur_tuner == IterationType.PASSED ) {
\r
2078 MWin.appendMessage(MSGID+"過去ログでは一局表示に切り替えられません");
\r
2082 // 右ダブルクリックで局表示に切り替え
\r
2083 String center = ((JLabel)e.getSource()).getText();
\r
2084 StdAppendMessage(MSGID+"一局表示に切り替え:"+center);
\r
2085 //redrawByCenter(center);
\r
2086 jLabel_tree.setView(JTreeLabel.Nodes.BCAST, center);
\r
2094 * 日付枠につけるリスナー(ダブルクリックで放送局別表示にジャンプ)
\r
2096 private final MouseAdapter tbMouseAdapter = new MouseAdapter() {
\r
2097 private Color bgcolor = null;
\r
2099 public void mouseExited(MouseEvent e) {
\r
2100 ((JTXTLabel)e.getSource()).setBackground(bgcolor);
\r
2102 public void mouseEntered(MouseEvent e) {
\r
2103 bgcolor = ((JTXTLabel)e.getSource()).getBackground();
\r
2104 ((JTXTLabel)e.getSource()).setBackground(new Color(180,180,255));
\r
2108 public void mouseClicked(MouseEvent e) {
\r
2109 if (e.getButton() == MouseEvent.BUTTON1) {
\r
2110 if (e.getClickCount() == 2) {
\r
2111 // 右ダブルクリックで日付表示に切り替え
\r
2112 String date = ((JTXTLabel)e.getSource()).getValue();
\r
2113 StdAppendMessage(MSGID+"日付表示に切り替え:"+date);
\r
2114 //redrawByDate(date, -1);
\r
2115 jLabel_tree.setView(JTreeLabel.Nodes.DATE, date);
\r
2124 /*******************************************************************************
\r
2126 ******************************************************************************/
\r
2128 private JDetailPanel getJTextPane_detail() {
\r
2129 if (jTextPane_detail == null) {
\r
2130 jTextPane_detail = new JDetailPanel();
\r
2131 jTextPane_detail.setRows(bounds.getDetailRows());
\r
2132 //Dimension d = jTextPane_detail.getMaximumSize();
\r
2133 //d.height = bounds.getDetailAreaHeight();
\r
2134 //jTextPane_detail.setPreferredSize(d);
\r
2135 //jTextPane_detail.setVerticalAlignment(JLabel.TOP);
\r
2136 //jTextPane_detail.setHorizontalAlignment(JLabel.LEFT);
\r
2138 return jTextPane_detail;
\r
2141 private JSplitPane getJSplitPane_view() {
\r
2142 if ( jSplitPane_view == null ) {
\r
2144 jSplitPane_view = new JSplitPane() {
\r
2146 private static final long serialVersionUID = 1L;
\r
2149 public void setDividerLocation(int loc) {
\r
2150 setDividerEnvs(loc);
\r
2151 super.setDividerLocation(loc);
\r
2155 jSplitPane_view.setLeftComponent(getJPanel_tree());
\r
2156 jSplitPane_view.setRightComponent(getJScrollPane_space_main());
\r
2159 return jSplitPane_view;
\r
2162 private JPanel getJPanel_tree() {
\r
2163 if (jPanel_tree == null) {
\r
2164 jPanel_tree = new JPanel();
\r
2166 jPanel_tree.setLayout(new BorderLayout());
\r
2167 jPanel_tree.add(getJScrollPane_tree_top(), BorderLayout.PAGE_START);
\r
2168 jPanel_tree.add(getJScrollPane_tree(), BorderLayout.CENTER);
\r
2170 return jPanel_tree;
\r
2174 private JScrollPane getJScrollPane_tree_top() {
\r
2175 if (jScrollPane_tree_top == null) {
\r
2176 jScrollPane_tree_top = new JScrollPane();
\r
2177 jScrollPane_tree_top.setViewportView(getJLabel_tree());
\r
2178 jScrollPane_tree_top.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
\r
2179 jScrollPane_tree_top.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
\r
2181 return jScrollPane_tree_top;
\r
2183 private JTreeLabel getJLabel_tree() {
\r
2184 if (jLabel_tree == null) {
\r
2185 jLabel_tree = new JTreeLabel();
\r
2187 Dimension d = jLabel_tree.getMaximumSize();
\r
2188 d.height = bounds.getBangumiColumnHeight();
\r
2189 jLabel_tree.setPreferredSize(d);
\r
2190 jLabel_tree.setOpaque(true);
\r
2191 jLabel_tree.setBackground(Color.WHITE);
\r
2193 return jLabel_tree;
\r
2196 private JScrollPane getJScrollPane_tree() {
\r
2197 if (jScrollPane_tree == null) {
\r
2198 jScrollPane_tree = new JScrollPane();
\r
2200 jScrollPane_tree.setViewportView(getJTree_tree());
\r
2202 return jScrollPane_tree;
\r
2208 private JTree getJTree_tree() {
\r
2209 if (jTree_tree == null) {
\r
2212 jTree_tree = new JTree();
\r
2213 jTree_tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
\r
2214 jTree_tree.setRootVisible(env.getRootNodeVisible());
\r
2217 jTree_tree.setModel(new DefaultTreeModel(getTreeNodes()));
\r
2220 undoTreeExpansion();
\r
2222 // ツリーの開閉時に状態を保存する
\r
2223 jTree_tree.addTreeExpansionListener(tel_nodeexpansion);
\r
2225 // フルスクリーンの時に使う(新聞形式のツリーを自動的に隠す)
\r
2226 jTree_tree.addMouseListener(ml_treehide);
\r
2228 return jTree_tree;
\r
2234 private DefaultMutableTreeNode getTreeNodes() {
\r
2236 paperRootNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.ROOT.getLabel());
\r
2238 dateNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.DATE.getLabel());
\r
2239 dgNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.TERRA.getLabel());
\r
2240 bsNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.BS.getLabel());
\r
2241 csNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.CS.getLabel());
\r
2242 centerNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.BCAST.getLabel());
\r
2243 passedNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.PASSED.getLabel());
\r
2245 paperRootNode.add(dateNode);
\r
2246 paperRootNode.add(dgNode);
\r
2247 paperRootNode.add(bsNode);
\r
2248 paperRootNode.add(csNode);
\r
2249 paperRootNode.add(centerNode);
\r
2250 paperRootNode.add(passedNode);
\r
2253 redrawTreeByDate();
\r
2254 redrawTreeByCenter();
\r
2255 redrawTreeByPassed();
\r
2257 return paperRootNode;
\r
2260 private void undoTreeExpansion() {
\r
2263 stopTreeListener();
\r
2266 ter = new TreeExpansionReg(jTree_tree, TreeExpRegFile_Paper);
\r
2270 catch (Exception e) {
\r
2271 MWin.appendMessage(ERRID+"ツリー展開情報の解析で問題が発生しました");
\r
2272 e.printStackTrace();
\r
2276 ArrayList<TreePath> tpa = ter.get();
\r
2277 for ( TreePath path : tpa ) {
\r
2278 jTree_tree.expandPath(path);
\r
2281 startTreeListener();
\r
2284 private JScrollPane getJScrollPane_space_main() {
\r
2285 if (jScrollPane_space_main == null) {
\r
2286 jScrollPane_space_main = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
\r
2287 jScrollPane_space_main.getVerticalScrollBar().setUnitIncrement(bounds.getBangumiColumnHeight());
\r
2288 jScrollPane_space_main.getHorizontalScrollBar().setUnitIncrement(bounds.getBangumiColumnWidth());
\r
2290 //jScrollPane_space_main.setViewportView(getJLayeredPane_space_main_view());
\r
2291 jScrollPane_space_main.setColumnHeaderView(getJPanel_space_top_view());
\r
2292 jScrollPane_space_main.setRowHeaderView(getJPanel_space_side_view());
\r
2294 vport = jScrollPane_space_main.getViewport();
\r
2296 return jScrollPane_space_main;
\r
2299 private JPanel getJPanel_space_top_view() {
\r
2300 if (jPanel_space_top_view == null) {
\r
2301 jPanel_space_top_view = new JPanel();
\r
2302 jPanel_space_top_view.setLayout(new SpringLayout());
\r
2304 return jPanel_space_top_view;
\r
2307 private JPanel getJPanel_space_side_view() {
\r
2308 if (jPanel_space_side_view == null) {
\r
2309 jPanel_space_side_view = new JPanel();
\r
2310 jPanel_space_side_view.setLayout(null);
\r
2312 return jPanel_space_side_view;
\r
2317 * 以下は、pcwinから呼び出されるメソッドをまとめたもの
\r
2321 public Component[] getTimebarComponents() {
\r
2322 return jPanel_space_side_view.getComponents();
\r
2326 public void updateColors(Env ec,PaperColorsMap pc) {
\r
2327 _updPColors(ec, pc, frameUsed);
\r
2329 if ( env.getDrawcacheEnable() ) {
\r
2330 _updPColors(ec, pc, frameUsedByDate);
\r
2337 for ( Component c : getTimebarComponents() ) {
\r
2338 if ( c instanceof JTimebarLabel ) {
\r
2339 int j = Integer.valueOf(((JTimebarLabel) c).getTs());
\r
2340 if ( j >=6 && j <= 11 ) {
\r
2341 c.setBackground(ec.getTimebarColor());
\r
2343 else if ( j >=12 && j <= 17 ) {
\r
2344 c.setBackground(ec.getTimebarColor2());
\r
2346 else if ( j >=18 && j <= 23 ) {
\r
2347 c.setBackground(ec.getTimebarColor3());
\r
2350 c.setBackground(ec.getTimebarColor4());
\r
2357 public void updateBounds(Env ec, Bounds bc) {
\r
2359 int maxCol = jPanel_space_top_view.getComponentCount();
\r
2360 float maxRow = 24*60;
\r
2362 float phm = bc.getPaperHeightMultiplier() * paperHeightZoom ;
\r
2364 int vieww = maxCol * bc.getBangumiColumnWidth();
\r
2365 int viewh = (int) Math.ceil(maxRow * phm);
\r
2368 Point vp = vport.getViewPosition();
\r
2369 float vh = vport.getView().getPreferredSize().height;
\r
2373 int h = (int) Math.ceil(60.0F*phm);
\r
2375 for ( Component b0 : jPanel_space_side_view.getComponents() ) {
\r
2376 b0.setBounds(0,(int) Math.ceil((float)row*phm),bc.getTimebarColumnWidth(),h);
\r
2380 Dimension d = jPanel_space_side_view.getPreferredSize();
\r
2382 jPanel_space_side_view.setPreferredSize(d);
\r
2385 // 放送局名(or日付)のサイズ変更
\r
2387 for ( int col=0; col<jPanel_space_top_view.getComponentCount(); col++ ) {
\r
2388 Component b1 = jPanel_space_top_view.getComponent(col);
\r
2390 bc.getBangumiColumnWidth() * col,
\r
2392 bc.getBangumiColumnWidth(),
\r
2393 bc.getBangumiColumnHeight());
\r
2395 Dimension d = jPanel_space_top_view.getPreferredSize();
\r
2397 jPanel_space_top_view.setPreferredSize(d);
\r
2400 // 各番組枠のサイズ変更・検索マッチ枠の表示変更
\r
2403 _updPBounds(bc, frameUsed);
\r
2404 _updPBorders(ec, bc, frameUsed);
\r
2406 Dimension d = jLayeredPane_space_main_view.getPreferredSize();
\r
2409 jLayeredPane_space_main_view.setPreferredSize(d);
\r
2412 if ( ec.getDrawcacheEnable() ) {
\r
2413 _updPBounds(bc, frameUsedByDate);
\r
2414 _updPBorders(ec, bc, frameUsedByDate);
\r
2416 for ( JLayeredPane pane : jLayeredPane_space_main_view_byDate ) {
\r
2417 Dimension d = pane.getPreferredSize();
\r
2420 pane.setPreferredSize(d);
\r
2425 // 予約枠・ピックアップ枠のサイズ変更&色変更
\r
2427 JRMLabel.setColumnWidth(bc.getBangumiColumnWidth());
\r
2428 JRMLabel.setHeightMultiplier(phm);
\r
2430 for ( JRMLabel rb : reserveBorders ) {
\r
2434 if ( rb.getEncoder().equals(TUNERLABEL_PICKUP) ) {
\r
2435 rb.setEncBackground(ec.getPickedColor());
\r
2436 rb.setEncForeground(ec.getPickedFontColor());
\r
2437 rb.setBorder(new LineBorder(ec.getPickedColor(),4));
\r
2439 else if ( rb.getExec() ) {
\r
2440 rb.setEncForeground(ec.getExecOnFontColor());
\r
2443 rb.setEncForeground(ec.getExecOffFontColor());
\r
2450 setTimelinePos(false);
\r
2452 // 枠のサイズを更新したのでupdateUI()
\r
2453 jScrollPane_space_main.updateUI();
\r
2456 vp.y = (int)Math.ceil(maxRow * (float)vp.y * phm / vh);
\r
2457 vport.setViewPosition(vp);
\r
2462 public void updateFonts(Env ec) {
\r
2463 JTXTButton.setShowStart(ec.getShowStart());
\r
2464 JTXTButton.setSplitEpno(ec.getSplitEpno());
\r
2465 JTXTButton.setShowDetail(ec.getShowDetail());
\r
2466 JTXTButton.setDetailTab(ec.getDetailTab());
\r
2467 JTXTButton.setDetailRows(ec.getDetailRows());
\r
2469 JTXTButton.setTitleFont(ec.getTitleFont());
\r
2470 JTXTButton.setTitleFontStyle(ec.getTitleFontStyle());
\r
2471 JTXTButton.setDetailFont(ec.getDetailFont());
\r
2472 JTXTButton.setDetailFontStyle(ec.getDetailFontStyle());
\r
2473 JTXTButton.setTitleFontSize(ec.getTitleFontSize());
\r
2474 JTXTButton.setTitleFontColor(ec.getTitleFontColor());
\r
2475 JTXTButton.setDetailFontSize(ec.getDetailFontSize());
\r
2476 JTXTButton.setDetailFontColor(ec.getDetailFontColor());
\r
2477 JTXTButton.setAAHint(ec.getPaperAAMode().getHint());
\r
2481 public void updateRepaint() {
\r
2482 _updPRepaint(frameUsed);
\r
2484 if ( env.getDrawcacheEnable() ) {
\r
2485 _updPRepaint(frameUsedByDate);
\r
2491 private void _updPColors(Env ec, PaperColorsMap pc, ArrayList<JTXTButton> fa) {
\r
2492 for ( JTXTButton b2 : fa ) {
\r
2493 b2.setBackground(pc.get(b2.getInfo().genre));
\r
2497 private void _updPBounds(Bounds bc, ArrayList<JTXTButton> fa) {
\r
2499 JTXTButton.setColumnWidth(bc.getBangumiColumnWidth());
\r
2500 JTXTButton.setHeightMultiplier(bc.getPaperHeightMultiplier() * paperHeightZoom);
\r
2502 for ( JTXTButton b2 : fa ) {
\r
2507 private void _updPBorders(Env ec, Bounds bc, ArrayList<JTXTButton> fa) {
\r
2508 dborder.setDashColor(ec.getMatchedBorderColor());
\r
2509 dborder.setThickness(ec.getMatchedBorderThickness());
\r
2510 for ( JTXTButton b2 : fa ) {
\r
2511 if ( bc.getShowMatchedBorder() && b2.isStandby() ) {
\r
2512 if ( b2.getBorder() != dborder )
\r
2513 b2.setBorder(dborder);
\r
2516 if ( b2.getBorder() != lborder )
\r
2517 b2.setBorder(lborder);
\r
2522 private void _updPRepaint(ArrayList<JTXTButton> fa) {
\r
2523 for ( JTXTButton b2 : fa ) {
\r
2524 b2.forceRepaint();
\r