OSDN Git Service

検索結果を表示するテーブルをタブに追加できるように修正.
authorspark_xp <spark_xp@d8c9ecd3-d47d-4367-8645-de82c00e513f>
Mon, 13 Sep 2010 13:43:21 +0000 (13:43 +0000)
committerspark_xp <spark_xp@d8c9ecd3-d47d-4367-8645-de82c00e513f>
Mon, 13 Sep 2010 13:43:21 +0000 (13:43 +0000)
結果を定期的に更新する機能はまだ付けていない.

git-svn-id: http://svn.sourceforge.jp/svnroot/nt-manager/NishioTweetManager/trunk@18 d8c9ecd3-d47d-4367-8645-de82c00e513f

src/twitter/gui/action/TweetMainAction.java
src/twitter/gui/component/TweetTabbedTable.java
src/twitter/gui/form/NishioTweetManager.java

index dc7b038..280d5ba 100644 (file)
@@ -15,6 +15,7 @@ import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.net.URL;
 import java.net.URLEncoder;
+import java.text.DateFormat;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
@@ -26,6 +27,7 @@ import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import javax.swing.ImageIcon;
 
 import javax.swing.JEditorPane;
 import javax.swing.JFrame;
@@ -277,6 +279,19 @@ public class TweetMainAction {
     private TweetTableModel tweetTableModel = null;
     private int uncheckedDirectMessageCount = 0;
     private int uncheckedMentionTweetCount = 0;
+
+    //Tweetの詳細情報を表示する部分
+    private JLabel userImageLabel = null;
+    private JLabel userNameLabel = null;
+    private JLabel updateTimeLabel = null;
+    private JLabel followerLabel = null;
+    private JLabel followingLabel = null;
+    private JLabel locationLabel = null;
+    private JEditorPane clientNameLabel = null;
+    private JLabel updateLabel = null;
+    private JEditorPane userIntroBox = null;
+    private JEditorPane userWebBox = null;
+
     // 新しく取得したtweetでまだ参照していない数
     private int uncheckedTimelineTweetCount = 0;
     private AboutDialog aboutDialog = null;
@@ -287,17 +302,61 @@ public class TweetMainAction {
 
     /**
      *
+     * @param mainFrame
+     * @param tweetManager
      * @param statusBarLabel
+     * @param tweetTableModel
+     * @param mentionTableModel
+     * @param directMessageTableModel
+     * @param sendDirectMessageTableModel
+     * @param mainTweetTable
+     * @param mentionTable
+     * @param directMessageTable
+     * @param sendDirectMessageTable
+     * @param tweetBoxPane
+     * @param tweetBoxScrollPane
+     * @param tweetMessageCountLabel
+     * @param detailInfoPanel
+     * @param tweetMainTab
+     * @param tweetMessageBox
+     * @param userImageLabel
+     * @param userNameLabel
+     * @param updateTimeLabel
+     * @param followerLabel
+     * @param followingLabel
+     * @param locationLabel
+     * @param clientNameLabel
+     * @param updateLabel
+     * @param userIntroBox
+     * @param userWebBox
      */
-    public TweetMainAction(JFrame mainFrame, TweetManager tweetManager,
-            JLabel statusBarLabel, TweetTableModel tweetTableModel,
+    public TweetMainAction(JFrame mainFrame,
+            TweetManager tweetManager,
+            JLabel statusBarLabel,
+            TweetTableModel tweetTableModel,
             TweetTableModel mentionTableModel,
             TweetTableModel directMessageTableModel,
-            TweetTableModel sendDirectMessageTableModel, JTable mainTweetTable,
-            JTable mentionTable, JTable directMessageTable,
-            JTable sendDirectMessageTable, JTextPane tweetBoxPane, JScrollPane tweetBoxScrollPane,
-            JLabel tweetMessageCountLabel, JPanel detailInfoPanel,
-            JTabbedPane tweetMainTab, JEditorPane tweetMessageBox) {
+            TweetTableModel sendDirectMessageTableModel,
+            JTable mainTweetTable,
+            JTable mentionTable,
+            JTable directMessageTable,
+            JTable sendDirectMessageTable,
+            JTextPane tweetBoxPane,
+            JScrollPane tweetBoxScrollPane,
+            JLabel tweetMessageCountLabel,
+            JPanel detailInfoPanel,
+            JTabbedPane tweetMainTab,
+            JEditorPane tweetMessageBox,
+            JLabel userImageLabel,
+            JLabel userNameLabel,
+            JLabel updateTimeLabel,
+            JLabel followerLabel,
+            JLabel followingLabel,
+            JLabel locationLabel,
+            JEditorPane clientNameLabel,
+            JLabel updateLabel,
+            JEditorPane userIntroBox,
+            JEditorPane userWebBox) {
         this.mainFrame = mainFrame;
         this.tweetManager = tweetManager;
         this.statusBarLabel = statusBarLabel;
@@ -316,6 +375,18 @@ public class TweetMainAction {
         this.tweetMessageBox = tweetMessageBox;
         this.tweetBoxScrollPane = tweetBoxScrollPane;
 
+        //詳細情報部分
+        this.userImageLabel = userImageLabel;
+        this.userNameLabel = userNameLabel;
+        this.updateTimeLabel = updateTimeLabel;
+        this.userIntroBox = userIntroBox;
+        this.followerLabel = followerLabel;
+        this.followingLabel = followingLabel;
+        this.locationLabel = locationLabel;
+        this.userWebBox = userWebBox;
+        this.clientNameLabel = clientNameLabel;
+        this.updateLabel = updateLabel;
+
         // 設定ファイルの読み込み
         try {
             loadProperties();
@@ -891,6 +962,63 @@ public class TweetMainAction {
         return directMessageDialog;
     }
 
+    /**
+     * テーブルで選択したツイートを詳細情報としてセット
+     * @param table
+     */
+    public void setDetailInformationFromTable(JTable table) {
+        int sc = table.getSelectedRowCount();
+        String infoMessage = "";
+
+        if (sc == 1) {
+            Status st = getTweetTableInformation(table, table.getModel());
+            infoMessage = st.getText();
+            // tweetMessageBox内のURLをhtmlリンクへ変換
+            infoMessage = actionReplaceTweetMessageBoxURLLink(infoMessage);
+            // @ユーザ情報をhtmlリンクへ変換
+            infoMessage = actionReplaceTweetMessageBoxUserInfo(infoMessage);
+            // #ハッシュタグ情報をhtmlリンクへ変換
+            infoMessage = actionReplaceTweetMessageBoxHashTab(infoMessage);
+            // 詳細情報にテーブルで選択した人のツイート情報を表示
+            tweetMessageBox.setText(infoMessage);
+            // user icon
+            userImageLabel.setIcon(new ImageIcon(st.getUser().getProfileImageURL()));
+            // user name and id
+            userNameLabel.setText(st.getUser().getName()
+                    + " / " + st.getUser().getScreenName());
+            // update Time
+            updateTimeLabel.setText(DateFormat.getInstance().format( st.getCreatedAt() ));
+            // ユーザ自己紹介文
+            userIntroBox.setText(st.getUser().getDescription());
+            // フォローされている数
+            followerLabel.setText(st.getUser().getFollowersCount()
+                    + "");
+            // フォローしている数
+            followingLabel.setText(st.getUser().getFriendsCount()
+                    + "");
+            // 現在地
+            locationLabel.setText(st.getUser().getLocation());
+            // Web
+            if (st.getUser().getURL() != null) {
+                userWebBox.setText("<a href=\""
+                        + st.getUser().getURL() + "\">"
+                        + st.getUser().getScreenName()
+                        + "のWebを開く" + "</a>");
+            } else {
+                userWebBox.setText("");
+            }
+            // client
+            clientNameLabel.setText(" via " + st.getSource());
+            // Update
+            updateLabel.setText(st.getUser().getStatusesCount()
+                    + "");
+        }
+    }
+
+    /**
+     *
+     * @return
+     */
     public AboutDialog getAboutDialog() {
         if (aboutDialog == null) {
             aboutDialog = new AboutDialog(mainFrame, true);
index 56553a9..38dd31d 100644 (file)
@@ -6,6 +6,8 @@
 package twitter.gui.component;
 
 import java.awt.Color;
+import java.awt.Point;
+import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.List;
 import javax.swing.JMenuItem;
@@ -13,7 +15,11 @@ import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.JTabbedPane;
 import javax.swing.JTable;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
 import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
 import twitter.action.TweetGetter;
 import twitter.gui.action.TweetMainAction;
 import twitter.manage.TweetManager;
@@ -85,7 +91,7 @@ public class TweetTabbedTable {
         model = new TweetTableModel();
         uncheckedTweet = 0;
         scrollPane = new JScrollPane();
-        
+
         //テーブルをタブに追加
         table.setModel(model);
         table.getTableHeader().setReorderingAllowed(false);
@@ -100,6 +106,9 @@ public class TweetTabbedTable {
             }
         });
 
+        //tweetを表示するテーブルを作成
+        createTweetTable(table);
+
         //スクロールペーン追加
         scrollPane.setViewportView(table);
         //タブにテーブル追加
@@ -107,6 +116,74 @@ public class TweetTabbedTable {
     }
 
     /**
+     * Tweetを表示するテーブルを作成
+     *
+     * @param model
+     * @return
+     */
+    private void createTweetTable(final JTable table) {
+
+        table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
+        table.setShowVerticalLines(false);
+        table.setShowHorizontalLines(true);
+
+        // Comment部分のColumnを複数行コメントが表示できるようにする
+        TableColumnModel mdl = table.getColumnModel();
+        TableColumn col = mdl.getColumn(1);
+        TweetCommentRenderer commentRenderer = new TweetCommentRenderer();
+        col.setCellRenderer(commentRenderer);
+        // INfo部分のColumnを複数行表示できるように
+        TweetCommentRenderer infoRenderer = new TweetCommentRenderer();
+        col = mdl.getColumn(2);
+        col.setCellRenderer(infoRenderer);
+        col.setMaxWidth(200);
+        col.setMinWidth(150);
+        // TODO:とりあえず幅指定した部分
+        // あとでファイルに幅情報などを保存しておき,それを読み込んで設定するような仕様に変更する
+        // ユーザImageを表示する部分
+        col = mdl.getColumn(0);
+        col.setCellRenderer(new UserImageRenderer());
+        col.setMinWidth(50);
+        col.setMaxWidth(50);
+        // 選択したセルの情報をDetailInfoへと表示
+        table.getSelectionModel().addListSelectionListener(
+                new ListSelectionListener() {
+
+                    @Override
+                    public void valueChanged(ListSelectionEvent e) {
+
+                        if (e.getValueIsAdjusting()) {
+                            return;
+                        }
+
+                        //テーブルで選択した要素を詳細情報として表示
+                        mainAction.setDetailInformationFromTable(table);
+                    }
+                });
+        // JTableを右クリックでも選択できるようにする
+        // また,同じ行を2回クリックできるようにする
+        table.addMouseListener(new MouseAdapter() {
+
+            @Override
+            public void mousePressed(MouseEvent e) {
+                // いったんSelectしていた情報を削除
+                table.clearSelection();
+                // if (e.getButton() == MouseEvent.BUTTON3) {
+                Point p = e.getPoint();
+                int col = table.columnAtPoint(p);
+                int row = table.rowAtPoint(p);
+                table.changeSelection(row, col, false, false);
+                // }
+            }
+        });
+        // MouseEventを追加
+        table.addMouseListener(commentRenderer);
+        table.addMouseMotionListener(commentRenderer);
+        table.addMouseListener(infoRenderer);
+        table.addMouseMotionListener(infoRenderer);
+    }
+
+    /**
      * テーブル情報更新
      */
     public void updateTweetTable() {
@@ -160,6 +237,7 @@ public class TweetTabbedTable {
     private void jTableMousePressed(java.awt.event.MouseEvent evt) {
         //右クリックメニュー表示
         showPopup(evt);
+        //TODO: ここを修正
         mainAction.actionResetUncheckedTimelineTweetCount();
     }
 
index d43fc1a..f001522 100644 (file)
@@ -776,7 +776,9 @@ public class NishioTweetManager extends javax.swing.JFrame {
         mainAction = new TweetMainAction(this, tweetManager, statusBar,
                 tweetTableModel, mentionTableModel, messageTableModel,
                 sendMessageTableModel, jTable, jTable1, jTable2, jTable3,
-                jTextPane, jScrollPane9, tweetLengthLabel, jPanel1, jTabbedPane1, tweetMessageBox);
+                jTextPane, jScrollPane9, tweetLengthLabel, jPanel1, jTabbedPane1, tweetMessageBox, userImageLabel,
+                userNameLabel, updateTimeLabel, followerLabel, followingLabel, locationLabel,
+                clientNameLabel, updateLabel, userIntroBox, userWebBox);
         // 自動更新開始
         mainAction.startTweetAutoUpdate();
         //もしログインに失敗したら,アカウント設定画面を出す
@@ -831,62 +833,8 @@ public class NishioTweetManager extends javax.swing.JFrame {
                             return;
                         }
 
-                        int sc = table.getSelectedRowCount();
-                        String infoMessage = "";
-                        if (sc == 1) {
-                            Status st = mainAction.getTweetTableInformation(
-                                    table, table.getModel());
-                            infoMessage = st.getText();
-                            // tweetMessageBox内のURLをhtmlリンクへ変換
-                            infoMessage = mainAction.actionReplaceTweetMessageBoxURLLink(infoMessage);
-                            // @ユーザ情報をhtmlリンクへ変換
-                            infoMessage = mainAction.actionReplaceTweetMessageBoxUserInfo(infoMessage);
-                            // #ハッシュタグ情報をhtmlリンクへ変換
-                            infoMessage = mainAction.actionReplaceTweetMessageBoxHashTab(infoMessage);
-                            // 詳細情報にテーブルで選択した人のツイート情報を表示
-                            tweetMessageBox.setText(infoMessage);
-                            // user icon
-                            userImageLabel.setIcon(new ImageIcon(st.getUser().getProfileImageURL()));
-                            // user name and id
-                            userNameLabel.setText(st.getUser().getName()
-                                    + " / " + st.getUser().getScreenName());
-                            // update Time
-                            updateTimeLabel.setText(st.getCreatedAt().toLocaleString());
-                            // ユーザのバックグラウンドイメージを取得
-                                                       /*
-                             * ImagePanel imagePanel = null; if( jContentPane
-                             * instanceof ImagePanel ) { imagePanel =
-                             * (ImagePanel)jContentPane; try { URL url = new URL
-                             * ( st.getUser().getProfileBackgroundImageUrl() );
-                             * imagePanel.setImage( new ImageIcon( url
-                             * ).getImage() ); } catch (MalformedURLException
-                             * e1) { e1.printStackTrace(); } }
-                             */
-                            // ユーザ自己紹介文
-                            userIntroBox.setText(st.getUser().getDescription());
-                            // フォローされている数
-                            followerLabel.setText(st.getUser().getFollowersCount()
-                                    + "");
-                            // フォローしている数
-                            followingLabel.setText(st.getUser().getFriendsCount()
-                                    + "");
-                            // 現在地
-                            locationLabel.setText(st.getUser().getLocation());
-                            // Web
-                            if (st.getUser().getURL() != null) {
-                                userWebBox.setText("<a href=\""
-                                        + st.getUser().getURL() + "\">"
-                                        + st.getUser().getScreenName()
-                                        + "のWebを開く" + "</a>");
-                            } else {
-                                userWebBox.setText("");
-                            }
-                            // client
-                            clientNameLabel.setText(" via " + st.getSource());
-                            // Update
-                            updateLabel.setText(st.getUser().getStatusesCount()
-                                    + "");
-                        }
+                        //テーブルで選択した要素を詳細情報として表示
+                        mainAction.setDetailInformationFromTable(table);
                     }
                 });
         // JTableを右クリックでも選択できるようにする