private static final int OPENING_WIAT = 500; // まあ起動時しか使わないんですけども\r
\r
private static final String MSGID = "[鯛ナビ] ";\r
- private static final String ERRID = "[ERROR]"+MSGID;\r
+// private static final String ERRID = "[ERROR]"+MSGID;\r
private static final String DBGID = "[DEBUG]"+MSGID;\r
\r
/**\r
protected 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) {\r
\r
- timer_now.pause();\r
- Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, h);\r
- timer_now.start();\r
+ timer_now.pause(); // 停止\r
+ \r
+ Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, null);\r
+ \r
+ timer_now.start(); // 再開\r
}\r
\r
@Override\r
protected 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
- timer_now.pause();\r
- Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, h);\r
- timer_now.start();\r
+ timer_now.pause(); // 停止\r
+ \r
+ Viewer.this.showPopupForTraceProgram(comp, tvd, keyword, threshold, x, y, clickedDateTime);\r
+ \r
+ timer_now.start(); // 再開\r
}\r
\r
@Override\r
}\r
\r
@Override\r
- protected JMenuItem getExecOnOffMenuItem(boolean fexec, String title,\r
- String chnam, String rsvId, String recId) {\r
+ protected JMenuItem getExecOnOffMenuItem(boolean fexec,\r
+ String start, String title, String chnam, String rsvId, String recId) {\r
\r
- return Viewer.this.getExecOnOffMenuItem(fexec, title, chnam, rsvId, recId, 0);\r
+ return Viewer.this.getExecOnOffMenuItem(fexec, start, title, chnam, rsvId, recId, 0);\r
}\r
\r
@Override\r
- protected JMenuItem getRemoveRsvMenuItem(String title, String chnam,\r
- String rsvId, String recId) {\r
+ protected JMenuItem getRemoveRsvMenuItem(\r
+ String start, String title, String chnam, String rsvId, String recId) {\r
\r
- return Viewer.this.getRemoveRsvMenuItem(title, chnam, rsvId, recId, 0);\r
+ return Viewer.this.getRemoveRsvMenuItem(start, title, chnam, rsvId, recId, 0);\r
}\r
\r
@Override\r
*/\r
private LikeReserveList findLikeReserves(ProgDetailList tvd, String keyword, int threshold) {\r
\r
- LikeReserveList likeRsvList = new LikeReserveList();\r
- \r
- // 曖昧検索のための初期化\r
- String keywordPop = null;\r
+ String keywordVal = null;\r
int thresholdVal = 0;\r
- if (threshold > 0) {\r
- // キーワード指定がある場合\r
- keywordPop = TraceProgram.replacePop(keyword);\r
- thresholdVal = threshold;\r
- }\r
- else {\r
- // キーワード指定がない場合\r
- keywordPop = tvd.titlePop;\r
- thresholdVal = env.getDefaultFazzyThreshold();\r
- }\r
-\r
- // 検索範囲\r
- long rangeLikeRsv = env.getRangeLikeRsv()*3600000;\r
- \r
- for ( HDDRecorder recorder : recorders ) {\r
- \r
- // 終了した予約を整理する\r
- recorder.refreshReserves();\r
- \r
- for ( ReserveList r : recorder.getReserves() ) {\r
- \r
- // タイトルのマッチング\r
- if ( ! isLikeTitle(tvd, r, keywordPop, thresholdVal) ) {\r
- continue;\r
- }\r
- \r
- // 放送局のマッチング\r
- if ( ! isLikeChannel(tvd, r) ) {\r
- continue;\r
- }\r
- \r
- // 近接時間チェック\r
- Long d = getLikeDist(tvd, r, rangeLikeRsv);\r
- if ( d == null ) {\r
- continue;\r
- }\r
- \r
- // 類似予約あり\r
- likeRsvList.add(new LikeReserveItem(recorder, r, d));\r
- }\r
- \r
- }\r
\r
- return likeRsvList;\r
- }\r
- private boolean isLikeTitle(ProgDetailList tvd, ReserveList r, String keywordPop, int thresholdVal) {\r
- \r
- if (env.getDisableFazzySearch() == false) {\r
- // 双方向の比較を行う・正引き\r
- int fazScore = TraceProgram.sumScore(keywordPop, r.getTitlePop());\r
- if ( fazScore >= thresholdVal ) {\r
- return true;\r
- }\r
- else if ( ! env.getDisableFazzySearchReverse() ) {\r
- // 逆引き\r
- fazScore = TraceProgram.sumScore(r.getTitlePop(), keywordPop);\r
- if ( fazScore >= thresholdVal) {\r
- return true;\r
- }\r
- }\r
- }\r
- else {\r
- if ( r.getTitlePop().equals(tvd.titlePop )) {\r
- return true;\r
- }\r
- }\r
- \r
- return false;\r
- }\r
- private boolean isLikeChannel(ProgDetailList tvd, ReserveList r) {\r
- \r
- if ( r.getCh_name() == null ) {\r
- return false;\r
- }\r
- if ( ! r.getCh_name().equals(tvd.center) ) {\r
- return false;\r
- }\r
- \r
- return true;\r
- }\r
- private Long getLikeDist(ProgDetailList tvd, ReserveList r, long rangeLikeRsv) {\r
- \r
- Long d = null;\r
- \r
- ArrayList<String> starts = new ArrayList<String>();\r
- ArrayList<String> ends = new ArrayList<String>();\r
- CommonUtils.getStartEndList(starts, ends, r);\r
- \r
- for ( int j=0; j<starts.size(); j++ ) {\r
- long dtmp = CommonUtils.getCompareDateTime(starts.get(j),tvd.startDateTime);\r
- if ( rangeLikeRsv > 0 && Math.abs(dtmp) >= rangeLikeRsv ) {\r
- // 範囲指定があって範囲外ならスキップ\r
- continue;\r
+ // 曖昧検索のための初期化\r
+ if ( ! env.getDisableFazzySearch() ) {\r
+ if ( threshold > 0 ) {\r
+ // キーワード指定がある場合\r
+ keywordVal = TraceProgram.replacePop(keyword);\r
+ thresholdVal = threshold;\r
}\r
- else if ( d == null || Math.abs(d) > Math.abs(dtmp) ) {\r
- // 初値、または一番小さい値を採用\r
- d = dtmp;\r
+ else {\r
+ // キーワード指定がない場合\r
+ keywordVal = tvd.titlePop;\r
+ thresholdVal = env.getDefaultFazzyThreshold();\r
}\r
}\r
- \r
- return d;\r
+\r
+ // 検索実行\r
+ return recorders.findLikeReserves(tvd, keywordVal, thresholdVal, env.getRangeLikeRsv(), ! env.getDisableFazzySearchReverse());\r
}\r
\r
- \r
/***\r
* \r
* リスト・新聞形式共通\r
public 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
JPopupMenu pop = new JPopupMenu();\r
\r
// 過去ログは処理対象外です\r
}\r
else {\r
- JMenuItem menuItem = new JMenuItem("予約する【"+tvd.title+" ("+tvd.center+")】");\r
+ JMenuItem menuItem = new JMenuItem(String.format("予約する【%s %s - %s(%s)】",tvd.accurateDate,tvd.start,tvd.title,tvd.center));\r
+ menuItem.setForeground(new Color(0,127,0));\r
+ Font f = menuItem.getFont();\r
+ menuItem.setFont(f.deriveFont(f.getStyle()|Font.BOLD));\r
\r
menuItem.addActionListener(new ActionListener() {\r
public void actionPerformed(ActionEvent e) {\r
}\r
\r
//\r
- if (rdialog.isReserved()) {\r
+ if (rdialog.isSucceededReserve()) {\r
listed.updateReserveMark();\r
paper.updateReserveBorder(tvd.center);\r
reserved.redrawReservedList();\r
pop.addSeparator();\r
\r
// 類似予約検索\r
- LikeReserveList likeRsvList = findLikeReserves(tvd, "", 0);\r
+ LikeReserveList likeRsvList;\r
+ if ( env.getDisableFazzySearch() ) {\r
+ likeRsvList = recorders.findLikeReserves(tvd, null, 0, env.getRangeLikeRsv(), false);\r
+ }\r
+ else {\r
+ likeRsvList = recorders.findLikeReserves(tvd, tvd.titlePop, env.getDefaultFazzyThreshold(), env.getRangeLikeRsv(), ! env.getDisableFazzySearchReverse());\r
+ }\r
\r
// 重複予約検索\r
- LikeReserveList overlapRsvList = new LikeReserveList();\r
- searchOverlapRsv(overlapRsvList, tvd, h);\r
- \r
+ LikeReserveList overlapRsvList = recorders.findOverlapReserves(tvd, clickedDateTime);\r
+\r
// 類似と重複で被るものを重複から除外\r
- for ( LikeReserveItem ll : likeRsvList ) {\r
- int i=0;\r
- for ( ; i<overlapRsvList.size(); i++ ) {\r
- if ( ll.getRsv() == overlapRsvList.getRsv(i) ) {\r
- break;\r
- }\r
- }\r
- if ( i < overlapRsvList.size() ) {\r
- overlapRsvList.remove(i);\r
- }\r
+ for ( LikeReserveItem item : likeRsvList ) {\r
+ overlapRsvList.removeDup(item);\r
}\r
\r
// 予約実行ON・OFF\r
rsvList = overlapRsvList;\r
}\r
\r
- for ( int i=0; i<rsvList.size(); i++ ) {\r
+ for ( LikeReserveItem rsvItem : rsvList ) {\r
\r
- final boolean fexec = rsvList.getRsv(i).getExec();\r
- final String title = rsvList.getRsv(i).getTitle();\r
- final String chnam = rsvList.getRsv(i).getCh_name();\r
- final String rsvId = rsvList.getRsv(i).getId();\r
- final String recId = rsvList.getRec(i).Myself();\r
+ final boolean fexec = rsvItem.getRsv().getExec();\r
+ final String start = rsvItem.getRsv().getAhh()+":"+rsvItem.getRsv().getAmm();\r
+ final String title = rsvItem.getRsv().getTitle();\r
+ final String chnam = rsvItem.getRsv().getCh_name();\r
+ final String rsvId = rsvItem.getRsv().getId();\r
+ final String recId = rsvItem.getRec().Myself();\r
\r
- pop.add(getExecOnOffMenuItem(fexec,title,chnam,rsvId,recId,n));\r
+ pop.add(getExecOnOffMenuItem(fexec,start,title,chnam,rsvId,recId,n));\r
}\r
\r
pop.addSeparator();\r
rsvList = overlapRsvList;\r
}\r
\r
- for (int i=0; i<rsvList.size(); i++) {\r
+ for ( LikeReserveItem rsvItem : rsvList ) {\r
\r
- final String title = rsvList.getRsv(i).getTitle();\r
- final String chnam = rsvList.getRsv(i).getCh_name();\r
- final String rsvId = rsvList.getRsv(i).getId();\r
- final String recId = rsvList.getRec(i).Myself();\r
+ final String start = rsvItem.getRsv().getAhh()+":"+rsvItem.getRsv().getAmm();\r
+ final String title = rsvItem.getRsv().getTitle();\r
+ final String chnam = rsvItem.getRsv().getCh_name();\r
+ final String rsvId = rsvItem.getRsv().getId();\r
+ final String recId = rsvItem.getRec().Myself();\r
\r
- pop.add(getRemoveRsvMenuItem(title,chnam,rsvId,recId,n));\r
+ pop.add(getRemoveRsvMenuItem(start, title,chnam,rsvId,recId,n));\r
}\r
\r
pop.addSeparator();\r
// ジャンプする\r
{\r
if ( mainWindow.isTabSelected(MWinTab.LISTED) ) {\r
- pop.add(getJumpMenuItem(tvd.title,tvd.center,tvd.startDateTime));\r
+ pop.add(getJumpMenuItem(tvd.title,tvd.center,tvd.accurateDate+" "+tvd.start));\r
}\r
if ( mainWindow.isTabSelected(MWinTab.LISTED) || mainWindow.isTabSelected(MWinTab.PAPER) ) {\r
JMenuItem mi = getJumpToLastWeekMenuItem(tvd.title,tvd.center,tvd.startDateTime);\r
\r
if ( ! isRemoveItem ) // 過去ログは処理対象外です\r
{\r
- final String label = tvd.title+" ("+tvd.center+")";\r
- JMenuItem menuItem = new JMenuItem("ピックアップへの追加【"+label+"】");\r
+ final String label = String.format("%s(%s)",tvd.title,tvd.center);\r
+ JMenuItem menuItem = new JMenuItem(String.format("ピックアップへの追加【%s %s - %s】",tvd.accurateDate,tvd.start,label));\r
menuItem.addActionListener(new ActionListener() {\r
public void actionPerformed(ActionEvent e) {\r
//\r
/**\r
* 予約を削除するメニューアイテム\r
*/\r
- private JMenuItem getRemoveRsvMenuItem(final String title, final String chnam, final String rsvId, final String recId, int n) {\r
+ private JMenuItem getRemoveRsvMenuItem(final String start, final String title, final String chnam, final String rsvId, final String recId, int n) {\r
//\r
- JMenuItem menuItem = new JMenuItem(((n==0)?"予約を削除する【":"隣接予約を削除する【")+title+"("+chnam+")/"+recId+"】");\r
+ JMenuItem menuItem = new JMenuItem();\r
+ \r
+ String mode = "削除";\r
menuItem.setForeground(Color.RED);\r
+ \r
+ String target = ( n==0 ) ? "予約" : "隣接予約";\r
+\r
+ menuItem.setText(String.format("%sを%sにする【%s - %s(%s)/%s】",target,mode,start,title,chnam,recId));\r
+ \r
if ( recId.equals(toolBar.getSelectedRecorder()) ) {\r
// 選択中のレコーダのものは太字に\r
Font f = menuItem.getFont();\r
rdialog.setOnlyUpdateExec(fexec);\r
rdialog.doUpdate();\r
\r
- if (rdialog.isReserved()) {\r
+ if (rdialog.isSucceededReserve()) {\r
// 予約状況を更新\r
listed.updateReserveMark();\r
paper.updateReserveBorder(chnam);\r
/**\r
* 予約実行をONOFFするメニューアイテム\r
*/\r
- private JMenuItem getExecOnOffMenuItem(final boolean fexec, final String title, final String chnam, final String rsvId, final String recId, int n) {\r
+ private JMenuItem getExecOnOffMenuItem(final boolean fexec, final String start, final String title, final String chnam, final String rsvId, final String recId, int n) {\r
\r
JMenuItem menuItem = new JMenuItem();\r
\r
}\r
else {\r
mode = "OFF";\r
+ menuItem.setForeground(Color.BLACK);\r
}\r
- \r
- menuItem.setText(((n==0)?"予約を":"隣接予約を")+mode+"にする【"+title+"("+chnam+")/"+recId+")】");\r
+\r
+ String target = ( n==0 ) ? "予約" : "隣接予約";\r
+\r
+ menuItem.setText(String.format("%sを%sにする【%s - %s(%s)/%s】",target,mode,start,title,chnam,recId));\r
\r
if ( recId.equals(toolBar.getSelectedRecorder()) ) {\r
// 選択中のレコーダのものは太字に\r
rdialog.setOnlyUpdateExec( ! fexec);\r
rdialog.doUpdate();\r
\r
- if (rdialog.isReserved()) {\r
+ if (rdialog.isSucceededReserve()) {\r
// 予約状況を更新\r
listed.updateReserveMark();\r
paper.updateReserveBorder(chnam);\r
* 新聞形式へジャンプするメニューアイテム\r
*/\r
private JMenuItem getJumpMenuItem(final String title, final String chnam, final String startDT) {\r
- JMenuItem menuItem = new JMenuItem("番組欄へジャンプする【"+title+" ("+chnam+")】");\r
+ JMenuItem menuItem = new JMenuItem(String.format("番組欄へジャンプする【%s - %s(%s)】",startDT,title,chnam));\r
menuItem.addActionListener(new ActionListener() {\r
public void actionPerformed(ActionEvent e) {\r
paper.jumpToBangumi(chnam,startDT);\r
});\r
return menuItem;\r
}\r
- private JMenuItem getJumpToLastWeekMenuItem(final String title, final String chnam, final String startDT) {\r
+ private JMenuItem getJumpToLastWeekMenuItem( final String title, final String chnam, final String startDT) {\r
GregorianCalendar cal = CommonUtils.getCalendar(startDT);\r
+ \r
if ( cal != null ) {\r
- JMenuItem menuItem = new JMenuItem("先週の番組欄へジャンプする【"+title+" ("+chnam+")】");\r
cal.add(Calendar.DATE, -7);\r
- final String lastweek = CommonUtils.getDateTime(cal);\r
+ final String lastdatetime = CommonUtils.getDateTimeW(cal);\r
+ \r
+ JMenuItem menuItem = new JMenuItem(String.format("先週の番組欄へジャンプする【%s - (%s)】",lastdatetime,chnam));\r
+ \r
menuItem.addActionListener(new ActionListener() {\r
public void actionPerformed(ActionEvent e) {\r
- paper.jumpToBangumi(chnam,lastweek);\r
+ paper.jumpToBangumi(chnam,lastdatetime);\r
}\r
});\r
return menuItem;\r
return null;\r
}\r
\r
- // カーソル位置にかかる予約枠の検索\r
- private void searchOverlapRsv(LikeReserveList overlapRsvList, ProgDetailList tvd, int h)\r
- {\r
- String clicked = "";\r
- if ( h >= 0 && tvd.start.length() != 0 ) {\r
- // 新聞形式ならクリック位置の日時を算出する\r
- GregorianCalendar cala = CommonUtils.getCalendar(tvd.startDateTime);\r
- if ( CommonUtils.isLateNight(cala.get(Calendar.HOUR_OF_DAY)) ) {\r
- cala.set(Calendar.HOUR_OF_DAY, TIMEBAR_START);\r
- cala.set(Calendar.MINUTE, 0);\r
- }\r
- cala.add(Calendar.MINUTE, Math.round(h/bounds.getPaperHeightMultiplier()));\r
- clicked = CommonUtils.getDateTime(cala);\r
- //StdAppendError("clicked:"+clicked);\r
- }\r
- \r
- HashMap<String,Boolean> misCN = new HashMap<String, Boolean>();\r
- for ( HDDRecorder recorder : recorders ) {\r
- \r
- // 終了した予約を整理する\r
- recorder.refreshReserves();\r
- \r
- for ( ReserveList r : recorder.getReserves() ) {\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
- if(r.getChannel().length() > 0) {\r
- misCN.put(r.getChannel(),true);\r
- }\r
- continue;\r
- }\r
- if ( ! r.getCh_name().equals(tvd.center)) {\r
- continue;\r
- }\r
- \r
- // 重複時間チェック\r
- boolean inRange = false;\r
- long d = 0;\r
- {\r
- ArrayList<String> starts = new ArrayList<String>();\r
- ArrayList<String> ends = new ArrayList<String>();\r
- CommonUtils.getStartEndList(starts, ends, r);\r
- if ( h >= 0 ) {\r
- // 新聞形式はピンポイント(マウスポインタのある位置の時刻)\r
- for (int j=0; j<starts.size(); j++) {\r
- if ( clicked.compareTo(starts.get(j)) >= 0 && clicked.compareTo(ends.get(j)) <= 0 ) {\r
- inRange = true;\r
- break;\r
- }\r
- }\r
- }\r
- else {\r
- // リスト形式は幅がある(開始~終了までの間のいずれかの時刻)\r
- for (int j=0; j<starts.size(); j++) {\r
- if ( CommonUtils.isOverlap(tvd.startDateTime, tvd.endDateTime, starts.get(j), ends.get(j), false) ) {\r
- inRange = true;\r
- d = CommonUtils.getDiffDateTime(tvd.startDateTime, starts.get(j));\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- if ( ! inRange) {\r
- continue;\r
- }\r
- \r
- // 類似予約あり!\r
- overlapRsvList.add(new LikeReserveItem(recorder, r, d));\r
- }\r
- }\r
- \r
- return;\r
- }\r
- \r
- \r
/*******************************************************************************\r
* タイマー関連\r
******************************************************************************/\r
private void loadTVProgramOnce(TVProgram tvp, String sType, String aName, boolean loadonly, boolean force) {\r
\r
final String FUNCID = "[Web番組表取得] ";\r
- final String ERRID = "[ERROR]"+FUNCID;\r
+// final String ERRID = "[ERROR]"+FUNCID;\r
\r
// ログ\r
String msg = FUNCID+sType+"を取得します: "+tvp.getTVProgramId();\r