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.io.IOException;
16 import java.util.ArrayList;
17 import java.util.List;
18 import javax.swing.JMenuItem;
19 import javax.swing.JPopupMenu;
20 import javax.swing.JScrollPane;
21 import javax.swing.JTabbedPane;
22 import javax.swing.JTable;
23 import javax.swing.event.ListSelectionEvent;
24 import javax.swing.event.ListSelectionListener;
25 import javax.swing.table.TableCellRenderer;
26 import javax.swing.table.TableColumn;
27 import javax.swing.table.TableColumnModel;
28 import twitter.action.TweetGetter;
29 import twitter.action.list.ListGetterSelection;
30 import twitter.action.streaming.TweetStreamingListener;
31 import twitter.gui.action.TweetMainAction;
32 import twitter.manage.TweetManager;
33 import twitter4j.Status;
34 import twitter4j.TwitterException;
41 public class TweetTabbedTable implements TweetStreamingListener {
45 private TweetTableModel model;
47 private int uncheckedTweet;
49 private TweetGetter tweetGetter;
53 private JTabbedPane tabbedPane;
55 private JScrollPane scrollPane;
57 private TweetManager tweetManager;
59 private TweetMainAction mainAction;
61 private Color newTableColor = null;
63 // TODO: ここを変更できるようにする
64 private int tableElementMaxSize = 500;
66 private String timerID;
80 * @param newTableColor
82 * @param tableElementMaxSize
87 public TweetTabbedTable(TweetGetter tweetGetter, String title,
88 JTabbedPane tabbedPane,
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.newTableColor = newTableColor;
97 this.tableElementMaxSize = tableElementMaxSize;
98 this.timerID = timerID;
100 table = new JTable();
101 model = new TweetTableModel();
103 scrollPane = new JScrollPane();
104 tweetGetter.setUpdateListener(this);
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 col = mdl.getColumn(0);
160 col.setCellRenderer(new UserImageRenderer());
162 col.setMinWidth(mainAction.getTableElementHeight());
163 col.setMaxWidth(mainAction.getTableElementHeight());
164 // 選択したセルの情報をDetailInfoへと表示
165 // JTableを右クリックでも選択できるようにする
166 // また,同じ行を2回クリックできるようにする
167 table.addMouseListener(new MouseAdapter() {
170 public void mousePressed(MouseEvent e) {
171 // いったんSelectしていた情報を削除
172 table.clearSelection();
173 // if (e.getButton() == MouseEvent.BUTTON3) {
174 Point p = e.getPoint();
175 int col = table.columnAtPoint(p);
176 int row = table.rowAtPoint(p);
177 table.changeSelection(row, col, false, false);
179 // テーブルで選択した要素を詳細情報として表示
180 mainAction.setDetailInformationFromTable(table);
185 table.addKeyListener(new KeyAdapter() {
188 public void keyReleased(KeyEvent ke) {
189 mainAction.setDetailInformationFromTable(table);
194 table.addMouseListener(commentRenderer);
195 // table.addMouseMotionListener(commentRenderer);
196 table.addMouseListener(infoRenderer);
197 // table.addMouseMotionListener(infoRenderer);
203 public void updateTweetTable() {
206 int remainingHits = tweetManager.getRateLimitStatus()
208 if (remainingHits <= 0) {
212 List<Status> tweet = tweetGetter.getNewTweetData();
215 int newNum = updateTable(tweet);
217 // 情報を取得したことをステータスバーに表示
218 mainAction.information(this.getTitle() + "タブのツイートを" + newNum
219 + "件取得しました. (APIリクエスト残数は" + remainingHits + "回です)");
221 } catch (TwitterException e1) {
222 e1.printStackTrace();
223 } catch (Exception e) {
234 private int updateTable(List<Status> tweet) {
235 if( tweet == null ) {
239 this.setUncheckedTweet(this.getUncheckedTweet() + tweet.size());
241 this.getTable().setShowGrid(false);
243 // まだチェックしていないtweetの数をタブにも表示
244 if (this.getUncheckedTweet() > 0) {
245 tabbedPane.setTitleAt(this.getTabSetNum(),
246 this.title + "(" + this.getUncheckedTweet() + ")");
249 this.getModel().insertTweet(tweet);
251 int tableHeight = mainAction.getTableElementHeight();
252 for (int i = 0; i < tweet.size(); i++) {
253 this.getTable().setRowHeight(i, tableHeight);
256 * for (Status t : tweet) { this.getModel().insertTweet(t);
257 * this.getTable().setRowHeight(0, getTableElementHeight()); }
260 TableCellRenderer renderer = getTable().getCellRenderer(0, 2);
261 if (renderer instanceof TweetCommentRenderer) {
262 if (this.getUncheckedTweet() - 1 >= 0) {
263 ((TweetCommentRenderer) renderer).updateNewCellRow(
264 this.getUncheckedTweet(), newTableColor);
266 ((TweetCommentRenderer) renderer).updateNewCellRow(-1,
271 getModel().removeOldTweet(getTableElementMaxSize());
273 getModel().refreshTime();
277 newNum = tweet.size();
281 this.mainAction.saveProperties();
282 } catch (IOException e) {
283 // TODO 自動生成された catch ブロック
295 private void jTableMousePressed(java.awt.event.MouseEvent evt) {
299 this.setUncheckedTweet(0);
300 this.setTitle(this.getTitle());
308 private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
318 private void showPopup(MouseEvent e) {
319 if (e.isPopupTrigger()) {
321 getRightClickPopup().show(e.getComponent(), e.getX(), e.getY());
326 * 右クリックを押した時のポップアップメニューを取得
330 private JPopupMenu getRightClickPopup() {
331 // if (rightClickPopup == null) {
332 JPopupMenu rightClickPopup = new JPopupMenu();
334 JMenuItem replyMenuItem = new JMenuItem("この発言に返信(Reply)");
335 replyMenuItem.setMnemonic('R');
336 replyMenuItem.addActionListener(new java.awt.event.ActionListener() {
338 public void actionPerformed(java.awt.event.ActionEvent e) {
339 // 選択したセルのステータスにreply
340 mainAction.actionSetReplyStatusToTweetBoxPane();
344 JMenuItem replyAllMenuItem = new JMenuItem("この発言に返信(Reply All)");
345 replyAllMenuItem.setMnemonic('A');
346 replyAllMenuItem.addActionListener(new java.awt.event.ActionListener() {
348 public void actionPerformed(java.awt.event.ActionEvent e) {
349 // 選択したセルのステータスにreply all
350 mainAction.actionSetReplyAllStatusToTweetBoxPane();
354 JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート(RT)");
355 retweetMenuItem.setMnemonic('R');
356 retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
359 public void actionPerformed(java.awt.event.ActionEvent e) {
360 // 選択したセルのステータスをRetweet
361 mainAction.actionRetweet();
365 JMenuItem quoteMenuItem = new JMenuItem("発言を引用ツイート(QT)");
366 quoteMenuItem.setMnemonic('Q');
367 quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
370 public void actionPerformed(java.awt.event.ActionEvent e) {
372 mainAction.actionSetQuoteStatusToTweetBoxPane();
376 JMenuItem unofficialRetweetMenuItem = new JMenuItem(
377 "発言をコメント付きリツイート(非公式RT)");
378 unofficialRetweetMenuItem.setMnemonic('T');
379 unofficialRetweetMenuItem
380 .addActionListener(new java.awt.event.ActionListener() {
383 public void actionPerformed(java.awt.event.ActionEvent e) {
384 // 選択したセルのステータスをコメント付Retweet
385 mainAction.actionCopySelectedStatusToTweetBoxPane();
389 JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信(D)");
390 directMessageMenuItem.setMnemonic('D');
391 directMessageMenuItem
392 .addActionListener(new java.awt.event.ActionListener() {
395 public void actionPerformed(java.awt.event.ActionEvent e) {
396 // ダイレクトメッセージ送信ダイアログを表示
397 mainAction.actionShowDirectMessageDialog();
401 JMenuItem statusBrowserMenuItem = new JMenuItem("この発言をブラウザで開く(O)");
402 statusBrowserMenuItem.setMnemonic('O');
403 statusBrowserMenuItem
404 .addActionListener(new java.awt.event.ActionListener() {
407 public void actionPerformed(java.awt.event.ActionEvent e) {
408 // 選択したセルのステータスをブラウザで開く
409 mainAction.actionOpenStatusURL();
413 JMenuItem userMenuItem = new JMenuItem("この人の発言を別タブで開く(U)");
414 userMenuItem.setMnemonic('U');
415 userMenuItem.addActionListener(new java.awt.event.ActionListener() {
418 public void actionPerformed(java.awt.event.ActionEvent e) {
420 mainAction.actionSelectedUserTimeline();
424 JMenuItem createFavMenuItem = new JMenuItem("この発言をお気に入りに追加(F)");
425 createFavMenuItem.setMnemonic('F');
427 .addActionListener(new java.awt.event.ActionListener() {
430 public void actionPerformed(java.awt.event.ActionEvent e) {
431 // 選択したセルのユーザ情報をブラウザで開く
432 mainAction.actionCreateFavorite();
436 JMenuItem destroyFavMenuItem = new JMenuItem("この発言をお気に入りから削除");
438 .addActionListener(new java.awt.event.ActionListener() {
441 public void actionPerformed(java.awt.event.ActionEvent e) {
442 // 選択したセルのユーザ情報をブラウザで開く
443 mainAction.actionDestroyFavorite();
447 JMenuItem createdListMenuItem = new JMenuItem("このユーザが作成したリスト一覧");
449 .addActionListener(new java.awt.event.ActionListener() {
452 public void actionPerformed(java.awt.event.ActionEvent e) {
453 // 選択したセルのユーザ情報をブラウザで開く
455 .actionShowSelectedUserList(ListGetterSelection.CREATED);
459 JMenuItem subscriptionListMenuItem = new JMenuItem("このユーザが購読しているリスト一覧");
460 subscriptionListMenuItem
461 .addActionListener(new java.awt.event.ActionListener() {
464 public void actionPerformed(java.awt.event.ActionEvent e) {
465 // 選択したセルのユーザ情報をブラウザで開く
467 .actionShowSelectedUserList(ListGetterSelection.SUBSCRIPTION);
471 JMenuItem membershipsListMenuItem = new JMenuItem(
472 "このユーザがフォローされているリスト一覧");
473 membershipsListMenuItem
474 .addActionListener(new java.awt.event.ActionListener() {
477 public void actionPerformed(java.awt.event.ActionEvent e) {
478 // 選択したセルのユーザ情報をブラウザで開く
480 .actionShowSelectedUserList(ListGetterSelection.MEMBERSHIPS);
484 JMenuItem followingUserMenuItem = new JMenuItem("このユーザがフォローしているユーザ一覧");
485 followingUserMenuItem
486 .addActionListener(new java.awt.event.ActionListener() {
489 public void actionPerformed(java.awt.event.ActionEvent e) {
490 // 選択したセルのユーザ情報をブラウザで開く
491 mainAction.actionOpenFollowing();
495 JMenuItem followerUserMenuItem = new JMenuItem("このユーザがフォローされているユーザ一覧");
497 .addActionListener(new java.awt.event.ActionListener() {
500 public void actionPerformed(java.awt.event.ActionEvent e) {
501 // 選択したセルのユーザ情報をブラウザで開く
502 mainAction.actionOpenFollower();
507 int sc = table.getSelectedRowCount();
508 if (sc == 1 && table != null) {
509 Status st = mainAction.getTweetTableInformation(table,
512 JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
513 "この人の発言をブラウザで開く(B)");
514 openBrowserUserInformationMenuItem.setMnemonic('B');
515 openBrowserUserInformationMenuItem
516 .addActionListener(new java.awt.event.ActionListener() {
519 public void actionPerformed(java.awt.event.ActionEvent e) {
520 // 選択したセルのユーザ情報をブラウザで開く
521 mainAction.actionOpenUserURL();
525 JMenuItem openFavMenuItem = new JMenuItem("この人のお気に入りを開く");
527 .addActionListener(new java.awt.event.ActionListener() {
530 public void actionPerformed(java.awt.event.ActionEvent e) {
531 // 選択したセルのユーザ情報をブラウザで開く
532 mainAction.actionOpenUserFav();
538 rightClickPopup.add(replyMenuItem);
540 rightClickPopup.add(replyAllMenuItem);
542 rightClickPopup.add(retweetMenuItem);
544 rightClickPopup.add(unofficialRetweetMenuItem);
546 rightClickPopup.add(quoteMenuItem);
548 rightClickPopup.add(directMessageMenuItem);
550 rightClickPopup.add(statusBrowserMenuItem);
552 rightClickPopup.add(userMenuItem);
554 rightClickPopup.add(openBrowserUserInformationMenuItem);
556 rightClickPopup.add(openFavMenuItem);
558 rightClickPopup.add(followingUserMenuItem);
560 rightClickPopup.add(followerUserMenuItem);
562 rightClickPopup.add(createdListMenuItem);
564 rightClickPopup.add(subscriptionListMenuItem);
565 // この人がフォローされているリスト一覧
566 rightClickPopup.add(membershipsListMenuItem);
569 if (st.isRetweet()) {
570 // Retweetのときのみ表示するメニュー
572 if (st.isFavorited()) {
573 // お気に入りに追加されている時のみ表示するメニュー
575 rightClickPopup.add(destroyFavMenuItem);
577 rightClickPopup.add(createFavMenuItem);
579 } catch (Exception e) {
580 // TODO:ここの無視部分をなんとかする
581 // DMのときはisFavoritedができない
585 return rightClickPopup;
590 * @return tweetGetter
592 public TweetGetter getTweetGetter() {
598 * @param tweetGetter tweetGetter
600 public void setTweetGetter(TweetGetter tweetGetter) {
601 this.tweetGetter = tweetGetter;
607 public String getTitle() {
615 public void setTitle(String title) {
617 this.tabbedPane.setTitleAt(this.getTabSetNum(), title);
621 * 自分自信がタブのどの場所に位置しているのかを取得
625 public int getTabSetNum() {
626 int tabCount = this.tabbedPane.getTabCount();
627 for (int i = 0; i < tabCount; i++) {
628 Component c = this.tabbedPane.getComponentAt(i);
629 if (c instanceof JScrollPane) {
630 if (c == this.scrollPane) {
639 * @return the tableElementMaxSize
641 public int getTableElementMaxSize() {
642 return tableElementMaxSize;
646 * @param tableElementMaxSize
647 * the tableElementMaxSize to set
649 public void setTableElementMaxSize(int tableElementMaxSize) {
650 this.tableElementMaxSize = tableElementMaxSize;
656 public TweetTableModel getModel() {
664 public void setModel(TweetTableModel model) {
669 * @return the uncheckedTweet
671 public int getUncheckedTweet() {
672 return uncheckedTweet;
676 * @param uncheckedTweet
677 * the uncheckedTweet to set
679 public void setUncheckedTweet(int uncheckedTweet) {
680 this.uncheckedTweet = uncheckedTweet;
684 * @return the timerID
686 public String getTimerID() {
693 public JTable getTable() {
698 * streaming api側からupdateされるもの
701 public void update(Status status) {
702 List<Status> tweet = new ArrayList<Status>();