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 // まだチェックしていないtweetの数をタブにも表示
242 if (this.getUncheckedTweet() > 0) {
243 tabbedPane.setTitleAt(this.getTabSetNum(),
244 this.title + "(" + this.getUncheckedTweet() + ")");
247 this.getModel().insertTweet(tweet);
249 int tableHeight = mainAction.getTableElementHeight();
250 for (int i = 0; i < tweet.size(); i++) {
251 this.getTable().setRowHeight(i, tableHeight);
254 * for (Status t : tweet) { this.getModel().insertTweet(t);
255 * this.getTable().setRowHeight(0, getTableElementHeight()); }
258 TableCellRenderer renderer = getTable().getCellRenderer(0, 2);
259 if (renderer instanceof TweetCommentRenderer) {
260 if (this.getUncheckedTweet() - 1 >= 0) {
261 ((TweetCommentRenderer) renderer).updateNewCellRow(
262 this.getUncheckedTweet(), newTableColor);
264 ((TweetCommentRenderer) renderer).updateNewCellRow(-1,
269 getModel().removeOldTweet(getTableElementMaxSize());
271 getModel().refreshTime();
275 newNum = tweet.size();
279 this.mainAction.saveProperties();
280 } catch (IOException e) {
281 // TODO 自動生成された catch ブロック
293 private void jTableMousePressed(java.awt.event.MouseEvent evt) {
297 this.setUncheckedTweet(0);
298 this.setTitle(this.getTitle());
306 private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
316 private void showPopup(MouseEvent e) {
317 if (e.isPopupTrigger()) {
319 getRightClickPopup().show(e.getComponent(), e.getX(), e.getY());
324 * 右クリックを押した時のポップアップメニューを取得
328 private JPopupMenu getRightClickPopup() {
329 // if (rightClickPopup == null) {
330 JPopupMenu rightClickPopup = new JPopupMenu();
332 JMenuItem replyMenuItem = new JMenuItem("この発言に返信(Reply)");
333 replyMenuItem.setMnemonic('R');
334 replyMenuItem.addActionListener(new java.awt.event.ActionListener() {
336 public void actionPerformed(java.awt.event.ActionEvent e) {
337 // 選択したセルのステータスにreply
338 mainAction.actionSetReplyStatusToTweetBoxPane();
342 JMenuItem replyAllMenuItem = new JMenuItem("この発言に返信(Reply All)");
343 replyAllMenuItem.setMnemonic('A');
344 replyAllMenuItem.addActionListener(new java.awt.event.ActionListener() {
346 public void actionPerformed(java.awt.event.ActionEvent e) {
347 // 選択したセルのステータスにreply all
348 mainAction.actionSetReplyAllStatusToTweetBoxPane();
352 JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート(RT)");
353 retweetMenuItem.setMnemonic('R');
354 retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
357 public void actionPerformed(java.awt.event.ActionEvent e) {
358 // 選択したセルのステータスをRetweet
359 mainAction.actionRetweet();
363 JMenuItem quoteMenuItem = new JMenuItem("発言を引用ツイート(QT)");
364 quoteMenuItem.setMnemonic('Q');
365 quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
368 public void actionPerformed(java.awt.event.ActionEvent e) {
370 mainAction.actionSetQuoteStatusToTweetBoxPane();
374 JMenuItem unofficialRetweetMenuItem = new JMenuItem(
375 "発言をコメント付きリツイート(非公式RT)");
376 unofficialRetweetMenuItem.setMnemonic('T');
377 unofficialRetweetMenuItem
378 .addActionListener(new java.awt.event.ActionListener() {
381 public void actionPerformed(java.awt.event.ActionEvent e) {
382 // 選択したセルのステータスをコメント付Retweet
383 mainAction.actionCopySelectedStatusToTweetBoxPane();
387 JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信(D)");
388 directMessageMenuItem.setMnemonic('D');
389 directMessageMenuItem
390 .addActionListener(new java.awt.event.ActionListener() {
393 public void actionPerformed(java.awt.event.ActionEvent e) {
394 // ダイレクトメッセージ送信ダイアログを表示
395 mainAction.actionShowDirectMessageDialog();
399 JMenuItem statusBrowserMenuItem = new JMenuItem("この発言をブラウザで開く(O)");
400 statusBrowserMenuItem.setMnemonic('O');
401 statusBrowserMenuItem
402 .addActionListener(new java.awt.event.ActionListener() {
405 public void actionPerformed(java.awt.event.ActionEvent e) {
406 // 選択したセルのステータスをブラウザで開く
407 mainAction.actionOpenStatusURL();
411 JMenuItem userMenuItem = new JMenuItem("この人の発言を別タブで開く(U)");
412 userMenuItem.setMnemonic('U');
413 userMenuItem.addActionListener(new java.awt.event.ActionListener() {
416 public void actionPerformed(java.awt.event.ActionEvent e) {
418 mainAction.actionSelectedUserTimeline();
422 JMenuItem createFavMenuItem = new JMenuItem("この発言をお気に入りに追加(F)");
423 createFavMenuItem.setMnemonic('F');
425 .addActionListener(new java.awt.event.ActionListener() {
428 public void actionPerformed(java.awt.event.ActionEvent e) {
429 // 選択したセルのユーザ情報をブラウザで開く
430 mainAction.actionCreateFavorite();
434 JMenuItem destroyFavMenuItem = new JMenuItem("この発言をお気に入りから削除");
436 .addActionListener(new java.awt.event.ActionListener() {
439 public void actionPerformed(java.awt.event.ActionEvent e) {
440 // 選択したセルのユーザ情報をブラウザで開く
441 mainAction.actionDestroyFavorite();
445 JMenuItem createdListMenuItem = new JMenuItem("このユーザが作成したリスト一覧");
447 .addActionListener(new java.awt.event.ActionListener() {
450 public void actionPerformed(java.awt.event.ActionEvent e) {
451 // 選択したセルのユーザ情報をブラウザで開く
453 .actionShowSelectedUserList(ListGetterSelection.CREATED);
457 JMenuItem subscriptionListMenuItem = new JMenuItem("このユーザが購読しているリスト一覧");
458 subscriptionListMenuItem
459 .addActionListener(new java.awt.event.ActionListener() {
462 public void actionPerformed(java.awt.event.ActionEvent e) {
463 // 選択したセルのユーザ情報をブラウザで開く
465 .actionShowSelectedUserList(ListGetterSelection.SUBSCRIPTION);
469 JMenuItem membershipsListMenuItem = new JMenuItem(
470 "このユーザがフォローされているリスト一覧");
471 membershipsListMenuItem
472 .addActionListener(new java.awt.event.ActionListener() {
475 public void actionPerformed(java.awt.event.ActionEvent e) {
476 // 選択したセルのユーザ情報をブラウザで開く
478 .actionShowSelectedUserList(ListGetterSelection.MEMBERSHIPS);
482 JMenuItem followingUserMenuItem = new JMenuItem("このユーザがフォローしているユーザ一覧");
483 followingUserMenuItem
484 .addActionListener(new java.awt.event.ActionListener() {
487 public void actionPerformed(java.awt.event.ActionEvent e) {
488 // 選択したセルのユーザ情報をブラウザで開く
489 mainAction.actionOpenFollowing();
493 JMenuItem followerUserMenuItem = new JMenuItem("このユーザがフォローされているユーザ一覧");
495 .addActionListener(new java.awt.event.ActionListener() {
498 public void actionPerformed(java.awt.event.ActionEvent e) {
499 // 選択したセルのユーザ情報をブラウザで開く
500 mainAction.actionOpenFollower();
505 int sc = table.getSelectedRowCount();
506 if (sc == 1 && table != null) {
507 Status st = mainAction.getTweetTableInformation(table,
510 JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
511 "この人の発言をブラウザで開く(B)");
512 openBrowserUserInformationMenuItem.setMnemonic('B');
513 openBrowserUserInformationMenuItem
514 .addActionListener(new java.awt.event.ActionListener() {
517 public void actionPerformed(java.awt.event.ActionEvent e) {
518 // 選択したセルのユーザ情報をブラウザで開く
519 mainAction.actionOpenUserURL();
523 JMenuItem openFavMenuItem = new JMenuItem("この人のお気に入りを開く");
525 .addActionListener(new java.awt.event.ActionListener() {
528 public void actionPerformed(java.awt.event.ActionEvent e) {
529 // 選択したセルのユーザ情報をブラウザで開く
530 mainAction.actionOpenUserFav();
536 rightClickPopup.add(replyMenuItem);
538 rightClickPopup.add(replyAllMenuItem);
540 rightClickPopup.add(retweetMenuItem);
542 rightClickPopup.add(unofficialRetweetMenuItem);
544 rightClickPopup.add(quoteMenuItem);
546 rightClickPopup.add(directMessageMenuItem);
548 rightClickPopup.add(statusBrowserMenuItem);
550 rightClickPopup.add(userMenuItem);
552 rightClickPopup.add(openBrowserUserInformationMenuItem);
554 rightClickPopup.add(openFavMenuItem);
556 rightClickPopup.add(followingUserMenuItem);
558 rightClickPopup.add(followerUserMenuItem);
560 rightClickPopup.add(createdListMenuItem);
562 rightClickPopup.add(subscriptionListMenuItem);
563 // この人がフォローされているリスト一覧
564 rightClickPopup.add(membershipsListMenuItem);
567 if (st.isRetweet()) {
568 // Retweetのときのみ表示するメニュー
570 if (st.isFavorited()) {
571 // お気に入りに追加されている時のみ表示するメニュー
573 rightClickPopup.add(destroyFavMenuItem);
575 rightClickPopup.add(createFavMenuItem);
577 } catch (Exception e) {
578 // TODO:ここの無視部分をなんとかする
579 // DMのときはisFavoritedができない
583 return rightClickPopup;
588 * @return tweetGetter
590 public TweetGetter getTweetGetter() {
596 * @param tweetGetter tweetGetter
598 public void setTweetGetter(TweetGetter tweetGetter) {
599 this.tweetGetter = tweetGetter;
605 public String getTitle() {
613 public void setTitle(String title) {
615 this.tabbedPane.setTitleAt(this.getTabSetNum(), title);
619 * 自分自信がタブのどの場所に位置しているのかを取得
623 public int getTabSetNum() {
624 int tabCount = this.tabbedPane.getTabCount();
625 for (int i = 0; i < tabCount; i++) {
626 Component c = this.tabbedPane.getComponentAt(i);
627 if (c instanceof JScrollPane) {
628 if (c == this.scrollPane) {
637 * @return the tableElementMaxSize
639 public int getTableElementMaxSize() {
640 return tableElementMaxSize;
644 * @param tableElementMaxSize
645 * the tableElementMaxSize to set
647 public void setTableElementMaxSize(int tableElementMaxSize) {
648 this.tableElementMaxSize = tableElementMaxSize;
654 public TweetTableModel getModel() {
662 public void setModel(TweetTableModel model) {
667 * @return the uncheckedTweet
669 public int getUncheckedTweet() {
670 return uncheckedTweet;
674 * @param uncheckedTweet
675 * the uncheckedTweet to set
677 public void setUncheckedTweet(int uncheckedTweet) {
678 this.uncheckedTweet = uncheckedTweet;
682 * @return the timerID
684 public String getTimerID() {
691 public JTable getTable() {
696 * streaming api側からupdateされるもの
699 public void update(Status status) {
700 List<Status> tweet = new ArrayList<Status>();