OSDN Git Service

タブパネルに変更
authorhaya4 <hayashi.yuu@gmail.com>
Sun, 25 Aug 2019 12:28:00 +0000 (21:28 +0900)
committerhaya4 <hayashi.yuu@gmail.com>
Sun, 25 Aug 2019 12:28:00 +0000 (21:28 +0900)
src/i18n.properties
src/i18n_ja_JP.properties
src/osm/jp/gpx/matchtime/gui/AdjustTime.java
src/osm/jp/gpx/matchtime/gui/Card.java [new file with mode: 0644]

index 2962feb..af470a9 100644 (file)
@@ -9,22 +9,26 @@ button.previous=Previous
 button.execute=Execute
 button.select=Selection...
 
+tab.100=1. Source image Folder
 label.100=<html><p>1. Select image source folder.</p><ul><li>If you perform a copy operation, the file update time may be rewritten to the time the copy was executed. It is recommended to directly specify the folder in the camera SD card.</li></ul>
 label.110=Image Folder
 
+tab.200=2. Set correct shooting time
 label.200=<html><p>2. Choose an image whose exact shooting time can be known.</p><ul><li>If the camera's clock is accurate, you can choose any image.</li></ul>
 label.210=Reference time image
 label.220=Based on EXIF date and time
 label.230=Based on FILE UPDATE time
-
+tab.300=2a. Set correct shooting time
 label.300=<html><p>3. enter the correct shooting time.</p><ul><li>If the camera clock is accurate, you do not need to change the setting.</li></ul>
 label.310=Reference time
 
+tab.400=3. Select GPX files
 label.400=<html><p>4. Please select a GPX file to perform the matching.</p><ul><li>If you specify a folder, it will target all GPX files in the folder.</li></ul>
 label.410=GPX folder
 label.420=Ignore the first node of segment 'trkseg'
 label.430=Also make the generated GPX file (the one whose filename ends with '_.gpx') as the target of conversion
 
+tab.500=4. perform EXIF conversion
 label.500=Select whether to perform EXIF conversion
 label.501=When performing EXIF conversion, you also need to specify the folder to output the converted file.
 label.502=The output folder must have write permission and sufficient free space.
index 6f75d3d..7504efd 100644 (file)
@@ -9,22 +9,27 @@ button.previous=\u623b\u308b
 button.execute=\u51e6\u7406\u5b9f\u884c
 button.select=\u9078\u629e...
 
+tab.100=1. \u753b\u50cf\u5143\u306e\u30d5\u30a1\u30a4\u30eb\u30d5\u30a9\u30eb\u30c0
 label.100=<html><p>1. \u4f4d\u7f6e\u60c5\u5831\u3092\u4ed8\u52a0\u3057\u305f\u3044\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u304c\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002</p><ul><li>\u30b3\u30d4\u30fc\u52d5\u4f5c\u3092\u884c\u3046\u3068\u3001\u30d5\u30a1\u30a4\u30eb\u66f4\u65b0\u6642\u523b\u304c\u30b3\u30d4\u30fc\u3092\u5b9f\u884c\u3057\u305f\u6642\u523b\u306b\u66f8\u304d\u63db\u308f\u3063\u3066\u3057\u307e\u3046\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002\u30ab\u30e1\u30e9SD\u30ab\u30fc\u30c9\u5185\u306e\u30d5\u30a9\u30eb\u30c0\u3092\u76f4\u63a5\u6307\u5b9a\u3059\u308b\u3053\u3068\u3092\u304a\u3059\u3059\u3081\u3057\u307e\u3059\u3002</li></ul>
 label.110=\u5bfe\u8c61\u30d5\u30a9\u30eb\u30c0
 
+tab.200=2. \u57fa\u6e96\u3068\u3059\u308b\u753b\u50cf\u306e\u9078\u629e
 label.200=<html><p>2. \u6b63\u78ba\u306a\u64ae\u5f71\u6642\u523b\u304c\u5224\u660e\u3067\u304d\u308b\u753b\u50cf\u3092\u9078\u3093\u3067\u304f\u3060\u3055\u3044\u3002</p><ul><li>\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u306e\u6642\u8a08\u753b\u9762\uff08\u79d2\u304c\u5224\u5225\u3067\u304d\u308b\u3053\u3068\uff09\u3092\u64ae\u5f71\u3057\u305f\u753b\u50cf</li><li>\u30ab\u30e1\u30e9\u306e\u6642\u8a08\u304c\u6b63\u78ba\u306a\u3089\u3070\u3001\u3069\u306e\u753b\u50cf\u3092\u9078\u3093\u3067\u3082\u69cb\u3044\u307e\u305b\u3093\u3002</li></ul>
 label.210=\u57fa\u6e96\u6642\u523b\u753b\u50cf
 label.220=EXIF\u306e\u65e5\u6642\u3092\u57fa\u6e96\u306b\u3059\u308b
 label.230=\u30d5\u30a1\u30a4\u30eb\u66f4\u65b0\u65e5\u6642\u3092\u57fa\u6e96\u306b\u3059\u308b
 
