1 package twitter.gui.action;
4 import java.awt.Desktop;
5 import java.awt.Dimension;
8 import java.awt.event.ActionEvent;
10 import java.io.FileInputStream;
11 import java.io.FileNotFoundException;
12 import java.io.FileOutputStream;
13 import java.io.IOException;
14 import java.io.UnsupportedEncodingException;
17 import java.net.URLEncoder;
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.Properties;
22 import java.util.TreeSet;
23 import java.util.concurrent.Executors;
24 import java.util.concurrent.ScheduledExecutorService;
25 import java.util.concurrent.ScheduledFuture;
26 import java.util.concurrent.TimeUnit;
27 import java.util.regex.Matcher;
28 import java.util.regex.Pattern;
30 import javax.swing.JEditorPane;
31 import javax.swing.JFrame;
32 import javax.swing.JLabel;
33 import javax.swing.JOptionPane;
34 import javax.swing.JPanel;
35 import javax.swing.JScrollPane;
36 import javax.swing.JTabbedPane;
37 import javax.swing.JTable;
38 import javax.swing.JTextPane;
39 import javax.swing.table.TableCellRenderer;
40 import javax.swing.table.TableModel;
41 import javax.swing.text.Style;
42 import javax.swing.text.StyleConstants;
43 import javax.swing.text.html.HTMLDocument;
44 import javax.swing.text.html.StyleSheet;
45 import twitter.action.TweetGetter;
46 import twitter.action.TweetSearchResultGetter;
48 import twitter.gui.component.TweetCommentRenderer;
49 import twitter.gui.component.TweetTabbedTable;
50 import twitter.gui.component.TweetTableModel;
51 import twitter.gui.form.AboutDialog;
52 import twitter.gui.form.AccountDialog;
53 import twitter.gui.form.ConfigurationDialog;
54 import twitter.gui.form.DirectMessageDialog;
55 import twitter.manage.TweetConfiguration;
56 import twitter.manage.TweetManager;
57 import twitter4j.Status;
58 import twitter4j.TwitterException;
66 public class TweetMainAction {
69 * 一定時間毎にtweet情報をアップデートするタスク
74 private class TweetAutoUpdateTask implements Runnable {
76 TweetAutoUpdateTask() {
80 // 一定時間ごとにTweet情報をアップデート
82 if (currentGetTimelinePeriodNum == 0) {
84 actionTweetTableUpdate();
86 currentGetTimelinePeriodNum = (currentGetTimelinePeriodNum + 1)
87 % getTimelinePeriodNum;
89 if (currentGetMentionPeriodNum == 0) {
91 actionMentionTableUpdate();
93 currentGetMentionPeriodNum = (currentGetMentionPeriodNum + 1)
94 % getMentionPeriodNum;
96 if (currentGetDirectMessagePeriodNum == 0) {
97 // DirectMessageテーブルの情報を更新
98 actionDirectMessageTableUpdate();
100 currentGetDirectMessagePeriodNum = (currentGetDirectMessagePeriodNum + 1)
101 % getDirectMessagePeriodNum;
103 if (currentGetSendDirectMessagePeriodNum == 0) {
104 // SendDirectMessageテーブルの情報を更新
105 actionSendDirectMessageTableUpdate();
107 currentGetSendDirectMessagePeriodNum = (currentGetSendDirectMessagePeriodNum + 1)
108 % getSendDirectMessagePeriodNum;
113 } catch (Exception e1) {
114 e1.printStackTrace();
120 * 一定時間毎にtweet情報をアップデートする
125 private class TweetAutoUpdateTimer {
127 private ScheduledFuture<?> future;
128 private final ScheduledExecutorService scheduler;
129 private final Runnable task;
130 private long time = 0;
132 public TweetAutoUpdateTimer() {
133 task = new TweetAutoUpdateTask();
134 scheduler = Executors.newSingleThreadScheduledExecutor();
140 public void reset() {
142 if (future != null) {
143 future = scheduler.scheduleAtFixedRate(task, time, time,
151 public void shutdown() {
152 scheduler.shutdown();
156 * 一定時間毎にTweetUpdateTaskを実行
161 public void start(long time) {
162 future = scheduler.scheduleAtFixedRate(task, 2, time,
171 if (future != null) {
177 public static final String BASIC_SETTING_FILENAME = TweetConfiguration.BASIC_SETTING_FILENAME;
179 private static final Pattern convURLLinkPtn = Pattern.compile(
180 "(http://|https://){1}[\\w\\.\\-/:\\#\\?\\=\\&\\;\\%\\~\\+]+",
181 Pattern.CASE_INSENSITIVE);
182 // default char encoding
183 private static final String DEFAULT_CHARACTER_ENCODING = "UTF-8";
184 // 設定ファイルを保存するディレクトリ名
185 public static final String PROPERTIES_DIRECTORY = "properties";
186 // search twitterのクエリ
187 private static final String SEARCH_QUERY = "search?q=";
188 // search twitterのURL
189 private static final String SEARCH_TWITTER_URL = "http://search.twitter.com/";
190 // Direct Messageタブに表示する文字
191 public static final String TAB_DIRECT_MESSAGE_STRING = "Message";
193 public static final String TAB_MENTION_STRING = "Mention";
195 public static final String TAB_TIMELINE_STRING = "Timeline";
196 // テーブルのデータ量が以下の値を超えたら古いデータから削除
197 private static final int TABLE_ELEMENT_MAX_SIZE = 200;
199 private static final String TWITTER_URL = "http://twitter.com/";
201 private TweetAutoUpdateTimer autoUpdateTimer = null;
203 private ConfigurationDialog configurationDialog = null;
204 private int currentGetDirectMessagePeriodNum = 0;
205 private int currentGetMentionPeriodNum = 0;
206 private int currentGetSendDirectMessagePeriodNum = 0;
207 private int currentGetTimelinePeriodNum = 0;
209 private Status currentStatus = null;
211 private JPanel detailInfoPanel = null;
212 // ダイレクトメッセージ送信用ダイアログ
213 private DirectMessageDialog directMessageDialog = null;
214 // directMessageを表示するテーブル
215 private JTable directMessageTable = null;
216 // directMessageのtweetを表示するテーブルモデル
217 private TweetTableModel directMessageTableModel = null;
219 private int updatePeriod = 1;
220 // DirectMessageの取得間隔
221 private int getDirectMessagePeriodNum = 10;
223 private int getMentionPeriodNum = 5;
224 // SendDirectMessageの取得間隔
225 private int getSendDirectMessagePeriodNum = 30;
227 private int getTimelinePeriodNum = 1;
229 private Color newTableColor = new Color(224, 255, 255);
231 private String tlFontName = "Takao Pゴシック";
233 private int tlFontSize = 13;
235 private String detailFontName = "Takao Pゴシック";
237 private int detailFontSize = 13;
239 private int tableElementHeight = 50;
241 private int mainFrameWidth = 729;
243 private int mainFrameHeight = 629;
245 private JFrame mainFrame = null;
246 // メインのtweetを表示するテーブル
247 private JTable mainTweetTable = null;
249 private JTable mentionTable = null;
250 // mentionのtweetを表示するテーブルモデル
251 private TweetTableModel mentionTableModel = null;
253 private Properties property = null;
254 // 現在テーブルで選択しているユーザ画像のURL
255 private URL selectedUserImageURL = null;
256 // 現在テーブルで選択しているユーザの名前
257 private String selectedUsername = null;
258 // sendDirectMessageを表示するテーブル
259 private JTable sendDirectMessageTable = null;
260 // sendDirectMessageのtweetを表示するテーブル
261 private TweetTableModel sendDirectMessageTableModel = null;
263 private JLabel statusBarLabel = null;
265 private JTextPane tweetBoxPane = null;
266 //自分がつぶやきを書く領域のスクロールペーン
267 private JScrollPane tweetBoxScrollPane = null;
269 private JTabbedPane tweetMainTab = null;
271 private TweetManager tweetManager = null;
272 // tweetを表示するTextPane
273 private JEditorPane tweetMessageBox = null;
274 // つぶやくことができる文字数を表示するラベル
275 private JLabel tweetMessageCountLabel = null;
276 // メインのtweetを表示するテーブルモデル
277 private TweetTableModel tweetTableModel = null;
278 private int uncheckedDirectMessageCount = 0;
279 private int uncheckedMentionTweetCount = 0;
280 // 新しく取得したtweetでまだ参照していない数
281 private int uncheckedTimelineTweetCount = 0;
282 private AboutDialog aboutDialog = null;
284 private AccountDialog accountDialog;
286 private List<TweetTabbedTable> tweetTabbedTableList = new ArrayList<TweetTabbedTable>();
290 * @param statusBarLabel
292 public TweetMainAction(JFrame mainFrame, TweetManager tweetManager,
293 JLabel statusBarLabel, TweetTableModel tweetTableModel,
294 TweetTableModel mentionTableModel,
295 TweetTableModel directMessageTableModel,
296 TweetTableModel sendDirectMessageTableModel, JTable mainTweetTable,
297 JTable mentionTable, JTable directMessageTable,
298 JTable sendDirectMessageTable, JTextPane tweetBoxPane, JScrollPane tweetBoxScrollPane,
299 JLabel tweetMessageCountLabel, JPanel detailInfoPanel,
300 JTabbedPane tweetMainTab, JEditorPane tweetMessageBox) {
301 this.mainFrame = mainFrame;
302 this.tweetManager = tweetManager;
303 this.statusBarLabel = statusBarLabel;
304 this.tweetTableModel = tweetTableModel;
305 this.mentionTableModel = mentionTableModel;
306 this.directMessageTableModel = directMessageTableModel;
307 this.sendDirectMessageTableModel = sendDirectMessageTableModel;
308 this.mainTweetTable = mainTweetTable;
309 this.mentionTable = mentionTable;
310 this.directMessageTable = directMessageTable;
311 this.sendDirectMessageTable = sendDirectMessageTable;
312 this.tweetBoxPane = tweetBoxPane;
313 this.tweetMessageCountLabel = tweetMessageCountLabel;
314 this.detailInfoPanel = detailInfoPanel;
315 this.tweetMainTab = tweetMainTab;
316 this.tweetMessageBox = tweetMessageBox;
317 this.tweetBoxScrollPane = tweetBoxScrollPane;
322 } catch (FileNotFoundException e) {
324 } catch (IOException e) {
328 updateFontInformationToComponent();
331 mainFrame.setSize(this.mainFrameWidth, this.mainFrameHeight);
332 mainFrame.setPreferredSize(new Dimension(this.mainFrameWidth, this.mainFrameHeight));
336 public void updateFontInformationToComponent() {
339 if (this.tlFontName != null) {
340 tlFont = new Font(this.tlFontName, Font.PLAIN, this.tlFontSize);
342 Font detailFont = null;
343 if (this.detailFontName != null) {
344 detailFont = new Font(this.detailFontName, Font.PLAIN,
345 this.detailFontSize);
347 this.mainTweetTable.setFont(tlFont);
348 this.mentionTable.setFont(tlFont);
349 this.directMessageTable.setFont(tlFont);
350 this.sendDirectMessageTable.setFont(tlFont);
352 // tweetメッセージボックスのフォントはhtmlレベルで変更する必要がある
353 this.tweetMessageBox.setFont(detailFont);
355 HTMLDocument doc = (HTMLDocument) this.tweetMessageBox.getDocument();
356 StyleSheet[] style = doc.getStyleSheet().getStyleSheets();
357 for (int i = style.length - 1; i >= 0; i--) {
358 Style body = style[i].getStyle("body");
360 StyleConstants.setFontFamily(body, detailFont.getFontName());
361 StyleConstants.setFontSize(body, detailFont.getSize());
365 } catch (Exception e) {
371 * ツイート検索結果を表示するタブを新しく追加
374 public void actionAddNewSearchResultTab(String searchWord) {
375 int numOfTab = this.tweetTabbedTableList.size();
377 //TODO:ここはあとで変更する必要がある.なぜなら既に追加されているタブの数は変わる可能性があるから
378 int alreadyExistTabNum = 4;
379 //指定したワードを検索してくるアクション
380 TweetGetter tweetGetter = new TweetSearchResultGetter(this.tweetManager, searchWord);
381 //検索したワードを表示するテーブルを作成,及びタブにそのテーブルを追加
382 TweetTabbedTable searchTable = new TweetTabbedTable(tweetGetter, searchWord,
383 this.tweetMainTab, numOfTab + alreadyExistTabNum,
384 this.tableElementHeight, this.tweetManager,
385 this, newTableColor, tableElementHeight);
386 searchTable.updateTweetTable();
392 public void actionBasicSettingDialog() {
393 // ダイレクトメッセージ送信用ダイアログを開く
394 Point loc = getConfigurationDialog().getLocation();
395 loc.translate(20, 20);
396 ConfigurationDialog dialog = getConfigurationDialog();
397 dialog.setLocation(loc);
398 dialog.setVisible(true);
404 public void actionCopySelectedStatusToTweetBoxPane() {
406 String username = this.currentStatus.getUser().getScreenName();
408 String message = this.currentStatus.getText();
409 this.tweetBoxPane.setText("RT: @" + username + ": " + message);
417 public void actionDetailInfoButton(ActionEvent e) {
418 if (detailInfoPanel.isVisible()) {
419 detailInfoPanel.setVisible(false);
421 detailInfoPanel.setVisible(true);
426 * 書き込みメッセージボックスの表示ONOFFボタンを押した時の動作
429 public void actionShowTweetboxButton(ActionEvent e) {
430 if( this.tweetBoxScrollPane.isVisible() ) {
431 this.tweetBoxScrollPane.setVisible(false);
433 this.tweetBoxScrollPane.setVisible(true);
438 * DirectMessageテーブルの更新
440 public void actionDirectMessageTableUpdate() {
443 int remainingHits = tweetManager.getRateLimitStatus().getRemainingHits();
444 if (remainingHits <= 0) {
445 information("API制限です.リクエストの残数が0となりました.");
452 List<Status> directMessages = tweetManager.getNewDirectMessages();
453 // まだ見ていないdirectMessage数を追加
454 uncheckedDirectMessageCount += directMessages.size();
455 // まだ見ていないmentionの数をタブに表示
456 if (uncheckedDirectMessageCount > 0) {
457 tweetMainTab.setTitleAt(2, TAB_DIRECT_MESSAGE_STRING + "("
458 + uncheckedDirectMessageCount + ")");
460 for (Status t : directMessages) {
461 directMessageTableModel.insertTweet(t);
462 directMessageTable.setRowHeight(0, tableElementHeight);
465 directMessageTableModel.removeOldTweet(TABLE_ELEMENT_MAX_SIZE);
467 directMessageTableModel.refreshTime();
468 } catch (TwitterException e1) {
469 e1.printStackTrace();
470 } catch (Exception e) {
480 public void actionExitButton(ActionEvent e) {
487 public void actionMentionTableUpdate() {
490 int remainingHits = tweetManager.getRateLimitStatus().getRemainingHits();
491 if (remainingHits <= 0) {
492 information("API制限です.リクエストの残数が0となりました.");
499 List<Status> mention = tweetManager.getNewMentionData();
500 // まだ見ていないmention数を追加
501 uncheckedMentionTweetCount += mention.size();
502 // まだ見ていないmentionの数をタブに表示
503 if (uncheckedMentionTweetCount > 0) {
504 tweetMainTab.setTitleAt(1, TAB_MENTION_STRING + "("
505 + uncheckedMentionTweetCount + ")");
507 for (Status t : mention) {
508 mentionTableModel.insertTweet(t);
509 mentionTable.setRowHeight(0, tableElementHeight);
512 TableCellRenderer renderer2 = mentionTable.getCellRenderer(0, 2);
513 if (renderer2 instanceof TweetCommentRenderer) {
514 if (this.uncheckedMentionTweetCount - 1 >= 0) {
515 ((TweetCommentRenderer) renderer2).updateNewCellRow(
516 this.uncheckedMentionTweetCount, newTableColor);
518 ((TweetCommentRenderer) renderer2).updateNewCellRow(-1,
523 mentionTableModel.removeOldTweet(TABLE_ELEMENT_MAX_SIZE);
525 mentionTableModel.refreshTime();
526 } catch (TwitterException e1) {
527 e1.printStackTrace();
534 public void actionOpenStatusURL() {
537 String userName = this.currentStatus.getUser().getScreenName();
539 long statusID = this.currentStatus.getId();
540 Desktop.getDesktop().browse(
541 new URI(TWITTER_URL + userName + "/statuses/" + statusID));
542 } catch (Exception ex) {
543 ex.printStackTrace();
544 JOptionPane.showMessageDialog(null, "エラーによりブラウザを起動できませんでした.",
545 "Error", JOptionPane.ERROR_MESSAGE);
552 public void actionOpenUserURL() {
554 String userName = this.currentStatus.getUser().getScreenName();
555 Desktop.getDesktop().browse(new URI(TWITTER_URL + userName));
556 } catch (Exception ex) {
557 ex.printStackTrace();
558 JOptionPane.showMessageDialog(null, "エラーによりブラウザを起動できませんでした.",
559 "Error", JOptionPane.ERROR_MESSAGE);
566 public void actionRefreshTime() {
567 tweetTableModel.refreshTime();
571 * TweetMessageBox内にある#ハッシュタグ の部分をa hrefリンクに変換
575 public String actionReplaceTweetMessageBoxHashTab(String message) {
577 Pattern userPtn = Pattern.compile("#[0-9A-Z_]+",
578 Pattern.CASE_INSENSITIVE);
579 Matcher matcher = userPtn.matcher(message);
581 * if( matcher.matches() ) { matcher. }
584 Set<String> findList = new TreeSet<String>();
585 while (matcher.find()) {
586 findList.add(matcher.group(0));
589 for (String f : findList) {
591 message = message.replaceAll(f, "<a href=\""
592 + SEARCH_TWITTER_URL + SEARCH_QUERY
593 + URLEncoder.encode(f, DEFAULT_CHARACTER_ENCODING)
594 + "\">" + f + "</a>");
595 } catch (UnsupportedEncodingException e) {
603 * TweetMessageBox内にあるリンクをa hrefリンクに変換
607 public String actionReplaceTweetMessageBoxURLLink(String message) {
608 Matcher matcher = convURLLinkPtn.matcher(message);
609 return matcher.replaceAll("<a href=\"$0\">$0</a>");
613 * @ユーザ名の部分をa hrefリンクに変換
616 public String actionReplaceTweetMessageBoxUserInfo(String message) {
618 Pattern userPtn = Pattern.compile("@[0-9A-Z_]+",
619 Pattern.CASE_INSENSITIVE);
620 Matcher matcher = userPtn.matcher(message);
622 Set<String> findList = new TreeSet<String>();
623 while (matcher.find()) {
624 findList.add(matcher.group(0));
626 // 指定したユーザ名をすべてリンクへ変更
627 for (String f : findList) {
628 message = message.replaceAll(f, "<a href=\"" + TWITTER_URL
629 + f.substring(1) + "\">" + f + "</a>");
635 * まだ見ていないdirectMessage数を0にする
637 public void actionResetUncheckedDirectMessageCount() {
638 uncheckedDirectMessageCount = 0;
639 tweetMainTab.setTitleAt(2, TAB_DIRECT_MESSAGE_STRING);
643 * まだ見ていないmention数を0にする
645 public void actionResetUncheckedMentionTweetCount() {
646 uncheckedMentionTweetCount = 0;
647 tweetMainTab.setTitleAt(1, TAB_MENTION_STRING);
653 public void actionResetUncheckedTimelineTweetCount() {
654 uncheckedTimelineTweetCount = 0;
655 tweetMainTab.setTitleAt(0, TAB_TIMELINE_STRING);
659 * 現在選択しているステータスを公式Retweet
661 public void actionRetweet() {
662 // 選択しているtweetのstatus id
663 long statusID = this.currentStatus.getId();
665 String username = this.currentStatus.getUser().getScreenName();
667 String message = this.currentStatus.getText();
669 if (message.length() > 30) {
670 message = message.substring(0, 30) + " ...(以下略)";
672 // Retweetしていいかどうかの確認
673 int ret = JOptionPane.showConfirmDialog(mainFrame, username + " さんの発言:"
674 + message + "\nをRetweetしますか?", "Retweetの確認",
675 JOptionPane.YES_NO_OPTION);
676 if (ret == JOptionPane.YES_OPTION) {
679 this.tweetManager.retweet(statusID);
680 } catch (TwitterException e) {
681 JOptionPane.showMessageDialog(null, "エラーによりRetweetできませんでした.",
682 "Retweet Error", JOptionPane.ERROR_MESSAGE);
692 public void updateTableHeight(int height) {
693 this.tableElementHeight = height;
694 mainTweetTable.setRowHeight(tableElementHeight);
695 mentionTable.setRowHeight(tableElementHeight);
696 directMessageTable.setRowHeight(tableElementHeight);
697 sendDirectMessageTable.setRowHeight(tableElementHeight);
701 * SendDirectMessageテーブルを更新
703 public void actionSendDirectMessageTableUpdate() {
706 int remainingHits = tweetManager.getRateLimitStatus().getRemainingHits();
707 if (remainingHits <= 0) {
708 information("API制限です.リクエストの残数が0となりました.");
713 List<Status> sendDirectMessages = tweetManager.getNewSendDirectMessages();
714 for (Status t : sendDirectMessages) {
715 sendDirectMessageTableModel.insertTweet(t);
716 sendDirectMessageTable.setRowHeight(0, tableElementHeight);
719 sendDirectMessageTableModel.removeOldTweet(TABLE_ELEMENT_MAX_SIZE);
721 sendDirectMessageTableModel.refreshTime();
722 } catch (TwitterException e1) {
723 e1.printStackTrace();
730 public void actionShowDirectMessageDialog() {
731 // ダイレクトメッセージ送信用ダイアログを開く
732 Point loc = getDirectMessageDialog().getLocation();
733 //loc.translate(20, 20);
734 DirectMessageDialog dialog = getDirectMessageDialog();
735 //dialog.setLocation(loc);
736 dialog.setLocationRelativeTo(null);
737 dialog.setVisible(true);
738 dialog.setUserInformation(this.selectedUsername,
739 this.selectedUserImageURL, this.tweetManager);
745 public void actionShowAboutDialog() {
746 Point loc = getDirectMessageDialog().getLocation();
747 //loc.translate(20, 20);
748 AboutDialog dialog = getAboutDialog();
749 dialog.setLocationRelativeTo(null);
750 //dialog.setLocation(loc);
751 dialog.setVisible(true);
757 public void actionShowAccountDialog() {
758 Point loc = getDirectMessageDialog().getLocation();
759 //loc.translate(20, 20);
760 AccountDialog dialog = getAccountDialog();
761 dialog.setLocationRelativeTo(null);
762 // dialog.setLocation(loc);
763 dialog.setVisible(true);
767 * tweetBoxPaneに書かれた文字をつぶやく
769 public void actionTweet() {
770 tweetManager.tweet(tweetBoxPane.getText());
771 tweetBoxPane.setText(""); // テキストをクリア
777 public void actionTweetTableUpdate() {
780 int remainingHits = tweetManager.getRateLimitStatus().getRemainingHits();
781 if (remainingHits <= 0) {
782 information("API制限です.リクエストの残数が0となりました.");
787 List<Status> tweet = tweetManager.getNewTimelineData();
789 uncheckedTimelineTweetCount += tweet.size();
790 // まだチェックしていないtweetの数をタブにも表示
791 if (uncheckedTimelineTweetCount > 0) {
792 tweetMainTab.setTitleAt(0, TAB_TIMELINE_STRING + "("
793 + uncheckedTimelineTweetCount + ")");
796 for (Status t : tweet) {
797 tweetTableModel.insertTweet(t);
798 mainTweetTable.setRowHeight(0, tableElementHeight);
801 TableCellRenderer renderer = mainTweetTable.getCellRenderer(0, 2);
802 if (renderer instanceof TweetCommentRenderer) {
803 if (this.uncheckedTimelineTweetCount - 1 >= 0) {
804 ((TweetCommentRenderer) renderer).updateNewCellRow(
805 this.uncheckedTimelineTweetCount, newTableColor);
807 ((TweetCommentRenderer) renderer).updateNewCellRow(-1,
812 tweetTableModel.removeOldTweet(TABLE_ELEMENT_MAX_SIZE);
814 // 取得したコメント数をステータスバーに表示
815 information(uncheckedTimelineTweetCount
816 + " 件の新しいツイートを取得しました. (APIリクエスト残数は" + remainingHits
819 tweetTableModel.refreshTime();
820 } catch (TwitterException e1) {
821 e1.printStackTrace();
830 public void actionUpdateButton(java.awt.event.ActionEvent e) {
833 actionTweetTableUpdate();
835 actionMentionTableUpdate();
836 // DirectMessageテーブルの情報を更新
837 actionDirectMessageTableUpdate();
838 // SendDirectMessageテーブルの情報を更新
839 actionSendDirectMessageTableUpdate();
840 } catch (Exception e1) {
841 e1.printStackTrace();
850 public void actionUpdateTweetMessageCount() {
851 int len = 140 - (tweetBoxPane.getText().length());
855 tweetMessageCountLabel.setText(len + "");
863 public ConfigurationDialog getConfigurationDialog() {
864 if (configurationDialog == null) {
865 configurationDialog = new ConfigurationDialog(mainFrame, this);
867 return configurationDialog;
874 public AccountDialog getAccountDialog() {
875 if( accountDialog == null ) {
876 accountDialog = new AccountDialog(mainFrame, true, tweetManager, this);
878 return accountDialog;
882 * ダイレクトメッセージ送信用ダイアログを取得
886 public DirectMessageDialog getDirectMessageDialog() {
887 if (directMessageDialog == null) {
888 directMessageDialog = new DirectMessageDialog(mainFrame);
889 directMessageDialog.setTitle("ダイレクトメッセージを送信");
891 return directMessageDialog;
894 public AboutDialog getAboutDialog() {
895 if (aboutDialog == null) {
896 aboutDialog = new AboutDialog(mainFrame, true);
902 * updatePeriodを取得します。
904 * @return updatePeriod
906 public int getUpdatePeriod() {
911 * updatePeriodを設定します。
913 * @param updatePeriod
916 public void setUpdatePeriod(int updatePeriod) {
917 this.updatePeriod = updatePeriod;
921 * getDirectMessagePeriodNumを取得します。
923 * @return getDirectMessagePeriodNum
925 public int getGetDirectMessagePeriodNum() {
926 return getDirectMessagePeriodNum;
930 * getMentionPeriodNumを取得します。
932 * @return getMentionPeriodNum
934 public int getGetMentionPeriodNum() {
935 return getMentionPeriodNum;
939 * getSendDirectMessagePeriodNumを取得します。
941 * @return getSendDirectMessagePeriodNum
943 public int getGetSendDirectMessagePeriodNum() {
944 return getSendDirectMessagePeriodNum;
948 * getTimelinePeriodNumを取得します。
950 * @return getTimelinePeriodNum
952 public int getGetTimelinePeriodNum() {
953 return getTimelinePeriodNum;
957 * テーブルで選択した場所のTweet情報を取得
961 public Status getTweetTableInformation(JTable table, TableModel model) {
962 int index = table.convertRowIndexToModel(table.getSelectedRow());
963 Status status = null;
964 if (model instanceof TweetTableModel) {
965 status = ((TweetTableModel) model).getTweetStatus(index);
966 // 現在選択したセルのユーザ名を保存しておく
967 this.selectedUsername = status.getUser().getScreenName();
968 // 現在選択したセルのユーザURLを保存しておく
969 this.selectedUserImageURL = status.getUser().getProfileImageURL();
971 this.currentStatus = status;
981 private void information(String message) {
982 statusBarLabel.setText(message);
988 * @throws IOException
989 * @throws FileNotFoundException
991 public void loadProperties() throws FileNotFoundException, IOException {
992 if (property == null) {
993 this.property = new Properties();
995 property.load(new FileInputStream("./" + PROPERTIES_DIRECTORY + "/"
996 + BASIC_SETTING_FILENAME));
998 String gtpn = this.property.getProperty("getTimelinePeriodNum");
999 String gmpn = this.property.getProperty("getMentionPeriodNum");
1000 String gdmpn = this.property.getProperty("getDirectMessagePeriodNum");
1001 String gsdmpn = this.property.getProperty("getSendDirectMessagePeriodNum");
1002 String up = this.property.getProperty("updatePeriod");
1003 String ntrgb = this.property.getProperty("newTableColorRGB");
1005 this.tlFontName = this.property.getProperty("tlFontName");
1006 this.detailFontName = this.property.getProperty("detailFontName");
1008 String tfs = this.property.getProperty("tlFontSize");
1009 String dfs = this.property.getProperty("detailFontSize");
1010 String teh = this.property.getProperty("tableElementHeight");
1013 String mfw = this.property.getProperty("mainFrameWidth");
1014 String mfh = this.property.getProperty("mainFrameHeight");
1017 this.getTimelinePeriodNum = Integer.parseInt(gtpn);
1018 this.getMentionPeriodNum = Integer.parseInt(gmpn);
1019 this.getDirectMessagePeriodNum = Integer.parseInt(gdmpn);
1020 this.getSendDirectMessagePeriodNum = Integer.parseInt(gsdmpn);
1021 this.updatePeriod = Integer.parseInt(up);
1022 this.newTableColor = new Color(Integer.parseInt(ntrgb));
1023 this.tlFontSize = Integer.parseInt(tfs);
1024 this.detailFontSize = Integer.parseInt(dfs);
1025 this.tableElementHeight = Integer.parseInt(teh);
1026 this.mainFrameWidth = Integer.parseInt(mfw);
1027 this.mainFrameHeight = Integer.parseInt(mfh);
1028 } catch (NumberFormatException e) {
1029 e.printStackTrace();
1034 * Tweet情報の自動更新のタイムをリセット
1036 public void resetTweetAutoUpdate() {
1037 if (this.autoUpdateTimer != null) {
1038 this.autoUpdateTimer.reset();
1045 * @throws IOException
1047 public void saveProperties() throws IOException {
1049 File logDir = new File("./" + PROPERTIES_DIRECTORY);
1050 if (!logDir.exists()) {
1051 // ディレクトリが存在しないので作成する
1052 if (logDir.mkdir() == false) {
1053 throw new IOException(PROPERTIES_DIRECTORY
1054 + "ディレクトリを作成できませんでした.");
1057 if (property == null) {
1058 this.property = new Properties();
1061 this.property.setProperty("getTimelinePeriodNum",
1062 this.getTimelinePeriodNum + "");
1063 this.property.setProperty("getMentionPeriodNum",
1064 this.getMentionPeriodNum + "");
1065 this.property.setProperty("getDirectMessagePeriodNum",
1066 this.getDirectMessagePeriodNum + "");
1067 this.property.setProperty("getSendDirectMessagePeriodNum",
1068 this.getSendDirectMessagePeriodNum + "");
1069 this.property.setProperty("updatePeriod", this.updatePeriod + "");
1070 this.property.setProperty("newTableColorRGB", newTableColor.getRGB()
1072 this.property.setProperty("tlFontName", this.tlFontName);
1073 this.property.setProperty("tlFontSize", this.tlFontSize + "");
1074 this.property.setProperty("detailFontName", this.detailFontName);
1075 this.property.setProperty("detailFontSize", this.detailFontSize + "");
1076 this.property.setProperty("tableElementHeight", this.tableElementHeight
1080 if( this.mainFrame.getExtendedState() == JFrame.NORMAL ) {
1081 this.mainFrameWidth = this.mainFrame.getWidth();
1082 this.mainFrameHeight = this.mainFrame.getHeight();
1084 this.property.setProperty("mainFrameWidth", this.mainFrameWidth + "");
1085 this.property.setProperty("mainFrameHeight", this.mainFrameHeight + "");
1087 property.store(new FileOutputStream("./" + PROPERTIES_DIRECTORY + "/"
1088 + BASIC_SETTING_FILENAME), null);
1092 * getDirectMessagePeriodNumを設定します。
1094 * @param getDirectMessagePeriodNum
1095 * getDirectMessagePeriodNum
1097 public void setGetDirectMessagePeriodNum(int getDirectMessagePeriodNum) {
1098 this.getDirectMessagePeriodNum = getDirectMessagePeriodNum;
1102 * getMentionPeriodNumを設定します。
1104 * @param getMentionPeriodNum
1105 * getMentionPeriodNum
1107 public void setGetMentionPeriodNum(int getMentionPeriodNum) {
1108 this.getMentionPeriodNum = getMentionPeriodNum;
1112 * getSendDirectMessagePeriodNumを設定します。
1114 * @param getSendDirectMessagePeriodNum
1115 * getSendDirectMessagePeriodNum
1117 public void setGetSendDirectMessagePeriodNum(
1118 int getSendDirectMessagePeriodNum) {
1119 this.getSendDirectMessagePeriodNum = getSendDirectMessagePeriodNum;
1123 * getTimelinePeriodNumを設定します。
1125 * @param getTimelinePeriodNum
1126 * getTimelinePeriodNum
1128 public void setGetTimelinePeriodNum(int getTimelinePeriodNum) {
1129 this.getTimelinePeriodNum = getTimelinePeriodNum;
1137 public void startTweetAutoUpdate() {
1138 if (this.autoUpdateTimer == null) {
1139 this.autoUpdateTimer = new TweetAutoUpdateTimer();
1142 this.autoUpdateTimer.stop();
1144 this.autoUpdateTimer.start(updatePeriod * 60);
1148 * newTableColorを取得します。
1150 * @return newTableColor
1152 public Color getNewTableColor() {
1153 return newTableColor;
1157 * newTableColorを設定します。
1159 * @param newTableColor
1162 public void setNewTableColor(Color newTableColor) {
1163 this.newTableColor = newTableColor;
1169 * @return tlFontName
1171 public String getTlFontName() {
1181 public void setTlFontName(String tlFontName) {
1182 this.tlFontName = tlFontName;
1188 * @return tlFontSize
1190 public int getTlFontSize() {
1200 public void setTlFontSize(int tlFontSize) {
1201 this.tlFontSize = tlFontSize;
1205 * detailFontNameを取得します。
1207 * @return detailFontName
1209 public String getDetailFontName() {
1210 return detailFontName;
1214 * detailFontNameを設定します。
1216 * @param detailFontName
1219 public void setDetailFontName(String detailFontName) {
1220 this.detailFontName = detailFontName;
1224 * detailFontSizeを取得します。
1226 * @return detailFontSize
1228 public int getDetailFontSize() {
1229 return detailFontSize;
1233 * detailFontSizeを設定します。
1235 * @param detailFontSize
1238 public void setDetailFontSize(int detailFontSize) {
1239 this.detailFontSize = detailFontSize;
1243 * tableElementHeightを取得します。
1245 * @return tableElementHeight
1247 public int getTableElementHeight() {
1248 return tableElementHeight;
1252 * tableElementHeightを設定します。
1254 * @param tableElementHeight
1255 * tableElementHeight
1257 public void setTableElementHeight(int tableElementHeight) {
1258 this.tableElementHeight = tableElementHeight;