OSDN Git Service

TableのGrid線を削除し、代わりに一行ずつ背景色を変えるようにした
[nt-manager/nt-manager.git] / src / twitter / gui / component / TweetTabbedTable.java
1 /*
2  * To change this template, choose Tools | Templates
3  * and open the template in the editor.
4  */
5
6 package twitter.gui.component;
7
8 import java.awt.Color;
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;
35
36 /**
37  * ツイートを表示するテーブルを扱うクラス
38  *
39  * @author nishio
40  */
41 public class TweetTabbedTable implements TweetStreamingListener {
42         // ツイートを表示するテーブル
43         private JTable table;
44         // ツイートを表示するテーブルのモデル
45         private TweetTableModel model;
46         // 未読のツイート数
47         private int uncheckedTweet;
48         // ツイートを取得する時に行うアクション
49         private TweetGetter tweetGetter;
50         // タブに表示される名前
51         private String title;
52         // タブ
53         private JTabbedPane tabbedPane;
54         // スクロールペーン
55         private JScrollPane scrollPane;
56         // ツイートを管理するクラス
57         private TweetManager tweetManager;
58         // メインアクション
59         private TweetMainAction mainAction;
60         // 新しく取得した部分のテーブルの色
61         private Color newTableColor = null;
62         // テーブルに追加できる要素の最大数
63         // TODO: ここを変更できるようにする
64         private int tableElementMaxSize = 500;
65         // 自動更新に使うタイマーのID
66         private String timerID;
67
68         /**
69          *
70          * @param tweetGetter
71          *            tweet取得時に行うアクション
72          * @param title
73          *             タブに表示するタイトル
74          * @param tabbedPane
75          *             テーブルを追加するタブ
76          * @param tweetManager
77          *             ツイート管理クラス
78          * @param mainAction
79          *            メインアクション
80          * @param newTableColor
81          *            新しく取得した部分の色
82          * @param tableElementMaxSize
83          *            テーブルに格納できる要素の最大数
84          * @param timerID
85          *            自動更新につかうタイマーのID
86          */
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;
92                 this.title = title;
93                 this.tabbedPane = tabbedPane;
94                 this.tweetManager = tweetManager;
95                 this.mainAction = mainAction;
96                 this.newTableColor = newTableColor;
97                 this.tableElementMaxSize = tableElementMaxSize;
98                 this.timerID = timerID;
99
100                 table = new JTable();
101                 model = new TweetTableModel();
102                 uncheckedTweet = 0;
103                 scrollPane = new JScrollPane();
104                 tweetGetter.setUpdateListener(this);
105         }
106
107         /**
108          * Tweet情報を表示するテーブルをタブに追加
109          */
110         public void addTableToTab() {
111                 // テーブルをタブに追加
112                 getTable().setModel(model);
113                 getTable().getTableHeader().setReorderingAllowed(false);
114                 getTable().addMouseListener(new java.awt.event.MouseAdapter() {
115                         @Override
116                         public void mousePressed(java.awt.event.MouseEvent evt) {
117                                 jTableMousePressed(evt);
118                         }
119
120                         @Override
121                         public void mouseReleased(java.awt.event.MouseEvent evt) {
122                                 jTableMouseReleased(evt);
123                         }
124                 });
125
126                 // tweetを表示するテーブルを作成
127                 createTweetTable(getTable());
128
129                 // スクロールペーン追加
130                 scrollPane.setViewportView(getTable());
131                 // タブにテーブル追加
132                 tabbedPane.addTab(this.title, scrollPane);
133         }
134
135         /**
136          * Tweetを表示するテーブルを作成
137          *
138          * @param model
139          * @return
140          */
141         private void createTweetTable(final JTable table) {
142
143                 table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
144                 table.setShowVerticalLines(false);
145                 table.setShowHorizontalLines(true);
146
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);
158                 // ユーザImageを表示する部分
159                 col = mdl.getColumn(0);
160                 col.setCellRenderer(new UserImageRenderer());
161                 //テーブルの高さ調節
162                 col.setMinWidth(mainAction.getTableElementHeight());
163                 col.setMaxWidth(mainAction.getTableElementHeight());
164                 // 選択したセルの情報をDetailInfoへと表示
165                 // JTableを右クリックでも選択できるようにする
166                 // また,同じ行を2回クリックできるようにする
167                 table.addMouseListener(new MouseAdapter() {
168
169                         @Override
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);
178
179                                 // テーブルで選択した要素を詳細情報として表示
180                                 mainAction.setDetailInformationFromTable(table);
181                                 // }
182                         }
183                 });
184                 // キー受付
185                 table.addKeyListener(new KeyAdapter() {
186
187                         @Override
188                         public void keyReleased(KeyEvent ke) {
189                                 mainAction.setDetailInformationFromTable(table);
190                         }
191
192                 });
193                 // MouseEventを追加
194                 table.addMouseListener(commentRenderer);
195                 // table.addMouseMotionListener(commentRenderer);
196                 table.addMouseListener(infoRenderer);
197                 // table.addMouseMotionListener(infoRenderer);
198         }
199
200         /**
201          * テーブル情報更新
202          */
203         public void updateTweetTable() {
204                 try {
205                         // API残り回数を取得
206                         int remainingHits = tweetManager.getRateLimitStatus()
207                                         .getRemainingHits();
208                         if (remainingHits <= 0) {
209                                 return;
210                         }
211                         // ツイート情報
212                         List<Status> tweet = tweetGetter.getNewTweetData();
213
214                         // テーブル更新
215                         int newNum = updateTable(tweet);
216
217                         // 情報を取得したことをステータスバーに表示
218                         mainAction.information(this.getTitle() + "タブのツイートを" + newNum
219                                         + "件取得しました. (APIリクエスト残数は" + remainingHits + "回です)");
220
221                 } catch (TwitterException e1) {
222                         e1.printStackTrace();
223                 } catch (Exception e) {
224                         e.printStackTrace();
225                 }
226         }
227
228         /**
229          * テーブルにツイート追加
230          *
231          * @param tweet
232          * @return
233          */
234         private int updateTable(List<Status> tweet) {
235                 if( tweet == null ) {
236                         return 0;
237                 }
238                 // まだ見ていないtweet数を追加
239                 this.setUncheckedTweet(this.getUncheckedTweet() + tweet.size());
240                 //grid線を削除する
241                 this.getTable().setShowGrid(false);
242
243                 // まだチェックしていないtweetの数をタブにも表示
244                 if (this.getUncheckedTweet() > 0) {
245                         tabbedPane.setTitleAt(this.getTabSetNum(),
246                                         this.title + "(" + this.getUncheckedTweet() + ")");
247                 }
248                 // ツイートをテーブルに追加
249                 this.getModel().insertTweet(tweet);
250                 // テーブルの高さを整える
251                 int tableHeight = mainAction.getTableElementHeight();
252                 for (int i = 0; i < tweet.size(); i++) {
253                         this.getTable().setRowHeight(i, tableHeight);
254                 }
255                 /*
256                  * for (Status t : tweet) { this.getModel().insertTweet(t);
257                  * this.getTable().setRowHeight(0, getTableElementHeight()); }
258                  */
259                 // 新規した部分の背景色を変更
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);
265                         } else {
266                                 ((TweetCommentRenderer) renderer).updateNewCellRow(-1,
267                                                 newTableColor);
268                         }
269                 }
270                 // 古いデータを削除
271                 getModel().removeOldTweet(getTableElementMaxSize());
272                 // 時間情報リフレッシュ
273                 getModel().refreshTime();
274                 // 新しい情報
275                 int newNum = 0;
276                 if (tweet != null) {
277                         newNum = tweet.size();
278                 }
279                 // 情報間隔毎に設定を保存
280                 try {
281                         this.mainAction.saveProperties();
282                 } catch (IOException e) {
283                         // TODO 自動生成された catch ブロック
284                         e.printStackTrace();
285                 }
286
287                 return newNum;
288         }
289
290         /**
291          * マウスクリック時の動作
292          *
293          * @param evt
294          */
295         private void jTableMousePressed(java.awt.event.MouseEvent evt) {
296                 // 右クリックメニュー表示
297                 showPopup(evt);
298                 // 未読ツイート分を0にする
299                 this.setUncheckedTweet(0);
300                 this.setTitle(this.getTitle());
301         }
302
303         /**
304          * マウスリリース時の動作
305          *
306          * @param evt
307          */
308         private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
309                 // 右クリックメニュー表示
310                 showPopup(evt);
311         }
312
313         /**
314          * ポップアップメニューを作成
315          *
316          * @param e
317          */
318         private void showPopup(MouseEvent e) {
319                 if (e.isPopupTrigger()) {
320                         // 右クリックのメニューを表示
321                         getRightClickPopup().show(e.getComponent(), e.getX(), e.getY());
322                 }
323         }
324
325         /**
326          * 右クリックを押した時のポップアップメニューを取得
327          *
328          * @return
329          */
330         private JPopupMenu getRightClickPopup() {
331                 // if (rightClickPopup == null) {
332                 JPopupMenu rightClickPopup = new JPopupMenu();
333
334                 JMenuItem replyMenuItem = new JMenuItem("この発言に返信(Reply)");
335                 replyMenuItem.setMnemonic('R');
336                 replyMenuItem.addActionListener(new java.awt.event.ActionListener() {
337
338                         public void actionPerformed(java.awt.event.ActionEvent e) {
339                                 // 選択したセルのステータスにreply
340                                 mainAction.actionSetReplyStatusToTweetBoxPane();
341                         }
342                 });
343
344                 JMenuItem replyAllMenuItem = new JMenuItem("この発言に返信(Reply All)");
345                 replyAllMenuItem.setMnemonic('A');
346                 replyAllMenuItem.addActionListener(new java.awt.event.ActionListener() {
347
348                         public void actionPerformed(java.awt.event.ActionEvent e) {
349                                 // 選択したセルのステータスにreply all
350                                 mainAction.actionSetReplyAllStatusToTweetBoxPane();
351                         }
352                 });
353
354                 JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート(RT)");
355                 retweetMenuItem.setMnemonic('R');
356                 retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
357
358                         @Override
359                         public void actionPerformed(java.awt.event.ActionEvent e) {
360                                 // 選択したセルのステータスをRetweet
361                                 mainAction.actionRetweet();
362                         }
363                 });
364
365                 JMenuItem quoteMenuItem = new JMenuItem("発言を引用ツイート(QT)");
366                 quoteMenuItem.setMnemonic('Q');
367                 quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
368
369                         @Override
370                         public void actionPerformed(java.awt.event.ActionEvent e) {
371                                 // 選択したセルのステータスをQT
372                                 mainAction.actionSetQuoteStatusToTweetBoxPane();
373                         }
374                 });
375
376                 JMenuItem unofficialRetweetMenuItem = new JMenuItem(
377                                 "発言をコメント付きリツイート(非公式RT)");
378                 unofficialRetweetMenuItem.setMnemonic('T');
379                 unofficialRetweetMenuItem
380                                 .addActionListener(new java.awt.event.ActionListener() {
381
382                                         @Override
383                                         public void actionPerformed(java.awt.event.ActionEvent e) {
384                                                 // 選択したセルのステータスをコメント付Retweet
385                                                 mainAction.actionCopySelectedStatusToTweetBoxPane();
386                                         }
387                                 });
388
389                 JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信(D)");
390                 directMessageMenuItem.setMnemonic('D');
391                 directMessageMenuItem
392                                 .addActionListener(new java.awt.event.ActionListener() {
393
394                                         @Override
395                                         public void actionPerformed(java.awt.event.ActionEvent e) {
396                                                 // ダイレクトメッセージ送信ダイアログを表示
397                                                 mainAction.actionShowDirectMessageDialog();
398                                         }
399                                 });
400
401                 JMenuItem statusBrowserMenuItem = new JMenuItem("この発言をブラウザで開く(O)");
402                 statusBrowserMenuItem.setMnemonic('O');
403                 statusBrowserMenuItem
404                                 .addActionListener(new java.awt.event.ActionListener() {
405
406                                         @Override
407                                         public void actionPerformed(java.awt.event.ActionEvent e) {
408                                                 // 選択したセルのステータスをブラウザで開く
409                                                 mainAction.actionOpenStatusURL();
410                                         }
411                                 });
412
413                 JMenuItem userMenuItem = new JMenuItem("この人の発言を別タブで開く(U)");
414                 userMenuItem.setMnemonic('U');
415                 userMenuItem.addActionListener(new java.awt.event.ActionListener() {
416
417                         @Override
418                         public void actionPerformed(java.awt.event.ActionEvent e) {
419                                 // 指定した人の発言を開く
420                                 mainAction.actionSelectedUserTimeline();
421                         }
422                 });
423
424                 JMenuItem createFavMenuItem = new JMenuItem("この発言をお気に入りに追加(F)");
425                 createFavMenuItem.setMnemonic('F');
426                 createFavMenuItem
427                                 .addActionListener(new java.awt.event.ActionListener() {
428
429                                         @Override
430                                         public void actionPerformed(java.awt.event.ActionEvent e) {
431                                                 // 選択したセルのユーザ情報をブラウザで開く
432                                                 mainAction.actionCreateFavorite();
433                                         }
434                                 });
435
436                 JMenuItem destroyFavMenuItem = new JMenuItem("この発言をお気に入りから削除");
437                 destroyFavMenuItem
438                                 .addActionListener(new java.awt.event.ActionListener() {
439
440                                         @Override
441                                         public void actionPerformed(java.awt.event.ActionEvent e) {
442                                                 // 選択したセルのユーザ情報をブラウザで開く
443                                                 mainAction.actionDestroyFavorite();
444                                         }
445                                 });
446
447                 JMenuItem createdListMenuItem = new JMenuItem("このユーザが作成したリスト一覧");
448                 createdListMenuItem
449                                 .addActionListener(new java.awt.event.ActionListener() {
450
451                                         @Override
452                                         public void actionPerformed(java.awt.event.ActionEvent e) {
453                                                 // 選択したセルのユーザ情報をブラウザで開く
454                                                 mainAction
455                                                                 .actionShowSelectedUserList(ListGetterSelection.CREATED);
456                                         }
457                                 });
458
459                 JMenuItem subscriptionListMenuItem = new JMenuItem("このユーザが購読しているリスト一覧");
460                 subscriptionListMenuItem
461                                 .addActionListener(new java.awt.event.ActionListener() {
462
463                                         @Override
464                                         public void actionPerformed(java.awt.event.ActionEvent e) {
465                                                 // 選択したセルのユーザ情報をブラウザで開く
466                                                 mainAction
467                                                                 .actionShowSelectedUserList(ListGetterSelection.SUBSCRIPTION);
468                                         }
469                                 });
470
471                 JMenuItem membershipsListMenuItem = new JMenuItem(
472                                 "このユーザがフォローされているリスト一覧");
473                 membershipsListMenuItem
474                                 .addActionListener(new java.awt.event.ActionListener() {
475
476                                         @Override
477                                         public void actionPerformed(java.awt.event.ActionEvent e) {
478                                                 // 選択したセルのユーザ情報をブラウザで開く
479                                                 mainAction
480                                                                 .actionShowSelectedUserList(ListGetterSelection.MEMBERSHIPS);
481                                         }
482                                 });
483
484                 JMenuItem followingUserMenuItem = new JMenuItem("このユーザがフォローしているユーザ一覧");
485                 followingUserMenuItem
486                                 .addActionListener(new java.awt.event.ActionListener() {
487
488                                         @Override
489                                         public void actionPerformed(java.awt.event.ActionEvent e) {
490                                                 // 選択したセルのユーザ情報をブラウザで開く
491                                                 mainAction.actionOpenFollowing();
492                                         }
493                                 });
494
495                 JMenuItem followerUserMenuItem = new JMenuItem("このユーザがフォローされているユーザ一覧");
496                 followerUserMenuItem
497                                 .addActionListener(new java.awt.event.ActionListener() {
498
499                                         @Override
500                                         public void actionPerformed(java.awt.event.ActionEvent e) {
501                                                 // 選択したセルのユーザ情報をブラウザで開く
502                                                 mainAction.actionOpenFollower();
503                                         }
504                                 });
505
506                 // 指定した発言がRTかどうか判定
507                 int sc = table.getSelectedRowCount();
508                 if (sc == 1 && table != null) {
509                         Status st = mainAction.getTweetTableInformation(table,
510                                         table.getModel());
511
512                         JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
513                                         "この人の発言をブラウザで開く(B)");
514                         openBrowserUserInformationMenuItem.setMnemonic('B');
515                         openBrowserUserInformationMenuItem
516                                         .addActionListener(new java.awt.event.ActionListener() {
517
518                                                 @Override
519                                                 public void actionPerformed(java.awt.event.ActionEvent e) {
520                                                         // 選択したセルのユーザ情報をブラウザで開く
521                                                         mainAction.actionOpenUserURL();
522                                                 }
523                                         });
524
525                         JMenuItem openFavMenuItem = new JMenuItem("この人のお気に入りを開く");
526                         openFavMenuItem
527                                         .addActionListener(new java.awt.event.ActionListener() {
528
529                                                 @Override
530                                                 public void actionPerformed(java.awt.event.ActionEvent e) {
531                                                         // 選択したセルのユーザ情報をブラウザで開く
532                                                         mainAction.actionOpenUserFav();
533                                                 }
534                                         });
535
536                         // メニューアイテムを追加
537                         // 返信
538                         rightClickPopup.add(replyMenuItem);
539                         // 返信all
540                         rightClickPopup.add(replyAllMenuItem);
541                         // 公式RT
542                         rightClickPopup.add(retweetMenuItem);
543                         // 非公式RT
544                         rightClickPopup.add(unofficialRetweetMenuItem);
545                         // QT
546                         rightClickPopup.add(quoteMenuItem);
547                         // ダイレクトメッセージ
548                         rightClickPopup.add(directMessageMenuItem);
549                         // 発言をブラウザで開く
550                         rightClickPopup.add(statusBrowserMenuItem);
551                         // この人の発言を別タブで開く
552                         rightClickPopup.add(userMenuItem);
553                         // この人のtimelineを開く
554                         rightClickPopup.add(openBrowserUserInformationMenuItem);
555                         // この人のfavを開く
556                         rightClickPopup.add(openFavMenuItem);
557                         // この人のfollowing開く
558                         rightClickPopup.add(followingUserMenuItem);
559                         // この人のfollower開く
560                         rightClickPopup.add(followerUserMenuItem);
561                         // この人が作成したリスト
562                         rightClickPopup.add(createdListMenuItem);
563                         // この人が購読しているリスト
564                         rightClickPopup.add(subscriptionListMenuItem);
565                         // この人がフォローされているリスト一覧
566                         rightClickPopup.add(membershipsListMenuItem);
567
568                         try {
569                                 if (st.isRetweet()) {
570                                         // Retweetのときのみ表示するメニュー
571                                 }
572                                 if (st.isFavorited()) {
573                                         // お気に入りに追加されている時のみ表示するメニュー
574                                         // お気に入り追加
575                                         rightClickPopup.add(destroyFavMenuItem);
576                                 } else {
577                                         rightClickPopup.add(createFavMenuItem);
578                                 }
579                         } catch (Exception e) {
580                                 // TODO:ここの無視部分をなんとかする
581                                 // DMのときはisFavoritedができない
582                         }
583                 }
584                 // }
585                 return rightClickPopup;
586         }
587
588         /**
589          * tweetGetterを取得します。
590          * @return tweetGetter
591          */
592         public TweetGetter getTweetGetter() {
593             return tweetGetter;
594         }
595
596         /**
597          * tweetGetterを設定します。
598          * @param tweetGetter tweetGetter
599          */
600         public void setTweetGetter(TweetGetter tweetGetter) {
601             this.tweetGetter = tweetGetter;
602         }
603
604         /**
605          * @return the title
606          */
607         public String getTitle() {
608                 return title;
609         }
610
611         /**
612          * @param title
613          *            the title to set
614          */
615         public void setTitle(String title) {
616                 this.title = title;
617                 this.tabbedPane.setTitleAt(this.getTabSetNum(), title);
618         }
619
620         /**
621          * 自分自信がタブのどの場所に位置しているのかを取得
622          *
623          * @return
624          */
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) {
631                                         return i;
632                                 }
633                         }
634                 }
635                 return 0;
636         }
637
638         /**
639          * @return the tableElementMaxSize
640          */
641         public int getTableElementMaxSize() {
642                 return tableElementMaxSize;
643         }
644
645         /**
646          * @param tableElementMaxSize
647          *            the tableElementMaxSize to set
648          */
649         public void setTableElementMaxSize(int tableElementMaxSize) {
650                 this.tableElementMaxSize = tableElementMaxSize;
651         }
652
653         /**
654          * @return the model
655          */
656         public TweetTableModel getModel() {
657                 return model;
658         }
659
660         /**
661          * @param model
662          *            the model to set
663          */
664         public void setModel(TweetTableModel model) {
665                 this.model = model;
666         }
667
668         /**
669          * @return the uncheckedTweet
670          */
671         public int getUncheckedTweet() {
672                 return uncheckedTweet;
673         }
674
675         /**
676          * @param uncheckedTweet
677          *            the uncheckedTweet to set
678          */
679         public void setUncheckedTweet(int uncheckedTweet) {
680                 this.uncheckedTweet = uncheckedTweet;
681         }
682
683         /**
684          * @return the timerID
685          */
686         public String getTimerID() {
687                 return timerID;
688         }
689
690         /**
691          * @return the table
692          */
693         public JTable getTable() {
694                 return table;
695         }
696
697         /**
698          * streaming api側からupdateされるもの
699          */
700         @Override
701         public void update(Status status) {
702                 List<Status> tweet = new ArrayList<Status>();
703                 tweet.add(status);
704                 updateTable(tweet);
705         }
706
707 }