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
23 import javax.swing.JComponent;
\r
24 import javax.swing.JLabel;
\r
25 import javax.swing.JLayeredPane;
\r
26 import javax.swing.JPanel;
\r
27 import javax.swing.JScrollPane;
\r
28 import javax.swing.JSplitPane;
\r
29 import javax.swing.JTree;
\r
30 import javax.swing.JViewport;
\r
31 import javax.swing.SpringLayout;
\r
32 import javax.swing.border.LineBorder;
\r
33 import javax.swing.event.MouseInputListener;
\r
34 import javax.swing.event.TreeExpansionEvent;
\r
35 import javax.swing.event.TreeExpansionListener;
\r
36 import javax.swing.event.TreeSelectionEvent;
\r
37 import javax.swing.event.TreeSelectionListener;
\r
38 import javax.swing.tree.DefaultMutableTreeNode;
\r
39 import javax.swing.tree.TreeNode;
\r
40 import javax.swing.tree.TreePath;
\r
41 import javax.swing.tree.TreeSelectionModel;
\r
42 import javax.swing.tree.DefaultTreeModel;
\r
44 import tainavi.TVProgram.ProgType;
\r
45 import tainavi.TVProgramIterator.IterationType;
\r
46 import tainavi.VWMainWindow.MWinTab;
\r
51 * @since 3.15.4β {@link Viewer}から分離
\r
53 public abstract class AbsPaperView extends JPanel implements TickTimerListener,HDDRecorderListener {
\r
55 private static final long serialVersionUID = 1L;
\r
57 public static String getViewName() { return "新聞形式"; }
\r
59 public void setDebug(boolean b) { debug = b; }
\r
60 private static boolean debug = false;
\r
63 /*******************************************************************************
\r
65 ******************************************************************************/
\r
67 protected abstract Env getEnv();
\r
68 protected abstract Bounds getBoundsEnv();
\r
69 protected abstract PaperColorsMap getPaperColorMap();
\r
70 protected abstract ChannelSort getChannelSort();
\r
72 protected abstract TVProgramList getTVProgramList();
\r
73 protected abstract HDDRecorderList getRecorderList();
\r
75 protected abstract StatusWindow getStWin();
\r
76 protected abstract StatusTextArea getMWin();
\r
78 protected abstract AbsReserveDialog getReserveDialog();
\r
79 protected abstract Component getParentComponent();
\r
81 protected abstract void ringBeep();
\r
83 // クラス内のイベントから呼び出されるもの
\r
88 protected abstract void onShown();
\r
92 protected abstract void onHidden();
\r
97 protected abstract void showPopupForTraceProgram(
\r
98 final JComponent comp,
\r
99 final ProgDetailList tvd, final String keyword, final int threshold,
\r
100 final int x, final int y, final String clickedDateTime
\r
104 * 予約マーク・予約枠を更新してほしい
\r
106 protected abstract void updateReserveDisplay();
\r
111 protected abstract void addToPickup(final ProgDetailList tvd);
\r
113 protected abstract boolean isTabSelected(MWinTab tab);
\r
114 protected abstract void setSelectedTab(MWinTab tab);
\r
116 protected abstract boolean isFullScreen();
\r
118 * ページャーコンボボックスを更新してほしい
\r
120 protected abstract void setPagerEnabled(boolean b);
\r
121 protected abstract int getPagerCount();
\r
122 protected abstract int getSelectedPagerIndex();
\r
123 protected abstract void setSelectedPagerIndex(int idx);
\r
124 protected abstract void setPagerItems(TVProgramIterator pli, int curindex);
\r
126 protected abstract String getExtensionMark(ProgDetailList tvd);
\r
127 protected abstract String getOptionMark(ProgDetailList tvd);
\r
128 protected abstract String getPostfixMark(ProgDetailList tvd);
\r
131 * ツリーペーンの幅の変更を保存してほしい
\r
133 protected abstract void setDividerEnvs(int loc);
\r
137 /*******************************************************************************
\r
139 ******************************************************************************/
\r
142 private final Env env = getEnv();
\r
143 private final Bounds bounds = getBoundsEnv();
\r
144 private final PaperColorsMap pColors = getPaperColorMap();
\r
145 private final ChannelSort chsort = getChannelSort();
\r
147 private final TVProgramList tvprograms = getTVProgramList();
\r
148 private final HDDRecorderList recorders = getRecorderList();
\r
150 private final StatusWindow StWin = getStWin(); // これは起動時に作成されたまま変更されないオブジェクト
\r
151 private final StatusTextArea MWin = getMWin(); // これは起動時に作成されたまま変更されないオブジェクト
\r
152 private final AbsReserveDialog rD = getReserveDialog(); // これは起動時に作成されたまま変更されないオブジェクト
\r
154 private final Component parent = getParentComponent(); // これは起動時に作成されたまま変更されないオブジェクト
\r
157 private void StdAppendMessage(String message) { System.out.println(message); }
\r
158 private void StdAppendError(String message) { System.err.println(message); }
\r
159 //private void StWinSetVisible(boolean b) { StWin.setVisible(b); }
\r
160 //private void StWinSetLocationCenter(Component frame) { CommonSwingUtils.setLocationCenter(frame, (VWStatusWindow)StWin); }
\r
164 /*******************************************************************************
\r
166 ******************************************************************************/
\r
168 private final String MSGID = "["+getViewName()+"] ";
\r
169 private final String ERRID = "[ERROR]"+MSGID;
\r
170 private final String DBGID = "[DEBUG]"+MSGID;
\r
172 private final int DASHBORDER_LENGTH = 6; // ダッシュの長さ
\r
173 private final int DASHBORDER_SPACE = 4; // ダッシュの間隔
\r
175 private static final String TreeExpRegFile_Paper = "env"+File.separator+"tree_expand_paper.xml";
\r
177 private static final int TIMEBAR_START = Viewer.TIMEBAR_START;
\r
180 private static final String TUNERLABEL_PICKUP = "PICKUP";
\r
185 * 現在時刻追従スクロールで日付がかわったかどうかを確認するための情報を保持する
\r
187 private String prevDT4Now = CommonUtils.getDate529(0,true);
\r
188 private String prevDT4Tree = prevDT4Now;
\r
193 private int framebuffersize = 512;
\r
196 /*******************************************************************************
\r
198 ******************************************************************************/
\r
202 private JDetailPanel jTextPane_detail = null;
\r
203 private JSplitPane jSplitPane_view = null;
\r
204 private JPanel jPanel_tree = null;
\r
205 private JScrollPane jScrollPane_tree_top = null;
\r
206 private JTreeLabel jLabel_tree = null;
\r
207 private JScrollPane jScrollPane_tree = null;
\r
208 private JTree jTree_tree = null;
\r
209 private JScrollPane jScrollPane_space_main = null;
\r
210 private JLayeredPane jLayeredPane_space_main_view = null;
\r
211 private ArrayList<JTaggedLayeredPane> jLayeredPane_space_main_view_byDate = null;
\r
212 private JLayeredPane jLayeredPane_space_main_view_byMakeshift = null;
\r
213 private JPanel jPanel_space_top_view = null;
\r
214 private JPanel jPanel_space_side_view = null;
\r
215 private JViewport vport = null;
\r
217 private final JTimeline jLabel_timeline = new JTimeline();
\r
219 private DefaultMutableTreeNode paperRootNode = null; // 新聞形式のツリー
\r
220 private DefaultMutableTreeNode dateNode = null;
\r
221 private DefaultMutableTreeNode dgNode = null;
\r
222 private DefaultMutableTreeNode bsNode = null;
\r
223 private DefaultMutableTreeNode csNode = null;
\r
224 private DefaultMutableTreeNode centerNode = null;
\r
225 private DefaultMutableTreeNode passedNode = null;
\r
227 private DefaultMutableTreeNode defaultNode = null;
\r
231 // 番組枠をしまっておくバッファ(newが遅いので一回作ったら捨てない)
\r
232 private ArrayList<JTXTButton> frameUsed = new ArrayList<JTXTButton>(); // 画面に表示されている番組枠
\r
233 private ArrayList<JTXTButton> frameUnused = new ArrayList<JTXTButton>(); // 未使用の予備
\r
234 private ArrayList<JTXTButton> frameUsedByDate = new ArrayList<JTXTButton>(); // 高速描画時の日付別ペーンに表示されている番組枠。高速描画時も、過去ログはframeUsedが使われる
\r
236 // 予約枠をしまっておくバッファ(検索用)
\r
237 private ArrayList<JRMLabel> reserveBorders = new ArrayList<JRMLabel>();
\r
240 TreeExpansionReg ter = null;
\r
242 DefaultMutableTreeNode nowNode = null;
\r
245 private boolean timer_now_enabled = false;
\r
247 private IterationType cur_tuner = null;
\r
251 private final DashBorder dborder = new DashBorder(Color.RED,env.getMatchedBorderThickness(),DASHBORDER_LENGTH,DASHBORDER_SPACE);
\r
252 private final DashBorder dborderK = new DashBorder(Color.MAGENTA,env.getMatchedBorderThickness(),DASHBORDER_LENGTH,DASHBORDER_SPACE);
\r
253 private final LineBorder lborder = new ChippedBorder(Color.BLACK,1);
\r
255 private float paperHeightZoom = 1.0F;
\r
260 private class JTimeline extends JLabel {
\r
262 private static final long serialVersionUID = 1L;
\r
264 private int minpos = 0;
\r
266 public int setMinpos(int x, int minpos, float multiplier) {
\r
267 if ( minpos >= 0 ) {
\r
268 this.minpos = minpos;
\r
271 int timeline = Math.round(this.minpos*multiplier);
\r
272 this.setLocation(x,timeline);
\r
278 /*******************************************************************************
\r
280 ******************************************************************************/
\r
282 public AbsPaperView() {
\r
286 this.setLayout(new BorderLayout());
\r
287 this.add(getJTextPane_detail(), BorderLayout.PAGE_START);
\r
288 this.add(getJSplitPane_view(), BorderLayout.CENTER);
\r
290 // タブが開いたり閉じたりしたときの処理
\r
291 this.addComponentListener(cl_shownhidden);
\r
296 /*******************************************************************************
\r
298 ******************************************************************************/
\r
300 // 主に他のクラスから呼び出されるメソッド
\r
302 public String getFrameBufferStatus() { return String.format("%d/%d",frameUsed.size(),framebuffersize); }
\r
307 public void jumpToNow() {
\r
308 if ( nowNode != null ) {
\r
309 TreePath tp = new TreePath(nowNode.getPath());
\r
310 jTree_tree.setSelectionPath(null);
\r
311 jTree_tree.setSelectionPath(tp);
\r
316 * ツールバーから過去ログへのジャンプ
\r
318 public boolean jumpToPassed(String passed) {
\r
321 if ( env.isPagerEnabled() ) {
\r
322 setPagerEnabled(true);
\r
328 GregorianCalendar c = CommonUtils.getCalendar(passed);
\r
329 String adate = CommonUtils.getDate(c);
\r
331 // 指定日付に移動して放送局の位置を確認する
\r
332 TVProgramIterator pli = redrawByDateWithCenter(null,adate);
\r
333 if ( pli == null ) {
\r
335 MWin.appendError(ERRID+"ジャンプ先の日付がみつかりません: "+adate);
\r
341 if ( ! isTabSelected(MWinTab.PAPER) ) {
\r
342 setSelectedTab(MWinTab.PAPER);
\r
349 * リスト形式・本体予約一覧からの目的の番組へジャンプ
\r
351 public boolean jumpToBangumi(String center, String startdt) {
\r
354 if ( env.isPagerEnabled() ) {
\r
355 setPagerEnabled(true);
\r
362 GregorianCalendar c = CommonUtils.getCalendar(startdt);
\r
363 int hour = c.get(Calendar.HOUR_OF_DAY);
\r
364 int min = c.get(Calendar.MINUTE);
\r
366 String adate = CommonUtils.getDate(c);
\r
367 String adate529 = CommonUtils.getDate529(c,true);
\r
370 // 指定日付に移動して放送局の位置を確認する
\r
371 TVProgramIterator pli = redrawByDateWithCenter(center,adate529);
\r
372 if ( pli == null ) {
\r
374 MWin.appendError(ERRID+"ジャンプ先の日付がみつかりません: "+adate529);
\r
380 if ( ! isTabSelected(MWinTab.PAPER) ) {
\r
381 setSelectedTab(MWinTab.PAPER);
\r
389 int crindex = pli.getIndex(center);
\r
390 if ( crindex == -1 ) {
\r
391 MWin.appendError(ERRID+"「"+center+"」は有効な放送局ではありません");
\r
397 if ( env.isPagerEnabled() ) {
\r
398 int idx = env.getPageIndex(1+crindex);
\r
399 x = (crindex - idx*env.getCenterPerPage()) * bounds.getBangumiColumnWidth();
\r
402 x = crindex * bounds.getBangumiColumnWidth();
\r
407 if (adate529.equals(adate)) {
\r
408 if (hour < TIMEBAR_START) {
\r
409 hour = TIMEBAR_START;
\r
416 y = Math.round((float)((hour-TIMEBAR_START)*60+min)*bounds.getPaperHeightMultiplier()*paperHeightZoom);
\r
420 // Viewのサイズ変更をJavaまかせにすると実際に表示されるまで変更されないので明示的に変更しておく
\r
421 Dimension dm = vport.getView().getPreferredSize();
\r
422 vport.setViewSize(dm);
\r
425 Point pos = new Point(0, 0);
\r
426 //vport.setViewPosition(pos);
\r
428 Rectangle ra = vport.getViewRect();
\r
429 pos.x = x + bounds.getBangumiColumnWidth()/2 - ra.width/2;
\r
430 pos.y = y - ra.height/4;
\r
432 // ViewのサイズがViewPortのサイズより小さい場合はsetViewPosition()が正しく動作しないので0にする
\r
433 if (pos.x < 0 || dm.width < ra.width) {
\r
436 else if ((dm.width - ra.width) < pos.x) {
\r
437 pos.x = dm.width - ra.width;
\r
440 if (pos.y < 0 || dm.height < ra.height) {
\r
443 else if ((dm.height - ra.height) < pos.y) {
\r
444 pos.y = dm.height - ra.height;
\r
447 vport.setViewPosition(pos);
\r
452 Point sc = vport.getLocationOnScreen();
\r
453 Point pos = vport.getViewPosition();
\r
455 Point loc = new Point();
\r
456 loc.x = sc.x + (x + bounds.getBangumiColumnWidth()/2) - pos.x;
\r
457 loc.y = sc.y + (y + Math.round(5*bounds.getPaperHeightMultiplier()*paperHeightZoom)) - pos.y;
\r
460 Robot robo = new Robot();
\r
461 robo.mouseMove(loc.x,loc.y);
\r
463 } catch (AWTException e) {
\r
464 e.printStackTrace();
\r
474 public boolean redrawByPager() {
\r
476 //JTreeLabel.Nodes node = jLabel_tree.getNode();
\r
477 String value = jLabel_tree.getValue();
\r
479 if ( value != null ) {
\r
480 if ( JTreeLabel.Nodes.NOW.getLabel().equals(value) ) {
\r
481 redrawByNow(cur_tuner);
\r
484 redrawByDate(value, cur_tuner);
\r
495 * @see #putReserveBorder(String, String, int)
\r
497 public void updateReserveBorder(String center) {
\r
499 // 予約の赤枠を表示する(上:日付別表示中、下:放送局別表示中)
\r
501 JTreeLabel.Nodes node = jLabel_tree.getNode();
\r
502 String value = jLabel_tree.getValue();
\r
511 IterationType sTyp;
\r
514 sTyp = IterationType.TERRA;
\r
517 sTyp = IterationType.BS;
\r
520 sTyp = IterationType.CS;
\r
523 sTyp = IterationType.ALL;
\r
529 if ( JTreeLabel.Nodes.NOW.getLabel().equals(dt) ) {
\r
530 dt = CommonUtils.getDate529(0,true);
\r
533 TVProgramIterator pli = tvprograms.getIterator().build(chsort.getClst(), sTyp);
\r
535 // ページャーが有効なら表示すべきページ番号を取得する
\r
537 int colmax = pli.size();
\r
539 if ( env.isPagerEnabled() ) {
\r
540 int selectedpage = getSelectedPagerIndex(); // 予約枠の描画なのだから、ページ移動の必要はないはずだ
\r
541 if ( selectedpage >= 0 ) {
\r
542 colmin = env.getCenterPerPage() * selectedpage;
\r
543 colmax = colmin + env.getCenterPerPage()-1;
\r
544 divider = env.getCenterPerPage();
\r
547 StWin.appendError(ERRID+"ページャーコンボボックスが不正です: "+selectedpage);
\r
552 if ( center != null ) {
\r
554 int cnt = pli.getIndex(center);
\r
555 if ( colmin <= cnt && cnt <= colmax ) {
\r
556 int col = (divider==0) ? (cnt) : (cnt % divider);
\r
557 putReserveBorder(dt, center, col);
\r
563 for ( ProgList pl : pli ) {
\r
565 if ( cnt < colmin ) {
\r
568 else if ( cnt > colmax ) {
\r
572 int col = (divider==0) ? (cnt) : (cnt % divider);
\r
574 putReserveBorder(dt, pl.Center, col);
\r
583 if (center != null && ! center.equals(value)) {
\r
587 if (center == null) {
\r
592 TVProgramIterator pli = tvprograms.getIterator().build(chsort.getClst(), IterationType.ALL);
\r
593 int cnt = tvprograms.getIterator().getIndex(center);
\r
595 MWin.appendError(ERRID+"「"+center+"」は有効な放送局ではありません");
\r
598 ProgList pl = pli.getP();
\r
599 for (int col=0; col<pl.pdate.size(); col++) {
\r
601 putReserveBorder(pl.pdate.get(col).Date, center, col);
\r
615 public void updateBangumiColumns() {
\r
616 for (JTXTButton b : frameUsed ) {
\r
617 ProgDetailList tvd = b.getInfo();
\r
618 if ( tvd.type == ProgType.PROG ) {
\r
619 _updPBorder(bounds, b);
\r
625 * 予約待機赤枠の描画(ツールバーからのトグル操作)
\r
627 public boolean toggleMatchBorder() {
\r
630 bounds.setShowMatchedBorder( ! bounds.getShowMatchedBorder());
\r
632 _updPBorderAll(env, bounds, frameUsed);
\r
634 if ( env.getDrawcacheEnable() ) {
\r
635 _updPBorderAll(env, bounds, frameUsedByDate);
\r
638 return bounds.getShowMatchedBorder();
\r
643 * 新聞枠の拡縮(ツールバーからの操作)
\r
645 public void setZoom(int n) {
\r
646 paperHeightZoom = n * 0.01F;
\r
647 updateBounds(env, bounds);
\r
654 public void clearPanel() {
\r
660 for ( JRMLabel b : reserveBorders) {
\r
661 jLayeredPane_space_main_view.remove(b);
\r
663 reserveBorders.clear();
\r
666 if (jLabel_timeline != null && jLayeredPane_space_main_view != null) {
\r
667 jLayeredPane_space_main_view.remove(jLabel_timeline);
\r
670 // 時間枠・日付枠・放送局枠の初期化
\r
671 jPanel_space_top_view.removeAll();
\r
672 redrawTimebar(jPanel_space_side_view);
\r
675 //paper.jLabel_tree.setText("");
\r
680 * <P>高速描画ONの場合は、主ペーンのほかに複数の日付別ペーンが作成されるのでどれを利用するか選択する。
\r
681 * @param pane : nullの場合、主ペーンを選択する。過去ログは常にnullで。
\r
682 * @see #jLayeredPane_space_main_view_byMakeshift 主ペーン
\r
683 * @see #jLayeredPane_space_main_view_byDate 日付別ペーン
\r
685 private void selectMainView(JLayeredPane pane) {
\r
688 Point p = vport.getViewPosition();
\r
690 if (pane == null) {
\r
692 StdAppendMessage(MSGID+"番組枠描画バッファをリセット: "+frameUsed.size()+"/"+framebuffersize);
\r
693 for (int i=frameUsed.size()-1; i>=0; i--) {
\r
694 JTXTButton b = frameUsed.remove(i);
\r
695 b.setToolTipText(null);
\r
697 frameUnused.add(b);
\r
698 //jLayeredPane_space_main_view_byMakeshift.remove(b); // 削除しちゃダメよ?
\r
701 if (jLayeredPane_space_main_view == jLayeredPane_space_main_view_byMakeshift) {
\r
704 jScrollPane_space_main.setViewportView(jLayeredPane_space_main_view = jLayeredPane_space_main_view_byMakeshift);
\r
707 if (jLayeredPane_space_main_view == pane) {
\r
710 jScrollPane_space_main.setViewportView(jLayeredPane_space_main_view = pane);
\r
714 vport.setViewPosition(p);
\r
720 private void startTimer() {
\r
721 timer_now_enabled = true;
\r
727 private boolean stopTimer() {
\r
728 jLabel_timeline.setVisible(false);
\r
729 return (timer_now_enabled = false);
\r
733 * サイドツリーの「現在日時」を選択する
\r
735 public void selectTreeDefault() {
\r
736 if ( defaultNode != null ) jTree_tree.setSelectionPath(new TreePath(defaultNode.getPath()));
\r
740 * サイドツリーの現在選択中のノードを再度選択して描画しなおす
\r
742 public void reselectTree() {
\r
743 String[] names = new String[] { jLabel_tree.getNode().getLabel(), jLabel_tree.getValue() };
\r
744 TreeNode[] nodes = ter.getSelectedPath(paperRootNode, names, 0);
\r
745 if (nodes != null) {
\r
746 TreePath tp = new TreePath(nodes);
\r
747 if ( tp != null ) {
\r
749 Point vp = vport.getViewPosition(); //= SwingUtilities.convertPoint(vport,0,0,label);
\r
751 jTree_tree.setSelectionPath(null);
\r
752 jTree_tree.setSelectionPath(tp);
\r
754 if (vp.x != 0 && vp.y != 0) {
\r
755 jLayeredPane_space_main_view.scrollRectToVisible(new Rectangle(vp, vport.getSize()));
\r
764 public void setExpandTree() {
\r
765 jSplitPane_view.setDividerLocation(bounds.getTreeWidthPaper());
\r
766 jScrollPane_tree.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
\r
767 jScrollPane_tree.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
\r
773 public void setCollapseTree() {
\r
774 jSplitPane_view.setDividerLocation(bounds.getMinDivLoc());
\r
775 jScrollPane_tree.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
\r
776 jScrollPane_tree.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
\r
780 * サイドツリーの展開状態を設定ファイルに保存(鯛ナビ終了時に呼び出される)
\r
782 public void saveTreeExpansion() {
\r
787 * 画面上部の番組詳細領域の表示のON/OFF
\r
789 public void setDetailVisible(boolean aFlag) {
\r
790 jTextPane_detail.setVisible(aFlag);
\r
796 public Component getCenterPane() {
\r
797 return jPanel_space_top_view;
\r
803 public Component getTimebarPane() {
\r
804 return jPanel_space_side_view;
\r
810 public Component getCurrentPane() {
\r
811 return jLayeredPane_space_main_view;
\r
817 public String getCurrentView() {
\r
818 return jLabel_tree.getView();
\r
822 * 高速描画ONの場合に日付別ペーンを一気に全部描画する
\r
824 public void buildMainViewByDate() {
\r
826 if (env.getDebug()) System.out.println(DBGID+"CALLED buildMainViewByDate()");
\r
828 if (jLayeredPane_space_main_view_byMakeshift == null) {
\r
829 jLayeredPane_space_main_view_byMakeshift = new JLayeredPane();
\r
830 for (int i=0; i<framebuffersize; i++) {
\r
831 JTXTButton b2 = new JTXTButton();
\r
833 jLayeredPane_space_main_view_byMakeshift.add(b2);
\r
834 jLayeredPane_space_main_view_byMakeshift.setLayer(b2, 0);
\r
837 b2.addMouseListener(ml_risepopup);
\r
838 b2.addMouseMotionListener(ml_risepopup);
\r
839 frameUnused.add(b2);
\r
841 StdAppendMessage(MSGID+"番組枠描画バッファを初期化: "+framebuffersize);
\r
845 if (env.isPagerEnabled() || ! env.getDrawcacheEnable()) {
\r
846 jLayeredPane_space_main_view_byDate = null;
\r
850 jLayeredPane_space_main_view_byDate = new ArrayList<JTaggedLayeredPane>();
\r
851 frameUsedByDate = new ArrayList<JTXTButton>();
\r
852 new SwingBackgroundWorker(true) {
\r
855 protected Object doWorks() throws Exception {
\r
857 int dogDays = (env.getExpandTo8())?(8):(7);
\r
859 for ( int y=0; y < dogDays; y++ ) {
\r
860 jLayeredPane_space_main_view_byDate.add(new JTaggedLayeredPane());
\r
862 for ( int y=0; y < dogDays; y++ ) {
\r
863 String day = CommonUtils.getDate529(y*86400,true);
\r
865 jLayeredPane_space_main_view_byDate.get(y).setTagstr(day);
\r
867 StWin.appendMessage(MSGID+"番組表を構築します:"+day);
\r
868 redrawByDate(day,IterationType.ALL);
\r
874 protected void doFinally() {
\r
882 private void stopTreeListener() {
\r
883 jTree_tree.removeTreeSelectionListener(tsl_nodeselected);
\r
889 private void startTreeListener() {
\r
890 jTree_tree.addTreeSelectionListener(tsl_nodeselected);
\r
896 public void redrawTreeByDate() {
\r
898 stopTreeListener();
\r
899 TreePath tp = jTree_tree.getSelectionPath();
\r
901 _redrawTreeByDate(dateNode);
\r
902 _redrawTreeByDate(dgNode);
\r
903 _redrawTreeByDate(bsNode);
\r
904 _redrawTreeByDate(csNode);
\r
906 jTree_tree.setSelectionPath(tp);
\r
907 jTree_tree.updateUI();
\r
908 startTreeListener();
\r
911 private void _redrawTreeByDate(DefaultMutableTreeNode parent) {
\r
913 // ★★★ でふぉるとのーど ★★★
\r
914 DefaultMutableTreeNode nNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.NOW.getLabel());
\r
915 if ( parent == dateNode ) {
\r
917 defaultNode = nNode;
\r
920 parent.removeAllChildren();
\r
922 int dogDays = (env.getExpandTo8())?(8):(7);
\r
923 for ( int i=0; i<dogDays; i++ ) {
\r
924 parent.add(new DefaultMutableTreeNode(CommonUtils.getDate529(i*86400, true)));
\r
931 public void redrawTreeByCenter() {
\r
933 stopTreeListener();
\r
934 TreePath tp = jTree_tree.getSelectionPath();
\r
936 centerNode.removeAllChildren();
\r
937 TVProgramIterator pli = tvprograms.getIterator();
\r
938 pli.build(chsort.getClst(), IterationType.ALL);
\r
939 for ( ProgList pl : pli ) {
\r
940 centerNode.add(new DefaultMutableTreeNode(pl.Center));
\r
943 jTree_tree.setSelectionPath(tp);
\r
944 jTree_tree.updateUI();
\r
945 startTreeListener();
\r
951 public void redrawTreeByPassed() {
\r
953 stopTreeListener();
\r
954 TreePath tp = jTree_tree.getSelectionPath();
\r
956 passedNode.removeAllChildren();
\r
957 if ( env.getUsePassedProgram() ) {
\r
958 String[] dd = new PassedProgram().getDateList(env.getPassedLogLimit());
\r
959 for ( int i=1; i<dd.length && i<=env.getPassedLogLimit(); i++ ) {
\r
960 passedNode.add(new DefaultMutableTreeNode(dd[i]));
\r
964 jTree_tree.setSelectionPath(tp);
\r
965 jTree_tree.updateUI();
\r
966 startTreeListener();
\r
972 private void redrawTimebar(JPanel jp)
\r
976 float phm60 = 60.0F * bounds.getPaperHeightMultiplier() * paperHeightZoom;
\r
978 for (int row=0; row<24; row++) {
\r
980 int hour = row+TIMEBAR_START;
\r
982 JTimebarLabel b0 = new JTimebarLabel(Integer.toString(hour));
\r
984 if ( hour >=6 && hour <= 11 ) {
\r
985 b0.setBackground(env.getTimebarColor());
\r
987 else if ( hour >=12 && hour <= 17 ) {
\r
988 b0.setBackground(env.getTimebarColor2());
\r
990 else if ( hour >=18 && hour <= 23 ) {
\r
991 b0.setBackground(env.getTimebarColor3());
\r
994 b0.setBackground(env.getTimebarColor4());
\r
996 b0.setOpaque(true);
\r
997 b0.setBorder(lborder);
\r
998 b0.setHorizontalAlignment(JLabel.CENTER);
\r
1002 (int) Math.ceil((float)row*phm60),
\r
1003 bounds.getTimebarColumnWidth(),
\r
1004 (int) Math.ceil(phm60));
\r
1009 Dimension d = jp.getMaximumSize();
\r
1010 d.width = bounds.getTimebarColumnWidth();
\r
1011 d.height = (int) Math.ceil(24*phm60);
\r
1012 jp.setPreferredSize(d);
\r
1019 * @see #redrawByDate(String, IterationType)
\r
1021 private void redrawByNow(final IterationType tuner) {
\r
1027 redrawByDate(CommonUtils.getDate529(0,true),tuner);
\r
1030 jLabel_timeline.setVisible(true);
\r
1031 Dimension dm = jLayeredPane_space_main_view.getPreferredSize();
\r
1032 //dm.height = Math.round(1*bounds.getPaperHeightMultiplier()*paperHeightZoom);
\r
1034 jLabel_timeline.setBorder(new LineBorder(Color.RED,2));
\r
1035 jLabel_timeline.setBackground(Color.RED);
\r
1036 jLabel_timeline.setOpaque(true);
\r
1037 jLabel_timeline.setBounds(0, 0, dm.width, dm.height);
\r
1038 jLayeredPane_space_main_view.add(jLabel_timeline);
\r
1039 jLayeredPane_space_main_view.setLayer(jLabel_timeline, 2);
\r
1042 setTimelinePos(true);
\r
1044 // 新しいタイマーの作成(1分ごとに線を移動する)
\r
1050 * @see #_redrawByDateWithCenter(String, String, IterationType)
\r
1052 private TVProgramIterator redrawByDate(String date, IterationType tuner) {
\r
1053 return _redrawByDateWithCenter(null,date,tuner);
\r
1057 * 日付別に表を作成する(ページャーが有効な場合は指定の放送局のあるページを開く)
\r
1058 * @see #_redrawByDateWithCenter(String, String, IterationType)
\r
1060 private TVProgramIterator redrawByDateWithCenter(String center, String date) {
\r
1063 String ndate529 = CommonUtils.getDate529(0, true);
\r
1066 IterationType tuner;
\r
1067 JTreeLabel.Nodes node;
\r
1068 if ( ndate529.compareTo(date) > 0 ) {
\r
1069 tuner = IterationType.PASSED;
\r
1070 node = JTreeLabel.Nodes.PASSED;
\r
1073 tuner = IterationType.ALL;
\r
1074 node = JTreeLabel.Nodes.DATE;
\r
1077 if ( tuner == IterationType.PASSED ) {
\r
1079 PassedProgram passed = tvprograms.getPassed();
\r
1080 if ( ! passed.loadAllCenters(date) ) {
\r
1081 System.err.println(ERRID+"過去ログの取得に失敗しました: "+date);
\r
1087 TVProgramIterator pli = _redrawByDateWithCenter(center, date, tuner);
\r
1089 getJTree_tree().getSelectionModel().setSelectionPath(null); // 選択は解除する
\r
1091 jLabel_tree.setView(node, date);
\r
1098 * @see #redrawByDate(String, IterationType)
\r
1099 * @see #redrawByDateWithCenter(String, String)
\r
1101 private TVProgramIterator _redrawByDateWithCenter(String center, String date, IterationType tuner) {
\r
1103 if (env.getDebug()) System.out.println(DBGID+"CALLED redrawByDate() date="+date+" IterationType="+tuner);
\r
1108 cur_tuner = tuner;
\r
1110 if (date == null) {
\r
1115 TVProgramIterator pli = tvprograms.getIterator().build(chsort.getClst(),tuner);
\r
1121 boolean drawPrograms = true;
\r
1122 if ( tuner != IterationType.ALL || env.isPagerEnabled() || ! env.getDrawcacheEnable() ) {
\r
1123 selectMainView(null);
\r
1127 boolean nopane = true;
\r
1128 for ( JTaggedLayeredPane tlp : jLayeredPane_space_main_view_byDate ) {
\r
1129 if ( tlp.getTagstr().equals(date) ) {
\r
1130 selectMainView(tlp);
\r
1131 if ( tlp.getComponentCountInLayer(0) > 0 ) {
\r
1133 drawPrograms = false;
\r
1141 selectMainView(null);
\r
1147 int colmax = pli.size();
\r
1149 if ( env.isPagerEnabled() ) {
\r
1151 int selectedpage = getSelectedPagerIndex();
\r
1153 if ( center == null ) {
\r
1154 // とび先の指定がないのでもともと選択されていたページを再度選択したい
\r
1155 if ( selectedpage == -1 ) {
\r
1160 int maxindex = env.getPageIndex(pli.size());
\r
1161 if ( selectedpage > maxindex ) {
\r
1162 // ページ数かわったら、インデックスがはみだしちゃった
\r
1168 // 特定の日付の特定の放送局を表示したい
\r
1169 int crindex = pli.getIndex(center);
\r
1170 if ( crindex == -1 ) {
\r
1172 MWin.appendError(ERRID+"「"+center+"」は有効な放送局ではありません");
\r
1176 selectedpage = env.getPageIndex(1+crindex);
\r
1180 colmin = env.getCenterPerPage() * selectedpage;
\r
1181 colmax = colmin + (env.getCenterPerPage()-1);
\r
1182 divider = env.getCenterPerPage();
\r
1184 // ページャーコンボボックスの書き換え
\r
1185 setPagerItems(pli,env.getPageIndex(1+colmin));
\r
1189 //setPagerEnabled(true);
\r
1192 if (env.getDebug()) System.out.println(DBGID+"[描画開始] ch_start="+colmin+" ch_end="+colmax+" ch_size="+pli.size());
\r
1195 dborder.setDashColor(env.getMatchedBorderColor());
\r
1196 dborder.setThickness(env.getMatchedBorderThickness());
\r
1197 dborderK.setDashColor(env.getMatchedKeywordBorderColor());
\r
1198 dborderK.setThickness(env.getMatchedBorderThickness());
\r
1204 jPanel_space_top_view.setLayout(null);
\r
1207 for ( ProgList pl : pli ) {
\r
1211 if ( cnt < colmin ) {
\r
1214 else if ( cnt > colmax ) {
\r
1218 col = (divider==0) ? (cnt) : (cnt % divider);
\r
1220 //TVProgram tvp = tvprograms.get(pli.getSiteId());
\r
1222 //if (env.getDebug()) System.out.println(DBGID+"[描画中] "+pl.Center+" min="+colmin+" max="+colmax+" cnt="+cnt+" col="+col+" siteid="+siteid);
\r
1225 JLabel b1 = new JLabel(pl.Center);
\r
1226 b1.setOpaque(true);
\r
1227 b1.setBackground(pl.BgColor);
\r
1228 b1.setBorder(lborder);
\r
1229 b1.setHorizontalAlignment(JLabel.CENTER);
\r
1230 b1.setBounds(bounds.getBangumiColumnWidth()*col, 0, bounds.getBangumiColumnWidth(), bounds.getBangumiColumnHeight());
\r
1231 b1.addMouseListener(cnMouseAdapter);
\r
1232 jPanel_space_top_view.add(b1);
\r
1235 if (tuner != IterationType.PASSED) {
\r
1236 putReserveBorder(date, pl.Center, col);
\r
1240 if (drawPrograms == true) {
\r
1241 putBangumiColumns(pl, col, date);
\r
1245 ++col; // 描画後にパネルサイズの変更にも使う
\r
1247 if ( ! env.getDrawcacheEnable()) {
\r
1248 // 番組枠描画バッファサイズの上限を確認する
\r
1249 if (framebuffersize < frameUsed.size()) {
\r
1250 framebuffersize = frameUsed.size();
\r
1251 StdAppendMessage(MSGID+"番組枠描画バッファの上限を変更: "+frameUsed.size()+"/"+framebuffersize);
\r
1256 //jPanel_space_top_view.setPreferredSize(new Dimension(bounds.getTimebarColumnWidth()+cnt*bounds.getBangumiColumnWidth(),bounds.getBangumiColumnHeight()));
\r
1257 jPanel_space_top_view.setPreferredSize(new Dimension(col*bounds.getBangumiColumnWidth(),bounds.getBangumiColumnHeight()));
\r
1258 jPanel_space_top_view.updateUI();
\r
1260 jLayeredPane_space_main_view.setPreferredSize(new Dimension(bounds.getBangumiColumnWidth()*col,Math.round(24*60*bounds.getPaperHeightMultiplier()*paperHeightZoom)));
\r
1262 if (env.getDebug()) System.out.println(DBGID+"END redrawByDate() date="+date+" IterationType="+tuner);
\r
1271 private void redrawByCenter(String center)
\r
1277 if ( env.isPagerEnabled() ) {
\r
1278 setPagerEnabled(false);
\r
1283 selectMainView(null);
\r
1285 jPanel_space_top_view.setLayout(null);
\r
1287 for (int a=0; a<tvprograms.size(); a++) {
\r
1289 TVProgram tvp = tvprograms.get(a);
\r
1291 if (tvp.getType() != ProgType.PROG) {
\r
1295 for (ProgList pl : tvp.getCenters()) {
\r
1296 if (pl.enabled == true && pl.Center.equals(center)) {
\r
1298 for (int centerid=0; centerid<pl.pdate.size(); centerid++)
\r
1300 ProgDateList pcl = pl.pdate.get(centerid);
\r
1302 JTXTLabel b1 = new JTXTLabel();
\r
1303 GregorianCalendar c = CommonUtils.getCalendar(pcl.Date);
\r
1304 if ( c != null ) {
\r
1305 String date = CommonUtils.getDate(c);
\r
1306 b1.setValue(date);
\r
1307 b1.setText(date.substring(5));
\r
1308 b1.setOpaque(true);
\r
1309 if ( c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY ) {
\r
1310 b1.setBackground(new Color(90,90,255));
\r
1312 else if ( c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY ) {
\r
1313 b1.setBackground(new Color(255,90,90));
\r
1316 b1.setBackground(new Color(180,180,180));
\r
1319 b1.setBorder(lborder);
\r
1320 b1.setHorizontalAlignment(JLabel.CENTER);
\r
1321 b1.setBounds(bounds.getBangumiColumnWidth()*centerid, 0, bounds.getBangumiColumnWidth(), bounds.getBangumiColumnHeight());
\r
1322 b1.addMouseListener(tbMouseAdapter);
\r
1323 jPanel_space_top_view.add(b1);
\r
1325 //jPanel_space_top_view.setPreferredSize(new Dimension(bounds.getTimebarColumnWidth()+bounds.getBangumiColumnWidth()*tvprogram.getPlist().get(x).pcenter.size(),bounds.getBangumiColumnHeight()));
\r
1326 jPanel_space_top_view.setPreferredSize(new Dimension(bounds.getBangumiColumnWidth()*pl.pdate.size(),bounds.getBangumiColumnHeight()));
\r
1327 jPanel_space_top_view.updateUI();
\r
1332 putBangumiColumns(pl, -1, null);
\r
1336 for (int progid=0; progid<pl.pdate.size(); progid++) {
\r
1337 putReserveBorder(pl.pdate.get(progid).Date, pl.Center, progid);
\r
1341 jLayeredPane_space_main_view.setPreferredSize(new Dimension(tvp.getCenters().get(0).pdate.size()*bounds.getBangumiColumnWidth(),Math.round(24*60*bounds.getPaperHeightMultiplier()*paperHeightZoom)));
\r
1342 //jScrollPane_space_main.updateUI();
\r
1349 // 番組枠描画バッファサイズの上限を確認する
\r
1350 if (framebuffersize < frameUsed.size()) {
\r
1351 framebuffersize = frameUsed.size();
\r
1352 StdAppendMessage(MSGID+"番組枠描画バッファの上限を変更: "+frameUsed.size()+"/"+framebuffersize);
\r
1359 * @see #updateReserveBorder(String)
\r
1361 private void putReserveBorder(String date, String Center, int q) {
\r
1363 // 古いマークの削除(一見取りこぼしがあるように見えるが無問題)
\r
1364 for (int i=reserveBorders.size()-1; i>=0; i--) {
\r
1365 JRMLabel rb = reserveBorders.get(i);
\r
1366 if ( rb.getDate().equals(date) && rb.getCenter().equals(Center) ) {
\r
1367 rb.setVisible(false);
\r
1368 jLayeredPane_space_main_view.remove(rb);
\r
1369 reserveBorders.remove(i);
\r
1374 JRMLabel.setColumnWidth(bounds.getBangumiColumnWidth());
\r
1375 JRMLabel.setHeightMultiplier(bounds.getPaperHeightMultiplier() * paperHeightZoom);
\r
1378 GregorianCalendar cal = CommonUtils.getCritCalendar(date);
\r
1379 String topDateTime = CommonUtils.getDateTime(cal);
\r
1380 cal.add(Calendar.DATE, 1);
\r
1381 String bottomDateTime = CommonUtils.getDateTime(cal);
\r
1384 String passedCritDateTime = CommonUtils.getCritDateTime(env.getDisplayPassedReserve());
\r
1386 // ツールバーで選択されている実レコーダ
\r
1387 String myself = ( env.getEffectComboToPaper() ) ? (getSelectedMySelf()) : (null);
\r
1390 drawReserveBorders(date, Center, q, topDateTime, bottomDateTime, passedCritDateTime, myself);
\r
1393 drawPickupBorders(date, Center, q, topDateTime, bottomDateTime, passedCritDateTime, TUNERLABEL_PICKUP);
\r
1395 private void drawReserveBorders(String date, String Center, int q, String topDateTime, String bottomDateTime, String passedCritDateTime, String myself) {
\r
1396 if ( myself == HDDRecorder.SELECTED_PICKUP ) {
\r
1399 for ( HDDRecorder recorder : getSelectedRecorderList() ) {
\r
1400 for ( ReserveList r : recorder.getReserves()) {
\r
1402 // 「実行のみ表示」で無効な予約は表示しない
\r
1403 if ( env.getDisplayOnlyExecOnEntry() && ! r.getExec() ) {
\r
1408 if ( r.getCh_name() == null ) {
\r
1409 if ( r.getChannel() == null ) {
\r
1410 // CHコードすらないのはバグだろう
\r
1411 System.err.println(ERRID+"予約情報にCHコードが設定されていません。バグの可能性があります。 recid="+recorder.Myself()+" chname="+r.getCh_name());
\r
1417 if (r.getCh_name().equals(Center)) {
\r
1420 ArrayList<String> starts = new ArrayList<String>();
\r
1421 ArrayList<String> ends = new ArrayList<String>();
\r
1422 CommonUtils.getStartEndList(starts, ends, r);
\r
1425 for ( int j=0; j<starts.size(); j++ ) {
\r
1426 if ( passedCritDateTime.compareTo(ends.get(j)) > 0 ) {
\r
1427 // 過去情報の表示が制限されている場合
\r
1431 drawBorder(date,Center,topDateTime,bottomDateTime,starts.get(j),ends.get(j),r.getRec_min(),r.getTuner(),recorder.getColor(r.getTuner()),r.getExec(),q);
\r
1437 private void drawPickupBorders(String date, String Center, int q, String topDateTime, String bottomDateTime, String passedCritDateTime, String tuner) {
\r
1438 for ( ProgList pl : tvprograms.getPickup().getCenters() ) {
\r
1439 if ( ! pl.Center.equals(Center) ) {
\r
1442 for ( ProgDateList pcl : pl.pdate ) {
\r
1443 for ( ProgDetailList tvd : pcl.pdetail ) {
\r
1444 if ( passedCritDateTime.compareTo(tvd.endDateTime) > 0 ) {
\r
1445 // 過去情報の表示が制限されている場合
\r
1449 drawBorder(date,Center,topDateTime,bottomDateTime,tvd.startDateTime,tvd.endDateTime,tvd.length,tuner,env.getPickedColor(),false,q);
\r
1454 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
1455 drawBorder(date, Center, topDateTime, bottomDateTime, startDateTime, endDateTime, Integer.valueOf(recmin), tuner, CommonUtils.str2color(bordercol), exec, col);
\r
1457 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
1459 GregorianCalendar ca = CommonUtils.getCalendar(startDateTime);
\r
1460 int ahh = ca.get(Calendar.HOUR_OF_DAY);
\r
1461 int amm = ca.get(Calendar.MINUTE);
\r
1465 if (topDateTime.compareTo(startDateTime) <= 0 && startDateTime.compareTo(bottomDateTime) < 0) {
\r
1467 row = ahh - TIMEBAR_START;
\r
1471 row = row*60 + amm;
\r
1474 else if (startDateTime.compareTo(topDateTime) < 0 && topDateTime.compareTo(endDateTime) < 0) {
\r
1475 // 表示開始位置が番組の途中にある
\r
1477 length = recmin - (TIMEBAR_START*60 - ahh*60 - amm);
\r
1484 // 重複予約の場合のエンコーダマーク表示位置の調整
\r
1487 for (int k=0; k<reserveBorders.size(); k++) {
\r
1488 JRMLabel rb = reserveBorders.get(k);
\r
1489 if ( rb.getDate().equals(date) && rb.getCenter().equals(Center) ) {
\r
1490 int drow = rb.getVRow() - row;
\r
1491 int dlen = rb.getVHeight() - length;
\r
1492 if ( rb.getVColumn() == col && ((drow == 0 && dlen == 0) || ((drow == 1 || drow == -1) && (dlen == 0 || dlen == -1 || dlen == 1))) ) {
\r
1499 JRMLabel rb = new JRMLabel();
\r
1502 rb.setVerticalAlignment(JLabel.BOTTOM);
\r
1503 rb.setHorizontalAlignment(JLabel.RIGHT);
\r
1505 else if (rc == 1) {
\r
1506 rb.setVerticalAlignment(JLabel.BOTTOM);
\r
1507 rb.setHorizontalAlignment(JLabel.LEFT);
\r
1510 rb.setVerticalAlignment(JLabel.TOP);
\r
1511 rb.setHorizontalAlignment(JLabel.RIGHT);
\r
1514 // エンコーダの区別がないものは"■"を表示する
\r
1515 rb.setEncBackground(bordercol);
\r
1516 rb.setBorder(new LineBorder(bordercol,4));
\r
1517 if ( tuner != null && tuner.equals(TUNERLABEL_PICKUP) ) {
\r
1518 rb.setEncForeground(env.getPickedFontColor());
\r
1520 else if ( exec ) {
\r
1521 rb.setEncForeground(env.getExecOnFontColor());
\r
1524 rb.setEncForeground(env.getExecOffFontColor());
\r
1526 if (tuner == null || tuner.equals("")) {
\r
1527 rb.setEncoder("■");
\r
1530 rb.setEncoder(tuner);
\r
1535 rb.setCenter(Center);
\r
1538 jLayeredPane_space_main_view.add(rb);
\r
1539 jLayeredPane_space_main_view.setLayer(rb,1);
\r
1540 rb.setVBounds(col, row, 1, length);
\r
1541 rb.setVisible(true);
\r
1543 reserveBorders.add(rb);
\r
1549 * @param cnt -1:放送局別表示、>=0:日付表示
\r
1551 private void putBangumiColumns(ProgList pl, int cnt, String date) {
\r
1552 int ymax = pl.pdate.size();
\r
1554 for ( int dateid=0; dateid < ymax; dateid++ ) {
\r
1555 ProgDateList pcl = pl.pdate.get(dateid);
\r
1558 if ( ! pcl.Date.equals(date) ) {
\r
1565 else if ( cnt == -1 ) {
\r
1571 int zmax = pcl.pdetail.size();
\r
1572 for ( int progid=0; progid<zmax; progid++ ) {
\r
1573 ProgDetailList tvd = pcl.pdetail.get(progid);
\r
1574 if ( progid != 0 ) {
\r
1576 String[] st = tvd.start.split(":",2);
\r
1577 if ( st.length == 2 ) {
\r
1578 int ahh = Integer.valueOf(st[0]);
\r
1579 int amm = Integer.valueOf(st[1]);
\r
1580 if ( CommonUtils.isLateNight(ahh) ) {
\r
1583 row = (ahh-TIMEBAR_START)*60+amm;
\r
1586 // 「番組情報がありません」は前の番組枠のお尻に
\r
1591 // その日の最初のエントリは5:00以前の場合もあるので強制0スタート
\r
1596 putBangumiColumnSub(tvd, row, col);
\r
1598 // 「番組情報がありません」用に保存
\r
1599 pEnd = row + tvd.length;
\r
1603 private void putBangumiColumnSub(ProgDetailList tvd, int row, int col) {
\r
1606 JTXTButton b2 = null;
\r
1607 if (jLayeredPane_space_main_view == jLayeredPane_space_main_view_byMakeshift && ! frameUnused.isEmpty()) {
\r
1608 b2 = frameUnused.remove(frameUnused.size()-1);
\r
1609 //b2.setVisible(true); // JTXTButton.clear()内でsetVisible(false)しているので
\r
1613 b2 = new JTXTButton();
\r
1614 jLayeredPane_space_main_view.add(b2);
\r
1615 jLayeredPane_space_main_view.setLayer(b2, 0);
\r
1618 b2.addMouseListener(ml_risepopup);
\r
1619 b2.addMouseMotionListener(ml_risepopup);
\r
1621 if (jLayeredPane_space_main_view == jLayeredPane_space_main_view_byMakeshift) {
\r
1622 frameUsed.add(b2);
\r
1625 // 裏描画は十分遅いのでb2をUnusedキャッシュには入れず都度生成で構わない
\r
1626 frameUsedByDate.add(b2);
\r
1632 JTXTButton.setColumnWidth(bounds.getBangumiColumnWidth());
\r
1633 JTXTButton.setHeightMultiplier(bounds.getPaperHeightMultiplier() * paperHeightZoom);
\r
1635 b2.setBackground(pColors.get(tvd.genre));
\r
1636 _updPBorder(bounds, b2);
\r
1639 b2.setVBounds(col,row,1,tvd.length);
\r
1642 if ( env.getTooltipEnable() == true && ! tvd.title.equals("") && ! tvd.start.equals("") ) {
\r
1644 int tlen = bounds.getTooltipWidth();
\r
1645 for (int i=0; i<tvd.title.length(); i+=tlen) {
\r
1646 t += tvd.title.substring(i, (i+tlen<tvd.title.length())?(i+tlen):(tvd.title.length()))+"<BR>";
\r
1649 int dlen = tlen+2;
\r
1650 for (int i=0; i<tvd.detail.length(); i+=dlen) {
\r
1651 d += " "+tvd.detail.substring(i, (i+dlen<tvd.detail.length())?(i+dlen):(tvd.detail.length()))+"<BR>";
\r
1653 String e = getExtensionMark(tvd);
\r
1654 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
1660 * @param minpos : MINPOS.RESET=初回、MINPOS.UPDATE=自動更新時
\r
1662 private int setTimelinePos(boolean reset) {
\r
1663 if ( vport != null && jLabel_timeline != null && jLabel_timeline.isVisible() ) {
\r
1665 int correct = 0; // 24:00-28:59迄は前日の日付になる
\r
1666 GregorianCalendar c = CommonUtils.getCalendar(0);
\r
1667 if ( CommonUtils.isLateNight(c) ) {
\r
1668 c.add(Calendar.DATE, -1);
\r
1672 Point vp = vport.getViewPosition();
\r
1673 Point tp = jLabel_timeline.getLocation();
\r
1676 int minpos_new = (c.get(Calendar.HOUR_OF_DAY)-TIMEBAR_START+correct)*60+c.get(Calendar.MINUTE);
\r
1677 int timeline_vpos = jLabel_timeline.setMinpos(0, minpos_new, bounds.getPaperHeightMultiplier()*paperHeightZoom);
\r
1682 Rectangle ra = vport.getViewRect();
\r
1683 if ( minpos_new >= 30 ) {
\r
1685 ra.y = Math.round(timeline_vpos - (float)bounds.getTimelinePosition() * bounds.getPaperHeightMultiplier() * paperHeightZoom);
\r
1686 vport.setViewPosition(new Point(ra.x, ra.y));
\r
1690 if ( ra.y >= 30 ) {
\r
1691 vport.setViewPosition(new Point(ra.x, 0));
\r
1696 if ( env.getTimerbarScrollEnable() && minpos_new >= 30 ) {
\r
1697 // 自動更新(05:30まではスクロールしないよ)
\r
1698 vp.y += (timeline_vpos - tp.y);
\r
1699 vport.setViewPosition(vp);
\r
1703 jLabel_timeline.updateUI();
\r
1705 return minpos_new;
\r
1712 * 番組枠のクリック位置を日時に変換する
\r
1714 private String getClickedDateTime(ProgDetailList tvd, int clikedY) {
\r
1716 String clickedDateTime = null;
\r
1718 if ( clikedY >= 0 && tvd.start.length() != 0 ) {
\r
1719 // 新聞形式ならクリック位置の日時を算出する
\r
1720 GregorianCalendar cala = CommonUtils.getCalendar(tvd.startDateTime);
\r
1721 cala.add(Calendar.MINUTE, Math.round(((float)clikedY)/(bounds.getPaperHeightMultiplier()*paperHeightZoom)));
\r
1722 clickedDateTime = CommonUtils.getDateTime(cala);
\r
1725 return clickedDateTime;
\r
1729 /*******************************************************************************
\r
1731 ******************************************************************************/
\r
1734 * ツールバーでレコーダの選択イベントが発生
\r
1737 public void valueChanged(HDDRecorderSelectionEvent e) {
\r
1738 if (debug) System.out.println(DBGID+"recorder selection rised");
\r
1740 // 選択中のレコーダ情報を保存する
\r
1741 src_recsel = (HDDRecorderSelectable) e.getSource();
\r
1744 updateReserveBorder(null);
\r
1747 private String getSelectedMySelf() {
\r
1748 return ( src_recsel!=null ? src_recsel.getSelectedMySelf() : null );
\r
1751 private HDDRecorderList getSelectedRecorderList() {
\r
1752 return ( src_recsel!=null ? src_recsel.getSelectedList() : null );
\r
1755 private HDDRecorderSelectable src_recsel;
\r
1759 * レコーダ情報の変更イベントが発生
\r
1762 public void stateChanged(HDDRecorderChangeEvent e) {
\r
1763 // テーブルをリフレッシュする処理
\r
1769 /*******************************************************************************
\r
1771 ******************************************************************************/
\r
1777 public void timerRised(TickTimerRiseEvent e) {
\r
1779 String curDT = CommonUtils.getDate529(0,true);
\r
1781 if ( prevDT4Tree != null && ! prevDT4Tree.equals(curDT) ) {
\r
1782 // 日付が変わったらツリーを書き換える
\r
1783 redrawTreeByDate();
\r
1784 redrawTreeByPassed();
\r
1787 prevDT4Tree = curDT;
\r
1790 if ( timer_now_enabled ) {
\r
1792 if (prevDT4Now != null && ! prevDT4Now.equals(curDT)) {
\r
1794 StdAppendError(MSGID+"日付が変わったので番組表を切り替えます("+CommonUtils.getDateTime(0)+")");
\r
1795 redrawByNow(cur_tuner);
\r
1799 setTimelinePos(false);
\r
1803 prevDT4Now = curDT;
\r
1808 * タブを開いたり閉じたりしたときに動くリスナー
\r
1810 private ComponentListener cl_shownhidden = new ComponentAdapter() {
\r
1812 public void componentShown(ComponentEvent e) {
\r
1815 for ( TVProgram tvp : tvprograms ) {
\r
1820 for ( HDDRecorder recorder : recorders ) {
\r
1821 recorder.removePassedReserves();
\r
1827 setPagerEnabled(true);
\r
1831 public void componentHidden(ComponentEvent e) {
\r
1835 setPagerEnabled(false);
\r
1840 * 番組枠につけるマウス操作のリスナー
\r
1842 private final MouseInputListener ml_risepopup = new MouseInputListener() {
\r
1844 private final Cursor defCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
\r
1845 private final Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
\r
1846 private final Point pp = new Point();
\r
1848 private Color bgcolor = null;
\r
1851 public void mouseClicked(MouseEvent e) {
\r
1854 Point p = e.getPoint();
\r
1857 JTXTButton b = (JTXTButton) e.getSource();
\r
1858 ProgDetailList tvd = b.getInfo();
\r
1860 if (e.getButton() == MouseEvent.BUTTON3) {
\r
1861 if (e.getClickCount() == 1) {
\r
1862 // 右シングルクリックでメニューの表示
\r
1863 String clicked = getClickedDateTime(tvd, e.getY());
\r
1864 showPopupForTraceProgram(b, tvd, tvd.title, TraceKey.noFazzyThreshold, p.x, p.y, clicked);
\r
1867 else if (e.getButton() == MouseEvent.BUTTON1) {
\r
1869 if (tvd.type == ProgType.PASSED) {
\r
1870 if (e.getClickCount() == 2) {
\r
1871 MWin.appendMessage(MSGID+"過去ログでダブルクリックは利用できません");
\r
1878 if (e.getClickCount() == 2) {
\r
1879 // 左ダブルクリックで予約ウィンドウを開く
\r
1880 openReserveDialog(tvd);
\r
1883 else if (e.getButton() == MouseEvent.BUTTON2) {
\r
1889 private void openReserveDialog(ProgDetailList tvd) {
\r
1891 // レコーダが登録されていない場合はなにもしない
\r
1892 if (recorders.size() == 0) {
\r
1897 CommonSwingUtils.setLocationCenter(parent,rD);
\r
1899 // サブタイトルを番組追跡の対象から外す
\r
1900 boolean succeeded = false;
\r
1901 if ( ! env.getSplitEpno() && env.getTraceOnlyTitle() ) {
\r
1902 succeeded = rD.open(tvd,tvd.title,TraceKey.defaultFazzyThreshold);
\r
1905 succeeded = rD.open(tvd);
\r
1909 rD.setVisible(true);
\r
1915 if (rD.isSucceededReserve()) {
\r
1916 updateReserveDisplay();
\r
1917 updateReserveBorder(tvd.center);
\r
1925 public void mouseEntered(MouseEvent e) {
\r
1927 JTXTButton b = (JTXTButton) e.getSource();
\r
1928 ProgDetailList tvd = b.getInfo();
\r
1930 if ( env.getEnableHighlight() ) {
\r
1931 bgcolor = ((JTXTButton)e.getSource()).getBackground();
\r
1932 ((JTXTButton)e.getSource()).setBackground(env.getHighlightColor());
\r
1934 jTextPane_detail.setLabel(tvd.start,tvd.end,tvd.title);
\r
1935 jTextPane_detail.setText(tvd.detail+"\n"+tvd.getAddedDetail());
\r
1939 public void mouseExited(MouseEvent e) {
\r
1940 if ( env.getEnableHighlight() ) {
\r
1941 ((JTXTButton)e.getSource()).setBackground(bgcolor);
\r
1946 public void mouseDragged(final MouseEvent e) {
\r
1947 Point cp = e.getLocationOnScreen();
\r
1948 Point vp = vport.getViewPosition(); //= SwingUtilities.convertPoint(vport,0,0,label);
\r
1949 vp.translate(pp.x-cp.x, pp.y-cp.y);
\r
1950 jLayeredPane_space_main_view.scrollRectToVisible(new Rectangle(vp, vport.getSize()));
\r
1951 pp.setLocation(cp);
\r
1955 public void mousePressed(MouseEvent e) {
\r
1956 pp.setLocation(e.getLocationOnScreen());
\r
1957 jLayeredPane_space_main_view.setCursor(hndCursor);
\r
1961 public void mouseReleased(MouseEvent e) {
\r
1962 jLayeredPane_space_main_view.setCursor(defCursor);
\r
1966 public void mouseMoved(MouseEvent e) {
\r
1971 * サイドツリーにつけるリスナー(ツリーの展開状態を記憶する)
\r
1973 private final TreeExpansionListener tel_nodeexpansion = new TreeExpansionListener() {
\r
1976 public void treeExpanded(TreeExpansionEvent event) {
\r
1981 public void treeCollapsed(TreeExpansionEvent event) {
\r
1987 * サイドツリーにつけるリスナー(クリックで描画実行)
\r
1989 private final TreeSelectionListener tsl_nodeselected = new TreeSelectionListener() {
\r
1991 public void valueChanged(TreeSelectionEvent e){
\r
1993 TreePath path = jTree_tree.getSelectionPath();
\r
1995 if ( path != null && path.getPathCount() == 2 ) {
\r
2000 if ( path != null && path.getPathCount() == 3 ) {
\r
2002 if (env.getDebug()) System.out.println(DBGID+"SELECTED treeSelListner "+path);
\r
2006 JTreeLabel.Nodes node = JTreeLabel.Nodes.getNode(path.getPathComponent(1).toString());
\r
2007 String value = path.getLastPathComponent().toString();
\r
2011 if ( JTreeLabel.Nodes.NOW.getLabel().equals(value) ) {
\r
2013 redrawByNow(IterationType.ALL);
\r
2016 redrawByDate(value,IterationType.ALL);
\r
2018 if ( env.isPagerEnabled() ) {
\r
2019 setPagerEnabled(true);
\r
2023 if ( JTreeLabel.Nodes.NOW.getLabel().equals(value) ) {
\r
2024 redrawByNow(IterationType.TERRA);
\r
2027 redrawByDate(value,IterationType.TERRA);
\r
2029 if ( env.isPagerEnabled() ) {
\r
2030 setPagerEnabled(true);
\r
2034 if ( JTreeLabel.Nodes.NOW.getLabel().equals(value) ) {
\r
2035 redrawByNow(IterationType.BS);
\r
2038 redrawByDate(path.getLastPathComponent().toString(),IterationType.BS);
\r
2040 if ( env.isPagerEnabled() ) {
\r
2041 setPagerEnabled(true);
\r
2045 if ( JTreeLabel.Nodes.NOW.getLabel().equals(value) ) {
\r
2046 redrawByNow(IterationType.CS);
\r
2049 redrawByDate(path.getLastPathComponent().toString(),IterationType.CS);
\r
2051 if ( env.isPagerEnabled() ) {
\r
2052 setPagerEnabled(true);
\r
2056 redrawByCenter(value);
\r
2057 if ( env.isPagerEnabled() ) {
\r
2058 setPagerEnabled(false);
\r
2062 PassedProgram passed = tvprograms.getPassed();
\r
2063 if ( passed.loadAllCenters(value) ) {
\r
2064 redrawByDate(value, IterationType.PASSED);
\r
2067 MWin.appendError(ERRID+"過去ログが存在しません: "+value);
\r
2070 if ( env.isPagerEnabled() ) {
\r
2071 setPagerEnabled(true);
\r
2078 jLabel_tree.setView(node, value);
\r
2082 // なんかおかしいのでデフォルト選択にまわす
\r
2083 CommonUtils.printStackTrace();
\r
2084 MWin.appendError(ERRID+"バグの可能性あり");
\r
2085 //redrawByNow(IterationType.ALL);
\r
2086 //jLabel_tree.setView(JTreeLabel.Nodes.DATE, JTreeLabel.Nodes.NOW.getLabel());
\r
2091 * フルスクリーン時にツリーを隠したりするの
\r
2093 private final MouseListener ml_treehide = new MouseAdapter() {
\r
2094 public void mouseEntered(MouseEvent e) {
\r
2095 if (isFullScreen()) {
\r
2097 //StdAppendMessage("Show tree (N)");
\r
2100 public void mouseExited(MouseEvent e) {
\r
2101 if (isFullScreen()) {
\r
2102 setCollapseTree();
\r
2103 //StdAppendMessage("Hide tree (N)");
\r
2109 * 放送局名につけるリスナー(ダブルクリックで一週間表示にジャンプ)
\r
2111 private final MouseAdapter cnMouseAdapter = new MouseAdapter() {
\r
2113 private Color bgcolor = null;
\r
2115 public void mouseExited(MouseEvent e) {
\r
2116 ((JLabel)e.getSource()).setBackground(bgcolor);
\r
2118 public void mouseEntered(MouseEvent e) {
\r
2119 bgcolor = ((JLabel)e.getSource()).getBackground();
\r
2120 ((JLabel)e.getSource()).setBackground(new Color(180,180,255));
\r
2123 public void mouseClicked(MouseEvent e) {
\r
2124 if (e.getButton() == MouseEvent.BUTTON1) {
\r
2125 if (e.getClickCount() == 2) {
\r
2126 if ( cur_tuner == IterationType.PASSED ) {
\r
2127 MWin.appendMessage(MSGID+"過去ログでは一局表示に切り替えられません");
\r
2131 // 右ダブルクリックで局表示に切り替え
\r
2132 String center = ((JLabel)e.getSource()).getText();
\r
2133 StdAppendMessage(MSGID+"一局表示に切り替え:"+center);
\r
2134 //redrawByCenter(center);
\r
2135 jLabel_tree.setView(JTreeLabel.Nodes.BCAST, center);
\r
2143 * 日付枠につけるリスナー(ダブルクリックで放送局別表示にジャンプ)
\r
2145 private final MouseAdapter tbMouseAdapter = new MouseAdapter() {
\r
2146 private Color bgcolor = null;
\r
2148 public void mouseExited(MouseEvent e) {
\r
2149 ((JTXTLabel)e.getSource()).setBackground(bgcolor);
\r
2151 public void mouseEntered(MouseEvent e) {
\r
2152 bgcolor = ((JTXTLabel)e.getSource()).getBackground();
\r
2153 ((JTXTLabel)e.getSource()).setBackground(new Color(180,180,255));
\r
2157 public void mouseClicked(MouseEvent e) {
\r
2158 if (e.getButton() == MouseEvent.BUTTON1) {
\r
2159 if (e.getClickCount() == 2) {
\r
2160 // 右ダブルクリックで日付表示に切り替え
\r
2161 String date = ((JTXTLabel)e.getSource()).getValue();
\r
2162 StdAppendMessage(MSGID+"日付表示に切り替え:"+date);
\r
2163 //redrawByDate(date, -1);
\r
2164 jLabel_tree.setView(JTreeLabel.Nodes.DATE, date);
\r
2173 /*******************************************************************************
\r
2175 ******************************************************************************/
\r
2177 private JDetailPanel getJTextPane_detail() {
\r
2178 if (jTextPane_detail == null) {
\r
2179 jTextPane_detail = new JDetailPanel();
\r
2180 jTextPane_detail.setRows(bounds.getDetailRows());
\r
2181 //Dimension d = jTextPane_detail.getMaximumSize();
\r
2182 //d.height = bounds.getDetailAreaHeight();
\r
2183 //jTextPane_detail.setPreferredSize(d);
\r
2184 //jTextPane_detail.setVerticalAlignment(JLabel.TOP);
\r
2185 //jTextPane_detail.setHorizontalAlignment(JLabel.LEFT);
\r
2187 return jTextPane_detail;
\r
2190 private JSplitPane getJSplitPane_view() {
\r
2191 if ( jSplitPane_view == null ) {
\r
2193 jSplitPane_view = new JSplitPane() {
\r
2195 private static final long serialVersionUID = 1L;
\r
2198 public void setDividerLocation(int loc) {
\r
2199 setDividerEnvs(loc);
\r
2200 super.setDividerLocation(loc);
\r
2204 jSplitPane_view.setLeftComponent(getJPanel_tree());
\r
2205 jSplitPane_view.setRightComponent(getJScrollPane_space_main());
\r
2208 return jSplitPane_view;
\r
2211 private JPanel getJPanel_tree() {
\r
2212 if (jPanel_tree == null) {
\r
2213 jPanel_tree = new JPanel();
\r
2215 jPanel_tree.setLayout(new BorderLayout());
\r
2216 jPanel_tree.add(getJScrollPane_tree_top(), BorderLayout.PAGE_START);
\r
2217 jPanel_tree.add(getJScrollPane_tree(), BorderLayout.CENTER);
\r
2219 return jPanel_tree;
\r
2223 private JScrollPane getJScrollPane_tree_top() {
\r
2224 if (jScrollPane_tree_top == null) {
\r
2225 jScrollPane_tree_top = new JScrollPane();
\r
2226 jScrollPane_tree_top.setViewportView(getJLabel_tree());
\r
2227 jScrollPane_tree_top.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
\r
2228 jScrollPane_tree_top.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
\r
2230 return jScrollPane_tree_top;
\r
2232 private JTreeLabel getJLabel_tree() {
\r
2233 if (jLabel_tree == null) {
\r
2234 jLabel_tree = new JTreeLabel();
\r
2236 Dimension d = jLabel_tree.getMaximumSize();
\r
2237 d.height = bounds.getBangumiColumnHeight();
\r
2238 jLabel_tree.setPreferredSize(d);
\r
2239 jLabel_tree.setOpaque(true);
\r
2240 jLabel_tree.setBackground(Color.WHITE);
\r
2242 return jLabel_tree;
\r
2245 private JScrollPane getJScrollPane_tree() {
\r
2246 if (jScrollPane_tree == null) {
\r
2247 jScrollPane_tree = new JScrollPane();
\r
2249 jScrollPane_tree.setViewportView(getJTree_tree());
\r
2251 return jScrollPane_tree;
\r
2257 private JTree getJTree_tree() {
\r
2258 if (jTree_tree == null) {
\r
2261 jTree_tree = new JTree();
\r
2262 jTree_tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
\r
2263 jTree_tree.setRootVisible(env.getRootNodeVisible());
\r
2266 jTree_tree.setModel(new DefaultTreeModel(getTreeNodes()));
\r
2269 undoTreeExpansion();
\r
2271 // ツリーの開閉時に状態を保存する
\r
2272 jTree_tree.addTreeExpansionListener(tel_nodeexpansion);
\r
2274 // フルスクリーンの時に使う(新聞形式のツリーを自動的に隠す)
\r
2275 jTree_tree.addMouseListener(ml_treehide);
\r
2277 return jTree_tree;
\r
2283 private DefaultMutableTreeNode getTreeNodes() {
\r
2285 paperRootNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.ROOT.getLabel());
\r
2287 dateNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.DATE.getLabel());
\r
2288 dgNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.TERRA.getLabel());
\r
2289 bsNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.BS.getLabel());
\r
2290 csNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.CS.getLabel());
\r
2291 centerNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.BCAST.getLabel());
\r
2292 passedNode = new DefaultMutableTreeNode(JTreeLabel.Nodes.PASSED.getLabel());
\r
2294 paperRootNode.add(dateNode);
\r
2295 paperRootNode.add(dgNode);
\r
2296 paperRootNode.add(bsNode);
\r
2297 paperRootNode.add(csNode);
\r
2298 paperRootNode.add(centerNode);
\r
2299 paperRootNode.add(passedNode);
\r
2302 redrawTreeByDate();
\r
2303 redrawTreeByCenter();
\r
2304 redrawTreeByPassed();
\r
2306 return paperRootNode;
\r
2309 private void undoTreeExpansion() {
\r
2312 stopTreeListener();
\r
2315 ter = new TreeExpansionReg(jTree_tree, TreeExpRegFile_Paper);
\r
2319 catch (Exception e) {
\r
2320 MWin.appendMessage(ERRID+"ツリー展開情報の解析で問題が発生しました");
\r
2321 e.printStackTrace();
\r
2325 ArrayList<TreePath> tpa = ter.get();
\r
2326 for ( TreePath path : tpa ) {
\r
2327 jTree_tree.expandPath(path);
\r
2330 startTreeListener();
\r
2333 private JScrollPane getJScrollPane_space_main() {
\r
2334 if (jScrollPane_space_main == null) {
\r
2335 jScrollPane_space_main = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
\r
2336 jScrollPane_space_main.getVerticalScrollBar().setUnitIncrement(bounds.getBangumiColumnHeight());
\r
2337 jScrollPane_space_main.getHorizontalScrollBar().setUnitIncrement(bounds.getBangumiColumnWidth());
\r
2339 //jScrollPane_space_main.setViewportView(getJLayeredPane_space_main_view());
\r
2340 jScrollPane_space_main.setColumnHeaderView(getJPanel_space_top_view());
\r
2341 jScrollPane_space_main.setRowHeaderView(getJPanel_space_side_view());
\r
2343 vport = jScrollPane_space_main.getViewport();
\r
2345 return jScrollPane_space_main;
\r
2348 private JPanel getJPanel_space_top_view() {
\r
2349 if (jPanel_space_top_view == null) {
\r
2350 jPanel_space_top_view = new JPanel();
\r
2351 jPanel_space_top_view.setLayout(new SpringLayout());
\r
2353 return jPanel_space_top_view;
\r
2356 private JPanel getJPanel_space_side_view() {
\r
2357 if (jPanel_space_side_view == null) {
\r
2358 jPanel_space_side_view = new JPanel();
\r
2359 jPanel_space_side_view.setLayout(null);
\r
2361 return jPanel_space_side_view;
\r
2366 * 以下は、pcwinから呼び出されるメソッドをまとめたもの
\r
2370 public Component[] getTimebarComponents() {
\r
2371 return jPanel_space_side_view.getComponents();
\r
2375 public void updateColors(Env ec,PaperColorsMap pc) {
\r
2376 _updPColors(ec, pc, frameUsed);
\r
2378 if ( env.getDrawcacheEnable() ) {
\r
2379 _updPColors(ec, pc, frameUsedByDate);
\r
2386 for ( Component c : getTimebarComponents() ) {
\r
2387 if ( c instanceof JTimebarLabel ) {
\r
2388 int j = Integer.valueOf(((JTimebarLabel) c).getTs());
\r
2389 if ( j >=6 && j <= 11 ) {
\r
2390 c.setBackground(ec.getTimebarColor());
\r
2392 else if ( j >=12 && j <= 17 ) {
\r
2393 c.setBackground(ec.getTimebarColor2());
\r
2395 else if ( j >=18 && j <= 23 ) {
\r
2396 c.setBackground(ec.getTimebarColor3());
\r
2399 c.setBackground(ec.getTimebarColor4());
\r
2406 public void updateBounds(Env ec, Bounds bc) {
\r
2408 int maxCol = jPanel_space_top_view.getComponentCount();
\r
2409 float maxRow = 24*60;
\r
2411 float phm = bc.getPaperHeightMultiplier() * paperHeightZoom ;
\r
2413 int vieww = maxCol * bc.getBangumiColumnWidth();
\r
2414 int viewh = (int) Math.ceil(maxRow * phm);
\r
2417 Point vp = vport.getViewPosition();
\r
2418 float vh = vport.getView().getPreferredSize().height;
\r
2422 int h = (int) Math.ceil(60.0F*phm);
\r
2424 for ( Component b0 : jPanel_space_side_view.getComponents() ) {
\r
2425 b0.setBounds(0,(int) Math.ceil((float)row*phm),bc.getTimebarColumnWidth(),h);
\r
2429 Dimension d = jPanel_space_side_view.getPreferredSize();
\r
2431 jPanel_space_side_view.setPreferredSize(d);
\r
2434 // 放送局名(or日付)のサイズ変更
\r
2436 for ( int col=0; col<jPanel_space_top_view.getComponentCount(); col++ ) {
\r
2437 Component b1 = jPanel_space_top_view.getComponent(col);
\r
2439 bc.getBangumiColumnWidth() * col,
\r
2441 bc.getBangumiColumnWidth(),
\r
2442 bc.getBangumiColumnHeight());
\r
2444 Dimension d = jPanel_space_top_view.getPreferredSize();
\r
2446 jPanel_space_top_view.setPreferredSize(d);
\r
2449 // 各番組枠のサイズ変更・検索マッチ枠の表示変更
\r
2452 _updPBounds(bc, frameUsed);
\r
2453 _updPBorderAll(ec, bc, frameUsed);
\r
2455 Dimension d = jLayeredPane_space_main_view.getPreferredSize();
\r
2458 jLayeredPane_space_main_view.setPreferredSize(d);
\r
2461 if ( ec.getDrawcacheEnable() ) {
\r
2462 _updPBounds(bc, frameUsedByDate);
\r
2463 _updPBorderAll(ec, bc, frameUsedByDate);
\r
2465 for ( JLayeredPane pane : jLayeredPane_space_main_view_byDate ) {
\r
2466 Dimension d = pane.getPreferredSize();
\r
2469 pane.setPreferredSize(d);
\r
2474 // 予約枠・ピックアップ枠のサイズ変更&色変更
\r
2476 JRMLabel.setColumnWidth(bc.getBangumiColumnWidth());
\r
2477 JRMLabel.setHeightMultiplier(phm);
\r
2479 for ( JRMLabel rb : reserveBorders ) {
\r
2483 if ( rb.getEncoder().equals(TUNERLABEL_PICKUP) ) {
\r
2484 rb.setEncBackground(ec.getPickedColor());
\r
2485 rb.setEncForeground(ec.getPickedFontColor());
\r
2486 rb.setBorder(new LineBorder(ec.getPickedColor(),4));
\r
2488 else if ( rb.getExec() ) {
\r
2489 rb.setEncForeground(ec.getExecOnFontColor());
\r
2492 rb.setEncForeground(ec.getExecOffFontColor());
\r
2499 setTimelinePos(false);
\r
2501 // 枠のサイズを更新したのでupdateUI()
\r
2502 jScrollPane_space_main.updateUI();
\r
2505 vp.y = (int)Math.ceil(maxRow * (float)vp.y * phm / vh);
\r
2506 vport.setViewPosition(vp);
\r
2511 public void updateFonts(Env ec) {
\r
2512 JTXTButton.setShowStart(ec.getShowStart());
\r
2513 JTXTButton.setSplitEpno(ec.getSplitEpno());
\r
2514 JTXTButton.setShowDetail(ec.getShowDetail());
\r
2515 JTXTButton.setDetailTab(ec.getDetailTab());
\r
2517 JTXTButton.setTitleFont(ec.getTitleFont());
\r
2518 JTXTButton.setTitleFontStyle(ec.getTitleFontStyle());
\r
2519 JTXTButton.setDetailFont(ec.getDetailFont());
\r
2520 JTXTButton.setDetailFontStyle(ec.getDetailFontStyle());
\r
2521 JTXTButton.setTitleFontSize(ec.getTitleFontSize());
\r
2522 JTXTButton.setTitleFontColor(ec.getTitleFontColor());
\r
2523 JTXTButton.setDetailFontSize(ec.getDetailFontSize());
\r
2524 JTXTButton.setDetailFontColor(ec.getDetailFontColor());
\r
2525 JTXTButton.setAAHint(ec.getPaperAAMode().getHint());
\r
2529 public void updateRepaint() {
\r
2530 _updPRepaint(frameUsed);
\r
2532 if ( env.getDrawcacheEnable() ) {
\r
2533 _updPRepaint(frameUsedByDate);
\r
2539 private void _updPColors(Env ec, PaperColorsMap pc, ArrayList<JTXTButton> fa) {
\r
2540 for ( JTXTButton b2 : fa ) {
\r
2541 b2.setBackground(pc.get(b2.getInfo().genre));
\r
2545 private void _updPBounds(Bounds bc, ArrayList<JTXTButton> fa) {
\r
2547 JTXTButton.setColumnWidth(bc.getBangumiColumnWidth());
\r
2548 JTXTButton.setHeightMultiplier(bc.getPaperHeightMultiplier() * paperHeightZoom);
\r
2550 for ( JTXTButton b2 : fa ) {
\r
2555 private void _updPBorderAll(Env ec, Bounds bc, ArrayList<JTXTButton> fa) {
\r
2556 dborder.setDashColor(ec.getMatchedBorderColor());
\r
2557 dborder.setThickness(ec.getMatchedBorderThickness());
\r
2558 dborderK.setDashColor(ec.getMatchedKeywordBorderColor());
\r
2559 dborderK.setThickness(ec.getMatchedBorderThickness());
\r
2560 for ( JTXTButton b2 : fa ) {
\r
2561 _updPBorder(bc, b2);
\r
2565 private void _updPBorder(Bounds bc, JTXTButton b) {
\r
2566 if ( bc.getShowMatchedBorder() && b.isStandby() ) {
\r
2567 if ( b.isStandbyByTrace() ) {
\r
2568 if ( b.getBorder() != dborder )
\r
2569 b.setBorder(dborder);
\r
2572 // 番組追跡はキーワード検索に優先する
\r
2573 if ( b.getBorder() != dborder && b.getBorder() != dborderK )
\r
2574 b.setBorder(dborderK);
\r
2578 if ( b.getBorder() != lborder )
\r
2579 b.setBorder(lborder);
\r
2583 private void _updPRepaint(ArrayList<JTXTButton> fa) {
\r
2584 for ( JTXTButton b2 : fa ) {
\r
2585 b2.forceRepaint();
\r