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 getTable().setModel(model);
106 getTable().getTableHeader().setReorderingAllowed(false);
107 getTable().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(getTable());
122 scrollPane.setViewportView(getTable());
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.getTable().setRowHeight(0, getTableElementHeight());
221 TableCellRenderer renderer = getTable().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();
237 if( tweet != null ) {
238 newNum = tweet.size();
240 //情報を取得したことをステータスバーに表示
241 mainAction.information( this.getTitle() + "タブのツイートを" + newNum +
242 "件取得しました. (APIリクエスト残数は" + remainingHits
246 this.mainAction.saveProperties();
247 } catch (TwitterException e1) {
248 e1.printStackTrace();
249 } catch (Exception e) {
258 private void jTableMousePressed(java.awt.event.MouseEvent evt) {
262 this.setUncheckedTweet(0);
263 this.setTitle( this.getTitle() );
270 private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
279 private void showPopup(MouseEvent e) {
280 if (e.isPopupTrigger()) {
282 getRightClickPopup().show(e.getComponent(), e.getX(),
288 * 右クリックを押した時のポップアップメニューを取得
292 private JPopupMenu getRightClickPopup() {
293 if (rightClickPopup == null) {
294 rightClickPopup = new JPopupMenu();
295 JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信");
296 directMessageMenuItem.addActionListener(new java.awt.event.ActionListener() {
298 public void actionPerformed(java.awt.event.ActionEvent e) {
299 // ダイレクトメッセージ送信ダイアログを表示
300 mainAction.actionShowDirectMessageDialog();
303 rightClickPopup.add(directMessageMenuItem);
304 JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート");
305 retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
307 public void actionPerformed(java.awt.event.ActionEvent e) {
308 // 選択したセルのステータスをRetweet
309 mainAction.actionRetweet();
312 rightClickPopup.add(retweetMenuItem);
313 JMenuItem quoteMenuItem = new JMenuItem("発言をコメント付きリツイート");
314 quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
316 public void actionPerformed(java.awt.event.ActionEvent e) {
317 // 選択したセルのステータスをコメント付Retweet
318 mainAction.actionCopySelectedStatusToTweetBoxPane();
321 rightClickPopup.add(quoteMenuItem);
323 JMenuItem statusBrowserMenuItem = new JMenuItem("発言をブラウザで開く");
324 statusBrowserMenuItem.addActionListener(new java.awt.event.ActionListener() {
326 public void actionPerformed(java.awt.event.ActionEvent e) {
327 // 選択したセルのステータスをブラウザで開く
328 mainAction.actionOpenStatusURL();
331 rightClickPopup.add(statusBrowserMenuItem);
333 JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
334 "この人のTimelineをブラウザで開く");
335 openBrowserUserInformationMenuItem.addActionListener(new java.awt.event.ActionListener() {
337 public void actionPerformed(java.awt.event.ActionEvent e) {
338 // 選択したセルのユーザ情報をブラウザで開く
339 mainAction.actionOpenUserURL();
342 rightClickPopup.add(openBrowserUserInformationMenuItem);
344 return rightClickPopup;
350 public String getTitle() {
355 * @param title the title to set
357 public void setTitle(String title) {
359 this.tabbedPane.setTitleAt( this.getTabSetNum() , title);
363 * @return the tableElementHeight
365 public int getTableElementHeight() {
366 return tableElementHeight;
370 * @param tableElementHeight the tableElementHeight to set
372 public void setTableElementHeight(int tableElementHeight) {
373 this.tableElementHeight = tableElementHeight;
377 * @return the tableElementMaxSize
379 public int getTableElementMaxSize() {
380 return tableElementMaxSize;
384 * @param tableElementMaxSize the tableElementMaxSize to set
386 public void setTableElementMaxSize(int tableElementMaxSize) {
387 this.tableElementMaxSize = tableElementMaxSize;
393 public TweetTableModel getModel() {
398 * @param model the model to set
400 public void setModel(TweetTableModel model) {
405 * @return the tabSetNum
407 public int getTabSetNum() {
412 * @return the uncheckedTweet
414 public int getUncheckedTweet() {
415 return uncheckedTweet;
419 * @param uncheckedTweet the uncheckedTweet to set
421 public void setUncheckedTweet(int uncheckedTweet) {
422 this.uncheckedTweet = uncheckedTweet;
426 * @param tabSetNum the tabSetNum to set
428 public void setTabSetNum(int tabSetNum) {
429 this.tabSetNum = tabSetNum;
433 * @return the timerID
435 public String getTimerID() {
442 public JTable getTable() {