import java.awt.TrayIcon;\r
import java.awt.datatransfer.Clipboard;\r
import java.awt.datatransfer.StringSelection;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.awt.event.ComponentAdapter;\r
-import java.awt.event.ComponentEvent;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.awt.event.WindowAdapter;\r
-import java.awt.event.WindowEvent;\r
+import java.awt.event.*;\r
import java.io.File;\r
import java.io.IOException;\r
import java.io.UnsupportedEncodingException;\r
import java.util.regex.Pattern;\r
\r
import javax.imageio.ImageIO;\r
-import javax.swing.ImageIcon;\r
-import javax.swing.JComponent;\r
-import javax.swing.JFrame;\r
-import javax.swing.JLabel;\r
-import javax.swing.JMenuItem;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPopupMenu;\r
-import javax.swing.SwingUtilities;\r
-import javax.swing.ToolTipManager;\r
-import javax.swing.UIManager;\r
+import javax.swing.*;\r
import javax.swing.event.ChangeEvent;\r
import javax.swing.event.ChangeListener;\r
\r
import tainavi.HDDRecorder.RecType;\r
-import tainavi.SearchKey.TargetId;\r
import tainavi.TVProgram.ProgFlags;\r
import tainavi.TVProgram.ProgGenre;\r
import tainavi.TVProgram.ProgOption;\r
import tainavi.TVProgram.ProgType;\r
import tainavi.VWMainWindow.MWinTab;\r
import tainavi.VWUpdate.UpdateResult;\r
+import tainavi.plugintv.Syobocal;\r
\r
\r
/**\r
* メインな感じ\r
*/\r
-public class Viewer extends JFrame implements ChangeListener,TickTimerListener,HDDRecorderListener {\r
+public class Viewer extends JFrame implements ChangeListener,TickTimerListener,HDDRecorderListener,CancelListener {\r
\r
private static final long serialVersionUID = 1L;\r
\r
toolBar.setBatchReservationEnabled(true);\r
// スナップショットを有効にする\r
toolBar.setSnapShotEnabled(true);\r
+ // 新聞形式以外ではマッチ枠を無効にする\r
+ toolBar.setBorderToggleEnabled(true, bounds.getShowReservedBackground());\r
}\r
\r
@Override\r
toolBar.setBatchReservationEnabled(false);\r
// スナップショットを無効にする\r
toolBar.setSnapShotEnabled(false);\r
+ // 新聞形式以外ではマッチ枠を無効にする\r
+ toolBar.setBorderToggleEnabled(false, bounds.getShowReservedBackground());\r
}\r
\r
@Override\r
// ジャンル別背景色を有効にする\r
toolBar.setPaperColorDialogEnabled(true);\r
// マッチ枠を有効にする\r
- toolBar.setBorderToggleEnabled(true);\r
+ toolBar.setBorderToggleEnabled(true, bounds.getShowMatchedBorder());\r
}\r
\r
@Override\r
// 新聞形式以外ではジャンル別背景色を無効にする\r
toolBar.setPaperColorDialogEnabled(false);\r
// 新聞形式以外ではマッチ枠を無効にする\r
- toolBar.setBorderToggleEnabled(false);\r
+ toolBar.setBorderToggleEnabled(false, bounds.getShowMatchedBorder());\r
}\r
\r
@Override\r
reserved.redrawListByKeywordFilter(search, kStr);\r
}\r
else if ( mainWindow.getSelectedTab() == MWinTab.RECED ) {\r
- recorded.redrawListByKeywordFilter(search, kStr);\r
+ if ( ! doFilter ) {\r
+ recorded.redrawListByKeyword(search, kStr);\r
+ }\r
+ else {\r
+ recorded.redrawListByErrorFilter();\r
+ }\r
}\r
else {\r
if ( search != null ) {\r
@Override\r
protected boolean jumpToPassed(String passed) {\r
timer_now.pause();\r
- boolean b = paper.jumpToBangumi(null,passed);\r
+ boolean b = paper.jumpToPassed(passed);\r
timer_now.start();\r
return b;\r
}\r
}\r
\r
@Override\r
- protected void toggleMatchBorder() {\r
+ protected void toggleMatchBorder(boolean b) {\r
timer_now.pause();\r
- paper.toggleMatchBorder();\r
+ if ( mainWindow.isTabSelected(MWinTab.LISTED) ) {\r
+ listed.toggleReservedBackground(b);\r
+ }\r
+ else if ( mainWindow.isTabSelected(MWinTab.PAPER) ) {\r
+ paper.toggleMatchBorder(b);\r
+ }\r
timer_now.start();\r
}\r
\r
}\r
\r
@Override\r
- protected void toggleSettingTabVisible() {\r
- mainWindow.toggleShowSettingTabs();\r
- }\r
-\r
- @Override\r
protected boolean isTabSelected(MWinTab tab) {\r
return mainWindow.isTabSelected(tab);\r
}\r
AbsKeywordDialog kD = new VWKeywordDialog();\r
CommonSwingUtils.setLocationCenter(Viewer.this,kD);\r
\r
- kD.open(search.getLabel(), search, srKeys, srGrps);\r
+ kD.open(search.getLabel(), srKeys, srGrps, search);\r
kD.setVisible(true);\r
\r
if (kD.isRegistered()) {\r
}\r
\r
/**\r
+ * \r
+ */\r
+ @Override\r
+ public void cancelRised(CancelEvent e) {\r
+ if ( mainWindow.isTabSelected(MWinTab.RSVED) ) {\r
+ if ( e.getCause() == CancelEvent.Cause.TOOLBAR_SEARCH ) {\r
+ reserved.redrawListByKeywordFilter(null,null);\r
+ }\r
+ }\r
+ else if ( mainWindow.isTabSelected(MWinTab.RECED) ) {\r
+ if ( e.getCause() == CancelEvent.Cause.TOOLBAR_SEARCH ) {\r
+ recorded.redrawListByKeyword(null,null);\r
+ }\r
+ }\r
+ }\r
+ \r
+ /**\r
* タイマーイベントが発生\r
*/\r
@Override\r
\r
// 番組追跡へ追加する\r
{\r
- final String label = tvd.title+" ("+tvd.center+")";\r
+ final String label = TraceProgram.getNewLabel(tvd.title, tvd.center);\r
JMenuItem menuItem = new JMenuItem("番組追跡への追加【"+label+"】");\r
menuItem.addActionListener(new ActionListener() {\r
public void actionPerformed(ActionEvent e) {\r
//\r
- for (TraceKey tr : trKeys.getTraceKeys()) {\r
- if (tr.getLabel().equals(label)) {\r
- mwin.appendMessage("【警告】すでに番組追跡に登録されています:"+label);\r
- ringBeep();\r
- return;\r
- }\r
- }\r
- \r
- //\r
- trKeys.add(label, tvd.title, tvd.center, env.getDefaultFazzyThreshold());\r
-\r
VWTraceKeyDialog tD = new VWTraceKeyDialog(0,0);\r
CommonSwingUtils.setLocationCenter(mainWindow,tD);\r
\r
- tD.reopen(label, trKeys);\r
+ tD.open(trKeys, tvd, env.getDefaultFazzyThreshold());\r
tD.setVisible(true);\r
\r
- if (tD.isRegistered()) { \r
+ if (tD.isRegistered()) {\r
//\r
trKeys.save();\r
\r
JMenuItem menuItem = new JMenuItem("キーワード検索への追加【"+label+"】");\r
menuItem.addActionListener(new ActionListener(){\r
public void actionPerformed(ActionEvent e){\r
- //\r
- for (SearchKey sr : srKeys.getSearchKeys()) {\r
- if (sr.getLabel().equals(tvd.title)) {\r
- ringBeep();\r
- String msg = "すでにキーワード検索に登録されています: "+tvd.title;\r
- mwin.appendMessage(msg);\r
- JOptionPane.showConfirmDialog(null, msg, "警告", JOptionPane.CLOSED_OPTION); // キーワード検索の追加ではダイアログで修正できるので止めない\r
- //return;\r
- }\r
- }\r
+ \r
// 「キーワード検索の設定」ウィンドウを開く\r
- SearchKey search = new SearchKey();\r
- {\r
- search.setCondition("0");\r
- search.alTarget.add(TargetId.TITLE);\r
- search.alContain.add("0");\r
- search.alKeyword.add(tvd.title);\r
- }\r
- {\r
- search.setCondition("0");\r
- search.alTarget.add(TargetId.CHANNEL);\r
- search.alContain.add("0");\r
- search.alKeyword.add(tvd.center);\r
- }\r
- {\r
- AbsKeywordDialog kD = new VWKeywordDialog();\r
- CommonSwingUtils.setLocationCenter(mainWindow,kD);\r
- \r
- kD.open(tvd.title, search, srKeys, srGrps);\r
- kD.setVisible(true);\r
+ \r
+ AbsKeywordDialog kD = new VWKeywordDialog();\r
+ CommonSwingUtils.setLocationCenter(mainWindow,kD);\r
+ \r
+ kD.open(srKeys, srGrps, tvd);\r
+ kD.setVisible(true);\r
+ \r
+ if (kD.isRegistered()) {\r
+ // 検索結果の再構築\r
+ mpList.clear(env.getDisableFazzySearch(), env.getDisableFazzySearchReverse());\r
+ mpList.build(tvprograms, trKeys.getTraceKeys(), srKeys.getSearchKeys());\r
\r
- if (kD.isRegistered()) {\r
- // 検索結果の再構築\r
- mpList.clear(env.getDisableFazzySearch(), env.getDisableFazzySearchReverse());\r
- mpList.build(tvprograms, trKeys.getTraceKeys(), srKeys.getSearchKeys());\r
- \r
- // ツリーに反映する\r
- listed.redrawTreeByKeyword();\r
+ // ツリーに反映する\r
+ listed.redrawTreeByKeyword();\r
\r
- // 表示を更新する\r
- paper.updateBangumiColumns();\r
- listed.reselectTree();\r
- \r
- mwin.appendMessage("キーワード検索へ追加しました【"+label+"】");\r
- }\r
+ // 表示を更新する\r
+ paper.updateBangumiColumns();\r
+ listed.reselectTree();\r
+ \r
+ mwin.appendMessage("キーワード検索へ追加しました【"+label+"】");\r
}\r
}\r
});\r
\r
@Override\r
protected void doFinally() {\r
- stwin.setVisible(false);\r
+ StWinSetVisible(false);\r
}\r
}.execute();\r
\r
CommonSwingUtils.setLocationCenter(Viewer.this, stwin);\r
- stwin.setVisible(true);\r
+ StWinSetVisible(true);\r
\r
// 予約状況を更新\r
listed.updateReserveMark();\r
\r
/**\r
* Web番組表をDLする\r
- * <P>単体実行の場合はこちらを呼び出す:{@link #doLoadTVProgram(LoadFor)}\r
+ * <P>単体実行の場合はこちらを呼び出す:{@link #doLoadTVProgram(boolean, tainavi.Viewer.LoadFor)}\r
* <P>部品実行の場合はこちらを呼び出す\r
*/\r
private boolean loadTVProgram(final boolean force, final LoadFor lf) {\r
\r
// 番組タイトルを整形する\r
private void fixTitle() {\r
+ // 番組追跡からサブタイトルを除外するかどうかのフラグ\r
+ ProgDetailList.tracenOnlyTitle = env.getFixTitle() && env.getTraceOnlyTitle();\r
//\r
if ( ! env.getFixTitle()) {\r
return;\r
// NHK系で先頭が「アニメ 」ではじまるものから「アニメ 」を削除する\r
tvd.title = tvd.title.replaceFirst("^アニメ[ ・]+","");\r
tvd.titlePop = TraceProgram.replacePop(tvd.title);\r
- tvd.SearchStrKeys = TraceProgram.splitKeys(tvd.titlePop);\r
}\r
if ( tvd.title.contains("コメンタリ") || tvd.detail.contains("コメンタリ") ) {\r
// "コメンタリ"の記述のあるものは「副音声」扱いにする(副音声でなくても)\r
// ジャンル=映画でサブジャンルが複数ありアニメが優先されてないものはアニメを優先する\r
tvd.subgenre = ProgSubgenre.MOVIE_ANIME;\r
}\r
- \r
- // サブタイトルを番組追跡の対象から外す\r
- if ( env.getTraceOnlyTitle() && tvd.title != tvd.splitted_title ) {\r
- tvd.SearchStrKeys = TraceProgram.splitKeys(TraceProgram.replacePop(tvd.splitted_title)); // 番組追跡の検索用インデックスは、サブタイトルを削除したもので置き換える\r
- }\r
}\r
}\r
}\r
// ほにゃらら\r
toolBar.setDebug(env.getDebug());\r
autores.setDebug(env.getDebug());\r
+ rdialog.setDebug(env.getDebug());\r
\r
// PassedProgramListの設定変更\r
tvprograms.getPassed().setPassedDir(env.getPassedDir());\r
// 列の表示・非表示\r
listed.setMarkColumnVisible(env.getSplitMarkAndTitle());\r
listed.setDetailColumnVisible(env.getShowDetailOnList());\r
+ listed.setPickupColumnVisible(env.getShowRsvPickup());\r
+ listed.setDupColumnVisible(env.getShowRsvDup());\r
listed.setRowHeaderVisible(env.getRowHeaderVisible());\r
reserved.setRowHeaderVisible(env.getRowHeaderVisible());\r
\r
\r
//\r
ArrayList<String> recIda = new ArrayList<String>();\r
- for ( File f : new File(CommonUtils.joinPath(new String[]{"bin","tainavi"})).listFiles() ) {\r
+ for ( File f : new File(CommonUtils.joinPath(new String[]{"bin","tainavi","pluginrec"})).listFiles() ) {\r
Matcher ma = Pattern.compile("^(PlugIn_Rec[^$]+)[^$]*\\.class$").matcher(f.getName());\r
if ( ma.find() ) {\r
if ( ! isMailPluginEnabled && f.getName().toLowerCase().contains("mail") ) {\r
// servicesに追記\r
StringBuilder sb = new StringBuilder();\r
for ( String recId : recIdd ) {\r
- sb.append("tainavi.");\r
+ sb.append("tainavi.pluginrec.");\r
sb.append(recId);\r
sb.append("\n");\r
}\r
*/\r
\r
ArrayList<String> prgIda = new ArrayList<String>();\r
- for ( File f : new File(CommonUtils.joinPath("bin","tainavi")).listFiles() ) {\r
+ for ( File f : new File(CommonUtils.joinPath("bin","tainavi","plugintv")).listFiles() ) {\r
Matcher ma = Pattern.compile("^(PlugIn_(TV|CS|RAD)P[^$]+)\\.class$").matcher(f.getName());\r
if (ma.find()) {\r
prgIda.add(ma.group(1));\r
// servicesに追記\r
StringBuilder sb = new StringBuilder();\r
for ( String prgId : prgIdd ) {\r
- sb.append("tainavi.");\r
+ sb.append("tainavi.plugintv.");\r
sb.append(prgId);\r
sb.append("\n");\r
}\r
// 設定\r
toolBar.setDebug(env.getDebug());\r
autores.setDebug(env.getDebug());\r
+ rdialog.setDebug(env.getDebug());\r
\r
// ページャーの設定\r
toolBar.setPagerItems();\r
}\r
else {\r
// 設定が存在する場合\r
- mainWindow.setSelectedTab(MWinTab.getAt(bounds.getSelectedTab()));\r
+ MWinTab tab = MWinTab.getAt(bounds.getSelectedTab());\r
+ mainWindow.setSelectedTab(tab);\r
}\r
}\r
\r
listed.saveTreeExpansion();\r
paper.saveTreeExpansion();\r
}\r
- \r
+\r
+ private void setKeyboardShortCut() {\r
+ class ShortCut {\r
+ final String action;\r
+ final int key;\r
+ final int mask;\r
+ final Action callback;\r
+\r
+ public ShortCut(String aAction, int aKey, int aMask, Action aCallback) {\r
+ action = aAction;\r
+ key = aKey;\r
+ mask = aMask;\r
+ callback = aCallback;\r
+ }\r
+ }\r
+\r
+ final String FIND_ACTION = "find";\r
+ final String SELECT_ACTION_LISTTAB = "listtab";\r
+ final String SELECT_ACTION_PAPERTAB = "papertab";\r
+ final String SELECT_ACTION_RSVEDTAB = "rsvedtab";\r
+ final String SELECT_ACTION_RECEDTAB = "recedtab";\r
+ final String SELECT_ACTION_AUTORESTAB = "autorestab";\r
+\r
+ final Action find_action = new AbstractAction() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ toolBar.setFocusInSearchBox();\r
+ }\r
+ };\r
+ final Action select_action_listtab = new AbstractAction() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ mainWindow.setSelectedTab(MWinTab.LISTED);\r
+ }\r
+ };\r
+ final Action select_action_papertab = new AbstractAction() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ mainWindow.setSelectedTab(MWinTab.PAPER);\r
+ }\r
+ };\r
+ final Action select_action_rsvedtab = new AbstractAction() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ mainWindow.setSelectedTab(MWinTab.RSVED);\r
+ }\r
+ };\r
+ final Action select_action_recedtab = new AbstractAction() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ mainWindow.setSelectedTab(MWinTab.RECED);\r
+ }\r
+ };\r
+ final Action select_action_autorestab = new AbstractAction() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ mainWindow.setSelectedTab(MWinTab.AUTORES);\r
+ }\r
+ };\r
+\r
+ ArrayList<ShortCut> sca = new ArrayList<ShortCut>();\r
+ sca.add(new ShortCut(FIND_ACTION, KeyEvent.VK_F, KeyEvent.CTRL_DOWN_MASK, find_action));\r
+ sca.add(new ShortCut(SELECT_ACTION_LISTTAB, KeyEvent.VK_1, KeyEvent.ALT_DOWN_MASK, select_action_listtab));\r
+ sca.add(new ShortCut(SELECT_ACTION_PAPERTAB, KeyEvent.VK_2, KeyEvent.ALT_DOWN_MASK, select_action_papertab));\r
+ sca.add(new ShortCut(SELECT_ACTION_RSVEDTAB, KeyEvent.VK_3, KeyEvent.ALT_DOWN_MASK, select_action_rsvedtab));\r
+ sca.add(new ShortCut(SELECT_ACTION_RECEDTAB, KeyEvent.VK_4, KeyEvent.ALT_DOWN_MASK, select_action_recedtab));\r
+ sca.add(new ShortCut(SELECT_ACTION_AUTORESTAB, KeyEvent.VK_5, KeyEvent.ALT_DOWN_MASK, select_action_autorestab));\r
+\r
+ InputMap imap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);\r
+ for ( ShortCut sc : sca ) {\r
+ imap.put(KeyStroke.getKeyStroke(sc.key, sc.mask), sc.action);\r
+ getRootPane().getActionMap().put(sc.action, sc.callback);\r
+ }\r
+ }\r
\r
/*******************************************************************************\r
* main()\r
toolBar.addHDDRecorderSelectionListener(paper); // 新聞形式\r
toolBar.addHDDRecorderSelectionListener(autores); // 自動予約一覧\r
toolBar.addHDDRecorderSelectionListener(rdialog); // 予約ダイアログ\r
+\r
+ // [ツールバー/キーワード入力] キャンセル動作\r
+ toolBar.addKeywordCancelListener(this);\r
\r
// [タイマー] タイトルバー更新/リスト形式の現在時刻ノード/新聞形式の現在時刻ノード\r
timer_now.addTickTimerRiseListener(this);\r
setTitleBar(); // タイトルバー更新\r
\r
ShowInitTab(); // 前回開いていたタブを開く\r
- \r
+\r
+ setKeyboardShortCut();\r
+\r
// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r
// タイマーを起動する\r
// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\r