OSDN Git Service

テーブルの高さ調節が正しく行われていない問題を解決 #26180
[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
241                 // まだチェックしていないtweetの数をタブにも表示
242                 if (this.getUncheckedTweet() > 0) {
243                         tabbedPane.setTitleAt(this.getTabSetNum(),
244                                         this.title + "(" + this.getUncheckedTweet() + ")");
245                 }
246                 // ツイートをテーブルに追加
247                 this.getModel().insertTweet(tweet);
248                 // テーブルの高さを整える
249                 int tableHeight = mainAction.getTableElementHeight();
250                 for (int i = 0; i < tweet.size(); i++) {
251                         this.getTable().setRowHeight(i, tableHeight);
252                 }
253                 /*
254                  * for (Status t : tweet) { this.getModel().insertTweet(t);
255                  * this.getTable().setRowHeight(0, getTableElementHeight()); }
256                  */
257                 // 新規した部分の背景色を変更
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);
263                         } else {
264                                 ((TweetCommentRenderer) renderer).updateNewCellRow(-1,
265                                                 newTableColor);
266                         }
267                 }
268                 // 古いデータを削除
269                 getModel().removeOldTweet(getTableElementMaxSize());
270                 // 時間情報リフレッシュ
271                 getModel().refreshTime();
272                 // 新しい情報
273                 int newNum = 0;
274                 if (tweet != null) {
275                         newNum = tweet.size();
276                 }
277                 // 情報間隔毎に設定を保存
278                 try {
279                         this.mainAction.saveProperties();
280                 } catch (IOException e) {
281                         // TODO 自動生成された catch ブロック
282                         e.printStackTrace();
283                 }
284
285                 return newNum;
286         }
287
288         /**
289          * マウスクリック時の動作
290          *
291          * @param evt
292          */
293         private void jTableMousePressed(java.awt.event.MouseEvent evt) {
294                 // 右クリックメニュー表示
295                 showPopup(evt);
296                 // 未読ツイート分を0にする
297                 this.setUncheckedTweet(0);
298                 this.setTitle(this.getTitle());
299         }
300
301         /**
302          * マウスリリース時の動作
303          *
304          * @param evt
305          */
306         private void jTableMouseReleased(java.awt.event.MouseEvent evt) {
307                 // 右クリックメニュー表示
308                 showPopup(evt);
309         }
310
311         /**
312          * ポップアップメニューを作成
313          *
314          * @param e
315          */
316         private void showPopup(MouseEvent e) {
317                 if (e.isPopupTrigger()) {
318                         // 右クリックのメニューを表示
319                         getRightClickPopup().show(e.getComponent(), e.getX(), e.getY());
320                 }
321         }
322
323         /**
324          * 右クリックを押した時のポップアップメニューを取得
325          *
326          * @return
327          */
328         private JPopupMenu getRightClickPopup() {
329                 // if (rightClickPopup == null) {
330                 JPopupMenu rightClickPopup = new JPopupMenu();
331
332                 JMenuItem replyMenuItem = new JMenuItem("この発言に返信(Reply)");
333                 replyMenuItem.setMnemonic('R');
334                 replyMenuItem.addActionListener(new java.awt.event.ActionListener() {
335
336                         public void actionPerformed(java.awt.event.ActionEvent e) {
337                                 // 選択したセルのステータスにreply
338                                 mainAction.actionSetReplyStatusToTweetBoxPane();
339                         }
340                 });
341
342                 JMenuItem replyAllMenuItem = new JMenuItem("この発言に返信(Reply All)");
343                 replyAllMenuItem.setMnemonic('A');
344                 replyAllMenuItem.addActionListener(new java.awt.event.ActionListener() {
345
346                         public void actionPerformed(java.awt.event.ActionEvent e) {
347                                 // 選択したセルのステータスにreply all
348                                 mainAction.actionSetReplyAllStatusToTweetBoxPane();
349                         }
350                 });
351
352                 JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート(RT)");
353                 retweetMenuItem.setMnemonic('R');
354                 retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
355
356                         @Override
357                         public void actionPerformed(java.awt.event.ActionEvent e) {
358                                 // 選択したセルのステータスをRetweet
359                                 mainAction.actionRetweet();
360                         }
361                 });
362
363                 JMenuItem quoteMenuItem = new JMenuItem("発言を引用ツイート(QT)");
364                 quoteMenuItem.setMnemonic('Q');
365                 quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
366
367                         @Override
368                         public void actionPerformed(java.awt.event.ActionEvent e) {
369                                 // 選択したセルのステータスをQT
370                                 mainAction.actionSetQuoteStatusToTweetBoxPane();
371                         }
372                 });
373
374                 JMenuItem unofficialRetweetMenuItem = new JMenuItem(
375                                 "発言をコメント付きリツイート(非公式RT)");
376                 unofficialRetweetMenuItem.setMnemonic('T');
377                 unofficialRetweetMenuItem
378                                 .addActionListener(new java.awt.event.ActionListener() {
379
380                                         @Override
381                                         public void actionPerformed(java.awt.event.ActionEvent e) {
382                                                 // 選択したセルのステータスをコメント付Retweet
383                                                 mainAction.actionCopySelectedStatusToTweetBoxPane();
384                                         }
385                                 });
386
387                 JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信(D)");
388                 directMessageMenuItem.setMnemonic('D');
389                 directMessageMenuItem
390                                 .addActionListener(new java.awt.event.ActionListener() {
391
392                                         @Override
393                                         public void actionPerformed(java.awt.event.ActionEvent e) {
394                                                 // ダイレクトメッセージ送信ダイアログを表示
395                                                 mainAction.actionShowDirectMessageDialog();
396                                         }
397                                 });
398
399                 JMenuItem statusBrowserMenuItem = new JMenuItem("この発言をブラウザで開く(O)");
400                 statusBrowserMenuItem.setMnemonic('O');
401                 statusBrowserMenuItem
402                                 .addActionListener(new java.awt.event.ActionListener() {
403
404                                         @Override
405                                         public void actionPerformed(java.awt.event.ActionEvent e) {
406                                                 // 選択したセルのステータスをブラウザで開く
407                                                 mainAction.actionOpenStatusURL();
408                                         }
409                                 });
410
411                 JMenuItem userMenuItem = new JMenuItem("この人の発言を別タブで開く(U)");
412                 userMenuItem.setMnemonic('U');
413                 userMenuItem.addActionListener(new java.awt.event.ActionListener() {
414
415                         @Override
416                         public void actionPerformed(java.awt.event.ActionEvent e) {
417                                 // 指定した人の発言を開く
418                                 mainAction.actionSelectedUserTimeline();
419                         }
420                 });
421
422                 JMenuItem createFavMenuItem = new JMenuItem("この発言をお気に入りに追加(F)");
423                 createFavMenuItem.setMnemonic('F');
424                 createFavMenuItem
425                                 .addActionListener(new java.awt.event.ActionListener() {
426
427                                         @Override
428                                         public void actionPerformed(java.awt.event.ActionEvent e) {
429                                                 // 選択したセルのユーザ情報をブラウザで開く
430                                                 mainAction.actionCreateFavorite();
431                                         }
432                                 });
433
434                 JMenuItem destroyFavMenuItem = new JMenuItem("この発言をお気に入りから削除");
435                 destroyFavMenuItem
436                                 .addActionListener(new java.awt.event.ActionListener() {
437
438                                         @Override
439                                         public void actionPerformed(java.awt.event.ActionEvent e) {
440                                                 // 選択したセルのユーザ情報をブラウザで開く
441                                                 mainAction.actionDestroyFavorite();
442                                         }
443                                 });
444
445                 JMenuItem createdListMenuItem = new JMenuItem("このユーザが作成したリスト一覧");
446                 createdListMenuItem
447                                 .addActionListener(new java.awt.event.ActionListener() {
448
449                                         @Override
450                                         public void actionPerformed(java.awt.event.ActionEvent e) {
451                                                 // 選択したセルのユーザ情報をブラウザで開く
452                                                 mainAction
453                                                                 .actionShowSelectedUserList(ListGetterSelection.CREATED);
454                                         }
455                                 });
456
457                 JMenuItem subscriptionListMenuItem = new JMenuItem("このユーザが購読しているリスト一覧");
458                 subscriptionListMenuItem
459                                 .addActionListener(new java.awt.event.ActionListener() {
460
461                                         @Override
462                                         public void actionPerformed(java.awt.event.ActionEvent e) {
463                                                 // 選択したセルのユーザ情報をブラウザで開く
464                                                 mainAction
465                                                                 .actionShowSelectedUserList(ListGetterSelection.SUBSCRIPTION);
466                                         }
467                                 });
468
469                 JMenuItem membershipsListMenuItem = new JMenuItem(
470                                 "このユーザがフォローされているリスト一覧");
471                 membershipsListMenuItem
472                                 .addActionListener(new java.awt.event.ActionListener() {
473
474                                         @Override
475                                         public void actionPerformed(java.awt.event.ActionEvent e) {
476                                                 // 選択したセルのユーザ情報をブラウザで開く
477                                                 mainAction
478                                                                 .actionShowSelectedUserList(ListGetterSelection.MEMBERSHIPS);
479                                         }
480                                 });
481
482                 JMenuItem followingUserMenuItem = new JMenuItem("このユーザがフォローしているユーザ一覧");
483                 followingUserMenuItem
484                                 .addActionListener(new java.awt.event.ActionListener() {
485
486                                         @Override
487                                         public void actionPerformed(java.awt.event.ActionEvent e) {
488                                                 // 選択したセルのユーザ情報をブラウザで開く
489                                                 mainAction.actionOpenFollowing();
490                                         }
491                                 });
492
493                 JMenuItem followerUserMenuItem = new JMenuItem("このユーザがフォローされているユーザ一覧");
494                 followerUserMenuItem
495                                 .addActionListener(new java.awt.event.ActionListener() {
496
497                                         @Override
498                                         public void actionPerformed(java.awt.event.ActionEvent e) {
499                                                 // 選択したセルのユーザ情報をブラウザで開く
500                                                 mainAction.actionOpenFollower();
501                                         }
502                                 });
503
504                 // 指定した発言がRTかどうか判定
505                 int sc = table.getSelectedRowCount();
506                 if (sc == 1 && table != null) {
507                         Status st = mainAction.getTweetTableInformation(table,
508                                         table.getModel());
509
510                         JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
511                                         "この人の発言をブラウザで開く(B)");
512                         openBrowserUserInformationMenuItem.setMnemonic('B');
513                         openBrowserUserInformationMenuItem
514                                         .addActionListener(new java.awt.event.ActionListener() {
515
516                                                 @Override
517                                                 public void actionPerformed(java.awt.event.ActionEvent e) {
518                                                         // 選択したセルのユーザ情報をブラウザで開く
519                                                         mainAction.actionOpenUserURL();
520                                                 }
521                                         });
522
523                         JMenuItem openFavMenuItem = new JMenuItem("この人のお気に入りを開く");
524                         openFavMenuItem
525                                         .addActionListener(new java.awt.event.ActionListener() {
526
527                                                 @Override
528                                                 public void actionPerformed(java.awt.event.ActionEvent e) {
529                                                         // 選択したセルのユーザ情報をブラウザで開く
530                                                         mainAction.actionOpenUserFav();
531                                                 }
532                                         });
533
534                         // メニューアイテムを追加
535                         // 返信
536                         rightClickPopup.add(replyMenuItem);
537                         // 返信all
538                         rightClickPopup.add(replyAllMenuItem);
539                         // 公式RT
540                         rightClickPopup.add(retweetMenuItem);
541                         // 非公式RT
542                         rightClickPopup.add(unofficialRetweetMenuItem);
543                         // QT
544                         rightClickPopup.add(quoteMenuItem);
545                         // ダイレクトメッセージ
546                         rightClickPopup.add(directMessageMenuItem);
547                         // 発言をブラウザで開く
548                         rightClickPopup.add(statusBrowserMenuItem);
549                         // この人の発言を別タブで開く
550                         rightClickPopup.add(userMenuItem);
551                         // この人のtimelineを開く
552                         rightClickPopup.add(openBrowserUserInformationMenuItem);
553                         // この人のfavを開く
554                         rightClickPopup.add(openFavMenuItem);
555                         // この人のfollowing開く
556                         rightClickPopup.add(followingUserMenuItem);
557                         // この人のfollower開く
558                         rightClickPopup.add(followerUserMenuItem);
559                         // この人が作成したリスト
560                         rightClickPopup.add(createdListMenuItem);
561                         // この人が購読しているリスト
562                         rightClickPopup.add(subscriptionListMenuItem);
563                         // この人がフォローされているリスト一覧
564                         rightClickPopup.add(membershipsListMenuItem);
565
566                         try {
567                                 if (st.isRetweet()) {
568                                         // Retweetのときのみ表示するメニュー
569                                 }
570                                 if (st.isFavorited()) {
571                                         // お気に入りに追加されている時のみ表示するメニュー
572                                         // お気に入り追加
573                                         rightClickPopup.add(destroyFavMenuItem);
574                                 } else {
575                                         rightClickPopup.add(createFavMenuItem);
576                                 }
577                         } catch (Exception e) {
578                                 // TODO:ここの無視部分をなんとかする
579                                 // DMのときはisFavoritedができない
580                         }
581                 }
582                 // }
583                 return rightClickPopup;
584         }
585
586         /**
587          * tweetGetterを取得します。
588          * @return tweetGetter
589          */
590         public TweetGetter getTweetGetter() {
591             return tweetGetter;
592         }
593
594         /**
595          * tweetGetterを設定します。
596          * @param tweetGetter tweetGetter
597          */
598         public void setTweetGetter(TweetGetter tweetGetter) {
599             this.tweetGetter = tweetGetter;
600         }
601
602         /**
603          * @return the title
604          */
605         public String getTitle() {
606                 return title;
607         }
608
609         /**
610          * @param title
611          *            the title to set
612          */
613         public void setTitle(String title) {
614                 this.title = title;
615                 this.tabbedPane.setTitleAt(this.getTabSetNum(), title);
616         }
617
618         /**
619          * 自分自信がタブのどの場所に位置しているのかを取得
620          *
621          * @return
622          */
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) {
629                                         return i;
630                                 }
631                         }
632                 }
633                 return 0;
634         }
635
636         /**
637          * @return the tableElementMaxSize
638          */
639         public int getTableElementMaxSize() {
640                 return tableElementMaxSize;
641         }
642
643         /**
644          * @param tableElementMaxSize
645          *            the tableElementMaxSize to set
646          */
647         public void setTableElementMaxSize(int tableElementMaxSize) {
648                 this.tableElementMaxSize = tableElementMaxSize;
649         }
650
651         /**
652          * @return the model
653          */
654         public TweetTableModel getModel() {
655                 return model;
656         }
657
658         /**
659          * @param model
660          *            the model to set
661          */
662         public void setModel(TweetTableModel model) {
663                 this.model = model;
664         }
665
666         /**
667          * @return the uncheckedTweet
668          */
669         public int getUncheckedTweet() {
670                 return uncheckedTweet;
671         }
672
673         /**
674          * @param uncheckedTweet
675          *            the uncheckedTweet to set
676          */
677         public void setUncheckedTweet(int uncheckedTweet) {
678                 this.uncheckedTweet = uncheckedTweet;
679         }
680
681         /**
682          * @return the timerID
683          */
684         public String getTimerID() {
685                 return timerID;
686         }
687
688         /**
689          * @return the table
690          */
691         public JTable getTable() {
692                 return table;
693         }
694
695         /**
696          * streaming api側からupdateされるもの
697          */
698         @Override
699         public void update(Status status) {
700                 List<Status> tweet = new ArrayList<Status>();
701                 tweet.add(status);
702                 updateTable(tweet);
703         }
704
705 }