OSDN Git Service

クラス名変更
[coroid/inqubus.git] / frontend / src / yukihane / inqubus / gui / MainFrame.java
index 64095c8..bedeb76 100644 (file)
@@ -13,9 +13,11 @@ import java.awt.datatransfer.Transferable;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
 import java.awt.event.KeyEvent;
 import java.io.File;
 import java.io.FilenameFilter;
+import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -24,15 +26,41 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import javax.swing.BorderFactory;
+import javax.swing.DropMode;
+import javax.swing.GroupLayout;
+import javax.swing.GroupLayout.Alignment;
 import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
 import javax.swing.JMenu;
 import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
 import javax.swing.JTextField;
 import javax.swing.KeyStroke;
+import javax.swing.LayoutStyle.ComponentPlacement;
 import javax.swing.TransferHandler;
+import javax.swing.WindowConstants;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.builder.ToStringBuilder;
 import saccubus.MainFrame_AboutBox;
-import yukihane.inqubus.config.Properties;
+import saccubus.util.WayBackTimeParser;
+import saccubus.worker.convert.ConvertProgress;
+import saccubus.worker.download.DownloadProgress;
+import saccubus.worker.WorkerListener;
+import saccubus.worker.profile.CommentProfile;
+import saccubus.worker.profile.DownloadProfile;
+import saccubus.worker.profile.GeneralProfile;
+import saccubus.worker.profile.LoginProfile;
+import saccubus.worker.profile.ProxyProfile;
+import saccubus.worker.profile.VideoProfile;
+import yukihane.Util;
+import yukihane.inqubus.Config;
+import yukihane.inqubus.manager.TaskManage;
 import yukihane.inqubus.model.Target;
 import yukihane.inqubus.model.TargetsTableModel;
 
@@ -40,28 +68,25 @@ import yukihane.inqubus.model.TargetsTableModel;
  *
  * @author yuki
  */
