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;
66 * @param tweetGetter tweet取得時に行うアクション
67 * @param title タブに表示するタイトル
68 * @param tabbedPane テーブルを追加するタブ
69 * @param tabSetNum 何番目のタブにセットするか
70 * @param tableElementHeight テーブルの高さ
71 * @param tweetManager ツイート管理クラス
72 * @param mainAction メインアクション
73 * @param newTableColor 新しく取得した部分の色
74 * @param tableElementMaxSize テーブルに格納できる要素の最大数
76 public TweetTabbedTable(TweetGetter tweetGetter,
77 String title, JTabbedPane tabbedPane, int tabSetNum, int tableElementHeight,
78 TweetManager tweetManager, TweetMainAction mainAction, Color newTableColor,
79 int tableElementMaxSize) {
80 this.tweetGetter = tweetGetter;
82 this.tabbedPane = tabbedPane;
83 this.tabSetNum = tabSetNum;
84 this.tweetManager = tweetManager;
85 this.mainAction = mainAction;
86 this.tableElementHeight = tableElementHeight;
87 this.newTableColor = newTableColor;
88 this.tableElementMaxSize = tableElementMaxSize;
91 model = new TweetTableModel();
93 scrollPane = new JScrollPane();
96 table.setModel(model);
97 table.getTableHeader().setReorderingAllowed(false);
98 table.addMouseListener(new java.awt.event.MouseAdapter() {
100 public void mousePressed(java.awt.event.MouseEvent evt) {
101 jTableMousePressed(evt);
104 public void mouseReleased(java.awt.event.MouseEvent evt) {
105 jTableMouseReleased(evt);
110 createTweetTable(table);
113 scrollPane.setViewportView(table);
115 tabbedPane.addTab(this.title, scrollPane);
124 private void createTweetTable(final JTable table) {
126 table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
127 table.setShowVerticalLines(false);
128 table.setShowHorizontalLines(true);
130 // Comment部分のColumnを複数行コメントが表示できるようにする
131 TableColumnModel mdl = table.getColumnModel();
132 TableColumn col = mdl.getColumn(1);
133 TweetCommentRenderer commentRenderer = new TweetCommentRenderer();
134 col.setCellRenderer(commentRenderer);
135 // INfo部分のColumnを複数行表示できるように
136 TweetCommentRenderer infoRenderer = new TweetCommentRenderer();
137 col = mdl.getColumn(2);
138 col.setCellRenderer(infoRenderer);
139 col.setMaxWidth(200);
140 col.setMinWidth(150);
142 // あとでファイルに幅情報などを保存しておき,それを読み込んで設定するような仕様に変更する
144 col = mdl.getColumn(0);
145 col.setCellRenderer(new UserImageRenderer());
148 // 選択したセルの情報をDetailInfoへと表示
149 table.getSelectionModel().addListSelectionListener(
150 new ListSelectionListener() {
153 public void valueChanged(ListSelectionEvent e) {
155 if (e.getValueIsAdjusting()) {
159 //テーブルで選択した要素を詳細情報として表示
160 mainAction.setDetailInformationFromTable(table);
163 // JTableを右クリックでも選択できるようにする
164 // また,同じ行を2回クリックできるようにする
165 table.addMouseListener(new MouseAdapter() {
168 public void mousePressed(MouseEvent e) {
169 // いったんSelectしていた情報を削除
170 table.clearSelection();
171 // if (e.getButton() == MouseEvent.BUTTON3) {
172 Point p = e.getPoint();
173 int col = table.columnAtPoint(p);
174 int row = table.rowAtPoint(p);
175 table.changeSelection(row, col, false, false);
180 table.addMouseListener(commentRenderer);
181 table.addMouseMotionListener(commentRenderer);
182 table.addMouseListener(infoRenderer);
183 table.addMouseMotionListener(infoRenderer);
189 public void updateTweetTable() {
192 int remainingHits = tweetManager.getRateLimitStatus().getRemainingHits();
193 if (remainingHits <= 0) {
197 List<Status> tweet = tweetGetter.getNewTweetData();
199 this.uncheckedTweet += tweet.size();
201 // まだチェックしていないtweetの数をタブにも表示
202 if (this.uncheckedTweet > 0) {
203 tabbedPane.setTitleAt(this.tabSetNum, this.title + "("
204 + this.uncheckedTweet + ")");
207 for (Status t : tweet) {
208 this.model.insertTweet(t);
209 this.table.setRowHeight(0, getTableElementHeight());
212 TableCellRenderer renderer = table.getCellRenderer(0, 2);
213 if (renderer instanceof TweetCommentRenderer) {
214 if (this.uncheckedTweet - 1 >= 0) {
215 ((TweetCommentRenderer) renderer).updateNewCellRow(
216 this.uncheckedTweet, newTableColor);
218 ((TweetCommentRenderer) renderer).updateNewCellRow(-1,
223 model.removeOldTweet( getTableElementMaxSize() );
226 } catch (TwitterException e1) {
227 e1.printStackTrace();
228 } catch (Exception e) {
237 private void jTableMousePressed(java.awt.event.MouseEvent evt) {
241 mainAction.actionResetUncheckedTimelineTweetCount();
248 private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
257 private void showPopup(MouseEvent e) {
258 if (e.isPopupTrigger()) {
260 getRightClickPopup().show(e.getComponent(), e.getX(),
266 * 右クリックを押した時のポップアップメニューを取得
270 private JPopupMenu getRightClickPopup() {
271 if (rightClickPopup == null) {
272 rightClickPopup = new JPopupMenu();
273 JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信");
274 directMessageMenuItem.addActionListener(new java.awt.event.ActionListener() {
276 public void actionPerformed(java.awt.event.ActionEvent e) {
277 // ダイレクトメッセージ送信ダイアログを表示
278 mainAction.actionShowDirectMessageDialog();
281 rightClickPopup.add(directMessageMenuItem);
282 JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート");
283 retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
285 public void actionPerformed(java.awt.event.ActionEvent e) {
286 // 選択したセルのステータスをRetweet
287 mainAction.actionRetweet();
290 rightClickPopup.add(retweetMenuItem);
291 JMenuItem quoteMenuItem = new JMenuItem("発言をコメント付きリツイート");
292 quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
294 public void actionPerformed(java.awt.event.ActionEvent e) {
295 // 選択したセルのステータスをコメント付Retweet
296 mainAction.actionCopySelectedStatusToTweetBoxPane();
299 rightClickPopup.add(quoteMenuItem);
301 JMenuItem statusBrowserMenuItem = new JMenuItem("発言をブラウザで開く");
302 statusBrowserMenuItem.addActionListener(new java.awt.event.ActionListener() {
304 public void actionPerformed(java.awt.event.ActionEvent e) {
305 // 選択したセルのステータスをブラウザで開く
306 mainAction.actionOpenStatusURL();
309 rightClickPopup.add(statusBrowserMenuItem);
311 JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
312 "この人のTimelineをブラウザで開く");
313 openBrowserUserInformationMenuItem.addActionListener(new java.awt.event.ActionListener() {
315 public void actionPerformed(java.awt.event.ActionEvent e) {
316 // 選択したセルのユーザ情報をブラウザで開く
317 mainAction.actionOpenUserURL();
320 rightClickPopup.add(openBrowserUserInformationMenuItem);
322 return rightClickPopup;
328 public String getTitle() {
333 * @param title the title to set
335 public void setTitle(String title) {
340 * @return the tableElementHeight
342 public int getTableElementHeight() {
343 return tableElementHeight;
347 * @param tableElementHeight the tableElementHeight to set
349 public void setTableElementHeight(int tableElementHeight) {
350 this.tableElementHeight = tableElementHeight;
354 * @return the tableElementMaxSize
356 public int getTableElementMaxSize() {
357 return tableElementMaxSize;
361 * @param tableElementMaxSize the tableElementMaxSize to set
363 public void setTableElementMaxSize(int tableElementMaxSize) {
364 this.tableElementMaxSize = tableElementMaxSize;