+tab.300=2a. \u672c\u5f53\u306e\u6642\u523b\u3092\u8a2d\u5b9a
 label.300=<html><p>3. \u6b63\u78ba\u306a\u64ae\u5f71\u6642\u523b\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002</p><ul><li>\u30ab\u30e1\u30e9\u306e\u6642\u8a08\u304c\u6b63\u78ba\u306a\u3089\u3070\u3001\u8a2d\u5b9a\u3092\u5909\u66f4\u3059\u308b\u5fc5\u8981\u306f\u3042\u308a\u307e\u305b\u3093\u3002</li></ul>
 label.310=\u57fa\u6e96\u6642\u523b
 
+tab.400=3. GPX\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e
 label.400=<html><p>4. \u30d2\u30e2\u4ed8\u3092\u884c\u3046GPX\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002</p><ul><li>\u30d5\u30a9\u30eb\u30c0\u3092\u6307\u5b9a\u3059\u308b\u3068\u3001\u30d5\u30a9\u30eb\u30c0\u5185\u306b\u3042\u308b\u3059\u3079\u3066\u306eGPX\u30d5\u30a1\u30a4\u30eb\u3092\u5bfe\u8c61\u3068\u3057\u307e\u3059\u3002</li></ul>
 label.410=GPX\u30d5\u30a9\u30eb\u30c0
 label.420=\u30bb\u30b0\u30e1\u30f3\u30c8'trkseg'\u306e\u6700\u521d\u306e\uff11\u30ce\u30fc\u30c9\u306f\u7121\u8996\u3059\u308b
 label.430=\u751f\u6210\u3055\u308c\u305fGPX\u30d5\u30a1\u30a4\u30eb\uff08\u30d5\u30a1\u30a4\u30eb\u540d\u304c'_.gpx'\u3067\u7d42\u308f\u308b\u3082\u306e\uff09\u3082\u5909\u63db\u306e\u5bfe\u8c61\u306b\u3059\u308b
 
+tab.500=4. EXIF\u5909\u63db\u306e\u5b9f\u884c
 label.500=EXIF\u5909\u63db\u3092\u884c\u3046\u304b\u3069\u3046\u304b\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044
 label.501=EXIF\u5909\u63db\u3092\u884c\u3046\u5834\u5408\u306b\u306f\u3001\u5909\u63db\u30d5\u30a1\u30a4\u30eb\u3092\u51fa\u529b\u3059\u308b\u30d5\u30a9\u30eb\u30c0\u3082\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
 label.502=\u51fa\u529b\u30d5\u30a9\u30eb\u30c0\u306b\u306f\u3001\u66f8\u304d\u8fbc\u307f\u6a29\u9650\u3068\u3001\u5341\u5206\u306a\u7a7a\u304d\u5bb9\u91cf\u304c\u5fc5\u8981\u3067\u3059\u3002