-public class MainFrame extends javax.swing.JFrame {
+public class MainFrame extends JFrame {
 
     private static final long serialVersionUID = 1L;
     private static final Logger logger = Logger.getLogger(MainFrame.class.getName());
+    private static final String ID_FIELD_TOOLTIP = "動画のIDまたはURLを入力します。";
+    private static final String FILE_LOCALBUTTON_TOOLTIP
+            = "ダウンロードする場合はチェックを外します。ローカルファイルを使用する場合はチェックを入れます。";
+    private static final String FILE_INPUTFIELD_TOOLTIP
+            = "ダウンロードする場合はファイル命名規則を入力します。"
+            + "ローカルファイルを使用する場合はパスを含むファイル名を入力します。";
+    private static final String FILE_OUTPUTFIELD_TOOLTIP
+            = "ファイル命名規則入力します。";
     private final TargetsTableModel targetModel = new TargetsTableModel();
+    private final TaskManage taskManager;
+    private final DownloadProgressListener downloadProgressListener = new DownloadProgressListener();
+    private final ConvertProgressListener convertProgressListener = new ConvertProgressListener();
 
     /** Creates new form MainFrame */
     public MainFrame() {
-        initComponents();
-        initInputPanel();
-        jPanel1.setTransferHandler(new DownloadListTransferHandler());
-        jTable1.setTransferHandler(new TableTransferHandler());
-    }
-
-    /** This method is called from within the constructor to
-     * initialize the form.
-     * WARNING: Do NOT modify this code. The content of this method is
-     * always regenerated by the Form Editor.
-     */
-    @SuppressWarnings("unchecked")
-    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
-    private void initComponents() {
         final URL url = MainFrame_AboutBox.class.getResource("icon.png");
         final Image icon1 = Toolkit.getDefaultToolkit().createImage(url);
         final URL url32 = MainFrame_AboutBox.class.getResource("icon32.png");
@@ -71,203 +96,231 @@ public class MainFrame extends javax.swing.JFrame {
         images.add(icon2);
         setIconImages(images);
 
-        jPanel1 = new javax.swing.JPanel();
-        jScrollPane1 = new javax.swing.JScrollPane();
-        jTable1 = new javax.swing.JTable();
-        jPanel2 = new javax.swing.JPanel();
-        jButton2 = new javax.swing.JButton();
-        jButton3 = new javax.swing.JButton();
-        jButton4 = new javax.swing.JButton();
-        jPanel3 = new javax.swing.JPanel();
-        idLabel = new javax.swing.JLabel();
-        idField = new javax.swing.JTextField();
-        movieLabel = new javax.swing.JLabel();
-        useMovieLocalCheckBox = new javax.swing.JCheckBox();
-        movieFileField = new javax.swing.JTextField();
-        movieFileSelectButton = new javax.swing.JButton();
-        commentLabel = new javax.swing.JLabel();
-        useCommentLocalCheckBox = new javax.swing.JCheckBox();
-        commentFileField = new javax.swing.JTextField();
-        commentFileSelectButton = new javax.swing.JButton();
-        outputLabel = new javax.swing.JLabel();
-        outputConvertCheckBox = new javax.swing.JCheckBox();
-        outputFileField = new javax.swing.JTextField();
-        applyButton = new javax.swing.JButton();
-
-        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
-
-        jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
-
-        jTable1.setModel(targetModel);
-        jTable1.setDropMode(javax.swing.DropMode.INSERT_ROWS);
-        jScrollPane1.setViewportView(jTable1);
-
-        jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder());
-
-        jButton2.setText("開始");
-
-        jButton3.setText("停止");
-
-        jButton4.setText("選択解除");
-
-        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
-        jPanel2.setLayout(jPanel2Layout);
-        jPanel2Layout.setHorizontalGroup(
-            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(jPanel2Layout.createSequentialGroup()
+        final JPanel pnlMain = new JPanel();
+        final JScrollPane scrDisplay = new JScrollPane();
+        tblDisplay = new JTable();
+        final JPanel pnlButton = new JPanel();
+        btnStart = new JButton();
+        btnStop = new JButton();
+        btnDeselect = new JButton();
+        final JPanel pnlInputMain = new JPanel();
+        final JLabel lblId = new JLabel();
+        fldId = new JTextField();
+        fldId.setToolTipText(ID_FIELD_TOOLTIP);
+        final JLabel lblVideo = new JLabel();
+        cbVideoLocal = new JCheckBox();
+        cbVideoLocal.setToolTipText(FILE_LOCALBUTTON_TOOLTIP);
+        fldVideo = new JTextField();
+        fldVideo.setToolTipText(FILE_INPUTFIELD_TOOLTIP);
+        btnVideo = new JButton();
+        final JLabel lblComment = new JLabel();
+        cbCommentLocal = new JCheckBox();
+        cbCommentLocal.setToolTipText(FILE_LOCALBUTTON_TOOLTIP);
+        cbCommentLocal.addItemListener(new ItemListener() {
+
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                final boolean selected = (e.getStateChange() == ItemEvent.SELECTED);
+                cbBackLogReduce.setEnabled(!selected);
+                cbBackLog.setEnabled(!selected);
+                if(selected) {
+                    cbBackLog.setSelected(false);
+                }
+            }
+        });
+        fldComment = new JTextField();
+        fldComment.setToolTipText(FILE_INPUTFIELD_TOOLTIP);
+        btnComment = new JButton();
+        final JLabel lblOutput = new JLabel();
+        cbOutputEnable = new JCheckBox();
+        fldOutput = new JTextField();
+        fldOutput.setToolTipText(FILE_OUTPUTFIELD_TOOLTIP);
+
+        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+
+        btnApply.addActionListener(new ApplyActionListener());
+
+        pnlMain.setBorder(BorderFactory.createEtchedBorder());
+
+        tblDisplay.setModel(targetModel);
+        tblDisplay.setDropMode(DropMode.INSERT_ROWS);
+        scrDisplay.setViewportView(tblDisplay);
+
+        pnlButton.setBorder(BorderFactory.createEtchedBorder());
+
+        btnStart.setText("開始");
+
+        btnStop.setText("停止");
+
+        btnDeselect.setText("選択解除");
+
+        GroupLayout gl_pnlButton = new GroupLayout(pnlButton);
+        pnlButton.setLayout(gl_pnlButton);
+        gl_pnlButton.setHorizontalGroup(
+            gl_pnlButton.createParallelGroup(Alignment.LEADING)
+            .addGroup(gl_pnlButton.createSequentialGroup()
                 .addContainerGap()
-                .addComponent(jButton2)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(jButton3)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 250, Short.MAX_VALUE)
-                .addComponent(jButton4)
+                .addComponent(btnStart)
+                .addPreferredGap(ComponentPlacement.RELATED)
+                .addComponent(btnStop)
+                .addPreferredGap(ComponentPlacement.RELATED, 250, Short.MAX_VALUE)
+                .addComponent(btnDeselect)
                 .addContainerGap())
         );
-        jPanel2Layout.setVerticalGroup(
-            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(jPanel2Layout.createSequentialGroup()
+        gl_pnlButton.setVerticalGroup(
+            gl_pnlButton.createParallelGroup(Alignment.LEADING)
+            .addGroup(gl_pnlButton.createSequentialGroup()
                 .addContainerGap()
-                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(jButton2)
-                    .addComponent(jButton3)
-                    .addComponent(jButton4))
-                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                .addGroup(gl_pnlButton.createParallelGroup(Alignment.BASELINE)
+                    .addComponent(btnStart)
+                    .addComponent(btnStop)
+                    .addComponent(btnDeselect))
+                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
 
-        jPanel3.setBorder(javax.swing.BorderFactory.createEtchedBorder());
+        pnlInputMain.setBorder(BorderFactory.createEtchedBorder());
 
-        idLabel.setText("ID");
+        lblId.setText("ID");
 
-        idField.addFocusListener(new java.awt.event.FocusAdapter() {
+        fldId.addFocusListener(new java.awt.event.FocusAdapter() {
 
             public void focusLost(java.awt.event.FocusEvent evt) {
                 idFieldFocusLost(evt);
             }
         });
 
-        movieLabel.setText("動画");
+        lblVideo.setText("動画");
 
-        useMovieLocalCheckBox.setText("local");
-        useMovieLocalCheckBox.addItemListener(new java.awt.event.ItemListener() {
+        cbVideoLocal.setText("local");
+        cbVideoLocal.addItemListener(new java.awt.event.ItemListener() {
 
             public void itemStateChanged(java.awt.event.ItemEvent evt) {
                 useMovieLocalCheckBoxItemStateChanged(evt);
             }
         });
 
-        movieFileSelectButton.setText("...");
+        btnVideo.setText("...");
 
-        commentLabel.setText("コメント");
+        lblComment.setText("コメント");
 
-        useCommentLocalCheckBox.setText("local");
-        useCommentLocalCheckBox.addItemListener(new java.awt.event.ItemListener() {
+        cbCommentLocal.setText("local");
+        cbCommentLocal.addItemListener(new java.awt.event.ItemListener() {
 
             public void itemStateChanged(java.awt.event.ItemEvent evt) {
                 useMovieLocalCheckBoxItemStateChanged(evt);
             }
         });
 
-        commentFileSelectButton.setText("...");
+        btnComment.setText("...");
 
-        outputLabel.setText("出力");
+        lblOutput.setText("出力");
 
-        outputConvertCheckBox.setText("変換");
-        outputConvertCheckBox.addItemListener(new java.awt.event.ItemListener() {
+        cbOutputEnable.setText("変換");
+        cbOutputEnable.addItemListener(new java.awt.event.ItemListener() {
 
             public void itemStateChanged(java.awt.event.ItemEvent evt) {
                 outputConvertCheckBoxItemStateChanged(evt);
             }
         });
 
-        applyButton.setText("適用");
 
-        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
-        jPanel3.setLayout(jPanel3Layout);
-        jPanel3Layout.setHorizontalGroup(
-            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(jPanel3Layout.createSequentialGroup()
+        GroupLayout gl_pnlInputMain = new GroupLayout(pnlInputMain);
+        pnlInputMain.setLayout(gl_pnlInputMain);
+        gl_pnlInputMain.setHorizontalGroup(
+            gl_pnlInputMain.createParallelGroup(Alignment.LEADING)
+            .addGroup(gl_pnlInputMain.createSequentialGroup()
                 .addContainerGap()
-                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                    .addGroup(jPanel3Layout.createSequentialGroup()
-                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                            .addComponent(commentLabel)
-                            .addComponent(movieLabel)
-                            .addComponent(idLabel)
-                            .addComponent(outputLabel))
-                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-                            .addGroup(jPanel3Layout.createSequentialGroup()
-                                .addComponent(useMovieLocalCheckBox)
-                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                                .addComponent(movieFileField, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)
-                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                                .addComponent(movieFileSelectButton))
-                            .addComponent(idField, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
-                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
-                                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
-                                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel3Layout.createSequentialGroup()
-                                        .addComponent(outputConvertCheckBox)
-                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                                        .addComponent(outputFileField, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE))
-                                    .addGroup(jPanel3Layout.createSequentialGroup()
-                                        .addComponent(useCommentLocalCheckBox)
-                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                                        .addComponent(commentFileField, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)))
-                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                                .addComponent(commentFileSelectButton))))
-                    .addComponent(applyButton, javax.swing.GroupLayout.Alignment.TRAILING))
+                .addGroup(gl_pnlInputMain.createParallelGroup(Alignment.LEADING)
+                    .addGroup(gl_pnlInputMain.createSequentialGroup()
+                        .addGroup(gl_pnlInputMain.createParallelGroup(Alignment.LEADING)
+                            .addComponent(lblComment)
+                            .addComponent(lblVideo)
+                            .addComponent(lblId)
+                            .addComponent(lblOutput))
+                        .addPreferredGap(ComponentPlacement.RELATED)
+                        .addGroup(gl_pnlInputMain.createParallelGroup(Alignment.LEADING)
+                            .addGroup(gl_pnlInputMain.createSequentialGroup()
+                                .addComponent(cbVideoLocal)
+                                .addPreferredGap(ComponentPlacement.RELATED)
+                                .addComponent(fldVideo, GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)
+                                .addPreferredGap(ComponentPlacement.RELATED)
+                                .addComponent(btnVideo))
+                            .addGroup(gl_pnlInputMain.createSequentialGroup()
+                                .addComponent(fldId, GroupLayout.PREFERRED_SIZE, 100, GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(ComponentPlacement.UNRELATED)
+                                .addComponent(cbBackLogReduce)
+                                .addComponent(cbBackLog)
+                                .addComponent(fldBackLog, GroupLayout.PREFERRED_SIZE, 150, GroupLayout.PREFERRED_SIZE)
+                            )
+                            .addGroup(Alignment.TRAILING, gl_pnlInputMain.createSequentialGroup()
+                                .addGroup(gl_pnlInputMain.createParallelGroup(Alignment.TRAILING)
+                                    .addGroup(Alignment.LEADING, gl_pnlInputMain.createSequentialGroup()
+                                        .addComponent(cbOutputEnable)
+                                        .addPreferredGap(ComponentPlacement.RELATED)
+                                        .addComponent(fldOutput, GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE))
+                                    .addGroup(gl_pnlInputMain.createSequentialGroup()
+                                        .addComponent(cbCommentLocal)
+                                        .addPreferredGap(ComponentPlacement.RELATED)
+                                        .addComponent(fldComment, GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)))
+                                .addPreferredGap(ComponentPlacement.RELATED)
+                                .addComponent(btnComment))))
+                    .addComponent(btnApply, Alignment.TRAILING))
                 .addContainerGap())
         );
-        jPanel3Layout.setVerticalGroup(
-            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(jPanel3Layout.createSequentialGroup()
+        gl_pnlInputMain.setVerticalGroup(
+            gl_pnlInputMain.createParallelGroup(Alignment.LEADING)
+            .addGroup(gl_pnlInputMain.createSequentialGroup()
                 .addContainerGap()
-                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(idField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
-                    .addComponent(idLabel))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(movieLabel)
-                    .addComponent(movieFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
-                    .addComponent(movieFileSelectButton)
-                    .addComponent(useMovieLocalCheckBox))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(commentLabel)
-                    .addComponent(commentFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
-                    .addComponent(commentFileSelectButton)
-                    .addComponent(useCommentLocalCheckBox))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
-                    .addComponent(outputLabel)
-                    .addComponent(outputFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
-                    .addComponent(outputConvertCheckBox))
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
-                .addComponent(applyButton)
-                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                .addGroup(gl_pnlInputMain.createParallelGroup(Alignment.BASELINE)
+                    .addComponent(fldId, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+                    .addComponent(lblId)
+                    .addComponent(cbBackLogReduce)
+                    .addComponent(cbBackLog)
+                    .addComponent(fldBackLog)
+                )
+                .addPreferredGap(ComponentPlacement.RELATED)
+                .addGroup(gl_pnlInputMain.createParallelGroup(Alignment.BASELINE)
+                    .addComponent(lblVideo)
+                    .addComponent(fldVideo, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+                    .addComponent(btnVideo)
+                    .addComponent(cbVideoLocal))
+                .addPreferredGap(ComponentPlacement.RELATED)
+                .addGroup(gl_pnlInputMain.createParallelGroup(Alignment.BASELINE)
+                    .addComponent(lblComment)
+                    .addComponent(fldComment, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+                    .addComponent(btnComment)
+                    .addComponent(cbCommentLocal))
+                .addPreferredGap(ComponentPlacement.RELATED)
+                .addGroup(gl_pnlInputMain.createParallelGroup(Alignment.BASELINE)
+                    .addComponent(lblOutput)
+                    .addComponent(fldOutput, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+                    .addComponent(cbOutputEnable))
+                .addPreferredGap(ComponentPlacement.UNRELATED)
+                .addComponent(btnApply)
+                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         );
 
-        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
-        jPanel1.setLayout(jPanel1Layout);
-        jPanel1Layout.setHorizontalGroup(
-            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
+        GroupLayout gl_pnlMain = new GroupLayout(pnlMain);
+        pnlMain.setLayout(gl_pnlMain);
+        gl_pnlMain.setHorizontalGroup(
+            gl_pnlMain.createParallelGroup(Alignment.LEADING)
+            .addGroup(Alignment.TRAILING, gl_pnlMain.createSequentialGroup()
                 .addContainerGap()
-                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
-                    .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
-                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE)
-                    .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                .addGroup(gl_pnlMain.createParallelGroup(Alignment.TRAILING)
+                    .addComponent(pnlInputMain, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addComponent(scrDisplay, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE)
+                    .addComponent(pnlButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                 .addContainerGap())
         );
-        jPanel1Layout.setVerticalGroup(
-            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
+        gl_pnlMain.setVerticalGroup(
+            gl_pnlMain.createParallelGroup(Alignment.LEADING)
+            .addGroup(Alignment.TRAILING, gl_pnlMain.createSequentialGroup()
                 .addContainerGap()
-                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
-                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
-                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addComponent(scrDisplay, GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE)
+                .addPreferredGap(ComponentPlacement.RELATED)
+                .addComponent(pnlButton, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(ComponentPlacement.RELATED)
+                .addComponent(pnlInputMain, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                 .addGap(24, 24, 24))
         );
 
@@ -275,21 +328,50 @@ public class MainFrame extends javax.swing.JFrame {
         JMenuBar menuBar = initMenuBar();
         setJMenuBar(menuBar);
 
-        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+        GroupLayout layout = new GroupLayout(getContentPane());
         getContentPane().setLayout(layout);
         layout.setHorizontalGroup(
-            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+            layout.createParallelGroup(Alignment.LEADING)
+            .addComponent(pnlMain, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
         );
         layout.setVerticalGroup(
-            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
-            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+            layout.createParallelGroup(Alignment.LEADING)
+            .addComponent(pnlMain, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
         );
 
         pack();
+        initInputPanel();
+        pnlMain.setTransferHandler(new DownloadListTransferHandler());
+        tblDisplay.setTransferHandler(new TableTransferHandler());
+
+        final Config p = Config.INSTANCE;
+        // TODO コンフィグからスレッド数
+        taskManager = new TaskManage(1, 1);
+
+    }
+
+    private class ApplyActionListener implements ActionListener {
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            final DownloadProfile prof = new InqubusDownloadProfile();
+            final String id = Util.getVideoId(fldId.getText());
+            logger.log(Level.INFO, prof.toString());
+            // TODO 処理開始
+//            new Download(prof, id).execute();
+        }
+    }
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
     }// </editor-fold>//GEN-END:initComponents
 
-    private File searchFileMatchId(final File dir, final String id) throws UnsupportedOperationException {
+    private File searchFileMatchId(final File dir, final String id) {
         // TODO 候補は複数返すようにして、その後の対処は呼び出しもとで行ってもらった方が良いかも
         if (id.isEmpty()) {
             return null;
@@ -315,20 +397,20 @@ public class MainFrame extends javax.swing.JFrame {
     }
 
     private void useMovieLocalCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_useMovieLocalCheckBoxItemStateChanged
-        final Properties p = Properties.INSTANCE;
+        final Config p = Config.INSTANCE;
 
         final ItemSelectable source = evt.getItemSelectable();
 
         JButton btn;
         JTextField field;
         File dir;
-        if (source == useMovieLocalCheckBox) {
-            btn = movieFileSelectButton;
-            field = movieFileField;
+        if (source == cbVideoLocal) {
+            btn = btnVideo;
+            field = fldVideo;
             dir = new File(p.getVideoDir());
         } else {
-            btn = commentFileSelectButton;
-            field = commentFileField;
+            btn = btnComment;
+            field = fldComment;
             dir = new File(p.getCommentDir());
         }
 
@@ -337,7 +419,7 @@ public class MainFrame extends javax.swing.JFrame {
 
         String text;
         if (useLocal) {
-            final File f = searchFileMatchId(dir, idField.getText());
+            final File f = searchFileMatchId(dir, fldId.getText());
             if (f != null) {
                 text = f.getPath();
             } else {
@@ -347,85 +429,98 @@ public class MainFrame extends javax.swing.JFrame {
             text = p.getVideoFileNamePattern();
         }
         field.setText(text);
+
+        fldId.setEnabled(!(cbVideoLocal.isSelected() && cbCommentLocal.isSelected()));
+
     }//GEN-LAST:event_useMovieLocalCheckBoxItemStateChanged
 
     private void outputConvertCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_outputConvertCheckBoxItemStateChanged
         final boolean convert = (evt.getStateChange() == ItemEvent.SELECTED);
-        outputFileField.setEnabled(convert);
+        fldOutput.setEnabled(convert);
     }//GEN-LAST:event_outputConvertCheckBoxItemStateChanged
 
     private void idFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_idFieldFocusLost
-        final Properties p = Properties.INSTANCE;
-        final String id = idField.getText();
+        final Config p = Config.INSTANCE;
+        final String id = fldId.getText();
         if (id.isEmpty()) {
             return;
         }
 
-        if (useMovieLocalCheckBox.isSelected() && movieFileField.getText().isEmpty()) {
+        if (cbVideoLocal.isSelected() && fldVideo.getText().isEmpty()) {
             final File dir = new File(p.getVideoDir());
             final File file = searchFileMatchId(dir, id);
             if (file != null) {
-                movieFileField.setText(file.getPath());
+                fldVideo.setText(file.getPath());
             }
         }
 
-        if (useCommentLocalCheckBox.isSelected() && commentFileField.getText().isEmpty()) {
+        if (cbCommentLocal.isSelected() && fldComment.getText().isEmpty()) {
             final File dir = new File(p.getCommentDir());
             final File file = searchFileMatchId(dir, id);
             if (file != null) {
-                commentFileField.setText(file.getPath());
+                fldComment.setText(file.getPath());
             }
         }
 
     }//GEN-LAST:event_idFieldFocusLost
     // Variables declaration - do not modify//GEN-BEGIN:variables
-    private javax.swing.JButton applyButton;
-    private javax.swing.JTextField commentFileField;
-    private javax.swing.JButton commentFileSelectButton;
-    private javax.swing.JLabel commentLabel;
-    private javax.swing.JTextField idField;
-    private javax.swing.JLabel idLabel;
-    private javax.swing.JButton jButton2;
-    private javax.swing.JButton jButton3;
-    private javax.swing.JButton jButton4;
-    private javax.swing.JPanel jPanel1;
-    private javax.swing.JPanel jPanel2;
-    private javax.swing.JPanel jPanel3;
-    private javax.swing.JScrollPane jScrollPane1;
-    private javax.swing.JTable jTable1;
-    private javax.swing.JTextField movieFileField;
-    private javax.swing.JButton movieFileSelectButton;
-    private javax.swing.JLabel movieLabel;
-    private javax.swing.JCheckBox outputConvertCheckBox;
-    private javax.swing.JTextField outputFileField;
-    private javax.swing.JLabel outputLabel;
-    private javax.swing.JCheckBox useCommentLocalCheckBox;
-    private javax.swing.JCheckBox useMovieLocalCheckBox;
+    private final JTable tblDisplay;
+    // ボタン領域
+    private final JButton btnStart;
+    private final JButton btnStop;
+    private final JButton btnDeselect;
+    //入力領域 - 標準
+    private final JTextField fldId;
+    private final JCheckBox cbBackLogReduce = new JCheckBox("コメ数減少");
+    private final JCheckBox cbBackLog = new JCheckBox("過去ログ");
+    private final JTextField fldBackLog = new JTextField();
+    private final JCheckBox cbVideoLocal;
+    private final JTextField fldVideo;
+    private final JButton btnVideo;
+    private final JCheckBox cbCommentLocal;
+    private final JTextField fldComment;
+    private final JButton btnComment;
+    private final JCheckBox cbOutputEnable;
+    private final JTextField fldOutput;
+    // 適用
+    private final JButton btnApply = new JButton("適用");
     // End of variables declaration//GEN-END:variables
 
     private void initInputPanel() {
-        idField.setText("");
+        final Config p = Config.INSTANCE;
 
-        final Properties p = Properties.INSTANCE;
+        fldId.setText("");
+        fldBackLog.setEnabled(false);
+        fldBackLog.setToolTipText("YYYY/MM/DD hh:mm:ss形式、あるいは1970/01/01からの経過秒を入力します。");
+        cbBackLog.setEnabled(true);
+        cbBackLog.addItemListener(new ItemListener() {
+
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                final boolean selected = (e.getStateChange() == ItemEvent.SELECTED);
+                fldBackLog.setEnabled(selected);
+            }
+        });
+        cbBackLogReduce.setToolTipText("「コメントの量を減らす」場合はチェックを付けます。");
 
         final boolean movieLocal = p.getVideoUseLocal();
-        useMovieLocalCheckBox.setSelected(movieLocal);
-        movieFileSelectButton.setEnabled(movieLocal);
+        cbVideoLocal.setSelected(movieLocal);
+        btnVideo.setEnabled(movieLocal);
         if (!movieLocal) {
-            movieFileField.setText(p.getVideoFileNamePattern());
+            fldVideo.setText(p.getVideoFileNamePattern());
         }
 
         final boolean commentLocal = p.getCommentUseLocal();
-        useCommentLocalCheckBox.setSelected(commentLocal);
-        commentFileSelectButton.setEnabled(commentLocal);
+        cbCommentLocal.setSelected(commentLocal);
+        btnComment.setEnabled(commentLocal);
         if (!commentLocal) {
-            commentFileField.setText(p.getCommentFileNamePattern());
+            fldComment.setText(p.getCommentFileNamePattern());
         }
 
         final boolean convert = p.getOutputEnable();
-        outputConvertCheckBox.setSelected(convert);
-        outputFileField.setEnabled(convert);
-        outputFileField.setText(p.getOutputFileNamePattern());
+        cbOutputEnable.setSelected(convert);
+        fldOutput.setEnabled(convert);
+        fldOutput.setText(p.getOutputFileNamePattern());
 
     }
 
@@ -483,6 +578,24 @@ public class MainFrame extends javax.swing.JFrame {
         return menuBar;
     }
 
+    private class DownloadProgressListener implements WorkerListener<DownloadProgress> {
+
+        @Override
+        public void process(DownloadProgress progress) {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+    }
+
+    private class ConvertProgressListener implements WorkerListener<ConvertProgress> {
+
+        @Override
+        public void process(ConvertProgress progress) {
+            throw new UnsupportedOperationException("Not supported yet.");
+        }
+    }
+
+
+
     private class DownloadListTransferHandler extends TransferHandler {
 
         private static final long serialVersionUID = 1L;
@@ -541,4 +654,269 @@ public class MainFrame extends javax.swing.JFrame {
             return super.importData(support);
         }
     }
+
+
+    private class InqubusDownloadProfile implements DownloadProfile {
+
+        private final LoginProfile loginProfile;
+        private final ProxyProfile proxyProfile;
+        private final VideoProfile videoProfile;
+        private final CommentProfile commentProfile;
+        private final GeneralProfile generalProfile;
+
+        private InqubusDownloadProfile() {
+            this.loginProfile = new InqubusLoginProfile();
+            this.proxyProfile = new InqubusProxyProfile();
+            this.videoProfile = new InqubusVideoProfile();
+            this.commentProfile = new InqubusCommentProfile();
+            this.generalProfile = new InqubusGeneralProfile();
+        }
+
+        @Override
+        public LoginProfile getLoginInfo() {
+            return this.loginProfile;
+        }
+
+        @Override
+        public ProxyProfile getProxyProfile() {
+            return this.proxyProfile;
+        }
+
+        @Override
+        public VideoProfile getVideoProfile() {
+            return this.videoProfile;
+        }
+
+        @Override
+        public CommentProfile getCommentProfile() {
+            return this.commentProfile;
+        }
+
+        @Override
+        public GeneralProfile getGeneralProfile() {
+            return this.generalProfile;
+        }
+
+        @Override
+        public String toString(){
+            return ToStringBuilder.reflectionToString(this);
+        }
+    }
+
+    private class InqubusLoginProfile implements LoginProfile {
+        private final String mail;
+        private final String password;
+
+        private InqubusLoginProfile(){
+            final Config p = Config.INSTANCE;
+            this.mail = p.getId();
+            this.password = p.getPassword();
+        }
+
+        @Override
+        public String getMail() {
+            return this.mail;
+        }
+
+        @Override
+        public String getPassword() {
+            return this.password;
+        }
+
+        @Override
+        public String toString(){
+            return ToStringBuilder.reflectionToString(this);
+        }
+    }
+
+    private class InqubusProxyProfile implements ProxyProfile {
+        private final boolean use;
+        private final String host;
+        private final int port;
+
+        private InqubusProxyProfile(){
+            final Config p = Config.INSTANCE;
+            this.use = p.getProxyUse();
+            this.host = p.getProxyHost();
+            final String pp = p.getProxyPort();
+            this.port = StringUtils.isBlank(pp) ? -1 : Integer.parseInt(pp);
+        }
+
+        @Override
+        public boolean use() {
+            return this.use;
+        }
+
+        @Override
+        public String getHost() {
+            return this.host;
+        }
+
+        @Override
+        public int getPort() {
+            return this.port;
+        }
+
+        @Override
+        public String toString(){
+            return ToStringBuilder.reflectionToString(this);
+        }
+    }
+
+    private class InqubusVideoProfile implements VideoProfile {
+        private final boolean download;
+        private final File dir;
+        private final String fileName;
+        private final File localFile;
+
+        private InqubusVideoProfile(){
+            final Config p = Config.INSTANCE;
+            this.download = !cbVideoLocal.isSelected();
+            if (this.download) {
+                this.dir = new File(p.getVideoDir());
+                this.fileName = fldVideo.getText();
+                this.localFile = null;
+            } else {
+                this.dir = null;
+                this.fileName = null;
+                this.localFile = new File(fldVideo.getText());
+            }
+        }
+
+        @Override
+        public boolean isDownload() {
+            return this.download;
+        }
+
+        @Override
+        public File getDir() {
+            return this.dir;
+        }
+
+        @Override
+        public String getFileName() {
+            return this.fileName;
+        }
+
+        @Override
+        public File getLocalFile() {
+            return this.localFile;
+        }
+
+        @Override
+        public String toString(){
+            return ToStringBuilder.reflectionToString(this);
+        }
+    }
+
+    private class InqubusCommentProfile implements CommentProfile {
+        private final boolean download;
+        private final File dir;
+        private final String fileName;
+        private final File localFile;
+        private final int lengthRelatedCommentSize;
+        private final boolean disablePerMinComment;
+        private final int perMinCommentSize;
+        private final long backLogPoint;
+
+        private InqubusCommentProfile() {
+            final Config p = Config.INSTANCE;
+            this.download = !cbVideoLocal.isSelected();
+            if (this.download) {
+                this.dir = new File(p.getVideoDir());
+                this.fileName = fldVideo.getText();
+                this.localFile = null;
+            } else {
+                this.dir = null;
+                this.fileName = null;
+                this.localFile = new File(fldVideo.getText());
+            }
+
+            if(cbBackLog.isSelected()) {
+                try {
+                    this.backLogPoint = WayBackTimeParser.parse(fldBackLog.getText());
+                } catch (IOException ex) {
+                    throw new IllegalArgumentException("過去ログ時刻指定が誤っています。", ex);
+                }
+            } else {
+                this.backLogPoint = -1L;
+            }
+
+            this.disablePerMinComment = cbBackLogReduce.isSelected();
+            this.lengthRelatedCommentSize
+                    = (p.getCommentSizeAutosize()) ? -1 : Integer.parseInt(p.getCommentSizeManual());
+            this.perMinCommentSize
+                    = (p.getCommentMinSizeAutosize()) ? -1 : Integer.parseInt(p.getCommentMinSizeManual());
+        }
+
+        @Override
+        public boolean isDownload() {
+            return this.download;
+        }
+
+        @Override
+        public File getDir() {
+            return this.dir;
+        }
+
+        @Override
+        public String getFileName() {
+            return this.fileName;
+        }
+
+        @Override
+        public File getLocalFile() {
+            return this.localFile;
+        }
+
+        @Override
+        public int getLengthRelatedCommentSize() {
+            return this.lengthRelatedCommentSize;
+        }
+
+        @Override
+        public boolean isDisablePerMinComment() {
+            return this.disablePerMinComment;
+        }
+
+        @Override
+        public int getPerMinCommentSize() {
+            return this.perMinCommentSize;
+        }
+
+        @Override
+        public long getBackLogPoint() {
+            return this.backLogPoint;
+        }
+
+        @Override
+        public String toString(){
+            return ToStringBuilder.reflectionToString(this);
+        }
+    }
+
+    private class InqubusGeneralProfile implements GeneralProfile {
+        private final String replaceFrom;
+        private final String replaceTo;
+        private InqubusGeneralProfile() {
+            final Config p = Config.INSTANCE;
+            this.replaceFrom = p.getReplaceFrom();
+            this.replaceTo = p.getReplaceTo();
+        }
+
+        @Override
+        public String getReplaceFrom() {
+            return this.replaceFrom;
+        }
+
+        @Override
+        public String getReplaceTo() {
+            return this.replaceTo;
+        }
+
+        @Override
+        public String toString(){
+            return ToStringBuilder.reflectionToString(this);
+        }
+    }
 }