import java.util.ArrayList;\r
import java.util.Calendar;\r
import java.util.GregorianCalendar;\r
-import java.util.HashMap;\r
import java.util.regex.Matcher;\r
import java.util.regex.Pattern;\r
\r
import tainavi.TVProgramIterator.IterationType;\r
import tainavi.VWMainWindow.MWinTab;\r
\r
+\r
/**\r
* 新聞形式タブのクラス\r
* @since 3.15.4β {@link Viewer}から分離\r
*/\r
-public abstract class AbsPaperView extends JPanel implements VWTimerRiseListener {\r
+public abstract class AbsPaperView extends JPanel implements TickTimerListener,HDDRecorderListener {\r
\r
private static final long serialVersionUID = 1L;\r
\r
public static String getViewName() { return "新聞形式"; }\r
\r
- //public void setDebug(boolean b) { debug = b; }\r
- //private static boolean debug = false;\r
+ public void setDebug(boolean b) { debug = b; }\r
+ private static boolean debug = false;\r
\r
\r
/*******************************************************************************\r
protected abstract void showPopupForTraceProgram(\r
final JComponent comp,\r
final ProgDetailList tvd, final String keyword, final int threshold,\r
- final int x, final int y, final int h\r
+ final int x, final int y, final String clickedDateTime\r
);\r
\r
/**\r
protected abstract boolean isTabSelected(MWinTab tab);\r
protected abstract void setSelectedTab(MWinTab tab);\r
\r
- protected abstract String getSelectedRecorderOnToolbar();\r
protected abstract boolean isFullScreen();\r
/**\r
* ページャーコンボボックスを更新してほしい\r
private static final String TreeExpRegFile_Paper = "env"+File.separator+"tree_expand_paper.xml";\r
\r
private static final int TIMEBAR_START = Viewer.TIMEBAR_START;\r
+\r
+ //\r
+ private static final String TUNERLABEL_PICKUP = "PICKUP";\r
\r
// 定数ではないが\r
\r
}\r
\r
/**\r
+ * ツールバーから過去ログへのジャンプ\r
+ */\r
+ public boolean jumpToPassed(String passed) {\r
+ \r
+ // ページャーは効くよ\r
+ if ( env.isPagerEnabled() ) {\r
+ setPagerEnabled(true);\r
+ }\r
+ \r
+ // タイマーは止める\r
+ stopTimer();\r
+ \r
+ GregorianCalendar c = CommonUtils.getCalendar(passed);\r
+ String adate = CommonUtils.getDate(c);\r
+ \r
+ // 指定日付に移動して放送局の位置を確認する\r
+ TVProgramIterator pli = redrawByDateWithCenter(null,adate);\r
+ if ( pli == null ) {\r
+ // どちらにもない\r
+ MWin.appendError(ERRID+"ジャンプ先の日付がみつかりません: "+adate);\r
+ ringBeep();\r
+ return false;\r
+ }\r
+ \r
+ // 新聞形式に移動\r
+ if ( ! isTabSelected(MWinTab.PAPER) ) {\r
+ setSelectedTab(MWinTab.PAPER);\r
+ }\r
+ \r
+ return true;\r
+ }\r
+ \r
+ /**\r
* リスト形式・本体予約一覧からの目的の番組へジャンプ\r
*/\r
public boolean jumpToBangumi(String center, String startdt) {\r
\r
// 日付群\r
GregorianCalendar c = CommonUtils.getCalendar(startdt);\r
+ int hour = c.get(Calendar.HOUR_OF_DAY);\r
+ int min = c.get(Calendar.MINUTE);\r
+ \r
String adate = CommonUtils.getDate(c);\r
- String atime = CommonUtils.getTime(c);\r
String adate529 = CommonUtils.getDate529(c,true);\r
\r
+ \r
// 指定日付に移動して放送局の位置を確認する\r
TVProgramIterator pli = redrawByDateWithCenter(center,adate529);\r
if ( pli == null ) {\r
if ( ! isTabSelected(MWinTab.PAPER) ) {\r
setSelectedTab(MWinTab.PAPER);\r
}\r
- \r
+ \r
+ /*\r
+ * マウスカーソル移動\r
+ */\r
+ \r
// 横の列\r
int crindex = pli.getIndex(center);\r
if ( crindex == -1 ) {\r
}\r
\r
// 縦の列\r
- int h = 0;\r
- int m = 0;\r
int y = 0;\r
- Matcher ma = Pattern.compile("^(\\d\\d):(\\d\\d)$").matcher(atime);\r
- if (ma.find()) {\r
- h = Integer.valueOf(ma.group(1));\r
- m = Integer.valueOf(ma.group(2));\r
- }\r
if (adate529.equals(adate)) {\r
- if (h < TIMEBAR_START) {\r
- h = TIMEBAR_START;\r
- m = 0;\r
+ if (hour < TIMEBAR_START) {\r
+ hour = TIMEBAR_START;\r
+ min = 0;\r
}\r
}\r
else {\r
- h += 24;\r
+ hour += 24;\r
}\r
- y = Math.round((float)((h-TIMEBAR_START)*60+m)*bounds.getPaperHeightMultiplier()*paperHeightZoom);\r
+ y = Math.round((float)((hour-TIMEBAR_START)*60+min)*bounds.getPaperHeightMultiplier()*paperHeightZoom);\r
\r
// 新聞面を移動する\r
{\r
jLayeredPane_space_main_view_byMakeshift.setLayer(b2, 0);\r
\r
// リスナーを設定する\r
- b2.addMouseListener(mListner);\r
- b2.addMouseMotionListener(mListner);\r
+ b2.addMouseListener(ml_risepopup);\r
+ b2.addMouseMotionListener(ml_risepopup);\r
frameUnused.add(b2);\r
}\r
StdAppendMessage(MSGID+"番組枠描画バッファを初期化: "+framebuffersize);\r
JRMLabel.setHeightMultiplier(bounds.getPaperHeightMultiplier() * paperHeightZoom);\r
\r
// 表示範囲\r
- GregorianCalendar cal = CommonUtils.getCalendar(String.format("%s %02d:00",date.substring(0,10),TIMEBAR_START));\r
- String startDateTime = CommonUtils.getDateTime(cal);\r
- cal.add(Calendar.HOUR_OF_DAY, 24);\r
- String endDateTime = CommonUtils.getDateTime(cal);\r
- \r
- // 基準日\r
- String critDateTime = CommonUtils.getCritDateTime(env.getDisplayPassedReserve());\r
+ GregorianCalendar cal = CommonUtils.getCritCalendar(date);\r
+ String topDateTime = CommonUtils.getDateTime(cal);\r
+ cal.add(Calendar.DATE, 1);\r
+ String bottomDateTime = CommonUtils.getDateTime(cal);\r
\r
- // 予約枠\r
- HashMap<String,Boolean> misCN = new HashMap<String, Boolean>();\r
+ // \r
+ String passedCritDateTime = CommonUtils.getCritDateTime(env.getDisplayPassedReserve());\r
\r
// ツールバーで選択されている実レコーダ\r
- String myself = ( env.getEffectComboToPaper() ) ? (getSelectedRecorderOnToolbar()) : (null);\r
+ String myself = ( env.getEffectComboToPaper() ) ? (getSelectedMySelf()) : (null);\r
\r
- if ( myself == null || myself.length() > 0 ) {\r
- \r
- // ピックアップはここに入らない\r
- \r
- HDDRecorderList recs = recorders.getMyself(myself);\r
- \r
- for ( HDDRecorder recorder : recs )\r
- {\r
- //System.err.println(DBGID+recorder.Myself());\r
+ // 予約枠の描画\r
+ drawReserveBorders(date, Center, q, topDateTime, bottomDateTime, passedCritDateTime, myself);\r
+ \r
+ // ピックアップ枠の描画\r
+ drawPickupBorders(date, Center, q, topDateTime, bottomDateTime, passedCritDateTime, TUNERLABEL_PICKUP);\r
+ }\r
+ private void drawReserveBorders(String date, String Center, int q, String topDateTime, String bottomDateTime, String passedCritDateTime, String myself) {\r
+ if ( myself == HDDRecorder.SELECTED_PICKUP ) {\r
+ return;\r
+ }\r
+ for ( HDDRecorder recorder : getSelectedRecorderList() ) {\r
+ for ( ReserveList r : recorder.getReserves()) {\r
\r
- for ( ReserveList r : recorder.getReserves()) {\r
- // Exec == ON ?\r
- if (env.getDisplayOnlyExecOnEntry() && ! r.getExec()) {\r
- //StdAppendMessage("@Exec = OFF : "+r.getTitle());\r
- continue;\r
+ // 「実行のみ表示」で無効な予約は表示しない\r
+ if ( env.getDisplayOnlyExecOnEntry() && ! r.getExec() ) {\r
+ continue;\r
+ }\r
+ \r
+ // 放送局名の確認\r
+ if ( r.getCh_name() == null ) {\r
+ if ( r.getChannel() == null ) {\r
+ // CHコードすらないのはバグだろう\r
+ System.err.println(ERRID+"予約情報にCHコードが設定されていません。バグの可能性があります。 recid="+recorder.Myself()+" chname="+r.getCh_name());\r
}\r
- // 局が一致して\r
- if (r.getCh_name() == null) {\r
- if ( r.getChannel() == null ) {\r
- System.err.println(ERRID+"予約情報にCHコードが設定されていません。バグの可能性があります。 recid="+recorder.Myself()+" chname="+r.getCh_name());\r
+ continue;\r
+ }\r
+ \r
+ // 描画本体\r
+ if (r.getCh_name().equals(Center)) {\r
+ \r
+ // 開始終了日時リストを生成する\r
+ ArrayList<String> starts = new ArrayList<String>();\r
+ ArrayList<String> ends = new ArrayList<String>();\r
+ CommonUtils.getStartEndList(starts, ends, r);\r
+ \r
+ // 予約枠を描画する\r
+ for ( int j=0; j<starts.size(); j++ ) {\r
+ if ( passedCritDateTime.compareTo(ends.get(j)) > 0 ) {\r
+ // 過去情報の表示が制限されている場合\r
continue;\r
}\r
- if (r.getChannel().length() > 0) {\r
- misCN.put(r.getChannel(),true);\r
- }\r
- continue;\r
- }\r
- \r
- if (r.getCh_name().equals(Center)) {\r
- \r
- // 開始終了日時リストを生成する\r
- ArrayList<String> starts = new ArrayList<String>();\r
- ArrayList<String> ends = new ArrayList<String>();\r
- CommonUtils.getStartEndList(starts, ends, r);\r
\r
- // 予約枠を描画する\r
- for (int j=0; j<starts.size(); j++) {\r
- if (critDateTime.compareTo(ends.get(j)) <= 0) {\r
- putReserveBorderSub(date,Center,startDateTime,endDateTime,starts.get(j),ends.get(j),r.getAhh(),r.getAmm(),r.getRec_min(),r.getTuner(),recorder.getColor(r.getTuner()),r.getExec(),q);\r
- }\r
- }\r
+ drawBorder(date,Center,topDateTime,bottomDateTime,starts.get(j),ends.get(j),r.getRec_min(),r.getTuner(),recorder.getColor(r.getTuner()),r.getExec(),q);\r
}\r
}\r
}\r
}\r
- \r
- // ピックアップ枠\r
- TVProgram tvp = tvprograms.getPickup();\r
- for ( ProgList pl : tvp.getCenters() ) {\r
- if ( pl.Center.equals(Center) ) {\r
- for ( ProgDateList pcl : pl.pdate ) {\r
- for ( ProgDetailList tvd : pcl.pdetail ) {\r
- putReserveBorderSub(date,Center,startDateTime,endDateTime,tvd.startDateTime,tvd.endDateTime,tvd.start.substring(0,2),tvd.start.substring(3,5),String.valueOf(tvd.length),"PICKUP",CommonUtils.color2str(env.getPickedColor()),false,q);\r
+ }\r
+ private void drawPickupBorders(String date, String Center, int q, String topDateTime, String bottomDateTime, String passedCritDateTime, String tuner) {\r
+ for ( ProgList pl : tvprograms.getPickup().getCenters() ) {\r
+ if ( ! pl.Center.equals(Center) ) {\r
+ continue;\r
+ }\r
+ for ( ProgDateList pcl : pl.pdate ) {\r
+ for ( ProgDetailList tvd : pcl.pdetail ) {\r
+ if ( passedCritDateTime.compareTo(tvd.endDateTime) > 0 ) {\r
+ // 過去情報の表示が制限されている場合\r
+ continue;\r
}\r
+ \r
+ drawBorder(date,Center,topDateTime,bottomDateTime,tvd.startDateTime,tvd.endDateTime,tvd.length,tuner,env.getPickedColor(),false,q);\r
}\r
}\r
}\r
}\r
- private void putReserveBorderSub(String date, String Center, String startDateTime, String endDateTime, String start, String end, String ahh, String amm, String recmin, String tuner, String bordercol,boolean exec,int col) {\r
- //\r
+ 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
+ drawBorder(date, Center, topDateTime, bottomDateTime, startDateTime, endDateTime, Integer.valueOf(recmin), tuner, CommonUtils.str2color(bordercol), exec, col);\r
+ }\r
+ 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
+ \r
+ GregorianCalendar ca = CommonUtils.getCalendar(startDateTime);\r
+ int ahh = ca.get(Calendar.HOUR_OF_DAY);\r
+ int amm = ca.get(Calendar.MINUTE);\r
+ \r
int row = 0;\r
int length = 0;\r
- if (startDateTime.compareTo(start) <= 0 && start.compareTo(endDateTime) < 0) {\r
- //\r
- row = Integer.valueOf(ahh) - TIMEBAR_START;\r
+ if (topDateTime.compareTo(startDateTime) <= 0 && startDateTime.compareTo(bottomDateTime) < 0) {\r
+ // 開始時刻が表示範囲内にある\r
+ row = ahh - TIMEBAR_START;\r
if (row < 0) {\r
row += 24;\r
}\r
- row = row*60 + Integer.valueOf(amm);\r
- length = Integer.valueOf(recmin);\r
+ row = row*60 + amm;\r
+ length = recmin;\r
}\r
- else if (start.compareTo(startDateTime) < 0 && startDateTime.compareTo(end) < 0) {\r
- //\r
+ else if (startDateTime.compareTo(topDateTime) < 0 && topDateTime.compareTo(endDateTime) < 0) {\r
+ // 表示開始位置が番組の途中にある\r
row = 0;\r
- length = Integer.valueOf(recmin) - (TIMEBAR_START*60 - Integer.valueOf(ahh)*60 - Integer.valueOf(amm));\r
+ length = recmin - (TIMEBAR_START*60 - ahh*60 - amm);\r
}\r
else {\r
return;\r
}\r
\r
{\r
- // 枠の色\r
- Color rbc = CommonUtils.str2color(bordercol);\r
- \r
// 重複予約の場合のエンコーダマーク表示位置の調整\r
int rc = 0;\r
//int rw = 0;\r
}\r
\r
// エンコーダの区別がないものは"■"を表示する\r
- rb.setEncBackground(rbc);\r
- rb.setBorder(new LineBorder(rbc,4));\r
- if ( tuner != null && tuner.equals("PICKUP") ) {\r
+ rb.setEncBackground(bordercol);\r
+ rb.setBorder(new LineBorder(bordercol,4));\r
+ if ( tuner != null && tuner.equals(TUNERLABEL_PICKUP) ) {\r
rb.setEncForeground(env.getPickedFontColor());\r
}\r
else if ( exec ) {\r
jLayeredPane_space_main_view.setLayer(b2, 0);\r
\r
// リスナーを設定する\r
- b2.addMouseListener(mListner);\r
- b2.addMouseMotionListener(mListner);\r
+ b2.addMouseListener(ml_risepopup);\r
+ b2.addMouseMotionListener(ml_risepopup);\r
}\r
if (jLayeredPane_space_main_view == jLayeredPane_space_main_view_byMakeshift) {\r
frameUsed.add(b2);\r
return -1;\r
}\r
\r
+ /**\r
+ * 番組枠のクリック位置を日時に変換する\r
+ */\r
+ private String getClickedDateTime(ProgDetailList tvd, int clikedY) {\r
+ \r
+ String clickedDateTime = null;\r
+ \r
+ if ( clikedY >= 0 && tvd.start.length() != 0 ) {\r
+ // 新聞形式ならクリック位置の日時を算出する\r
+ GregorianCalendar cala = CommonUtils.getCalendar(tvd.startDateTime);\r
+ cala.add(Calendar.MINUTE, Math.round(((float)clikedY)/(bounds.getPaperHeightMultiplier()*paperHeightZoom)));\r
+ clickedDateTime = CommonUtils.getDateTime(cala);\r
+ }\r
+ \r
+ return clickedDateTime;\r
+ }\r
+ \r
+ \r
+ /*******************************************************************************\r
+ * ハンドラ―メソッド\r
+ ******************************************************************************/\r
+ \r
+ /**\r
+ * ツールバーでレコーダの選択イベントが発生\r
+ */\r
+ @Override\r
+ public void valueChanged(HDDRecorderSelectionEvent e) {\r
+ if (debug) System.out.println(DBGID+"recorder selection rised");\r
+ \r
+ // 選択中のレコーダ情報を保存する\r
+ src_recsel = (HDDRecorderSelectable) e.getSource();\r
+ \r
+ // 予約枠を書き換える\r
+ updateReserveBorder(null);\r
+ }\r
+ \r
+ private String getSelectedMySelf() {\r
+ return ( src_recsel!=null ? src_recsel.getSelectedMySelf() : null );\r
+ }\r
+ \r
+ private HDDRecorderList getSelectedRecorderList() {\r
+ return ( src_recsel!=null ? src_recsel.getSelectedList() : null );\r
+ }\r
+ \r
+ private HDDRecorderSelectable src_recsel;\r
+ \r
+ \r
+ /**\r
+ * レコーダ情報の変更イベントが発生\r
+ */\r
+ @Override\r
+ public void stateChanged(HDDRecorderChangeEvent e) {\r
+ // テーブルをリフレッシュする処理\r
+ \r
+ }\r
+ \r
+ \r
+\r
/*******************************************************************************\r
* リスナー\r
******************************************************************************/\r
* 現在時刻追従スクロール\r
*/\r
@Override\r
- public void timerRised(VWTimerRiseEvent e) {\r
+ public void timerRised(TickTimerRiseEvent e) {\r
\r
String curDT = CommonUtils.getDate529(0,true);\r
\r
/**\r
* 番組枠につけるマウス操作のリスナー\r
*/\r
- private final MouseInputListener mListner = new MouseInputListener() {\r
+ private final MouseInputListener ml_risepopup = new MouseInputListener() {\r
//\r
private final Cursor defCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);\r
private final Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);\r
if (e.getButton() == MouseEvent.BUTTON3) {\r
if (e.getClickCount() == 1) {\r
// 右シングルクリックでメニューの表示\r
- showPopupForTraceProgram(b, tvd, tvd.title, TraceKey.noFazzyThreshold, p.x, p.y, e.getY());\r
+ String clicked = getClickedDateTime(tvd, e.getY());\r
+ showPopupForTraceProgram(b, tvd, tvd.title, TraceKey.noFazzyThreshold, p.x, p.y, clicked);\r
}\r
}\r
else if (e.getButton() == MouseEvent.BUTTON1) {\r
MWin.appendMessage(MSGID+"過去ログでダブルクリックは利用できません");\r
ringBeep();\r
}\r
+ \r
return;\r
}\r
+ \r
if (e.getClickCount() == 2) {\r
- // RADIOは閲覧のみ\r
- if (tvd.type == ProgType.PROG && tvd.subtype == ProgSubtype.RADIO) {\r
- return;\r
- }\r
- // レコーダが選択されていない場合はなにもしない\r
- if (recorders.size() == 0) {\r
- return;\r
- }\r
- \r
// 左ダブルクリックで予約ウィンドウを開く\r
- \r
- //VWReserveDialog rD = new VWReserveDialog(0, 0, env, tvprograms, recorders, avs, chavs, stwin);\r
- CommonSwingUtils.setLocationCenter(parent,rD);\r
- //rD.clear();\r
- \r
- // サブタイトルを番組追跡の対象から外す\r
- boolean succeeded = false;\r
- if ( ! env.getSplitEpno() && env.getTraceOnlyTitle() ) {\r
- //String[] d = tvp.doSplitEpno(tvd.genre, tvd.title);\r
- succeeded = rD.open(tvd,tvd.title,TraceKey.defaultFazzyThreshold);\r
- }\r
- else {\r
- succeeded = rD.open(tvd);\r
- }\r
- \r
- if (succeeded) {\r
- rD.setVisible(true);\r
- }\r
- else {\r
- rD.dispose();\r
- }\r
- \r
- if (rD.isReserved()) {\r
- updateReserveDisplay();\r
- updateReserveBorder(tvd.center);\r
- }\r
+ openReserveDialog(tvd); \r
}\r
}\r
else if (e.getButton() == MouseEvent.BUTTON2) {\r
addToPickup(tvd);\r
}\r
}\r
+ \r
+ private void openReserveDialog(ProgDetailList tvd) {\r
+ \r
+ // レコーダが登録されていない場合はなにもしない\r
+ if (recorders.size() == 0) {\r
+ return;\r
+ }\r
+\r
+ // ダイアログの位置指定\r
+ CommonSwingUtils.setLocationCenter(parent,rD);\r
+ \r
+ // サブタイトルを番組追跡の対象から外す\r
+ boolean succeeded = false;\r
+ if ( ! env.getSplitEpno() && env.getTraceOnlyTitle() ) {\r
+ succeeded = rD.open(tvd,tvd.title,TraceKey.defaultFazzyThreshold);\r
+ }\r
+ else {\r
+ succeeded = rD.open(tvd);\r
+ }\r
+ \r
+ if (succeeded) {\r
+ rD.setVisible(true);\r
+ }\r
+ else {\r
+ rD.dispose();\r
+ }\r
+ \r
+ if (rD.isSucceededReserve()) {\r
+ updateReserveDisplay();\r
+ updateReserveBorder(tvd.center);\r
+ }\r
+ }\r
\r
/**\r
* 詳細情報の自動表示\r
\r
rb.reVBounds();\r
\r
- if ( rb.getEncoder().equals("PICKUP") ) {\r
+ if ( rb.getEncoder().equals(TUNERLABEL_PICKUP) ) {\r
rb.setEncBackground(ec.getPickedColor());\r
rb.setEncForeground(ec.getPickedFontColor());\r
rb.setBorder(new LineBorder(ec.getPickedColor(),4));\r