index 5ab17fd..999f895 100644 (file)
@@ -23,8 +23,8 @@ import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
 public class AdjustTime extends JFrame
 {
     public static final String PROGRAM_NAME = "AdjustTime for JOSM";
-    public static final String PROGRAM_VARSION = "4.01";
-    public static final String PROGRAM_UPDATE = "2018/09/17";
+    public static final String PROGRAM_VARSION = "5.01";
+    public static final String PROGRAM_UPDATE = "2019/08/25";
 
     AppParameters params;
     SimpleDateFormat dfjp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
@@ -34,7 +34,7 @@ public class AdjustTime extends JFrame
     public ResourceBundle i18n = ResourceBundle.getBundle("i18n");
     
     //{{DECLARE_CONTROLS
-    JPanel cardPanel;       // ウィザード形式パネル(カード型)
+    JTabbedPane cardPanel;       // ウィザード形式パネル(タブ型)
     JPanel[] cards;
     int cardPanelNo = 0;
     JPanel argsPanel;          // パラメータ設定パネル       (上部)
@@ -46,7 +46,6 @@ public class AdjustTime extends JFrame
     JCheckBox noFirstNode;     // GPX: <trkseg>セグメントの最初の1ノードは無視する。 {ON | OFF}
     JCheckBox gpxReuse;                // 生成されたGPXファイル(ファイル名が'_.gpx'で終わるもの)も対象にする。 {ON | OFF}
     JTextArea textArea;                // 実行結果表示領域
-    //ImagePreview imagePane;  // 基準時刻画像表示
     ParameterPanelFolder arg1_srcFolder;
     ParameterPanelImageFile arg2_baseTimeImg;
     ParameterPanel arg3_basetime;      // 基準時刻:
@@ -64,8 +63,6 @@ public class AdjustTime extends JFrame
     JButton zoomInButton;      // [Zoom in]ボタン
     JButton zoomOutButton;     // [Zoom out]ボタン
     
-    JButton nextButton;     // [次へ]ボタン
-    JButton backButton;     // [戻る]ボタン
     JButton doButton;       // [処理実行]ボタン
     //}}
 
@@ -138,12 +135,6 @@ public class AdjustTime extends JFrame
             else if (object == doButton) {
                doButton_Action(event);
             }
-            else if (object == nextButton) {
-               nextButton_Action(event);
-            }
-            else if (object == backButton) {
-               backButton_Action(event);
-            }
         }
     }
     
@@ -184,228 +175,239 @@ public class AdjustTime extends JFrame
         params = new AppParameters();
         
         //---------------------------------------------------------------------
-        cardPanel = new JPanel();
-        cardPanel.setLayout(new CardLayout());
+        cardPanel = new JTabbedPane(JTabbedPane.LEFT);
         mainPanel.add(cardPanel, BorderLayout.CENTER);
         
-        nextButton = new JButton(i18n.getString("button.next"));
-        southPanel.add(nextButton, BorderLayout.EAST);
-
-        backButton = new JButton(i18n.getString("button.previous"));
-        southPanel.add(backButton, BorderLayout.WEST);
-
         cards = new JPanel[5];
-        for (int i=0; i < 5; i++) {
-            cards[i] = new JPanel();
-            cardPanel.add(cards[i], String.valueOf(i));
-        }
         cardPanelNo = 0;
 
         //---------------------------------------------------------------------
         // 1.[対象フォルダ]設定パネル
         int cardNo = 0;
-        cards[cardNo].setLayout(new BorderLayout());
-        JLabel label1 = new JLabel();
-        label1.setText(i18n.getString("label.100"));
-        cards[cardNo].add(label1, BorderLayout.NORTH);
-        
-        argsPanel = new JPanel();
-        argsPanel.setLayout(new BoxLayout(argsPanel, BoxLayout.Y_AXIS));
-        arg1_srcFolder = new ParameterPanelFolder(i18n.getString("label.110") +": ", params.getProperty(AppParameters.IMG_SOURCE_FOLDER));
-        argsPanel.add(arg1_srcFolder);
-        cards[cardNo].add(argsPanel, BorderLayout.CENTER);
+        {
+            Card card = new Card(cardPanel, i18n.getString("tab.100"), -1, 1);
+            cardPanel.addTab(card.getTitle(), card);
+            cards[cardNo] = card;
+
+            JLabel label1 = new JLabel();
+            label1.setText(i18n.getString("label.100"));
+            card.mainPanel.add(label1, BorderLayout.NORTH);
+
+            argsPanel = new JPanel();
+            argsPanel.setLayout(new BoxLayout(argsPanel, BoxLayout.Y_AXIS));
+            arg1_srcFolder = new ParameterPanelFolder(i18n.getString("label.110") +": ", params.getProperty(AppParameters.IMG_SOURCE_FOLDER));
+            argsPanel.add(arg1_srcFolder);
+            card.mainPanel.add(argsPanel, BorderLayout.CENTER);
+        }
         
         //---------------------------------------------------------------------
         // 2.[基準時刻画像]設定パネル
         cardNo++;
