OSDN Git Service

72c47e9f567414d0b179258054b0d45d72adc0c7
[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         table.setModel(model);
106         table.getTableHeader().setReorderingAllowed(false);
107         table.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(table);
120
121         //スクロールペーン追加
122         scrollPane.setViewportView(table);
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.table.setRowHeight(0, getTableElementHeight());
219             }
220             // 新規した部分の背景色を変更
221             TableCellRenderer renderer = table.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         } catch (TwitterException e1) {
236             e1.printStackTrace();
237         } catch (Exception e) {
238             e.printStackTrace();
239         }
240     }
241
242     /**
243      * マウスクリック時の動作
244      * @param evt
245      */
246     private void jTableMousePressed(java.awt.event.MouseEvent evt) {
247         //右クリックメニュー表示
248         showPopup(evt);
249         //未読ツイート分を0にする
250         this.setUncheckedTweet(0);
251         this.setTitle( this.getTitle() );
252     }
253
254     /**
255      * マウスリリース時の動作
256      * @param evt
257      */
258     private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
259         //右クリックメニュー表示
260         showPopup(evt);
261     }
262
263     /**
264      * ポップアップメニューを作成
265      * @param e
266      */
267     private void showPopup(MouseEvent e) {
268         if (e.isPopupTrigger()) {
269             // 右クリックのメニューを表示
270             getRightClickPopup().show(e.getComponent(), e.getX(),
271                     e.getY());
272         }
273     }
274
275     /**
276      * 右クリックを押した時のポップアップメニューを取得
277      *
278      * @return
279      */
280     private JPopupMenu getRightClickPopup() {
281         if (rightClickPopup == null) {
282             rightClickPopup = new JPopupMenu();
283             JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信");
284             directMessageMenuItem.addActionListener(new java.awt.event.ActionListener() {
285
286                 public void actionPerformed(java.awt.event.ActionEvent e) {
287                     // ダイレクトメッセージ送信ダイアログを表示
288                     mainAction.actionShowDirectMessageDialog();
289                 }
290             });
291             rightClickPopup.add(directMessageMenuItem);
292             JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート");
293             retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
294
295                 public void actionPerformed(java.awt.event.ActionEvent e) {
296                     // 選択したセルのステータスをRetweet
297                     mainAction.actionRetweet();
298                 }
299             });
300             rightClickPopup.add(retweetMenuItem);
301             JMenuItem quoteMenuItem = new JMenuItem("発言をコメント付きリツイート");
302             quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
303
304                 public void actionPerformed(java.awt.event.ActionEvent e) {
305                     // 選択したセルのステータスをコメント付Retweet
306                     mainAction.actionCopySelectedStatusToTweetBoxPane();
307                 }
308             });
309             rightClickPopup.add(quoteMenuItem);
310
311             JMenuItem statusBrowserMenuItem = new JMenuItem("発言をブラウザで開く");
312             statusBrowserMenuItem.addActionListener(new java.awt.event.ActionListener() {
313
314                 public void actionPerformed(java.awt.event.ActionEvent e) {
315                     // 選択したセルのステータスをブラウザで開く
316                     mainAction.actionOpenStatusURL();
317                 }
318             });
319             rightClickPopup.add(statusBrowserMenuItem);
320
321             JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
322                     "この人のTimelineをブラウザで開く");
323             openBrowserUserInformationMenuItem.addActionListener(new java.awt.event.ActionListener() {
324
325                 public void actionPerformed(java.awt.event.ActionEvent e) {
326                     // 選択したセルのユーザ情報をブラウザで開く
327                     mainAction.actionOpenUserURL();
328                 }
329             });
330             rightClickPopup.add(openBrowserUserInformationMenuItem);
331         }
332         return rightClickPopup;
333     }
334
335     /**
336      * @return the title
337      */
338     public String getTitle() {
339         return title;
340     }
341
342     /**
343      * @param title the title to set
344      */
345     public void setTitle(String title) {
346         this.title = title;
347         this.tabbedPane.setTitleAt( this.getTabSetNum() , title);
348     }
349
350     /**
351      * @return the tableElementHeight
352      */
353     public int getTableElementHeight() {
354         return tableElementHeight;
355     }
356
357     /**
358      * @param tableElementHeight the tableElementHeight to set
359      */
360     public void setTableElementHeight(int tableElementHeight) {
361         this.tableElementHeight = tableElementHeight;
362     }
363
364     /**
365      * @return the tableElementMaxSize
366      */
367     public int getTableElementMaxSize() {
368         return tableElementMaxSize;
369     }
370
371     /**
372      * @param tableElementMaxSize the tableElementMaxSize to set
373      */
374     public void setTableElementMaxSize(int tableElementMaxSize) {
375         this.tableElementMaxSize = tableElementMaxSize;
376     }
377
378     /**
379      * @return the model
380      */
381     public TweetTableModel getModel() {
382         return model;
383     }
384
385     /**
386      * @param model the model to set
387      */
388     public void setModel(TweetTableModel model) {
389         this.model = model;
390     }
391
392     /**
393      * @return the tabSetNum
394      */
395     public int getTabSetNum() {
396         return tabSetNum;
397     }
398
399     /**
400      * @return the uncheckedTweet
401      */
402     public int getUncheckedTweet() {
403         return uncheckedTweet;
404     }
405
406     /**
407      * @param uncheckedTweet the uncheckedTweet to set
408      */
409     public void setUncheckedTweet(int uncheckedTweet) {
410         this.uncheckedTweet = uncheckedTweet;
411     }
412
413     /**
414      * @param tabSetNum the tabSetNum to set
415      */
416     public void setTabSetNum(int tabSetNum) {
417         this.tabSetNum = tabSetNum;
418     }
419
420     /**
421      * @return the timerID
422      */
423     public String getTimerID() {
424         return timerID;
425     }
426
427 }