2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
6 package twitter.gui.component;
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;
33 public class TweetTabbedTable {
37 private TweetTableModel model;
39 private int uncheckedTweet;
41 private TweetGetter tweetGetter;
45 private JTabbedPane tabbedPane;
47 private int tabSetNum;
49 private JScrollPane scrollPane;
51 private TweetManager tweetManager;
53 private TweetMainAction mainAction;
55 private JPopupMenu rightClickPopup = null;
57 private int tableElementHeight;
59 private Color newTableColor = null;
61 private int tableElementMaxSize = 200;
63 private String timerID;
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
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;
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;
95 model = new TweetTableModel();
97 scrollPane = new JScrollPane();
101 * Tweet情報を表示するテーブルをタブに追加
103 public void addTableToTab() {
105 table.setModel(model);
106 table.getTableHeader().setReorderingAllowed(false);
107 table.addMouseListener(new java.awt.event.MouseAdapter() {
109 public void mousePressed(java.awt.event.MouseEvent evt) {
110 jTableMousePressed(evt);
113 public void mouseReleased(java.awt.event.MouseEvent evt) {
114 jTableMouseReleased(evt);
119 createTweetTable(table);
122 scrollPane.setViewportView(table);
124 tabbedPane.addTab(this.title, scrollPane);
133 private void createTweetTable(final JTable table) {
135 table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
136 table.setShowVerticalLines(false);
137 table.setShowHorizontalLines(true);
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);
151 // あとでファイルに幅情報などを保存しておき,それを読み込んで設定するような仕様に変更する
153 col = mdl.getColumn(0);
154 col.setCellRenderer(new UserImageRenderer());
157 // 選択したセルの情報をDetailInfoへと表示
158 table.getSelectionModel().addListSelectionListener(
159 new ListSelectionListener() {
162 public void valueChanged(ListSelectionEvent e) {
164 if (e.getValueIsAdjusting()) {
168 //テーブルで選択した要素を詳細情報として表示
169 mainAction.setDetailInformationFromTable(table);
172 // JTableを右クリックでも選択できるようにする
173 // また,同じ行を2回クリックできるようにする
174 table.addMouseListener(new MouseAdapter() {
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);
189 table.addMouseListener(commentRenderer);
190 table.addMouseMotionListener(commentRenderer);
191 table.addMouseListener(infoRenderer);
192 table.addMouseMotionListener(infoRenderer);
198 public void updateTweetTable() {
201 int remainingHits = tweetManager.getRateLimitStatus().getRemainingHits();
202 if (remainingHits <= 0) {
206 List<Status> tweet = tweetGetter.getNewTweetData();
208 this.setUncheckedTweet(this.getUncheckedTweet() + tweet.size());
210 // まだチェックしていないtweetの数をタブにも表示
211 if (this.getUncheckedTweet() > 0) {
212 tabbedPane.setTitleAt(this.getTabSetNum(), this.title + "("
213 + this.getUncheckedTweet() + ")");
216 for (Status t : tweet) {
217 this.getModel().insertTweet(t);
218 this.table.setRowHeight(0, getTableElementHeight());
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);
227 ((TweetCommentRenderer) renderer).updateNewCellRow(-1,
232 getModel().removeOldTweet( getTableElementMaxSize() );
234 getModel().refreshTime();
235 } catch (TwitterException e1) {
236 e1.printStackTrace();
237 } catch (Exception e) {
246 private void jTableMousePressed(java.awt.event.MouseEvent evt) {
250 this.setUncheckedTweet(0);
251 this.setTitle( this.getTitle() );
258 private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
267 private void showPopup(MouseEvent e) {
268 if (e.isPopupTrigger()) {
270 getRightClickPopup().show(e.getComponent(), e.getX(),
276 * 右クリックを押した時のポップアップメニューを取得
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() {
286 public void actionPerformed(java.awt.event.ActionEvent e) {
287 // ダイレクトメッセージ送信ダイアログを表示
288 mainAction.actionShowDirectMessageDialog();
291 rightClickPopup.add(directMessageMenuItem);
292 JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート");
293 retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
295 public void actionPerformed(java.awt.event.ActionEvent e) {
296 // 選択したセルのステータスをRetweet
297 mainAction.actionRetweet();
300 rightClickPopup.add(retweetMenuItem);
301 JMenuItem quoteMenuItem = new JMenuItem("発言をコメント付きリツイート");
302 quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
304 public void actionPerformed(java.awt.event.ActionEvent e) {
305 // 選択したセルのステータスをコメント付Retweet
306 mainAction.actionCopySelectedStatusToTweetBoxPane();
309 rightClickPopup.add(quoteMenuItem);
311 JMenuItem statusBrowserMenuItem = new JMenuItem("発言をブラウザで開く");
312 statusBrowserMenuItem.addActionListener(new java.awt.event.ActionListener() {
314 public void actionPerformed(java.awt.event.ActionEvent e) {
315 // 選択したセルのステータスをブラウザで開く
316 mainAction.actionOpenStatusURL();
319 rightClickPopup.add(statusBrowserMenuItem);
321 JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
322 "この人のTimelineをブラウザで開く");
323 openBrowserUserInformationMenuItem.addActionListener(new java.awt.event.ActionListener() {
325 public void actionPerformed(java.awt.event.ActionEvent e) {
326 // 選択したセルのユーザ情報をブラウザで開く
327 mainAction.actionOpenUserURL();
330 rightClickPopup.add(openBrowserUserInformationMenuItem);
332 return rightClickPopup;
338 public String getTitle() {
343 * @param title the title to set
345 public void setTitle(String title) {
347 this.tabbedPane.setTitleAt( this.getTabSetNum() , title);
351 * @return the tableElementHeight
353 public int getTableElementHeight() {
354 return tableElementHeight;
358 * @param tableElementHeight the tableElementHeight to set
360 public void setTableElementHeight(int tableElementHeight) {
361 this.tableElementHeight = tableElementHeight;
365 * @return the tableElementMaxSize
367 public int getTableElementMaxSize() {
368 return tableElementMaxSize;
372 * @param tableElementMaxSize the tableElementMaxSize to set
374 public void setTableElementMaxSize(int tableElementMaxSize) {
375 this.tableElementMaxSize = tableElementMaxSize;
381 public TweetTableModel getModel() {
386 * @param model the model to set
388 public void setModel(TweetTableModel model) {
393 * @return the tabSetNum
395 public int getTabSetNum() {
400 * @return the uncheckedTweet
402 public int getUncheckedTweet() {
403 return uncheckedTweet;
407 * @param uncheckedTweet the uncheckedTweet to set
409 public void setUncheckedTweet(int uncheckedTweet) {
410 this.uncheckedTweet = uncheckedTweet;
414 * @param tabSetNum the tabSetNum to set
416 public void setTabSetNum(int tabSetNum) {
417 this.tabSetNum = tabSetNum;
421 * @return the timerID
423 public String getTimerID() {