-        cards[cardNo].setLayout(new BorderLayout());
-        JLabel label2 = new JLabel();
-        label2.setText(i18n.getString("label.200"));
-        cards[cardNo].add(label2, BorderLayout.NORTH);
-
-        argsPanel = new JPanel();
-        
-        // 基準時刻画像
-        argsPanel.setLayout(new BoxLayout(argsPanel, BoxLayout.Y_AXIS));
-        arg2_baseTimeImg = new ParameterPanelImageFile(i18n.getString("label.210") +": ", params.getProperty(AppParameters.IMG_BASE_FILE), arg1_srcFolder);
-        argsPanel.add(arg2_baseTimeImg);
-        
-        baseTimeGroup = new ButtonGroup();
-        
-        // EXIFの日時を基準にする
-        exifBase = new JRadioButton(i18n.getString("label.220"));
-        
-        // ファイル更新日時を基準にする
-        fupdateBase = new JRadioButton(i18n.getString("label.230"));
-        baseTimeGroup.add(exifBase);
-        baseTimeGroup.add(fupdateBase);
-        argsPanel.add(exifBase);
-        argsPanel.add(fupdateBase);
-        if (params.getProperty(AppParameters.GPX_BASETIME).equals("EXIF_TIME")) {
-            fupdateBase.setSelected(false);
-            exifBase.setSelected(true);
-        }
-        else {
-            fupdateBase.setSelected(true);
-            exifBase.setSelected(false);
+        {
+            Card card = new Card(cardPanel, i18n.getString("tab.200"), 0, 2);
+            cardPanel.addTab(card.getTitle(), card);
+            cards[cardNo] = card;
+
+            JLabel label2 = new JLabel();
+            label2.setText(i18n.getString("label.200"));
+            card.mainPanel.add(label2, BorderLayout.NORTH);
+
+            argsPanel = new JPanel();
+
+            // 基準時刻画像
+            argsPanel.setLayout(new BoxLayout(argsPanel, BoxLayout.Y_AXIS));
+            arg2_baseTimeImg = new ParameterPanelImageFile(i18n.getString("label.210") +": ", params.getProperty(AppParameters.IMG_BASE_FILE), arg1_srcFolder);
+            argsPanel.add(arg2_baseTimeImg);
+
+            baseTimeGroup = new ButtonGroup();
+
+            // EXIFの日時を基準にする
+            exifBase = new JRadioButton(i18n.getString("label.220"));
+
+            // ファイル更新日時を基準にする
+            fupdateBase = new JRadioButton(i18n.getString("label.230"));
+            baseTimeGroup.add(exifBase);
+            baseTimeGroup.add(fupdateBase);
+            argsPanel.add(exifBase);
+            argsPanel.add(fupdateBase);
+            if (params.getProperty(AppParameters.GPX_BASETIME).equals("EXIF_TIME")) {
+                fupdateBase.setSelected(false);
+                exifBase.setSelected(true);
+            }
+            else {
+                fupdateBase.setSelected(true);
+                exifBase.setSelected(false);
+            }
+            card.mainPanel.add(argsPanel, BorderLayout.CENTER);
         }
-        cards[cardNo].add(argsPanel, BorderLayout.CENTER);
         
         //---------------------------------------------------------------------
-        // 3.基準時刻の入力画面
+        // 2a.基準時刻の入力画面
         cardNo++;
-        cards[cardNo].setLayout(new BorderLayout());
-        argsPanel = new JPanel();
-        argsPanel.setLayout(new GridLayout(2, 1));
-
-        // 3. 正確な撮影時刻を入力してください。
-        //    カメラの時計が正確ならば、設定を変更する必要はありません。
-        JLabel label3 = new JLabel();
-        label3.setText(i18n.getString("label.300"));
-        argsPanel.add(label3);
-        
-        // 基準時刻:
-        String str310 = String.format("  %s: ", i18n.getString("label.310"));
-        arg3_basetime = new ParameterPanel(str310, ImportPicture.TIME_FORMAT_STRING);
-        argsPanel.add(arg3_basetime);
-        cards[cardNo].add(argsPanel, BorderLayout.NORTH);
-
-        // 参考画像
-        imageLabel = new JLabel();
-        imageSPane = new JScrollPane(imageLabel);
-        cards[cardNo].add(imageSPane, BorderLayout.CENTER);
-              
-        // 画像ファイル選択ダイアログを起動するボタン
-        buttonPanel = new JPanel();
-        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
-        openButton = new JButton(createImageIcon("images/Fit16.gif"));
-        buttonPanel.add(openButton);
-        zoomInButton = new JButton(createImageIcon("images/ZoomIn16.gif"));
-        buttonPanel.add(zoomInButton);
-        zoomOutButton = new JButton(createImageIcon("images/ZoomOut16.gif"));
-        buttonPanel.add(zoomOutButton);
-        cards[cardNo].add(buttonPanel, BorderLayout.SOUTH);
+        {
+            Card card = new Card(cardPanel, i18n.getString("tab.300"), 1, 3);
+            cardPanel.addTab(card.getTitle(), card);
+            cards[cardNo] = card;
+
+            argsPanel = new JPanel();
+            argsPanel.setLayout(new GridLayout(2, 1));
+
+            // 3. 正確な撮影時刻を入力してください。
+            //    カメラの時計が正確ならば、設定を変更する必要はありません。
+            JLabel label3 = new JLabel();
+            label3.setText(i18n.getString("label.300"));
+            argsPanel.add(label3);
+
+            // 基準時刻:
+            String str310 = String.format("  %s: ", i18n.getString("label.310"));
+            arg3_basetime = new ParameterPanel(str310, ImportPicture.TIME_FORMAT_STRING);
+            argsPanel.add(arg3_basetime);
+            card.mainPanel.add(argsPanel, BorderLayout.NORTH);
+
+            // 参考画像
+            imageLabel = new JLabel();
+            imageSPane = new JScrollPane(imageLabel);
+            card.mainPanel.add(imageSPane, BorderLayout.CENTER);
+
+            // 画像ファイル選択ダイアログを起動するボタン
+            buttonPanel = new JPanel();
+            buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
+            openButton = new JButton(createImageIcon("images/Fit16.gif"));
+            buttonPanel.add(openButton);
+            zoomInButton = new JButton(createImageIcon("images/ZoomIn16.gif"));
+            buttonPanel.add(zoomInButton);
+            zoomOutButton = new JButton(createImageIcon("images/ZoomOut16.gif"));
+            buttonPanel.add(zoomOutButton);
+            card.mainPanel.add(buttonPanel, BorderLayout.SOUTH);
+        }
         
         //---------------------------------------------------------------------
-        // 4.GPXファイル設定画面
+        // 3.GPXファイル設定画面
         cardNo++;
-        cards[cardNo].setLayout(new BorderLayout());
-        
-        // 4. ヒモ付を行うGPXファイルを選択してください。
-        //    - フォルダを指定すると、フォルダ内のすべてのGPXファイルを対象とします。
-        JLabel label4 = new JLabel();
-        label4.setText(i18n.getString("label.400"));
-        cards[cardNo].add(label4, BorderLayout.NORTH);
-        
-        JPanel tmpPanel4a = new JPanel();
-        tmpPanel4a.setLayout(new BoxLayout(tmpPanel4a, BoxLayout.Y_AXIS));
-        
-        // "GPXフォルダ: "
-        arg4_gpxFolder = new ParameterPanelGpx(
-            i18n.getString("label.410") + ": ", 
-            params.getProperty(AppParameters.GPX_SOURCE_FOLDER)
-        );
-        tmpPanel4a.add(arg4_gpxFolder);
-        
-        // "セグメント'trkseg'の最初の1ノードは無視する。"
-        noFirstNode = new JCheckBox(
-            i18n.getString("label.420"), 
-            params.getProperty(AppParameters.GPX_NO_FIRST_NODE).equals("ON")
-        );
-        tmpPanel4a.add(noFirstNode);
-        
-        // "生成されたGPXファイル(ファイル名が'_.gpx'で終わるもの)も変換の対象にする"
-        gpxReuse = new JCheckBox(
-            i18n.getString("label.430"),
-            params.getProperty(AppParameters.GPX_REUSE).equals("ON")
-        );
-        gpxReuse.setEnabled(true);
-        tmpPanel4a.add(gpxReuse);
-        cards[cardNo].add(tmpPanel4a, BorderLayout.CENTER);
+        {
+            Card card = new Card(cardPanel, i18n.getString("tab.400"), 2, 4);
+            cardPanel.addTab(card.getTitle(), card);
+            cards[cardNo] = card;
+
+            // 4. ヒモ付を行うGPXファイルを選択してください。
+            //    - フォルダを指定すると、フォルダ内のすべてのGPXファイルを対象とします。
+            JLabel label4 = new JLabel();
+            label4.setText(i18n.getString("label.400"));
+            card.mainPanel.add(label4, BorderLayout.NORTH);
+
+            JPanel tmpPanel4a = new JPanel();
+            tmpPanel4a.setLayout(new BoxLayout(tmpPanel4a, BoxLayout.Y_AXIS));
+
+            // "GPXフォルダ: "
+            arg4_gpxFolder = new ParameterPanelGpx(
+                i18n.getString("label.410") + ": ", 
+                params.getProperty(AppParameters.GPX_SOURCE_FOLDER)
+            );
+            tmpPanel4a.add(arg4_gpxFolder);
+
+            // "セグメント'trkseg'の最初の1ノードは無視する。"
+            noFirstNode = new JCheckBox(
+                i18n.getString("label.420"), 
+                params.getProperty(AppParameters.GPX_NO_FIRST_NODE).equals("ON")
+            );
+            tmpPanel4a.add(noFirstNode);
+
+            // "生成されたGPXファイル(ファイル名が'_.gpx'で終わるもの)も変換の対象にする"
+            gpxReuse = new JCheckBox(
+                i18n.getString("label.430"),
+                params.getProperty(AppParameters.GPX_REUSE).equals("ON")
+            );
+            gpxReuse.setEnabled(true);
+            tmpPanel4a.add(gpxReuse);
+            card.mainPanel.add(tmpPanel4a, BorderLayout.CENTER);
+        }
         
         //---------------------------------------------------------------------
-        // 5.EXIF更新設定画面
+        // 4.EXIF更新設定画面
         cardNo++;
-        cards[cardNo].setLayout(new BorderLayout());
-
-        // 5. EXIF変換を行うかどうかを選択してください。
-        //    - EXIF変換を行う場合には、変換ファイルを出力するフォルダも指定する必要があります。
-        //    - 出力フォルダには、書き込み権限と、十分な空き容量が必要です。
-        JLabel label5 = new JLabel();
-        label5.setText(
-            String.format(
-                "<html><p>5. %s</p><ul><li>%s</li><li>%s</li></ul>",
-                i18n.getString("label.500"),
-                i18n.getString("label.501"),
-                i18n.getString("label.502")
-            )
-        );
-        cards[cardNo].add(label5, BorderLayout.NORTH);
-        
-        JPanel tmpPanel5 = new JPanel();
-        tmpPanel5.setLayout(new BoxLayout(tmpPanel5, BoxLayout.Y_AXIS));
-
-        // "IMGの変換をする"
-        outputIMG = new JCheckBox(
-            i18n.getString("label.510"), 
-            Boolean.parseBoolean(params.getProperty(AppParameters.IMG_OUTPUT))
-        );
-        tmpPanel5.add(outputIMG);
-
-        // "GPXファイル時間外のファイルもコピーする"
-        outputIMG_all = new JCheckBox(
-            i18n.getString("label.520"),
-            Boolean.parseBoolean(params.getProperty(AppParameters.IMG_OUTPUT_ALL))
-        );
-        tmpPanel5.add(outputIMG_all);
-
-        // "出力フォルダ: "
-        arg5_outputFolder = new ParameterPanelFolder(
-            i18n.getString("label.530") + ": ",
-            params.getProperty(AppParameters.IMG_OUTPUT_FOLDER)
-        );
-        tmpPanel5.add(arg5_outputFolder);
-
-        // "EXIFの変換をする"
-        exifON = new JCheckBox(
-            i18n.getString("label.540"),
-            Boolean.parseBoolean(params.getProperty(AppParameters.IMG_OUTPUT_EXIF))
-        );
-        tmpPanel5.add(exifON);
-        
-        // "ポイントマーカー<WPT>をGPXファイルに出力する"
-        gpxOutputWpt = new JCheckBox(
-            i18n.getString("label.550"),
-            Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_WPT))
-        );
-        gpxOutputWpt.setEnabled(true);
-        tmpPanel5.add(gpxOutputWpt);
-        
-        // "ソースGPXの<MAGVAR>を無視する"
-        gpxOverwriteMagvar = new JCheckBox(
-            i18n.getString("label.560"),
-            Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OVERWRITE_MAGVAR))
-        );
-        gpxOverwriteMagvar.setEnabled(true);
-        tmpPanel5.add(gpxOverwriteMagvar);
-        
-        // "出力GPXに<SPEED>を上書きする"
-        gpxOutputSpeed = new JCheckBox(
-            i18n.getString("label.570"),
-            Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_SPEED))
-        );
-        gpxOutputSpeed.setEnabled(true);
-        tmpPanel5.add(gpxOutputSpeed);
-        
-        cards[cardNo].add(tmpPanel5, BorderLayout.CENTER);
-        
-        // "処理実行"
-        doButton = new JButton(
-            i18n.getString("button.execute"),
-            AdjustTime.createImageIcon("images/media_playback_start.png")
-        );
-        cards[cardNo].add(doButton, BorderLayout.SOUTH);
-
+        {
+            Card card = new Card(cardPanel, i18n.getString("tab.500"), 3, -1);
+            cardPanel.addTab(card.getTitle(), card);
+            cards[cardNo] = card;
+            
+            // 5. EXIF変換を行うかどうかを選択してください。
+            //    - EXIF変換を行う場合には、変換ファイルを出力するフォルダも指定する必要があります。
+            //    - 出力フォルダには、書き込み権限と、十分な空き容量が必要です。
+            JLabel label5 = new JLabel();
+            label5.setText(
+                String.format(
+                    "<html><p>5. %s</p><ul><li>%s</li><li>%s</li></ul>",
+                    i18n.getString("label.500"),
+                    i18n.getString("label.501"),
+                    i18n.getString("label.502")
+                )
+            );
+            card.mainPanel.add(label5, BorderLayout.NORTH);
+
+            JPanel tmpPanel5 = new JPanel();
+            tmpPanel5.setLayout(new BoxLayout(tmpPanel5, BoxLayout.Y_AXIS));
+
+            // "IMGの変換をする"
+            outputIMG = new JCheckBox(
+                i18n.getString("label.510"), 
+                Boolean.parseBoolean(params.getProperty(AppParameters.IMG_OUTPUT))
+            );
+            tmpPanel5.add(outputIMG);
+
+            // "GPXファイル時間外のファイルもコピーする"
+            outputIMG_all = new JCheckBox(
+                i18n.getString("label.520"),
+                Boolean.parseBoolean(params.getProperty(AppParameters.IMG_OUTPUT_ALL))
+            );
+            tmpPanel5.add(outputIMG_all);
+
+            // "出力フォルダ: "
+            arg5_outputFolder = new ParameterPanelFolder(
+                i18n.getString("label.530") + ": ",
+                params.getProperty(AppParameters.IMG_OUTPUT_FOLDER)
+            );
+            tmpPanel5.add(arg5_outputFolder);
+
+            // "EXIFの変換をする"
+            exifON = new JCheckBox(
+                i18n.getString("label.540"),
+                Boolean.parseBoolean(params.getProperty(AppParameters.IMG_OUTPUT_EXIF))
+            );
+            tmpPanel5.add(exifON);
+
+            // "ポイントマーカー<WPT>をGPXファイルに出力する"
+            gpxOutputWpt = new JCheckBox(
+                i18n.getString("label.550"),
+                Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_WPT))
+            );
+            gpxOutputWpt.setEnabled(true);
+            tmpPanel5.add(gpxOutputWpt);
+
+            // "ソースGPXの<MAGVAR>を無視する"
+            gpxOverwriteMagvar = new JCheckBox(
+                i18n.getString("label.560"),
+                Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OVERWRITE_MAGVAR))
+            );
+            gpxOverwriteMagvar.setEnabled(true);
+            tmpPanel5.add(gpxOverwriteMagvar);
+
+            // "出力GPXに<SPEED>を上書きする"
+            gpxOutputSpeed = new JCheckBox(
+                i18n.getString("label.570"),
+                Boolean.parseBoolean(params.getProperty(AppParameters.GPX_OUTPUT_SPEED))
+            );
+            gpxOutputSpeed.setEnabled(true);
+            tmpPanel5.add(gpxOutputSpeed);
+
+            card.mainPanel.add(tmpPanel5, BorderLayout.CENTER);
+
+            // "処理実行"
+            doButton = new JButton(
+                i18n.getString("button.execute"),
+                AdjustTime.createImageIcon("images/media_playback_start.png")
+            );
+            card.mainPanel.add(doButton, BorderLayout.SOUTH);
+        }
 
         //---------------------------------------------------------------------
         // INIT_MENUS
