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 // TODO: ここを変更できるようにする
62 private int tableElementMaxSize = 500;
64 private String timerID;
78 * @param tableElementMaxSize
83 public TweetTabbedTable(TweetGetter tweetGetter, String title,
84 JTabbedPane tabbedPane,
85 TweetManager tweetManager, TweetMainAction mainAction,
86 int tableElementMaxSize, String timerID) {
87 this.tweetGetter = tweetGetter;
89 this.tabbedPane = tabbedPane;
90 this.tweetManager = tweetManager;
91 this.mainAction = mainAction;
92 this.tableElementMaxSize = tableElementMaxSize;
93 this.timerID = timerID;
96 model = new TweetTableModel();
98 scrollPane = new JScrollPane();
99 tweetGetter.setUpdateListener(this);
103 * Tweet情報を表示するテーブルをタブに追加
105 public void addTableToTab() {
107 getTable().setModel(model);
108 getTable().getTableHeader().setReorderingAllowed(false);
109 getTable().addMouseListener(new java.awt.event.MouseAdapter() {
111 public void mousePressed(java.awt.event.MouseEvent evt) {
112 jTableMousePressed(evt);
116 public void mouseReleased(java.awt.event.MouseEvent evt) {
117 jTableMouseReleased(evt);
122 createTweetTable(getTable());
125 scrollPane.setViewportView(getTable());
127 tabbedPane.addTab(this.title, scrollPane);
136 private void createTweetTable(final JTable table) {
138 table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
139 table.setShowVerticalLines(false);
140 table.setShowHorizontalLines(true);
142 // Comment部分のColumnを複数行コメントが表示できるようにする
143 TableColumnModel mdl = table.getColumnModel();
144 TableColumn col = mdl.getColumn(1);
145 TweetCommentRenderer commentRenderer = new TweetCommentRenderer(this.mainAction);
146 col.setCellRenderer(commentRenderer);
147 // INfo部分のColumnを複数行表示できるように
148 TweetCommentRenderer infoRenderer = new TweetCommentRenderer(this.mainAction);
149 col = mdl.getColumn(2);
150 col.setCellRenderer(infoRenderer);
151 col.setMaxWidth(200);
152 col.setMinWidth(150);
154 col = mdl.getColumn(0);
155 col.setCellRenderer(new UserImageRenderer());
157 col.setMinWidth(mainAction.getTableElementHeight());
158 col.setMaxWidth(mainAction.getTableElementHeight());
159 // 選択したセルの情報をDetailInfoへと表示
160 // JTableを右クリックでも選択できるようにする
161 // また,同じ行を2回クリックできるようにする
162 table.addMouseListener(new MouseAdapter() {
165 public void mousePressed(MouseEvent e) {
166 // いったんSelectしていた情報を削除
167 table.clearSelection();
168 // if (e.getButton() == MouseEvent.BUTTON3) {
169 Point p = e.getPoint();
170 int col = table.columnAtPoint(p);
171 int row = table.rowAtPoint(p);
172 table.changeSelection(row, col, false, false);
174 // テーブルで選択した要素を詳細情報として表示
175 mainAction.setDetailInformationFromTable(table);
180 table.addKeyListener(new KeyAdapter() {
183 public void keyReleased(KeyEvent ke) {
184 mainAction.setDetailInformationFromTable(table);
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()
203 if (remainingHits <= 0) {
207 List<Status> tweet = tweetGetter.getNewTweetData();
210 int newNum = updateTable(tweet);
212 // 情報を取得したことをステータスバーに表示
213 mainAction.information(this.getTitle() + "タブのツイートを" + newNum
214 + "件取得しました. (APIリクエスト残数は" + remainingHits + "回です)");
216 } catch (TwitterException e1) {
217 e1.printStackTrace();
218 } catch (Exception e) {
229 private int updateTable(List<Status> tweet) {
230 if( tweet == null ) {
234 this.setUncheckedTweet(this.getUncheckedTweet() + tweet.size());
236 this.getTable().setShowGrid(false);
238 // まだチェックしていないtweetの数をタブにも表示
239 if (this.getUncheckedTweet() > 0) {
240 tabbedPane.setTitleAt(this.getTabSetNum(),
241 this.title + "(" + this.getUncheckedTweet() + ")");
244 this.getModel().insertTweet(tweet);
246 int tableHeight = mainAction.getTableElementHeight();
247 for (int i = 0; i < tweet.size(); i++) {
248 this.getTable().setRowHeight(i, tableHeight);
251 * for (Status t : tweet) { this.getModel().insertTweet(t);
252 * this.getTable().setRowHeight(0, getTableElementHeight()); }
255 TableCellRenderer renderer = getTable().getCellRenderer(0, 2);
256 if (renderer instanceof TweetCommentRenderer) {
257 if (this.getUncheckedTweet() - 1 >= 0) {
258 ((TweetCommentRenderer) renderer).updateNewCellRow(this.getUncheckedTweet());
260 ((TweetCommentRenderer) renderer).updateNewCellRow(-1);
264 getModel().removeOldTweet(getTableElementMaxSize());
266 getModel().refreshTime();
270 newNum = tweet.size();
274 this.mainAction.saveProperties();
275 } catch (IOException e) {
276 // TODO 自動生成された catch ブロック
288 private void jTableMousePressed(java.awt.event.MouseEvent evt) {
292 this.setUncheckedTweet(0);
293 this.setTitle(this.getTitle());
301 private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
311 private void showPopup(MouseEvent e) {
312 if (e.isPopupTrigger()) {
314 getRightClickPopup().show(e.getComponent(), e.getX(), e.getY());
319 * 右クリックを押した時のポップアップメニューを取得
323 private JPopupMenu getRightClickPopup() {
324 // if (rightClickPopup == null) {
325 JPopupMenu rightClickPopup = new JPopupMenu();
327 JMenuItem replyMenuItem = new JMenuItem("この発言に返信(Reply)");
328 replyMenuItem.setMnemonic('R');
329 replyMenuItem.addActionListener(new java.awt.event.ActionListener() {
331 public void actionPerformed(java.awt.event.ActionEvent e) {
332 // 選択したセルのステータスにreply
333 mainAction.actionSetReplyStatusToTweetBoxPane();
337 JMenuItem replyAllMenuItem = new JMenuItem("この発言に返信(Reply All)");
338 replyAllMenuItem.setMnemonic('A');
339 replyAllMenuItem.addActionListener(new java.awt.event.ActionListener() {
341 public void actionPerformed(java.awt.event.ActionEvent e) {
342 // 選択したセルのステータスにreply all
343 mainAction.actionSetReplyAllStatusToTweetBoxPane();
347 JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート(RT)");
348 retweetMenuItem.setMnemonic('R');
349 retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
352 public void actionPerformed(java.awt.event.ActionEvent e) {
353 // 選択したセルのステータスをRetweet
354 mainAction.actionRetweet();
358 JMenuItem quoteMenuItem = new JMenuItem("発言を引用ツイート(QT)");
359 quoteMenuItem.setMnemonic('Q');
360 quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
363 public void actionPerformed(java.awt.event.ActionEvent e) {
365 mainAction.actionSetQuoteStatusToTweetBoxPane();
369 JMenuItem unofficialRetweetMenuItem = new JMenuItem(
370 "発言をコメント付きリツイート(非公式RT)");
371 unofficialRetweetMenuItem.setMnemonic('T');
372 unofficialRetweetMenuItem
373 .addActionListener(new java.awt.event.ActionListener() {
376 public void actionPerformed(java.awt.event.ActionEvent e) {
377 // 選択したセルのステータスをコメント付Retweet
378 mainAction.actionCopySelectedStatusToTweetBoxPane();
382 JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信(D)");
383 directMessageMenuItem.setMnemonic('D');
384 directMessageMenuItem
385 .addActionListener(new java.awt.event.ActionListener() {
388 public void actionPerformed(java.awt.event.ActionEvent e) {
389 // ダイレクトメッセージ送信ダイアログを表示
390 mainAction.actionShowDirectMessageDialog();
394 JMenuItem statusBrowserMenuItem = new JMenuItem("この発言をブラウザで開く(O)");
395 statusBrowserMenuItem.setMnemonic('O');
396 statusBrowserMenuItem
397 .addActionListener(new java.awt.event.ActionListener() {
400 public void actionPerformed(java.awt.event.ActionEvent e) {
401 // 選択したセルのステータスをブラウザで開く
402 mainAction.actionOpenStatusURL();
406 JMenuItem userMenuItem = new JMenuItem("この人の発言を別タブで開く(U)");
407 userMenuItem.setMnemonic('U');
408 userMenuItem.addActionListener(new java.awt.event.ActionListener() {
411 public void actionPerformed(java.awt.event.ActionEvent e) {
413 mainAction.actionSelectedUserTimeline();
417 JMenuItem createFavMenuItem = new JMenuItem("この発言をお気に入りに追加(F)");
418 createFavMenuItem.setMnemonic('F');
420 .addActionListener(new java.awt.event.ActionListener() {
423 public void actionPerformed(java.awt.event.ActionEvent e) {
424 // 選択したセルのユーザ情報をブラウザで開く
425 mainAction.actionCreateFavorite();
429 JMenuItem destroyFavMenuItem = new JMenuItem("この発言をお気に入りから削除");
431 .addActionListener(new java.awt.event.ActionListener() {
434 public void actionPerformed(java.awt.event.ActionEvent e) {
435 // 選択したセルのユーザ情報をブラウザで開く
436 mainAction.actionDestroyFavorite();
440 JMenuItem createdListMenuItem = new JMenuItem("このユーザが作成したリスト一覧");
442 .addActionListener(new java.awt.event.ActionListener() {
445 public void actionPerformed(java.awt.event.ActionEvent e) {
446 // 選択したセルのユーザ情報をブラウザで開く
448 .actionShowSelectedUserList(ListGetterSelection.CREATED);
452 JMenuItem subscriptionListMenuItem = new JMenuItem("このユーザが購読しているリスト一覧");
453 subscriptionListMenuItem
454 .addActionListener(new java.awt.event.ActionListener() {
457 public void actionPerformed(java.awt.event.ActionEvent e) {
458 // 選択したセルのユーザ情報をブラウザで開く
460 .actionShowSelectedUserList(ListGetterSelection.SUBSCRIPTION);
464 JMenuItem membershipsListMenuItem = new JMenuItem(
465 "このユーザがフォローされているリスト一覧");
466 membershipsListMenuItem
467 .addActionListener(new java.awt.event.ActionListener() {
470 public void actionPerformed(java.awt.event.ActionEvent e) {
471 // 選択したセルのユーザ情報をブラウザで開く
473 .actionShowSelectedUserList(ListGetterSelection.MEMBERSHIPS);
477 JMenuItem followingUserMenuItem = new JMenuItem("このユーザがフォローしているユーザ一覧");
478 followingUserMenuItem
479 .addActionListener(new java.awt.event.ActionListener() {
482 public void actionPerformed(java.awt.event.ActionEvent e) {
483 // 選択したセルのユーザ情報をブラウザで開く
484 mainAction.actionOpenFollowing();
488 JMenuItem followerUserMenuItem = new JMenuItem("このユーザがフォローされているユーザ一覧");
490 .addActionListener(new java.awt.event.ActionListener() {
493 public void actionPerformed(java.awt.event.ActionEvent e) {
494 // 選択したセルのユーザ情報をブラウザで開く
495 mainAction.actionOpenFollower();
500 int sc = table.getSelectedRowCount();
501 if (sc == 1 && table != null) {
502 Status st = mainAction.getTweetTableInformation(table,
505 JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
506 "この人の発言をブラウザで開く(B)");
507 openBrowserUserInformationMenuItem.setMnemonic('B');
508 openBrowserUserInformationMenuItem
509 .addActionListener(new java.awt.event.ActionListener() {
512 public void actionPerformed(java.awt.event.ActionEvent e) {
513 // 選択したセルのユーザ情報をブラウザで開く
514 mainAction.actionOpenUserURL();
518 JMenuItem openFavMenuItem = new JMenuItem("この人のお気に入りを開く");
520 .addActionListener(new java.awt.event.ActionListener() {
523 public void actionPerformed(java.awt.event.ActionEvent e) {
524 // 選択したセルのユーザ情報をブラウザで開く
525 mainAction.actionOpenUserFav();
531 rightClickPopup.add(replyMenuItem);
533 rightClickPopup.add(replyAllMenuItem);
535 rightClickPopup.add(retweetMenuItem);
537 rightClickPopup.add(unofficialRetweetMenuItem);
539 rightClickPopup.add(quoteMenuItem);
541 rightClickPopup.add(directMessageMenuItem);
543 rightClickPopup.add(statusBrowserMenuItem);
545 rightClickPopup.add(userMenuItem);
547 rightClickPopup.add(openBrowserUserInformationMenuItem);
549 rightClickPopup.add(openFavMenuItem);
551 rightClickPopup.add(followingUserMenuItem);
553 rightClickPopup.add(followerUserMenuItem);
555 rightClickPopup.add(createdListMenuItem);
557 rightClickPopup.add(subscriptionListMenuItem);
558 // この人がフォローされているリスト一覧
559 rightClickPopup.add(membershipsListMenuItem);
562 if (st.isRetweet()) {
563 // Retweetのときのみ表示するメニュー
565 if (st.isFavorited()) {
566 // お気に入りに追加されている時のみ表示するメニュー
568 rightClickPopup.add(destroyFavMenuItem);
570 rightClickPopup.add(createFavMenuItem);
572 } catch (Exception e) {
573 // TODO:ここの無視部分をなんとかする
574 // DMのときはisFavoritedができない
578 return rightClickPopup;
583 * @return tweetGetter
585 public TweetGetter getTweetGetter() {
591 * @param tweetGetter tweetGetter
593 public void setTweetGetter(TweetGetter tweetGetter) {
594 this.tweetGetter = tweetGetter;
600 public String getTitle() {
608 public void setTitle(String title) {
610 this.tabbedPane.setTitleAt(this.getTabSetNum(), title);
614 * 自分自信がタブのどの場所に位置しているのかを取得
618 public int getTabSetNum() {
619 int tabCount = this.tabbedPane.getTabCount();
620 for (int i = 0; i < tabCount; i++) {
621 Component c = this.tabbedPane.getComponentAt(i);
622 if (c instanceof JScrollPane) {
623 if (c == this.scrollPane) {
632 * @return the tableElementMaxSize
634 public int getTableElementMaxSize() {
635 return tableElementMaxSize;
639 * @param tableElementMaxSize
640 * the tableElementMaxSize to set
642 public void setTableElementMaxSize(int tableElementMaxSize) {
643 this.tableElementMaxSize = tableElementMaxSize;
649 public TweetTableModel getModel() {
657 public void setModel(TweetTableModel model) {
662 * @return the uncheckedTweet
664 public int getUncheckedTweet() {
665 return uncheckedTweet;
669 * @param uncheckedTweet
670 * the uncheckedTweet to set
672 public void setUncheckedTweet(int uncheckedTweet) {
673 this.uncheckedTweet = uncheckedTweet;
677 * @return the timerID
679 public String getTimerID() {
686 public JTable getTable() {
691 * streaming api側からupdateされるもの
694 public void update(Status status) {
695 List<Status> tweet = new ArrayList<Status>();