OSDN Git Service

行うべき処理が無い場合にはメッセージを出力し,キューには追加しない No.26342
[coroid/inqubus.git] / frontend / src / yukihane / inqubus / gui / MainFrame.java
index 2448bac..8e03253 100644 (file)
@@ -15,6 +15,7 @@ import java.awt.event.ActionListener;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.beans.PropertyChangeEvent;
@@ -30,8 +31,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.SortedSet;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import javax.swing.BorderFactory;
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.DropMode;
@@ -56,8 +55,11 @@ import javax.swing.LayoutStyle.ComponentPlacement;
 import javax.swing.SwingUtilities;
 import javax.swing.WindowConstants;
 import javax.swing.border.BevelBorder;
+import javax.swing.table.TableModel;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.lang.builder.ToStringBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import saccubus.MainFrame_AboutBox;
 import saccubus.util.WayBackTimeParser;
 import saccubus.worker.profile.CommentProfile;
@@ -86,6 +88,8 @@ import yukihane.inqubus.manager.TaskManageListener;
 import yukihane.inqubus.manager.TaskStatus;
 import yukihane.inqubus.model.Target;
 import yukihane.inqubus.model.TargetsTableModel;
+import yukihane.inqubus.thumbnail.Repository;
+import yukihane.inqubus.thumbnail.Thumbnail;
 
 /**
  *
@@ -95,6 +99,7 @@ public class MainFrame extends JFrame {
 
     private static final long serialVersionUID = 1L;
     private static final Logger logger = LoggerFactory.getLogger(MainFrame.class);
+    private final Repository thumbRepository = new Repository();
     private final TargetsTableModel targetModel = new TargetsTableModel();
     private final TaskManage taskManager;
     private final Thread videoFileWatcherThread;
@@ -107,6 +112,7 @@ public class MainFrame extends JFrame {
     public MainFrame() {
         super();
         addWindowListener(new MainFrameWindowListener());
+        setTitle(MainFrame_AboutBox.VERSION);
 
         final Config p = Config.INSTANCE;
 
@@ -150,7 +156,32 @@ public class MainFrame extends JFrame {
 
         final JPanel pnlMain = new JPanel();
         final JScrollPane scrDisplay = new JScrollPane();
-        tblDisplay = new JTable(targetModel, new TargetsColumnModel());
+        tblDisplay = new JTable(targetModel, new TargetsColumnModel()) {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public String getToolTipText(MouseEvent e) {
+                int row = convertRowIndexToModel(rowAtPoint(e.getPoint()));
+                TableModel m = getModel();
+                final String videoId = (String) m.getValueAt(row, 0);
+                try {
+                    final Thumbnail thumbnail = thumbRepository.getThumnail(videoId);
+                    if (thumbnail == null) {
+                        return videoId + ": 動画情報未取得";
+                    }
+
+                    final URL imageUrl = thumbnail.getImageFile().toURI().toURL();
+
+                    return "<html>" + videoId + ": " + thumbnail.getTitle()
+                            + " (" + thumbnail.getLength() + ")" + "<br/>"
+                            + "<img src=\"" + imageUrl + "\"/>"
+                            + "</html>";
+                } catch (Throwable ex) {
+                    logger.warn(null, ex);
+                    return videoId + ": 情報取得できません";
+                }
+            }
+        };
         tblDisplay.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
         final JPanel pnlButton = new JPanel();
         final JPanel pnlInputMain = new JPanel();
@@ -183,18 +214,12 @@ public class MainFrame extends JFrame {
         cbBackLogReduce.setToolTipText("「コメントの量を減らす」場合はチェックを付けます。");
 
         cbCommentLocal = new JCheckBox();
-        cbCommentLocal.addItemListener(new ItemListener() {
+        cbOwnerComment = new JCheckBox();
 
-            @Override
-            public void itemStateChanged(ItemEvent e) {
-                final boolean selected = (e.getStateChange() == ItemEvent.SELECTED);
-                cbBackLogReduce.setEnabled(!selected);
-                cbBackLog.setEnabled(!selected);
-            }
-        });
         btnComment.addActionListener(
                 new FileChooseActionListener(MainFrame.this, JFileChooser.FILES_ONLY, fldComment));
         fldComment.setTransferHandler(new ContentTransferHandler(fldComment.getTransferHandler(), cbCommentLocal));
+
         final JLabel lblOutput = new JLabel();
         cbOutputEnable = new JCheckBox();
         fldOutput = new JTextField();
@@ -248,6 +273,7 @@ public class MainFrame extends JFrame {
         cmbId.getEditorComponent().addActionListener(applyListener);
         cmbId.getEditorComponent().addFocusListener(new java.awt.event.FocusAdapter() {
 
+            @Override
             public void focusLost(java.awt.event.FocusEvent evt) {
                 idFieldFocusLost(evt);
             }
@@ -258,6 +284,7 @@ public class MainFrame extends JFrame {
         cbVideoLocal.setText("local");
         cbVideoLocal.addItemListener(new java.awt.event.ItemListener() {
 
+            @Override
             public void itemStateChanged(java.awt.event.ItemEvent evt) {
                 useMovieLocalCheckBoxItemStateChanged(evt);
             }
@@ -266,18 +293,26 @@ public class MainFrame extends JFrame {
         lblComment.setText("コメント");
 
         cbCommentLocal.setText("local");
-        cbCommentLocal.addItemListener(new java.awt.event.ItemListener() {
+        cbCommentLocal.addItemListener(new ItemListener() {
 
-            public void itemStateChanged(java.awt.event.ItemEvent evt) {
-                useMovieLocalCheckBoxItemStateChanged(evt);
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                useMovieLocalCheckBoxItemStateChanged(e);
+                final boolean selected = (e.getStateChange() == ItemEvent.SELECTED);
+                cbBackLogReduce.setEnabled(!selected);
+                cbBackLog.setEnabled(!selected);
+                cbOwnerComment.setEnabled(!selected);
             }
         });
 
+        cbOwnerComment.setText("投コメのみ");
+
         lblOutput.setText("出力");
 
         cbOutputEnable.setText("変換");
         cbOutputEnable.addItemListener(new java.awt.event.ItemListener() {
 
+            @Override
             public void itemStateChanged(java.awt.event.ItemEvent evt) {
                 outputConvertCheckBoxItemStateChanged(evt);
             }
@@ -293,12 +328,6 @@ public class MainFrame extends JFrame {
                 .addComponent(lblId)
                 .addPreferredGap(ComponentPlacement.RELATED)
                 .addComponent(cmbId, GroupLayout.PREFERRED_SIZE, 100, Short.MAX_VALUE)
-                .addPreferredGap(ComponentPlacement.UNRELATED)
-                .addComponent(cbBackLogReduce)
-                .addPreferredGap(ComponentPlacement.UNRELATED)
-                .addComponent(cbBackLog)
-                .addPreferredGap(ComponentPlacement.RELATED)
-                .addComponent(fldBackLog, GroupLayout.PREFERRED_SIZE, 150, GroupLayout.PREFERRED_SIZE)
                 .addContainerGap()
             )
             .addGroup(glInputMain.createSequentialGroup()
@@ -310,21 +339,34 @@ public class MainFrame extends JFrame {
                 )
                 .addPreferredGap(ComponentPlacement.RELATED)
                 .addGroup(glInputMain.createParallelGroup(Alignment.LEADING)
-                    .addComponent(cbVideoLocal)
-                    .addComponent(cbCommentLocal)
-                    .addComponent(cbOutputEnable)
-                )
-                .addPreferredGap(ComponentPlacement.RELATED)
-                .addGroup(glInputMain.createParallelGroup(Alignment.LEADING)
-                    .addComponent(cmbVideo, 300, 300, Short.MAX_VALUE)
-                    .addComponent(cmbComment, 300, 300, Short.MAX_VALUE)
-                    .addComponent(fldOutput, 300, 300, Short.MAX_VALUE)
+                    .addGroup(glInputMain.createSequentialGroup()
+                        .addGroup(glInputMain.createParallelGroup(Alignment.LEADING)
+                            .addComponent(cbVideoLocal)
+                            .addComponent(cbCommentLocal)
+                            .addComponent(cbOutputEnable)
+                        )
+                        .addPreferredGap(ComponentPlacement.RELATED)
+                        .addGroup(glInputMain.createParallelGroup(Alignment.LEADING)
+                            .addComponent(cmbVideo, 300, 300, Short.MAX_VALUE)
+                            .addComponent(cmbComment, 300, 300, Short.MAX_VALUE)
+                            .addComponent(fldOutput, 300, 300, Short.MAX_VALUE)
+                        )
+                        .addGroup(glInputMain.createParallelGroup()
+                            .addComponent(btnVideo)
+                            .addComponent(btnComment)
+                        )
+                        .addContainerGap()
+                    )
+                    .addGroup(glInputMain.createSequentialGroup()
+                        .addComponent(cbOwnerComment)
+                        .addPreferredGap(ComponentPlacement.UNRELATED)
+                        .addComponent(cbBackLogReduce)
+                        .addPreferredGap(ComponentPlacement.UNRELATED)
+                        .addComponent(cbBackLog)
+                        .addPreferredGap(ComponentPlacement.RELATED)
+                        .addComponent(fldBackLog, GroupLayout.PREFERRED_SIZE, 150, GroupLayout.PREFERRED_SIZE)
+                    )
                 )
-                .addGroup(glInputMain.createParallelGroup()
-                    .addComponent(btnVideo)
-                    .addComponent(btnComment)
-                )
-                .addContainerGap()
             )
         );
 
@@ -335,9 +377,6 @@ public class MainFrame extends JFrame {
                 .addGroup(glInputMain.createParallelGroup(Alignment.BASELINE)
                     .addComponent(cmbId, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                     .addComponent(lblId)
-                    .addComponent(cbBackLogReduce)
-                    .addComponent(cbBackLog)
-                    .addComponent(fldBackLog)
                 )
                 .addPreferredGap(ComponentPlacement.RELATED)
                 .addGroup(glInputMain.createParallelGroup(Alignment.BASELINE)
@@ -355,6 +394,13 @@ public class MainFrame extends JFrame {
                 )
                 .addPreferredGap(ComponentPlacement.RELATED)
                 .addGroup(glInputMain.createParallelGroup(Alignment.BASELINE)
+                    .addComponent(cbOwnerComment)
+                    .addComponent(cbBackLogReduce)
+                    .addComponent(cbBackLog)
+                    .addComponent(fldBackLog)
+                )
+                .addPreferredGap(ComponentPlacement.RELATED)
+                .addGroup(glInputMain.createParallelGroup(Alignment.BASELINE)
                     .addComponent(lblOutput)
                     .addComponent(fldOutput, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                     .addComponent(cbOutputEnable)
@@ -576,10 +622,18 @@ public class MainFrame extends JFrame {
                 final InqubusConvertProfile convProf = new InqubusConvertProfile();
                 logger.debug(downProf.toString());
                 logger.debug(convProf.toString());
+
+                final File tempDir = new File(Config.INSTANCE.getSystemTempDir());
+                thumbRepository.request(downProf.getProxyProfile(), tempDir, id);
+
                 final RequestProcess rp = new RequestProcess(downProf, id, convProf);
-                taskManager.add(rp);
-                targetModel.addTarget(new Target(rp));
-                initInputPanel();
+                final boolean res = taskManager.add(rp);
+                if (res) {
+                    targetModel.addTarget(new Target(rp));
+                    initInputPanel();
+                } else {
+                    fldInputMessage.setText("行うべき処理がありません");
+                }
             } catch (Throwable th) {
                 logger.error(null, th);
                 JOptionPane.showMessageDialog(MainFrame.this, th.getMessage(), "中断しました", JOptionPane.ERROR_MESSAGE);
@@ -649,6 +703,7 @@ public class MainFrame extends JFrame {
     private final FileComboBox cmbComment = new FileComboBox();
     private final JTextField fldComment = cmbComment.getEditorComponent();
     private final JButton btnComment = new JButton("...");
+    private final JCheckBox cbOwnerComment;
     private final JCheckBox cbOutputEnable;
     private final JTextField fldOutput;
     // 入力領域 - ffmpeg
@@ -660,6 +715,7 @@ public class MainFrame extends JFrame {
     // End of variables declaration//GEN-END:variables
 
     private void initInputPanel() {
+        fldInputMessage.setText("");
         initMainTab();
         initFfmpegTab();
         tbpInput.setSelectedIndex(0);
@@ -881,6 +937,7 @@ public class MainFrame extends JFrame {
 
     private class InqubusCommentProfile extends ConfigCommentProfile {
         private final boolean download;
+        private final boolean ownerCommentOnly;
         private final File dir;
         private final String fileName;
         private final File localFile;
@@ -896,10 +953,12 @@ public class MainFrame extends JFrame {
                 this.dir = new File(p.getCommentDir());
                 this.fileName = fldComment.getText();
                 this.localFile = null;
+                this.ownerCommentOnly = cbOwnerComment.isSelected();
             } else {
                 this.dir = null;
                 this.fileName = null;
                 this.localFile = new File(fldComment.getText());
+                this.ownerCommentOnly = false;
             }
 
             if(cbBackLog.isSelected()) {
@@ -921,6 +980,11 @@ public class MainFrame extends JFrame {
         }
 
         @Override
+        public boolean isOwnerCommentOnly(){
+            return this.ownerCommentOnly;
+        }
+
+        @Override
         public File getDir() {
             return this.dir;
         }
@@ -961,7 +1025,6 @@ public class MainFrame extends JFrame {
         private final boolean convert;
 
         private InqubusConvertProfile() throws IOException {
-            final Config p = Config.INSTANCE;
             this.outputProfile = new InqubusOutputProfile();
             this.generalProfile = new ConfigGeneralProfile();
 
@@ -1008,7 +1071,6 @@ public class MainFrame extends JFrame {
 
 
         private InqubusOutputProfile() {
-            final Config p = Config.INSTANCE;
             this.fileName = fldOutput.getText();
             // TODO この時点でのID/Titleはどうするか…
             this.videoId = "";