@@ -444,9 +446,6 @@ public class AdjustTime extends JFrame
         gpxOutputSpeed.addActionListener(lSymAction);
         noFirstNode.addActionListener(lSymAction);
         gpxReuse.addActionListener(lSymAction);
-        //arg1Panel_4.field.addActionListener(lSymAction);
-        nextButton.addActionListener(lSymAction);
-        backButton.addActionListener(lSymAction);
         //}}
     }
     
@@ -729,28 +728,4 @@ public class AdjustTime extends JFrame
                
        doButton.setEnabled(true);
     }
-    
-    /**
-     * [次へ]ボタンをクリックした時の動作
-     * @param event 
-     */
-    void nextButton_Action(ActionEvent event) {
-        if ((cardPanelNo + 1) < cards.length) {
-            cardPanelNo++;
-            CardLayout cl = (CardLayout)(cardPanel.getLayout());
-            cl.show(cardPanel, String.valueOf(cardPanelNo));
-        }
-    }
-
-    /**
-     * [戻る]ボタンをクリックした時の動作
-     * @param event
-     */
-    void backButton_Action(ActionEvent event) {
-        if ((cardPanelNo - 1) >= 0) {
-            cardPanelNo--;
-            CardLayout cl = (CardLayout)(cardPanel.getLayout());
-            cl.show(cardPanel, String.valueOf(cardPanelNo));
-        }
-    }
 }
