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
63
64     /**
65      *
66      * @param tweetGetter tweet取得時に行うアクション
67      * @param title タブに表示するタイトル
68      * @param tabbedPane テーブルを追加するタブ
69      * @param tabSetNum 何番目のタブにセットするか
70      * @param tableElementHeight テーブルの高さ
71      * @param tweetManager ツイート管理クラス
72      * @param mainAction メインアクション
73      * @param newTableColor 新しく取得した部分の色
74      * @param tableElementMaxSize テーブルに格納できる要素の最大数
75      */
76     public TweetTabbedTable(TweetGetter tweetGetter,
77             String title, JTabbedPane tabbedPane, int tabSetNum, int tableElementHeight,
78             TweetManager tweetManager, TweetMainAction mainAction, Color newTableColor,
79             int tableElementMaxSize) {
80         this.tweetGetter = tweetGetter;
81         this.title = title;
82         this.tabbedPane = tabbedPane;
83         this.tabSetNum = tabSetNum;
84         this.tweetManager = tweetManager;
85         this.mainAction = mainAction;
86         this.tableElementHeight = tableElementHeight;
87         this.newTableColor = newTableColor;
88         this.tableElementMaxSize = tableElementMaxSize;
89
90         table = new JTable();
91         model = new TweetTableModel();
92         uncheckedTweet = 0;
93         scrollPane = new JScrollPane();
94
95         //テーブルをタブに追加
96         table.setModel(model);
97         table.getTableHeader().setReorderingAllowed(false);
98         table.addMouseListener(new java.awt.event.MouseAdapter() {
99             @Override
100             public void mousePressed(java.awt.event.MouseEvent evt) {
101                 jTableMousePressed(evt);
102             }
103             @Override
104             public void mouseReleased(java.awt.event.MouseEvent evt) {
105                 jTableMouseReleased(evt);
106             }
107         });
108
109         //tweetを表示するテーブルを作成
110         createTweetTable(table);
111
112         //スクロールペーン追加
113         scrollPane.setViewportView(table);
114         //タブにテーブル追加
115         tabbedPane.addTab(this.title, scrollPane);
116     }
117
118     /**
119      * Tweetを表示するテーブルを作成
120      *
121      * @param model
122      * @return
123      */
124     private void createTweetTable(final JTable table) {
125
126         table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
127         table.setShowVerticalLines(false);
128         table.setShowHorizontalLines(true);
129
130         // Comment部分のColumnを複数行コメントが表示できるようにする
131         TableColumnModel mdl = table.getColumnModel();
132         TableColumn col = mdl.getColumn(1);
133         TweetCommentRenderer commentRenderer = new TweetCommentRenderer();
134         col.setCellRenderer(commentRenderer);
135         // INfo部分のColumnを複数行表示できるように
136         TweetCommentRenderer infoRenderer = new TweetCommentRenderer();
137         col = mdl.getColumn(2);
138         col.setCellRenderer(infoRenderer);
139         col.setMaxWidth(200);
140         col.setMinWidth(150);
141         // TODO:とりあえず幅指定した部分
142         // あとでファイルに幅情報などを保存しておき,それを読み込んで設定するような仕様に変更する
143         // ユーザImageを表示する部分
144         col = mdl.getColumn(0);
145         col.setCellRenderer(new UserImageRenderer());
146         col.setMinWidth(50);
147         col.setMaxWidth(50);
148         // 選択したセルの情報をDetailInfoへと表示
149         table.getSelectionModel().addListSelectionListener(
150                 new ListSelectionListener() {
151
152                     @Override
153                     public void valueChanged(ListSelectionEvent e) {
154
155                         if (e.getValueIsAdjusting()) {
156                             return;
157                         }
158
159                         //テーブルで選択した要素を詳細情報として表示
160                         mainAction.setDetailInformationFromTable(table);
161                     }
162                 });
163         // JTableを右クリックでも選択できるようにする
164         // また,同じ行を2回クリックできるようにする
165         table.addMouseListener(new MouseAdapter() {
166
167             @Override
168             public void mousePressed(MouseEvent e) {
169                 // いったんSelectしていた情報を削除
170                 table.clearSelection();
171                 // if (e.getButton() == MouseEvent.BUTTON3) {
172                 Point p = e.getPoint();
173                 int col = table.columnAtPoint(p);
174                 int row = table.rowAtPoint(p);
175                 table.changeSelection(row, col, false, false);
176                 // }
177             }
178         });
179         // MouseEventを追加
180         table.addMouseListener(commentRenderer);
181         table.addMouseMotionListener(commentRenderer);
182         table.addMouseListener(infoRenderer);
183         table.addMouseMotionListener(infoRenderer);
184     }
185
186     /**
187      * テーブル情報更新
188      */
189     public void updateTweetTable() {
190         try {
191             // API残り回数を取得
192             int remainingHits = tweetManager.getRateLimitStatus().getRemainingHits();
193             if (remainingHits <= 0) {
194                 return;
195             }
196             // ツイート情報
197             List<Status> tweet = tweetGetter.getNewTweetData();
198             // まだ見ていないtweet数を追加
199             this.uncheckedTweet += tweet.size();
200
201             // まだチェックしていないtweetの数をタブにも表示
202             if (this.uncheckedTweet > 0) {
203                 tabbedPane.setTitleAt(this.tabSetNum, this.title + "("
204                         + this.uncheckedTweet + ")");
205             }
206             // ツイートをテーブルに追加
207             for (Status t : tweet) {
208                 this.model.insertTweet(t);
209                 this.table.setRowHeight(0, getTableElementHeight());
210             }
211             // 新規した部分の背景色を変更
212             TableCellRenderer renderer = table.getCellRenderer(0, 2);
213             if (renderer instanceof TweetCommentRenderer) {
214                 if (this.uncheckedTweet - 1 >= 0) {
215                     ((TweetCommentRenderer) renderer).updateNewCellRow(
216                             this.uncheckedTweet, newTableColor);
217                 } else {
218                     ((TweetCommentRenderer) renderer).updateNewCellRow(-1,
219                             newTableColor);
220                 }
221             }
222             // 古いデータを削除
223             model.removeOldTweet( getTableElementMaxSize() );
224
225             model.refreshTime();
226         } catch (TwitterException e1) {
227             e1.printStackTrace();
228         } catch (Exception e) {
229             e.printStackTrace();
230         }
231     }
232
233     /**
234      * マウスクリック時の動作
235      * @param evt
236      */
237     private void jTableMousePressed(java.awt.event.MouseEvent evt) {
238         //右クリックメニュー表示
239         showPopup(evt);
240         //TODO: ここを修正
241         mainAction.actionResetUncheckedTimelineTweetCount();
242     }
243
244     /**
245      * マウスリリース時の動作
246      * @param evt
247      */
248     private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
249         //右クリックメニュー表示
250         showPopup(evt);
251     }
252
253     /**
254      * ポップアップメニューを作成
255      * @param e
256      */
257     private void showPopup(MouseEvent e) {
258         if (e.isPopupTrigger()) {
259             // 右クリックのメニューを表示
260             getRightClickPopup().show(e.getComponent(), e.getX(),
261                     e.getY());
262         }
263     }
264
265     /**
266      * 右クリックを押した時のポップアップメニューを取得
267      *
268      * @return
269      */
270     private JPopupMenu getRightClickPopup() {
271         if (rightClickPopup == null) {
272             rightClickPopup = new JPopupMenu();
273             JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信");
274             directMessageMenuItem.addActionListener(new java.awt.event.ActionListener() {
275
276                 public void actionPerformed(java.awt.event.ActionEvent e) {
277                     // ダイレクトメッセージ送信ダイアログを表示
278                     mainAction.actionShowDirectMessageDialog();
279                 }
280             });
281             rightClickPopup.add(directMessageMenuItem);
282             JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート");
283             retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
284
285                 public void actionPerformed(java.awt.event.ActionEvent e) {
286                     // 選択したセルのステータスをRetweet
287                     mainAction.actionRetweet();
288                 }
289             });
290             rightClickPopup.add(retweetMenuItem);
291             JMenuItem quoteMenuItem = new JMenuItem("発言をコメント付きリツイート");
292             quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
293
294                 public void actionPerformed(java.awt.event.ActionEvent e) {
295                     // 選択したセルのステータスをコメント付Retweet
296                     mainAction.actionCopySelectedStatusToTweetBoxPane();
297                 }
298             });
299             rightClickPopup.add(quoteMenuItem);
300
301             JMenuItem statusBrowserMenuItem = new JMenuItem("発言をブラウザで開く");
302             statusBrowserMenuItem.addActionListener(new java.awt.event.ActionListener() {
303
304                 public void actionPerformed(java.awt.event.ActionEvent e) {
305                     // 選択したセルのステータスをブラウザで開く
306                     mainAction.actionOpenStatusURL();
307                 }
308             });
309             rightClickPopup.add(statusBrowserMenuItem);
310
311             JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
312                     "この人のTimelineをブラウザで開く");
313             openBrowserUserInformationMenuItem.addActionListener(new java.awt.event.ActionListener() {
314
315                 public void actionPerformed(java.awt.event.ActionEvent e) {
316                     // 選択したセルのユーザ情報をブラウザで開く
317                     mainAction.actionOpenUserURL();
318                 }
319             });
320             rightClickPopup.add(openBrowserUserInformationMenuItem);
321         }
322         return rightClickPopup;
323     }
324
325     /**
326      * @return the title
327      */
328     public String getTitle() {
329         return title;
330     }
331
332     /**
333      * @param title the title to set
334      */
335     public void setTitle(String title) {
336         this.title = title;
337     }
338
339     /**
340      * @return the tableElementHeight
341      */
342     public int getTableElementHeight() {
343         return tableElementHeight;
344     }
345
346     /**
347      * @param tableElementHeight the tableElementHeight to set
348      */
349     public void setTableElementHeight(int tableElementHeight) {
350         this.tableElementHeight = tableElementHeight;
351     }
352
353     /**
354      * @return the tableElementMaxSize
355      */
356     public int getTableElementMaxSize() {
357         return tableElementMaxSize;
358     }
359
360     /**
361      * @param tableElementMaxSize the tableElementMaxSize to set
362      */
363     public void setTableElementMaxSize(int tableElementMaxSize) {
364         this.tableElementMaxSize = tableElementMaxSize;
365     }
366
367 }