2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
7 * NishioTweetManager.java
9 * Created on 2010/09/06, 3:32:04
11 package twitter.gui.form;
13 import java.awt.AWTException;
14 import java.awt.Image;
15 import java.awt.MenuItem;
16 import java.awt.Point;
17 import java.awt.PopupMenu;
18 import java.awt.SystemTray;
19 import java.awt.TrayIcon;
20 import java.awt.event.ActionEvent;
21 import java.awt.event.ActionListener;
22 import java.awt.event.MouseAdapter;
23 import java.awt.event.MouseEvent;
24 import java.awt.image.BufferedImage;
26 import javax.swing.ImageIcon;
27 import javax.swing.JFrame;
28 import javax.swing.JMenuItem;
29 import javax.swing.JPopupMenu;
30 import javax.swing.JTable;
31 import javax.swing.UIManager;
32 import javax.swing.WindowConstants;
33 import javax.swing.event.ListSelectionEvent;
34 import javax.swing.event.ListSelectionListener;
35 import javax.swing.table.TableColumn;
36 import javax.swing.table.TableColumnModel;
37 import javax.swing.text.Style;
38 import javax.swing.text.StyleConstants;
39 import javax.swing.text.html.HTMLDocument;
40 import javax.swing.text.html.StyleSheet;
41 import twitter.gui.action.TweetMainAction;
42 import twitter.gui.component.TweetCommentRenderer;
43 import twitter.gui.component.TweetHyperlinkHandler;
44 import twitter.gui.component.TweetTableModel;
45 import twitter.gui.component.UserImageRenderer;
46 import twitter.manage.TweetManager;
47 import twitter4j.Status;
53 public class NishioTweetManager extends javax.swing.JFrame {
55 private SystemTray systemTray;
56 private TrayIcon trayIcon;
58 /** Creates new form NishioTweetManager */
59 public NishioTweetManager() {
70 private void initComponents2() {
74 /*URL resource = getClass().getResource("icon.png");
75 image = new ImageIcon(resource).getImage();*/
76 image = new ImageIcon("resources/icon.png").getImage();
78 this.setIconImage(image);
79 } catch (Exception e) {
81 image = new BufferedImage(32, 32, BufferedImage.TYPE_INT_RGB);
84 systemTray = SystemTray.getSystemTray();
85 final JFrame frame = this;
86 final PopupMenu popup = new PopupMenu();
87 trayIcon = new TrayIcon(image, "Nishio Tweet Manager", popup);
89 //左クリックした時に「画面を開く」アクションをする
90 trayIcon.addMouseListener(new MouseAdapter() {
93 public void mousePressed(MouseEvent me) {
95 if (me.getButton() == MouseEvent.BUTTON1) {
96 frame.setVisible(true);
102 MenuItem item1 = new MenuItem("画面を開く");
103 item1.addActionListener(new ActionListener() {
105 public void actionPerformed(ActionEvent e) {
106 frame.setVisible(true);
109 MenuItem item2 = new MenuItem("終了");
110 item2.addActionListener(new ActionListener() {
112 public void actionPerformed(ActionEvent e) {
113 systemTray.remove(trayIcon);
114 frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
123 systemTray.add(trayIcon);
124 } catch (AWTException e) {
129 /** This method is called from within the constructor to
130 * initialize the form.
131 * WARNING: Do NOT modify this code. The content of this method is
132 * always regenerated by the Form Editor.
134 @SuppressWarnings("unchecked")
135 // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
136 private void initComponents() {
138 jTabbedPane1 = new javax.swing.JTabbedPane();
139 jScrollPane1 = new javax.swing.JScrollPane();
140 jTable = new javax.swing.JTable();
141 jScrollPane2 = new javax.swing.JScrollPane();
142 jTable1 = new javax.swing.JTable();
143 jScrollPane3 = new javax.swing.JScrollPane();
144 jTable2 = new javax.swing.JTable();
145 jScrollPane4 = new javax.swing.JScrollPane();
146 jTable3 = new javax.swing.JTable();
147 jPanel1 = new javax.swing.JPanel();
148 userImageLabel = new javax.swing.JLabel();
149 jScrollPane5 = new javax.swing.JScrollPane();
150 tweetMessageBox = new javax.swing.JEditorPane();
151 jLabel3 = new javax.swing.JLabel();
152 jLabel4 = new javax.swing.JLabel();
153 jLabel5 = new javax.swing.JLabel();
154 userNameLabel = new javax.swing.JLabel();
155 updateTimeLabel = new javax.swing.JLabel();
156 locationLabel = new javax.swing.JLabel();
157 jLabel9 = new javax.swing.JLabel();
158 followingLabel = new javax.swing.JLabel();
159 followerLabel = new javax.swing.JLabel();
160 jLabel12 = new javax.swing.JLabel();
161 jLabel13 = new javax.swing.JLabel();
162 updateLabel = new javax.swing.JLabel();
163 jScrollPane6 = new javax.swing.JScrollPane();
164 userIntroBox = new javax.swing.JEditorPane();
165 jScrollPane7 = new javax.swing.JScrollPane();
166 userWebBox = new javax.swing.JEditorPane();
167 jScrollPane8 = new javax.swing.JScrollPane();
168 clientNameLabel = new javax.swing.JEditorPane();
169 jButton1 = new javax.swing.JButton();
170 jButton2 = new javax.swing.JButton();
171 jScrollPane9 = new javax.swing.JScrollPane();
172 jTextPane = new javax.swing.JTextPane();
173 jLabel15 = new javax.swing.JLabel();
174 tweetLengthLabel = new javax.swing.JLabel();
175 jButton4 = new javax.swing.JButton();
176 jToggleButton1 = new javax.swing.JToggleButton();
177 statusBar = new javax.swing.JLabel();
178 jToggleButton2 = new javax.swing.JToggleButton();
179 jMenuBar1 = new javax.swing.JMenuBar();
180 jMenu1 = new javax.swing.JMenu();
181 jMenuItem1 = new javax.swing.JMenuItem();
182 jMenu4 = new javax.swing.JMenu();
183 jMenuItem5 = new javax.swing.JMenuItem();
184 jMenu5 = new javax.swing.JMenu();
185 jMenuItem6 = new javax.swing.JMenuItem();
186 jMenu2 = new javax.swing.JMenu();
187 jMenuItem2 = new javax.swing.JMenuItem();
188 jMenuItem4 = new javax.swing.JMenuItem();
189 jMenu3 = new javax.swing.JMenu();
190 jMenuItem3 = new javax.swing.JMenuItem();
192 setTitle("Nishio Tweet Manager");
194 jTable.setModel(tweetTableModel);
195 jTable.getTableHeader().setReorderingAllowed(false);
196 jTable.addMouseListener(new java.awt.event.MouseAdapter() {
197 public void mousePressed(java.awt.event.MouseEvent evt) {
198 jTableMousePressed(evt);
200 public void mouseReleased(java.awt.event.MouseEvent evt) {
201 jTableMouseReleased(evt);
204 jTable.addFocusListener(new java.awt.event.FocusAdapter() {
205 public void focusGained(java.awt.event.FocusEvent evt) {
206 jTableFocusGained(evt);
209 jScrollPane1.setViewportView(jTable);
211 jTabbedPane1.addTab("Timeline", jScrollPane1);
213 jTable1.setModel(mentionTableModel);
214 jTable1.getTableHeader().setReorderingAllowed(false);
215 jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
216 public void mousePressed(java.awt.event.MouseEvent evt) {
217 jTable1MousePressed(evt);
219 public void mouseReleased(java.awt.event.MouseEvent evt) {
220 jTable1MouseReleased(evt);
223 jTable1.addFocusListener(new java.awt.event.FocusAdapter() {
224 public void focusGained(java.awt.event.FocusEvent evt) {
225 jTable1FocusGained(evt);
228 jScrollPane2.setViewportView(jTable1);
230 jTabbedPane1.addTab("Mention", jScrollPane2);
232 jTable2.setModel(messageTableModel);
233 jTable2.getTableHeader().setReorderingAllowed(false);
234 jTable2.addMouseListener(new java.awt.event.MouseAdapter() {
235 public void mousePressed(java.awt.event.MouseEvent evt) {
236 jTable2MousePressed(evt);
238 public void mouseReleased(java.awt.event.MouseEvent evt) {
239 jTable2MouseReleased(evt);
242 jTable2.addFocusListener(new java.awt.event.FocusAdapter() {
243 public void focusGained(java.awt.event.FocusEvent evt) {
244 jTable2FocusGained(evt);
247 jScrollPane3.setViewportView(jTable2);
249 jTabbedPane1.addTab("Message", jScrollPane3);
251 jTable3.setModel(sendMessageTableModel);
252 jTable3.getTableHeader().setReorderingAllowed(false);
253 jScrollPane4.setViewportView(jTable3);
255 jTabbedPane1.addTab("Send", jScrollPane4);
257 jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
259 userImageLabel.setBackground(java.awt.Color.black);
260 userImageLabel.setOpaque(true);
262 jScrollPane5.setHorizontalScrollBar(null);
264 tweetMessageBox.setContentType("text/html");
265 tweetMessageBox.setEditable(false);
266 tweetMessageBox.addComponentListener(new java.awt.event.ComponentAdapter() {
267 public void componentResized(java.awt.event.ComponentEvent evt) {
268 tweetMessageBoxComponentResized(evt);
271 tweetMessageBox.addHyperlinkListener(new TweetHyperlinkHandler());
272 jScrollPane5.setViewportView(tweetMessageBox);
274 jLabel3.setText("ユーザ名");
276 jLabel4.setText("更新日");
278 jLabel5.setText("現在地");
280 userNameLabel.setText("UserName");
282 updateTimeLabel.setText("Date");
284 locationLabel.setText("Information");
286 jLabel9.setText("Following");
288 followingLabel.setText("0");
290 followerLabel.setText("0");
292 jLabel12.setText("Follower");
294 jLabel13.setText("更新回数");
296 updateLabel.setText("0");
298 jScrollPane6.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
300 userIntroBox.setContentType("text/html");
301 userIntroBox.setEditable(false);
302 userIntroBox.setMinimumSize(new java.awt.Dimension(120, 20));
303 jScrollPane6.setViewportView(userIntroBox);
305 jScrollPane7.setBorder(null);
306 jScrollPane7.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
307 jScrollPane7.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
309 userWebBox.setBorder(null);
310 userWebBox.setContentType("text/html");
311 userWebBox.setEditable(false);
312 userWebBox.setEditable(false);
313 userWebBox.addHyperlinkListener(new TweetHyperlinkHandler());
316 HTMLDocument doc = (HTMLDocument) userWebBox.getDocument();
317 StyleSheet[] style = doc.getStyleSheet().getStyleSheets();
318 for (int i = style.length - 1; i >= 0; i--) {
319 Style body = style[i].getStyle("body");
321 // TODO: change default font size
322 StyleConstants.setFontSize(body, 13);
325 } catch (Exception e) {
328 jScrollPane7.setViewportView(userWebBox);
330 jScrollPane8.setBorder(null);
331 jScrollPane8.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
332 jScrollPane8.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
334 clientNameLabel.setBorder(null);
335 clientNameLabel.setContentType("text/html");
336 clientNameLabel.setEditable(false);
337 clientNameLabel.setEditable(false);
338 clientNameLabel.addHyperlinkListener(new TweetHyperlinkHandler());
341 HTMLDocument doc = (HTMLDocument) clientNameLabel.getDocument();
342 StyleSheet[] style = doc.getStyleSheet().getStyleSheets();
343 for (int i = style.length - 1; i >= 0; i--) {
344 Style body = style[i].getStyle("body");
346 // TODO: default font size
347 StyleConstants.setFontSize(body, 13);
350 } catch (Exception e) {
353 jScrollPane8.setViewportView(clientNameLabel);
355 javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
356 jPanel1.setLayout(jPanel1Layout);
357 jPanel1Layout.setHorizontalGroup(
358 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
359 .addGroup(jPanel1Layout.createSequentialGroup()
360 .addComponent(userImageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
362 .addComponent(jScrollPane5, javax.swing.GroupLayout.DEFAULT_SIZE, 674, Short.MAX_VALUE))
363 .addGroup(jPanel1Layout.createSequentialGroup()
365 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
366 .addGroup(jPanel1Layout.createSequentialGroup()
367 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
368 .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
369 .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
370 .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
372 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
373 .addComponent(locationLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 183, javax.swing.GroupLayout.PREFERRED_SIZE)
374 .addComponent(userNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 183, javax.swing.GroupLayout.PREFERRED_SIZE)
375 .addComponent(updateTimeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 183, javax.swing.GroupLayout.PREFERRED_SIZE))
376 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
377 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
378 .addComponent(jLabel13, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
379 .addComponent(jLabel12, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
380 .addComponent(jLabel9))
382 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
383 .addComponent(updateLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
384 .addComponent(followerLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 68, Short.MAX_VALUE)
385 .addComponent(followingLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
386 .addGroup(jPanel1Layout.createSequentialGroup()
387 .addComponent(jScrollPane7, javax.swing.GroupLayout.PREFERRED_SIZE, 220, javax.swing.GroupLayout.PREFERRED_SIZE)
388 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
389 .addComponent(jScrollPane8, javax.swing.GroupLayout.PREFERRED_SIZE, 189, javax.swing.GroupLayout.PREFERRED_SIZE)))
390 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
391 .addComponent(jScrollPane6, javax.swing.GroupLayout.DEFAULT_SIZE, 292, Short.MAX_VALUE))
393 jPanel1Layout.setVerticalGroup(
394 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
395 .addGroup(jPanel1Layout.createSequentialGroup()
396 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
397 .addComponent(userImageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
398 .addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE))
399 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
400 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
401 .addGroup(jPanel1Layout.createSequentialGroup()
402 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
403 .addGroup(jPanel1Layout.createSequentialGroup()
404 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
405 .addComponent(jLabel3)
406 .addComponent(userNameLabel))
407 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
408 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
409 .addComponent(jLabel4)
410 .addComponent(updateTimeLabel))
411 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
412 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
413 .addComponent(jLabel5)
414 .addComponent(locationLabel)))
415 .addGroup(jPanel1Layout.createSequentialGroup()
416 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
417 .addComponent(jLabel9)
418 .addComponent(followingLabel))
419 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
420 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
421 .addComponent(jLabel12)
422 .addComponent(followerLabel))
423 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
424 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
425 .addComponent(jLabel13)
426 .addComponent(updateLabel))))
427 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
428 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
429 .addComponent(jScrollPane8, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
430 .addComponent(jScrollPane7, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)))
431 .addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE))
435 jButton1.setText("今すぐ更新");
436 jButton1.addActionListener(new java.awt.event.ActionListener() {
437 public void actionPerformed(java.awt.event.ActionEvent evt) {
438 jButton1ActionPerformed(evt);
442 jButton2.setText("リフレッシュ");
443 jButton2.addActionListener(new java.awt.event.ActionListener() {
444 public void actionPerformed(java.awt.event.ActionEvent evt) {
445 jButton2ActionPerformed(evt);
449 jScrollPane9.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
450 jScrollPane9.setMaximumSize(new java.awt.Dimension(32767, 80));
451 jScrollPane9.setMinimumSize(new java.awt.Dimension(26, 80));
453 jTextPane.setMaximumSize(new java.awt.Dimension(2147483647, 20));
454 jTextPane.addFocusListener(new java.awt.event.FocusAdapter() {
455 public void focusGained(java.awt.event.FocusEvent evt) {
456 jTextPaneFocusGained(evt);
458 public void focusLost(java.awt.event.FocusEvent evt) {
459 jTextPaneFocusLost(evt);
462 jTextPane.addKeyListener(new java.awt.event.KeyAdapter() {
463 public void keyReleased(java.awt.event.KeyEvent evt) {
464 jTextPaneKeyReleased(evt);
467 jScrollPane9.setViewportView(jTextPane);
469 jLabel15.setText("残り文字数");
471 tweetLengthLabel.setText("140");
473 jButton4.setText("つぶやく");
474 jButton4.addActionListener(new java.awt.event.ActionListener() {
475 public void actionPerformed(java.awt.event.ActionEvent evt) {
476 jButton4ActionPerformed(evt);
480 jToggleButton1.setSelected(true);
481 jToggleButton1.setText("詳細情報");
482 jToggleButton1.setMaximumSize(new java.awt.Dimension(73, 26));
483 jToggleButton1.setMinimumSize(new java.awt.Dimension(73, 26));
484 jToggleButton1.addActionListener(new java.awt.event.ActionListener() {
485 public void actionPerformed(java.awt.event.ActionEvent evt) {
486 jToggleButton1ActionPerformed(evt);
490 statusBar.setText("Status");
491 statusBar.setBorder(javax.swing.BorderFactory.createEtchedBorder());
493 jToggleButton2.setSelected(true);
494 jToggleButton2.setText("書き込み欄");
495 jToggleButton2.setMaximumSize(new java.awt.Dimension(73, 26));
496 jToggleButton2.setMinimumSize(new java.awt.Dimension(73, 26));
497 jToggleButton2.addActionListener(new java.awt.event.ActionListener() {
498 public void actionPerformed(java.awt.event.ActionEvent evt) {
499 jToggleButton2ActionPerformed(evt);
503 jMenu1.setText("ファイル");
505 jMenuItem1.setText("終了");
506 jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
507 public void actionPerformed(java.awt.event.ActionEvent evt) {
508 jMenuItem1ActionPerformed(evt);
511 jMenu1.add(jMenuItem1);
513 jMenuBar1.add(jMenu1);
515 jMenu4.setText("タブ");
517 jMenuItem5.setText("Debug");
518 jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
519 public void actionPerformed(java.awt.event.ActionEvent evt) {
520 jMenuItem5ActionPerformed(evt);
523 jMenu4.add(jMenuItem5);
525 jMenuBar1.add(jMenu4);
527 jMenu5.setText("検索");
529 jMenuItem6.setText("キーワードでTwitter全体を検索");
530 jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
531 public void actionPerformed(java.awt.event.ActionEvent evt) {
532 jMenuItem6ActionPerformed(evt);
535 jMenu5.add(jMenuItem6);
537 jMenuBar1.add(jMenu5);
539 jMenu2.setText("設定");
541 jMenuItem2.setText("基本設定");
542 jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
543 public void actionPerformed(java.awt.event.ActionEvent evt) {
544 jMenuItem2ActionPerformed(evt);
547 jMenu2.add(jMenuItem2);
549 jMenuItem4.setText("アカウント設定");
550 jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
551 public void actionPerformed(java.awt.event.ActionEvent evt) {
552 jMenuItem4ActionPerformed(evt);
555 jMenu2.add(jMenuItem4);
557 jMenuBar1.add(jMenu2);
559 jMenu3.setText("ヘルプ");
561 jMenuItem3.setText("このプログラムについて");
562 jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
563 public void actionPerformed(java.awt.event.ActionEvent evt) {
564 jMenuItem3ActionPerformed(evt);
567 jMenu3.add(jMenuItem3);
569 jMenuBar1.add(jMenu3);
571 setJMenuBar(jMenuBar1);
573 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
574 getContentPane().setLayout(layout);
575 layout.setHorizontalGroup(
576 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
577 .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 729, Short.MAX_VALUE)
578 .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
579 .addGroup(layout.createSequentialGroup()
581 .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE)
582 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
583 .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE)
584 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
585 .addComponent(jToggleButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE)
586 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
587 .addComponent(jToggleButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
588 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE)
589 .addComponent(jLabel15)
590 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
591 .addComponent(tweetLengthLabel)
593 .addComponent(jButton4, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)
595 .addComponent(statusBar, javax.swing.GroupLayout.DEFAULT_SIZE, 729, Short.MAX_VALUE)
596 .addComponent(jScrollPane9, javax.swing.GroupLayout.DEFAULT_SIZE, 729, Short.MAX_VALUE)
598 layout.setVerticalGroup(
599 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
600 .addGroup(layout.createSequentialGroup()
601 .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 281, Short.MAX_VALUE)
602 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
603 .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
604 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
605 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
606 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
607 .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
608 .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE))
609 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
610 .addComponent(jLabel15)
611 .addComponent(tweetLengthLabel)
612 .addComponent(jButton4, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
613 .addComponent(jToggleButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
614 .addComponent(jToggleButton2, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)))
615 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
616 .addComponent(jScrollPane9, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE)
617 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
618 .addComponent(statusBar, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
622 }// </editor-fold>//GEN-END:initComponents
624 private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed
626 mainAction.actionTweet();
628 }//GEN-LAST:event_jButton4ActionPerformed
630 private void jTableFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTableFocusGained
631 // まだ見ていないtweet数を0にする
632 mainAction.actionResetUncheckedTimelineTweetCount();
633 }//GEN-LAST:event_jTableFocusGained
635 private void jTableMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTableMousePressed
638 mainAction.actionResetUncheckedTimelineTweetCount();
639 }//GEN-LAST:event_jTableMousePressed
641 private void jTableMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTableMouseReleased
644 }//GEN-LAST:event_jTableMouseReleased
646 private void jTable1FocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTable1FocusGained
647 mainAction.actionResetUncheckedMentionTweetCount();
648 }//GEN-LAST:event_jTable1FocusGained
650 private void jTable1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTable1MousePressed
653 mainAction.actionResetUncheckedMentionTweetCount();
654 }//GEN-LAST:event_jTable1MousePressed
656 private void jTable1MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTable1MouseReleased
659 }//GEN-LAST:event_jTable1MouseReleased
661 private void jTable2FocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTable2FocusGained
662 mainAction.actionResetUncheckedDirectMessageCount();
663 }//GEN-LAST:event_jTable2FocusGained
665 private void jTable2MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTable2MousePressed
668 mainAction.actionResetUncheckedDirectMessageCount();
669 }//GEN-LAST:event_jTable2MousePressed
671 private void jTable2MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTable2MouseReleased
674 }//GEN-LAST:event_jTable2MouseReleased
676 private void tweetMessageBoxComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_tweetMessageBoxComponentResized
677 }//GEN-LAST:event_tweetMessageBoxComponentResized
679 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
680 mainAction.actionUpdateButton(evt);
681 // いますぐ更新ボタンを押したので,更新タイムを一度リセットする
682 mainAction.resetTweetAutoUpdate();
683 }//GEN-LAST:event_jButton1ActionPerformed
685 private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
687 mainAction.actionRefreshTime();
688 }//GEN-LAST:event_jButton2ActionPerformed
690 private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButton1ActionPerformed
692 mainAction.actionDetailInfoButton(evt);
693 }//GEN-LAST:event_jToggleButton1ActionPerformed
695 private void jTextPaneKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextPaneKeyReleased
697 mainAction.actionUpdateTweetMessageCount();
698 }//GEN-LAST:event_jTextPaneKeyReleased
700 private void jTextPaneFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextPaneFocusGained
702 }//GEN-LAST:event_jTextPaneFocusGained
704 private void jTextPaneFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextPaneFocusLost
706 }//GEN-LAST:event_jTextPaneFocusLost
708 private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
710 mainAction.actionExitButton(evt);
711 }//GEN-LAST:event_jMenuItem1ActionPerformed
713 private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
715 mainAction.actionBasicSettingDialog();
716 }//GEN-LAST:event_jMenuItem2ActionPerformed
718 private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
719 mainAction.actionShowAboutDialog();
720 }//GEN-LAST:event_jMenuItem3ActionPerformed
722 private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem4ActionPerformed
723 mainAction.actionShowAccountDialog();
724 }//GEN-LAST:event_jMenuItem4ActionPerformed
726 private void jToggleButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButton2ActionPerformed
727 mainAction.actionShowTweetboxButton(evt);
730 }//GEN-LAST:event_jToggleButton2ActionPerformed
732 private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem5ActionPerformed
733 this.mainAction.actionAddNewSearchResultTab("#followme");
734 }//GEN-LAST:event_jMenuItem5ActionPerformed
736 private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed
737 this.mainAction.actionShowKeywordSearchDialog();
738 }//GEN-LAST:event_jMenuItem6ActionPerformed
743 private void updateLen() {
745 mainAction.actionUpdateTweetMessageCount();
752 private void showPopup(MouseEvent e) {
753 if (e.isPopupTrigger()) {
755 getRightClickPopup().show(e.getComponent(), e.getX(),
761 * @param args the command line arguments
763 public static void main(String args[]) {
764 java.awt.EventQueue.invokeLater(new Runnable() {
770 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
772 } catch (Exception e) {
775 new NishioTweetManager().setVisible(true);
783 private void init() {
785 boolean login = false;
787 tweetManager.loginTwitter();
789 } catch (Exception e) {
794 mainAction = new TweetMainAction(this, tweetManager, statusBar,
795 tweetTableModel, mentionTableModel, messageTableModel,
796 sendMessageTableModel, jTable, jTable1, jTable2, jTable3,
797 jTextPane, jScrollPane9, tweetLengthLabel, jPanel1, jTabbedPane1, tweetMessageBox, userImageLabel,
798 userNameLabel, updateTimeLabel, followerLabel, followingLabel, locationLabel,
799 clientNameLabel, updateLabel, userIntroBox, userWebBox);
801 mainAction.startTweetAutoUpdate();
802 //もしログインに失敗したら,アカウント設定画面を出す
803 if (login == false) {
804 mainAction.actionShowAccountDialog();
807 createTweetTable(jTable);
808 createTweetTable(jTable1);
809 createTweetTable(jTable2);
810 createTweetTable(jTable3);
819 private void createTweetTable(final JTable table) {
821 table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
822 table.setShowVerticalLines(false);
823 table.setShowHorizontalLines(true);
825 // Comment部分のColumnを複数行コメントが表示できるようにする
826 TableColumnModel mdl = table.getColumnModel();
827 TableColumn col = mdl.getColumn(1);
828 TweetCommentRenderer commentRenderer = new TweetCommentRenderer();
829 col.setCellRenderer(commentRenderer);
830 // INfo部分のColumnを複数行表示できるように
831 TweetCommentRenderer infoRenderer = new TweetCommentRenderer();
832 col = mdl.getColumn(2);
833 col.setCellRenderer(infoRenderer);
834 col.setMaxWidth(200);
835 col.setMinWidth(150);
837 // あとでファイルに幅情報などを保存しておき,それを読み込んで設定するような仕様に変更する
839 col = mdl.getColumn(0);
840 col.setCellRenderer(new UserImageRenderer());
843 // 選択したセルの情報をDetailInfoへと表示
844 table.getSelectionModel().addListSelectionListener(
845 new ListSelectionListener() {
848 public void valueChanged(ListSelectionEvent e) {
850 if (e.getValueIsAdjusting()) {
854 //テーブルで選択した要素を詳細情報として表示
855 mainAction.setDetailInformationFromTable(table);
858 // JTableを右クリックでも選択できるようにする
859 // また,同じ行を2回クリックできるようにする
860 table.addMouseListener(new MouseAdapter() {
863 public void mousePressed(MouseEvent e) {
864 // いったんSelectしていた情報を削除
865 table.clearSelection();
866 // if (e.getButton() == MouseEvent.BUTTON3) {
867 Point p = e.getPoint();
868 int col = table.columnAtPoint(p);
869 int row = table.rowAtPoint(p);
870 table.changeSelection(row, col, false, false);
875 table.addMouseListener(commentRenderer);
876 table.addMouseMotionListener(commentRenderer);
877 table.addMouseListener(infoRenderer);
878 table.addMouseMotionListener(infoRenderer);
882 * 右クリックを押した時のポップアップメニューを取得
886 private JPopupMenu getRightClickPopup() {
887 if (rightClickPopup == null) {
888 rightClickPopup = new JPopupMenu();
889 JMenuItem directMessageMenuItem = new JMenuItem("ダイレクトメッセージを送信");
890 directMessageMenuItem.addActionListener(new java.awt.event.ActionListener() {
892 public void actionPerformed(java.awt.event.ActionEvent e) {
893 // ダイレクトメッセージ送信ダイアログを表示
894 mainAction.actionShowDirectMessageDialog();
897 rightClickPopup.add(directMessageMenuItem);
898 JMenuItem retweetMenuItem = new JMenuItem("発言を公式リツイート");
899 retweetMenuItem.addActionListener(new java.awt.event.ActionListener() {
901 public void actionPerformed(java.awt.event.ActionEvent e) {
902 // 選択したセルのステータスをRetweet
903 mainAction.actionRetweet();
906 rightClickPopup.add(retweetMenuItem);
907 JMenuItem quoteMenuItem = new JMenuItem("発言をコメント付きリツイート");
908 quoteMenuItem.addActionListener(new java.awt.event.ActionListener() {
910 public void actionPerformed(java.awt.event.ActionEvent e) {
911 // 選択したセルのステータスをコメント付Retweet
912 mainAction.actionCopySelectedStatusToTweetBoxPane();
915 rightClickPopup.add(quoteMenuItem);
917 JMenuItem statusBrowserMenuItem = new JMenuItem("発言をブラウザで開く");
918 statusBrowserMenuItem.addActionListener(new java.awt.event.ActionListener() {
920 public void actionPerformed(java.awt.event.ActionEvent e) {
921 // 選択したセルのステータスをブラウザで開く
922 mainAction.actionOpenStatusURL();
925 rightClickPopup.add(statusBrowserMenuItem);
927 JMenuItem openBrowserUserInformationMenuItem = new JMenuItem(
928 "この人のTimelineをブラウザで開く");
929 openBrowserUserInformationMenuItem.addActionListener(new java.awt.event.ActionListener() {
931 public void actionPerformed(java.awt.event.ActionEvent e) {
932 // 選択したセルのユーザ情報をブラウザで開く
933 mainAction.actionOpenUserURL();
936 rightClickPopup.add(openBrowserUserInformationMenuItem);
938 return rightClickPopup;
940 //nishio tweet manager
941 private JPopupMenu rightClickPopup = null;
942 private TweetMainAction mainAction = null;
944 private TweetManager tweetManager = new TweetManager();
946 private TweetTableModel tweetTableModel = new TweetTableModel();
947 private TweetTableModel mentionTableModel = new TweetTableModel();
948 private TweetTableModel messageTableModel = new TweetTableModel();
949 private TweetTableModel sendMessageTableModel = new TweetTableModel();
950 // Variables declaration - do not modify//GEN-BEGIN:variables
951 private javax.swing.JEditorPane clientNameLabel;
952 private javax.swing.JLabel followerLabel;
953 private javax.swing.JLabel followingLabel;
954 private javax.swing.JButton jButton1;
955 private javax.swing.JButton jButton2;
956 private javax.swing.JButton jButton4;
957 private javax.swing.JLabel jLabel12;
958 private javax.swing.JLabel jLabel13;
959 private javax.swing.JLabel jLabel15;
960 private javax.swing.JLabel jLabel3;
961 private javax.swing.JLabel jLabel4;
962 private javax.swing.JLabel jLabel5;
963 private javax.swing.JLabel jLabel9;
964 private javax.swing.JMenu jMenu1;
965 private javax.swing.JMenu jMenu2;
966 private javax.swing.JMenu jMenu3;
967 private javax.swing.JMenu jMenu4;
968 private javax.swing.JMenu jMenu5;
969 private javax.swing.JMenuBar jMenuBar1;
970 private javax.swing.JMenuItem jMenuItem1;
971 private javax.swing.JMenuItem jMenuItem2;
972 private javax.swing.JMenuItem jMenuItem3;
973 private javax.swing.JMenuItem jMenuItem4;
974 private javax.swing.JMenuItem jMenuItem5;
975 private javax.swing.JMenuItem jMenuItem6;
976 private javax.swing.JPanel jPanel1;
977 private javax.swing.JScrollPane jScrollPane1;
978 private javax.swing.JScrollPane jScrollPane2;
979 private javax.swing.JScrollPane jScrollPane3;
980 private javax.swing.JScrollPane jScrollPane4;
981 private javax.swing.JScrollPane jScrollPane5;
982 private javax.swing.JScrollPane jScrollPane6;
983 private javax.swing.JScrollPane jScrollPane7;
984 private javax.swing.JScrollPane jScrollPane8;
985 private javax.swing.JScrollPane jScrollPane9;
986 private javax.swing.JTabbedPane jTabbedPane1;
987 private javax.swing.JTable jTable;
988 private javax.swing.JTable jTable1;
989 private javax.swing.JTable jTable2;
990 private javax.swing.JTable jTable3;
991 private javax.swing.JTextPane jTextPane;
992 private javax.swing.JToggleButton jToggleButton1;
993 private javax.swing.JToggleButton jToggleButton2;
994 private javax.swing.JLabel locationLabel;
995 private javax.swing.JLabel statusBar;
996 private javax.swing.JLabel tweetLengthLabel;
997 private javax.swing.JEditorPane tweetMessageBox;
998 private javax.swing.JLabel updateLabel;
999 private javax.swing.JLabel updateTimeLabel;
1000 private javax.swing.JLabel userImageLabel;
1001 private javax.swing.JEditorPane userIntroBox;
1002 private javax.swing.JLabel userNameLabel;
1003 private javax.swing.JEditorPane userWebBox;
1004 // End of variables declaration//GEN-END:variables