diff --git a/src/osm/jp/gpx/matchtime/gui/Card.java b/src/osm/jp/gpx/matchtime/gui/Card.java
new file mode 100644 (file)
index 0000000..78617a5
--- /dev/null
@@ -0,0 +1,94 @@
+package osm.jp.gpx.matchtime.gui;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.util.ResourceBundle;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+
+/**
+ *
+ * @author yuu
+ */
+public class Card extends JPanel {
+    public ResourceBundle i18n = ResourceBundle.getBundle("i18n");
+    JTabbedPane tabbe;
+    public JPanel mainPanel;
+    String title;
+    int backNumber = -1;
+    int nextNumber = -1;
+    JButton nextButton;     // [次へ]ボタン
+    JButton backButton;     // [戻る]ボタン
+    
+    public Card(JTabbedPane tabbe, String title, int backNumber, int nextNumber) {
+        super();
+        this.tabbe = tabbe;
+        this.title = title;
+        this.backNumber = backNumber;
+        this.nextNumber = nextNumber;
+
+        // INIT_CONTROLS
+        this.setLayout(new BorderLayout());
+        
+        //---- CENTER -----
+        mainPanel = new JPanel();
+        mainPanel.setLayout(new BorderLayout());
+        this.add(mainPanel, BorderLayout.CENTER);
+        
+        //---- SOUTH -----
+        JPanel buttonPanel = new JPanel(new BorderLayout());
+        buttonPanel.add(Box.createVerticalStrut(10), BorderLayout.SOUTH);
+        buttonPanel.add(Box.createVerticalStrut(10), BorderLayout.NORTH);
+        this.add(buttonPanel, BorderLayout.SOUTH);
+        
+        //{{REGISTER_LISTENERS
+        SymAction lSymAction = new SymAction();
+        if (nextNumber >= 0) {
+            nextButton = new JButton(i18n.getString("button.next"));
+            buttonPanel.add(nextButton, BorderLayout.EAST);
+            nextButton.addActionListener(lSymAction);
+        }
+
+        if (backNumber >= 0) {
+            backButton = new JButton(i18n.getString("button.previous"));
+            buttonPanel.add(backButton, BorderLayout.WEST);
+            backButton.addActionListener(lSymAction);
+        }
+        //}}
+    }
+    
+    public String getTitle() {
+        return this.title;
+    }
+    
+    /**
+     * [次へ]ボタンをクリックした時の動作
+     * @param event 
+     */
+    void nextButton_Action(ActionEvent event) {
+        this.tabbe.setSelectedIndex(this.nextNumber);
+    }
+
+    /**
+     * [戻る]ボタンをクリックした時の動作
+     * @param event
+     */
+    void backButton_Action(ActionEvent event) {
+        this.tabbe.setSelectedIndex(this.backNumber);
+    }
+
+    class SymAction implements java.awt.event.ActionListener {
+        @Override
+        public void actionPerformed(java.awt.event.ActionEvent event) {
+            Object object = event.getSource();
+            if (object == nextButton) {
+               nextButton_Action(event);
+            }
+            else if (object == backButton) {
+               backButton_Action(event);
+            }
+        }
+    }
+}