2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
6 package twitter.gui.component;
9 import java.awt.Component;
10 import java.awt.Point;
11 import java.awt.event.KeyAdapter;
12 import java.awt.event.KeyEvent;
13 import java.awt.event.MouseAdapter;
14 import java.awt.event.MouseEvent;
15 import java.util.List;
16 import javax.swing.JMenuItem;
17 import javax.swing.JPopupMenu;
18 import javax.swing.JScrollPane;
19 import javax.swing.JTabbedPane;
20 import javax.swing.JTable;
21 import javax.swing.event.ListSelectionEvent;
22 import javax.swing.event.ListSelectionListener;
23 import javax.swing.table.TableCellRenderer;
24 import javax.swing.table.TableColumn;
25 import javax.swing.table.TableColumnModel;
26 import twitter.action.TweetGetter;
27 import twitter.action.list.ListGetterSelection;
28 import twitter.gui.action.TweetMainAction;
29 import twitter.manage.TweetManager;
30 import twitter4j.Status;
31 import twitter4j.TwitterException;
38 public class TweetTabbedTable {
42 private TweetTableModel model;
44 private int uncheckedTweet;
46 private TweetGetter tweetGetter;
50 private JTabbedPane tabbedPane;
52 private JScrollPane scrollPane;
54 private TweetManager tweetManager;
56 private TweetMainAction mainAction;
58 private int tableElementHeight;
60 private Color newTableColor = null;
62 private int tableElementMaxSize = 200;
64 private String timerID;
74 * @param tableElementHeight
80 * @param newTableColor
82 * @param tableElementMaxSize
87 public TweetTabbedTable(TweetGetter tweetGetter, String title,
88 JTabbedPane tabbedPane, int tableElementHeight,
89 TweetManager tweetManager, TweetMainAction mainAction,
90 Color newTableColor, int tableElementMaxSize, String timerID) {
91 this.tweetGetter = tweetGetter;
93 this.tabbedPane = tabbedPane;
94 this.tweetManager = tweetManager;
95 this.mainAction = mainAction;
96 this.tableElementHeight = tableElementHeight;
97 this.newTableColor = newTableColor;
98 this.tableElementMaxSize = tableElementMaxSize;
99 this.timerID = timerID;
101 table = new JTable();
102 model = new TweetTableModel();
104 scrollPane = new JScrollPane();
108 * Tweet情報を表示するテーブルをタブに追加
110 public void addTableToTab() {
112 getTable().setModel(model);
113 getTable().getTableHeader().setReorderingAllowed(false);
114 getTable().addMouseListener(new java.awt.event.MouseAdapter() {
116 public void mousePressed(java.awt.event.MouseEvent evt) {
117 jTableMousePressed(evt);
121 public void mouseReleased(java.awt.event.MouseEvent evt) {
122 jTableMouseReleased(evt);
127 createTweetTable(getTable());
130 scrollPane.setViewportView(getTable());
132 tabbedPane.addTab(this.title, scrollPane);
141 private void createTweetTable(final JTable table) {
143 table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
144 table.setShowVerticalLines(false);
145 table.setShowHorizontalLines(true);
147 // Comment部分のColumnを複数行コメントが表示できるようにする
148 TableColumnModel mdl = table.getColumnModel();
149 TableColumn col = mdl.getColumn(1);
150 TweetCommentRenderer commentRenderer = new TweetCommentRenderer();
151 col.setCellRenderer(commentRenderer);
152 // INfo部分のColumnを複数行表示できるように
153 TweetCommentRenderer infoRenderer = new TweetCommentRenderer();
154 col = mdl.getColumn(2);
155 col.setCellRenderer(infoRenderer);
156 col.setMaxWidth(200);
157 col.setMinWidth(150);
159 // あとでファイルに幅情報などを保存しておき,それを読み込んで設定するような仕様に変更する
161 col = mdl.getColumn(0);
162 col.setCellRenderer(new UserImageRenderer());
165 // 選択したセルの情報をDetailInfoへと表示
166 // JTableを右クリックでも選択できるようにする
167 // また,同じ行を2回クリックできるようにする
168 table.addMouseListener(new MouseAdapter() {
171 public void mousePressed(MouseEvent e) {
172 // いったんSelectしていた情報を削除
173 table.clearSelection();
174 // if (e.getButton() == MouseEvent.BUTTON3) {
175 Point p = e.getPoint();
176 int col = table.columnAtPoint(p);
177 int row = table.rowAtPoint(p);
178 table.changeSelection(row, col, false, false);
180 // テーブルで選択した要素を詳細情報として表示
181 mainAction.setDetailInformationFromTable(table);
186 table.addKeyListener(new KeyAdapter() {
189 public void keyReleased(KeyEvent ke) {
190 mainAction.setDetailInformationFromTable(table);
195 table.addMouseListener(commentRenderer);
196 // table.addMouseMotionListener(commentRenderer);
197 table.addMouseListener(infoRenderer);
198 // table.addMouseMotionListener(infoRenderer);
204 public void updateTweetTable() {
207 int remainingHits = tweetManager.getRateLimitStatus()
209 if (remainingHits <= 0) {
213 List<Status> tweet = tweetGetter.getNewTweetData();
215 this.setUncheckedTweet(this.getUncheckedTweet() + tweet.size());
217 // まだチェックしていないtweetの数をタブにも表示
218 if (this.getUncheckedTweet() > 0) {
219 tabbedPane.setTitleAt(this.getTabSetNum(), this.title + "("
220 + this.getUncheckedTweet() + ")");
223 this.getModel().insertTweet(tweet);
225 int tableHeight = getTableElementHeight();
226 for(int i=0; i < tweet.size(); i++) {
227 this.getTable().setRowHeight(i, tableHeight);
230 for (Status t : tweet) {
231 this.getModel().insertTweet(t);
232 this.getTable().setRowHeight(0, getTableElementHeight());
235 TableCellRenderer renderer = getTable().getCellRenderer(0, 2);
236 if (renderer instanceof TweetCommentRenderer) {
237 if (this.getUncheckedTweet() - 1 >= 0) {
238 ((TweetCommentRenderer) renderer).updateNewCellRow(this
239 .getUncheckedTweet(), newTableColor);
241 ((TweetCommentRenderer) renderer).updateNewCellRow(-1,
246 getModel().removeOldTweet(getTableElementMaxSize());
248 getModel().refreshTime();
252 newNum = tweet.size();
254 // 情報を取得したことをステータスバーに表示
255 mainAction.information(this.getTitle() + "タブのツイートを" + newNum
256 + "件取得しました. (APIリクエスト残数は" + remainingHits + "回です)");
259 this.mainAction.saveProperties();
260 } catch (TwitterException e1) {
261 e1.printStackTrace();
262 } catch (Exception e) {
272 private void jTableMousePressed(java.awt.event.MouseEvent evt) {
276 this.setUncheckedTweet(0);
277 this.setTitle(this.getTitle());
285 private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
295 private void showPopup(MouseEvent e) {
296 if (e.isPopupTrigger()) {
298 getRightClickPopup().show(e.getComponent(), e.getX(), e.getY());
303 * 右クリックを押した時のポップアップメニューを取得
307 private JPopupMenu getRightClickPopup() {
308 // if (rightClickPopup == null) {
309 JPopupMenu rightClickPopup = new JPopupMenu();
311 JMenuItem replyMenuItem = new JMenuItem("この発言に返信(Reply)");
312 replyMenuItem.setMnemonic('R');
313 replyMenuItem.addActionListener(new java.awt.event.ActionListener() {
315 public void actionPerformed(java.awt.event.ActionEvent e) {
316 // 選択したセルのステータスにreply
317 mainAction.actionSetReplyStatusToTweetBoxPane();
321 JMenuItem replyAllMenuItem = new JMenuItem("この発言に返信(Reply All)");
322 replyAllMenuItem.setMnemonic('A');
323 replyAllMenuItem.addActionListener(new java.awt.event.ActionListener() {
325 public void actionPerformed(java.awt.event.ActionEvent e) {
326 // 選択したセルのステータスにreply all
327 mainAction.actionSetReplyAllStatusToTweetBoxPane();
331 JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート(RT)");
332 retweetMenuItem.setMnemonic('R');
333 retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
336 public void actionPerformed(java.awt.event.ActionEvent e) {
337 // 選択したセルのステータスをRetweet
338 mainAction.actionRetweet();
342 JMenuItem quoteMenuItem = new JMenuItem("発言を引用ツイート(QT)");
343 quoteMenuItem.setMnemonic('Q');
344 quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
347 public void actionPerformed(java.awt.event.ActionEvent e) {
349 mainAction.actionSetQuoteStatusToTweetBoxPane();
353 JMenuItem unofficialRetweetMenuItem = new JMenuItem(
354 "発言をコメント付きリツイート(非公式RT)");
355 unofficialRetweetMenuItem.setMnemonic('T');
356 unofficialRetweetMenuItem
357 .addActionListener(new java.awt.event.ActionListener() {
360 public void actionPerformed(java.awt.event.ActionEvent e) {
361 // 選択したセルのステータスをコメント付Retweet
362 mainAction.actionCopySelectedStatusToTweetBoxPane();
366 JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信(D)");
367 directMessageMenuItem.setMnemonic('D');
368 directMessageMenuItem
369 .addActionListener(new java.awt.event.ActionListener() {
372 public void actionPerformed(java.awt.event.ActionEvent e) {
373 // ダイレクトメッセージ送信ダイアログを表示
374 mainAction.actionShowDirectMessageDialog();
378 JMenuItem statusBrowserMenuItem = new JMenuItem("この発言をブラウザで開く(O)");
379 statusBrowserMenuItem.setMnemonic('O');
380 statusBrowserMenuItem
381 .addActionListener(new java.awt.event.ActionListener() {
384 public void actionPerformed(java.awt.event.ActionEvent e) {
385 // 選択したセルのステータスをブラウザで開く
386 mainAction.actionOpenStatusURL();
390 JMenuItem userMenuItem = new JMenuItem("この人の発言を別タブで開く(U)");
391 userMenuItem.setMnemonic('U');
392 userMenuItem.addActionListener(new java.awt.event.ActionListener() {
395 public void actionPerformed(java.awt.event.ActionEvent e) {
397 mainAction.actionSelectedUserTimeline();
401 JMenuItem createFavMenuItem = new JMenuItem("この発言をお気に入りに追加(F)");
402 createFavMenuItem.setMnemonic('F');
404 .addActionListener(new java.awt.event.ActionListener() {
407 public void actionPerformed(java.awt.event.ActionEvent e) {
408 // 選択したセルのユーザ情報をブラウザで開く
409 mainAction.actionCreateFavorite();
413 JMenuItem destroyFavMenuItem = new JMenuItem("この発言をお気に入りから削除");
415 .addActionListener(new java.awt.event.ActionListener() {
418 public void actionPerformed(java.awt.event.ActionEvent e) {
419 // 選択したセルのユーザ情報をブラウザで開く
420 mainAction.actionDestroyFavorite();
424 JMenuItem createdListMenuItem = new JMenuItem("このユーザが作成したリスト一覧");
426 .addActionListener(new java.awt.event.ActionListener() {
429 public void actionPerformed(java.awt.event.ActionEvent e) {
430 // 選択したセルのユーザ情報をブラウザで開く
432 .actionShowSelectedUserList(ListGetterSelection.CREATED);
436 JMenuItem subscriptionListMenuItem = new JMenuItem("このユーザが購読しているリスト一覧");
437 subscriptionListMenuItem
438 .addActionListener(new java.awt.event.ActionListener() {
441 public void actionPerformed(java.awt.event.ActionEvent e) {
442 // 選択したセルのユーザ情報をブラウザで開く
444 .actionShowSelectedUserList(ListGetterSelection.SUBSCRIPTION);
448 JMenuItem membershipsListMenuItem = new JMenuItem(
449 "このユーザがフォローされているリスト一覧");
450 membershipsListMenuItem
451 .addActionListener(new java.awt.event.ActionListener() {
454 public void actionPerformed(java.awt.event.ActionEvent e) {
455 // 選択したセルのユーザ情報をブラウザで開く
457 .actionShowSelectedUserList(ListGetterSelection.MEMBERSHIPS);
462 int sc = table.getSelectedRowCount();
463 if (sc == 1 && table != null) {
464 Status st = mainAction.getTweetTableInformation(table, table
467 JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
468 "この人の発言をブラウザで開く(B)");
469 openBrowserUserInformationMenuItem.setMnemonic('B');
470 openBrowserUserInformationMenuItem
471 .addActionListener(new java.awt.event.ActionListener() {
474 public void actionPerformed(java.awt.event.ActionEvent e) {
475 // 選択したセルのユーザ情報をブラウザで開く
476 mainAction.actionOpenUserURL();
480 JMenuItem openFavMenuItem = new JMenuItem("この人のお気に入りを開く");
482 .addActionListener(new java.awt.event.ActionListener() {
485 public void actionPerformed(java.awt.event.ActionEvent e) {
486 // 選択したセルのユーザ情報をブラウザで開く
487 mainAction.actionOpenUserFav();
493 rightClickPopup.add(replyMenuItem);
495 rightClickPopup.add(replyAllMenuItem);
497 rightClickPopup.add(retweetMenuItem);
499 rightClickPopup.add(unofficialRetweetMenuItem);
501 rightClickPopup.add(quoteMenuItem);
503 rightClickPopup.add(directMessageMenuItem);
505 rightClickPopup.add(statusBrowserMenuItem);
507 rightClickPopup.add(userMenuItem);
509 rightClickPopup.add(openBrowserUserInformationMenuItem);
511 rightClickPopup.add(openFavMenuItem);
513 rightClickPopup.add(createdListMenuItem);
515 rightClickPopup.add(subscriptionListMenuItem);
516 // この人がフォローされているリスト一覧
517 rightClickPopup.add(membershipsListMenuItem);
520 if (st.isRetweet()) {
521 // Retweetのときのみ表示するメニュー
523 if (st.isFavorited()) {
524 // お気に入りに追加されている時のみ表示するメニュー
526 rightClickPopup.add(destroyFavMenuItem);
528 rightClickPopup.add(createFavMenuItem);
530 } catch (Exception e) {
531 // TODO:ここの無視部分をなんとかする
532 // DMのときはisFavoritedができない
536 return rightClickPopup;
542 public String getTitle() {
550 public void setTitle(String title) {
552 this.tabbedPane.setTitleAt(this.getTabSetNum(), title);
556 * 自分自信がタブのどの場所に位置しているのかを取得
560 public int getTabSetNum() {
561 int tabCount = this.tabbedPane.getTabCount();
562 for (int i = 0; i < tabCount; i++) {
563 Component c = this.tabbedPane.getComponentAt(i);
564 if (c instanceof JScrollPane) {
565 if (c == this.scrollPane) {
574 * @return the tableElementHeight
576 public int getTableElementHeight() {
577 return tableElementHeight;
581 * @param tableElementHeight
582 * the tableElementHeight to set
584 public void setTableElementHeight(int tableElementHeight) {
585 this.tableElementHeight = tableElementHeight;
589 * @return the tableElementMaxSize
591 public int getTableElementMaxSize() {
592 return tableElementMaxSize;
596 * @param tableElementMaxSize
597 * the tableElementMaxSize to set
599 public void setTableElementMaxSize(int tableElementMaxSize) {
600 this.tableElementMaxSize = tableElementMaxSize;
606 public TweetTableModel getModel() {
614 public void setModel(TweetTableModel model) {
619 * @return the uncheckedTweet
621 public int getUncheckedTweet() {
622 return uncheckedTweet;
626 * @param uncheckedTweet
627 * the uncheckedTweet to set
629 public void setUncheckedTweet(int uncheckedTweet) {
630 this.uncheckedTweet = uncheckedTweet;
634 * @return the timerID
636 public String getTimerID() {
643 public JTable getTable() {