OSDN Git Service

情報更新を行った旨をステータスバーに表示するようにした
[nt-manager/nt-manager.git] / src / twitter / gui / component / TweetTabbedTable.java
1 /*
2  * To change this template, choose Tools | Templates
3  * and open the template in the editor.
4  */
5
6 package twitter.gui.component;
7
8 import java.awt.Color;
9 import java.awt.Point;
10 import java.awt.event.MouseAdapter;
11 import java.awt.event.MouseEvent;
12 import java.util.List;
13 import javax.swing.JMenuItem;
14 import javax.swing.JPopupMenu;
15 import javax.swing.JScrollPane;
16 import javax.swing.JTabbedPane;
17 import javax.swing.JTable;
18 import javax.swing.event.ListSelectionEvent;
19 import javax.swing.event.ListSelectionListener;
20 import javax.swing.table.TableCellRenderer;
21 import javax.swing.table.TableColumn;
22 import javax.swing.table.TableColumnModel;
23 import twitter.action.TweetGetter;
24 import twitter.gui.action.TweetMainAction;
25 import twitter.manage.TweetManager;
26 import twitter4j.Status;
27 import twitter4j.TwitterException;
28
29 /**
30  * ツイートを表示するテーブルを扱うクラス
31  * @author nishio
32  */
33 public class TweetTabbedTable {
34     //ツイートを表示するテーブル
35     private JTable table;
36     //ツイートを表示するテーブルのモデル
37     private TweetTableModel model;
38     //未読のツイート数
39     private int uncheckedTweet;
40     //ツイートを取得する時に行うアクション
41     private TweetGetter tweetGetter;
42     //タブに表示される名前
43     private String title;
44     //タブ
45     private JTabbedPane tabbedPane;
46     //何番目のタブにテーブルをセットするか
47     private int tabSetNum;
48     //スクロールペーン
49     private JScrollPane scrollPane;
50     //ツイートを管理するクラス
51     private TweetManager tweetManager;
52     //メインアクション
53     private TweetMainAction mainAction;
54     //右クリックを押した時のポップアップ
55     private JPopupMenu rightClickPopup = null;
56     //テーブルの高さ
57     private int tableElementHeight;
58     //新しく取得した部分のテーブルの色
59     private Color newTableColor = null;
60     //テーブルに追加できる要素の最大数
61     private int tableElementMaxSize = 200;
62     //自動更新に使うタイマーのID
63     private String timerID;
64
65
66     /**
67      *
68      * @param tweetGetter tweet取得時に行うアクション
69      * @param title タブに表示するタイトル
70      * @param tabbedPane テーブルを追加するタブ
71      * @param tabSetNum 何番目のタブにセットするか
72      * @param tableElementHeight テーブルの高さ
73      * @param tweetManager ツイート管理クラス
74      * @param mainAction メインアクション
75      * @param newTableColor 新しく取得した部分の色
76      * @param tableElementMaxSize テーブルに格納できる要素の最大数
77      * @param timerID 自動更新につかうタイマーのID
78      */
79     public TweetTabbedTable(TweetGetter tweetGetter,
80             String title, JTabbedPane tabbedPane, int tabSetNum, int tableElementHeight,
81             TweetManager tweetManager, TweetMainAction mainAction, Color newTableColor,
82             int tableElementMaxSize, String timerID) {
83         this.tweetGetter = tweetGetter;
84         this.title = title;
85         this.tabbedPane = tabbedPane;
86         this.tabSetNum = tabSetNum;
87         this.tweetManager = tweetManager;
88         this.mainAction = mainAction;
89         this.tableElementHeight = tableElementHeight;
90         this.newTableColor = newTableColor;
91         this.tableElementMaxSize = tableElementMaxSize;
92         this.timerID = timerID;
93
94         table = new JTable();
95         model = new TweetTableModel();
96         uncheckedTweet = 0;
97         scrollPane = new JScrollPane();
98     }
99
100     /**
101      * Tweet情報を表示するテーブルをタブに追加
102      */
103     public void addTableToTab() {
104         //テーブルをタブに追加
105         getTable().setModel(model);
106         getTable().getTableHeader().setReorderingAllowed(false);
107         getTable().addMouseListener(new java.awt.event.MouseAdapter() {
108             @Override
109             public void mousePressed(java.awt.event.MouseEvent evt) {
110                 jTableMousePressed(evt);
111             }
112             @Override
113             public void mouseReleased(java.awt.event.MouseEvent evt) {
114                 jTableMouseReleased(evt);
115             }
116         });
117
118         //tweetを表示するテーブルを作成
119         createTweetTable(getTable());
120
121         //スクロールペーン追加
122         scrollPane.setViewportView(getTable());
123         //タブにテーブル追加
124         tabbedPane.addTab(this.title, scrollPane);
125     }
126
127     /**
128      * Tweetを表示するテーブルを作成
129      *
130      * @param model
131      * @return
132      */
133     private void createTweetTable(final JTable table) {
134
135         table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
136         table.setShowVerticalLines(false);
137         table.setShowHorizontalLines(true);
138
139         // Comment部分のColumnを複数行コメントが表示できるようにする
140         TableColumnModel mdl = table.getColumnModel();
141         TableColumn col = mdl.getColumn(1);
142         TweetCommentRenderer commentRenderer = new TweetCommentRenderer();
143         col.setCellRenderer(commentRenderer);
144         // INfo部分のColumnを複数行表示できるように
145         TweetCommentRenderer infoRenderer = new TweetCommentRenderer();
146         col = mdl.getColumn(2);
147         col.setCellRenderer(infoRenderer);
148         col.setMaxWidth(200);
149         col.setMinWidth(150);
150         // TODO:とりあえず幅指定した部分
151         // あとでファイルに幅情報などを保存しておき,それを読み込んで設定するような仕様に変更する
152         // ユーザImageを表示する部分
153         col = mdl.getColumn(0);
154         col.setCellRenderer(new UserImageRenderer());
155         col.setMinWidth(50);
156         col.setMaxWidth(50);
157         // 選択したセルの情報をDetailInfoへと表示
158         table.getSelectionModel().addListSelectionListener(
159                 new ListSelectionListener() {
160
161                     @Override
162                     public void valueChanged(ListSelectionEvent e) {
163
164                         if (e.getValueIsAdjusting()) {
165                             return;
166                         }
167
168                         //テーブルで選択した要素を詳細情報として表示
169                         mainAction.setDetailInformationFromTable(table);
170                     }
171                 });
172         // JTableを右クリックでも選択できるようにする
173         // また,同じ行を2回クリックできるようにする
174         table.addMouseListener(new MouseAdapter() {
175
176             @Override
177             public void mousePressed(MouseEvent e) {
178                 // いったんSelectしていた情報を削除
179                 table.clearSelection();
180                 // if (e.getButton() == MouseEvent.BUTTON3) {
181                 Point p = e.getPoint();
182                 int col = table.columnAtPoint(p);
183                 int row = table.rowAtPoint(p);
184                 table.changeSelection(row, col, false, false);
185                 // }
186             }
187         });
188         // MouseEventを追加
189         table.addMouseListener(commentRenderer);
190         table.addMouseMotionListener(commentRenderer);
191         table.addMouseListener(infoRenderer);
192         table.addMouseMotionListener(infoRenderer);
193     }
194
195     /**
196      * テーブル情報更新
197      */
198     public void updateTweetTable() {
199         try {
200             // API残り回数を取得
201             int remainingHits = tweetManager.getRateLimitStatus().getRemainingHits();
202             if (remainingHits <= 0) {
203                 return;
204             }
205             // ツイート情報
206             List<Status> tweet = tweetGetter.getNewTweetData();
207             // まだ見ていないtweet数を追加
208             this.setUncheckedTweet(this.getUncheckedTweet() + tweet.size());
209
210             // まだチェックしていないtweetの数をタブにも表示
211             if (this.getUncheckedTweet() > 0) {
212                 tabbedPane.setTitleAt(this.getTabSetNum(), this.title + "("
213                         + this.getUncheckedTweet() + ")");
214             }
215             // ツイートをテーブルに追加
216             for (Status t : tweet) {
217                 this.getModel().insertTweet(t);
218                 this.getTable().setRowHeight(0, getTableElementHeight());
219             }
220             // 新規した部分の背景色を変更
221             TableCellRenderer renderer = getTable().getCellRenderer(0, 2);
222             if (renderer instanceof TweetCommentRenderer) {
223                 if (this.getUncheckedTweet() - 1 >= 0) {
224                     ((TweetCommentRenderer) renderer).updateNewCellRow(
225                             this.getUncheckedTweet(), newTableColor);
226                 } else {
227                     ((TweetCommentRenderer) renderer).updateNewCellRow(-1,
228                             newTableColor);
229                 }
230             }
231             // 古いデータを削除
232             getModel().removeOldTweet( getTableElementMaxSize() );
233             //時間情報リフレッシュ
234             getModel().refreshTime();
235             //新しい情報
236             int newNum = 0;
237             if( tweet != null ) {
238                 newNum = tweet.size();
239             }
240             //情報を取得したことをステータスバーに表示
241             mainAction.information( this.getTitle() + "タブのツイートを" + newNum +
242                     "件取得しました. (APIリクエスト残数は" + remainingHits
243                     + "回です)");
244
245             //情報間隔毎に設定を保存
246             this.mainAction.saveProperties();
247         } catch (TwitterException e1) {
248             e1.printStackTrace();
249         } catch (Exception e) {
250             e.printStackTrace();
251         }
252     }
253
254     /**
255      * マウスクリック時の動作
256      * @param evt
257      */
258     private void jTableMousePressed(java.awt.event.MouseEvent evt) {
259         //右クリックメニュー表示
260         showPopup(evt);
261         //未読ツイート分を0にする
262         this.setUncheckedTweet(0);
263         this.setTitle( this.getTitle() );
264     }
265
266     /**
267      * マウスリリース時の動作
268      * @param evt
269      */
270     private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
271         //右クリックメニュー表示
272         showPopup(evt);
273     }
274
275     /**
276      * ポップアップメニューを作成
277      * @param e
278      */
279     private void showPopup(MouseEvent e) {
280         if (e.isPopupTrigger()) {
281             // 右クリックのメニューを表示
282             getRightClickPopup().show(e.getComponent(), e.getX(),
283                     e.getY());
284         }
285     }
286
287     /**
288      * 右クリックを押した時のポップアップメニューを取得
289      *
290      * @return
291      */
292     private JPopupMenu getRightClickPopup() {
293         if (rightClickPopup == null) {
294             rightClickPopup = new JPopupMenu();
295             JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信");
296             directMessageMenuItem.addActionListener(new java.awt.event.ActionListener() {
297
298                 public void actionPerformed(java.awt.event.ActionEvent e) {
299                     // ダイレクトメッセージ送信ダイアログを表示
300                     mainAction.actionShowDirectMessageDialog();
301                 }
302             });
303             rightClickPopup.add(directMessageMenuItem);
304             JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート");
305             retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
306
307                 public void actionPerformed(java.awt.event.ActionEvent e) {
308                     // 選択したセルのステータスをRetweet
309                     mainAction.actionRetweet();
310                 }
311             });
312             rightClickPopup.add(retweetMenuItem);
313             JMenuItem quoteMenuItem = new JMenuItem("発言をコメント付きリツイート");
314             quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
315
316                 public void actionPerformed(java.awt.event.ActionEvent e) {
317                     // 選択したセルのステータスをコメント付Retweet
318                     mainAction.actionCopySelectedStatusToTweetBoxPane();
319                 }
320             });
321             rightClickPopup.add(quoteMenuItem);
322
323             JMenuItem statusBrowserMenuItem = new JMenuItem("発言をブラウザで開く");
324             statusBrowserMenuItem.addActionListener(new java.awt.event.ActionListener() {
325
326                 public void actionPerformed(java.awt.event.ActionEvent e) {
327                     // 選択したセルのステータスをブラウザで開く
328                     mainAction.actionOpenStatusURL();
329                 }
330             });
331             rightClickPopup.add(statusBrowserMenuItem);
332
333             JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
334                     "この人のTimelineをブラウザで開く");
335             openBrowserUserInformationMenuItem.addActionListener(new java.awt.event.ActionListener() {
336
337                 public void actionPerformed(java.awt.event.ActionEvent e) {
338                     // 選択したセルのユーザ情報をブラウザで開く
339                     mainAction.actionOpenUserURL();
340                 }
341             });
342             rightClickPopup.add(openBrowserUserInformationMenuItem);
343         }
344         return rightClickPopup;
345     }
346
347     /**
348      * @return the title
349      */
350     public String getTitle() {
351         return title;
352     }
353
354     /**
355      * @param title the title to set
356      */
357     public void setTitle(String title) {
358         this.title = title;
359         this.tabbedPane.setTitleAt( this.getTabSetNum() , title);
360     }
361
362     /**
363      * @return the tableElementHeight
364      */
365     public int getTableElementHeight() {
366         return tableElementHeight;
367     }
368
369     /**
370      * @param tableElementHeight the tableElementHeight to set
371      */
372     public void setTableElementHeight(int tableElementHeight) {
373         this.tableElementHeight = tableElementHeight;
374     }
375
376     /**
377      * @return the tableElementMaxSize
378      */
379     public int getTableElementMaxSize() {
380         return tableElementMaxSize;
381     }
382
383     /**
384      * @param tableElementMaxSize the tableElementMaxSize to set
385      */
386     public void setTableElementMaxSize(int tableElementMaxSize) {
387         this.tableElementMaxSize = tableElementMaxSize;
388     }
389
390     /**
391      * @return the model
392      */
393     public TweetTableModel getModel() {
394         return model;
395     }
396
397     /**
398      * @param model the model to set
399      */
400     public void setModel(TweetTableModel model) {
401         this.model = model;
402     }
403
404     /**
405      * @return the tabSetNum
406      */
407     public int getTabSetNum() {
408         return tabSetNum;
409     }
410
411     /**
412      * @return the uncheckedTweet
413      */
414     public int getUncheckedTweet() {
415         return uncheckedTweet;
416     }
417
418     /**
419      * @param uncheckedTweet the uncheckedTweet to set
420      */
421     public void setUncheckedTweet(int uncheckedTweet) {
422         this.uncheckedTweet = uncheckedTweet;
423     }
424
425     /**
426      * @param tabSetNum the tabSetNum to set
427      */
428     public void setTabSetNum(int tabSetNum) {
429         this.tabSetNum = tabSetNum;
430     }
431
432     /**
433      * @return the timerID
434      */
435     public String getTimerID() {
436         return timerID;
437     }
438
439     /**
440      * @return the table
441      */
442     public JTable getTable() {
443         return table;
444     }
445
446 }