OSDN Git Service

fixed: GUIを一新した
[importpicture/importpicture.git] / src / osm / jp / gpx / matchtime / gui / AdjustTime.java
1 package osm.jp.gpx.matchtime.gui;
2
3 import osm.jp.gpx.matchtime.gui.restamp.RestampDialog;
4 import java.awt.*;
5 import java.io.IOException;
6 import java.text.SimpleDateFormat;
7 import java.util.ResourceBundle;
8 import java.util.TimeZone;
9 import java.util.logging.Level;
10 import java.util.logging.Logger;
11 import javax.swing.*;
12 import javax.swing.event.DocumentEvent;
13 import osm.jp.gpx.*;
14 import osm.jp.gpx.matchtime.gui.restamp.CardImageFile;
15 import osm.jp.gpx.matchtime.gui.restamp.CardSourceFolder;
16
17 /**
18  * 本プログラムのメインクラス
19  */
20 @SuppressWarnings("serial")
21 public class AdjustTime extends JFrame
22 {
23     public static final String PROGRAM_NAME = "AdjustTime for JOSM";
24     public static final String PROGRAM_VARSION = "5.02";
25     public static final String PROGRAM_UPDATE = "2019/10/22";
26
27     AppParameters params;
28     public static SimpleDateFormat dfjp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
29
30     // Used for addNotify check.
31     boolean fComponentsAdjusted = false;
32     public static ResourceBundle i18n = ResourceBundle.getBundle("i18n");
33     
34     //{{DECLARE_CONTROLS
35     JTabbedPane cardPanel;       // ウィザード形式パネル(タブ型)
36     Card[] cards;
37     //}}
38
39     //---入力フィールド----------------------------------------------------
40     ParameterPanelFolder arg1_srcFolder;    // 対象フォルダ
41     ParameterPanelImageFile arg2_baseTimeImg;   // 開始画像ファイルパス
42     ParameterPanelTime arg2_basetime;       // 開始画像の基準時刻:
43     ParameterPanelGpx arg3_gpxFile;         // GPX file or Folder
44     ParameterPanelOutput arg4_output;       // EXIF & 書き出しフォルダ
45
46     //{{DECLARE_MENUS
47     java.awt.MenuBar mainMenuBar;
48     java.awt.Menu menu1;
49     java.awt.MenuItem miDoNewFileList;
50     java.awt.MenuItem miDoDirSize;
51     java.awt.MenuItem miDoReadXML;
52     java.awt.MenuItem miExit;
53     java.awt.Menu menu2;
54     java.awt.MenuItem miRestamp;
55     java.awt.Menu menu3;
56     java.awt.MenuItem miAbout;
57     //}}
58
59     class SymWindow extends java.awt.event.WindowAdapter {
60         /**
61          * このFrameが閉じられるときの動作。
62          * このパネルが閉じられたら、このアプリケーションも終了させる。
63          */
64         @Override
65         public void windowClosing(java.awt.event.WindowEvent event) {
66             Object object = event.getSource();
67             if (object == AdjustTime.this) {
68                 DbMang_WindowClosing(event);
69             }
70         }
71     }
72
73     class SymAction implements java.awt.event.ActionListener {
74         @Override
75         public void actionPerformed(java.awt.event.ActionEvent event) {
76             Object object = event.getSource();
77             if (object == miAbout) {
78                 miAbout_Action(event);
79             }
80             else if (object == miRestamp) {
81                 try {
82                     miRestamp_Action(event);
83                 } catch (IOException ex) {
84                     Logger.getLogger(AdjustTime.class.getName()).log(Level.SEVERE, null, ex);
85                 }
86             }
87             else if (object == miExit) {
88                 miExit_Action(event);
89             }
90         }
91     }
92     
93     /**
94      * データベース内のテーブルを一覧で表示するFrame
95      * @throws IOException 
96      */
97     @SuppressWarnings("OverridableMethodCallInConstructor")
98     public AdjustTime() throws IOException
99     {
100         dfjp.setTimeZone(TimeZone.getTimeZone("JST"));
101
102         // INIT_CONTROLS
103         Container container = getContentPane();
104         container.setLayout(new BorderLayout());
105         setSize(
106             getInsets().left + getInsets().right + 720,
107             getInsets().top + getInsets().bottom + 480
108         );
109         setTitle(AdjustTime.PROGRAM_NAME +" v"+ AdjustTime.PROGRAM_VARSION);
110         
111         //---- CENTER -----
112         JPanel mainPanel = new JPanel();
113         mainPanel.setLayout(new BorderLayout());
114         container.add(mainPanel, BorderLayout.CENTER);
115         
116         //---- SOUTH -----
117         JPanel southPanel = new JPanel(new BorderLayout());
118         southPanel.add(Box.createVerticalStrut(10), BorderLayout.SOUTH);
119         southPanel.add(Box.createVerticalStrut(10), BorderLayout.NORTH);
120         container.add(southPanel, BorderLayout.SOUTH);
121         
122         //---- SPACE -----
123         container.add(Box.createVerticalStrut(30), BorderLayout.NORTH);
124         container.add(Box.createHorizontalStrut(10), BorderLayout.WEST);
125         container.add(Box.createHorizontalStrut(10), BorderLayout.EAST);
126         
127         params = new AppParameters();
128         
129         //---------------------------------------------------------------------
130         cardPanel = new JTabbedPane(JTabbedPane.LEFT);
131         mainPanel.add(cardPanel, BorderLayout.CENTER);
132         
133         cards = new Card[4];
134         int cardNo = 0;
135
136         //---------------------------------------------------------------------
137         // 1.[対象フォルダ]設定パネル
138         {
139             arg1_srcFolder = new ParameterPanelFolder(
140                     i18n.getString("label.110") +": ", 
141                     params.getProperty(AppParameters.IMG_SOURCE_FOLDER)
142             );
143             arg1_srcFolder.argField
144                 .getDocument()
145                 .addDocumentListener(
146                     new SimpleDocumentListener() {
147                         @Override
148                         public void update(DocumentEvent e) {
149                             toEnable(0, arg1_srcFolder.isEnable());
150                         }
151                     }
152                 );
153
154             Card card = new CardSourceFolder(cardPanel, arg1_srcFolder);
155             cardPanel.addTab(card.getTitle(), card);
156             cardPanel.setEnabledAt(cardNo, true);
157             cards[cardNo] = card;
158             cardNo++;
159         }
160         
161         //---------------------------------------------------------------------
162         // 2.[基準時刻画像]設定パネル
163         // 2a.基準時刻の入力画面
164         {
165             // 基準時刻画像
166             arg2_baseTimeImg = new ParameterPanelImageFile(
167                 i18n.getString("label.210") +": ", 
168                 null, 
169                 arg1_srcFolder
170             );
171
172             // 2a. 基準時刻:
173             arg2_basetime = new ParameterPanelTime(
174                     i18n.getString("label.310"), 
175                     null, 
176                     arg2_baseTimeImg
177             );
178             arg2_basetime.argField.getDocument().addDocumentListener(
179                 new SimpleDocumentListener() {
180                     @Override
181                     public void update(DocumentEvent e) {
182                         toEnable(1, arg2_basetime.isEnable());
183                     }
184                 }
185             );
186             
187             // EXIFの日時を基準にする
188             arg2_basetime.addExifBase(i18n.getString("label.220"), params);
189
190             // ファイル更新日時を基準にする
191             arg2_basetime.addFileUpdate(i18n.getString("label.230"), params);
192
193             CardImageFile card = new CardImageFile(
194                     cardPanel, arg2_basetime, (Window)this, 
195                     AdjustTime.i18n.getString("tab.300"), 0, 2);
196             cardPanel.addTab(card.getTitle(), card);
197             cardPanel.setEnabledAt(cardNo, false);
198             cards[cardNo] = card;
199             cardNo++;
200         }
201         
202         //---------------------------------------------------------------------
203         // 3.GPXファイル設定画面
204         {
205             // 3. GPXファイル選択パラメータ
206             arg3_gpxFile = new ParameterPanelGpx(
207                 i18n.getString("label.410") + ": ", 
208                 params.getProperty(AppParameters.GPX_SOURCE_FOLDER)
209             );
210             arg3_gpxFile.argField.getDocument().addDocumentListener(
211                 new SimpleDocumentListener() {
212                     @Override
213                     public void update(DocumentEvent e) {
214                         toEnable(2, arg3_gpxFile.isEnable());
215                     }
216                 }
217             );
218
219             // "セグメント'trkseg'の最初の1ノードは無視する。"
220             arg3_gpxFile.addNoFirstNode(i18n.getString("label.420"), params);
221
222             // "生成されたGPXファイル(ファイル名が'_.gpx'で終わるもの)も変換の対象にする"
223             arg3_gpxFile.addGpxReuse(i18n.getString("label.430"), params);
224             
225             // 3. GPXファイルを選択
226             CardGpxFile card = new CardGpxFile(
227                     cardPanel, arg3_gpxFile,
228                      AdjustTime.i18n.getString("tab.400"), 1, 3);
229             cardPanel.addTab(card.getTitle(), card);
230             cardPanel.setEnabledAt(cardNo, false);
231             cards[cardNo] = card;
232             cardNo++;
233         }
234         
235         //---------------------------------------------------------------------
236         // 4.EXIF更新設定画面 & 実行画面
237         {
238             // 4. ファイル変換・実行パラメータ
239             // "出力フォルダ: "
240             arg4_output = new ParameterPanelOutput(
241                 i18n.getString("label.530") + ": ", 
242                 params.getProperty(AppParameters.IMG_OUTPUT_FOLDER)
243             );
244             arg4_output.argField.getDocument().addDocumentListener(
245                 new SimpleDocumentListener() {
246                     @Override
247                     public void update(DocumentEvent e) {
248                         toEnable(3, arg4_output.isEnable());
249                     }
250                 }
251             );
252
253             // "IMGの変換をする"
254             arg4_output.addCheckChangeImage(i18n.getString("label.510"), params);
255
256             // "GPXファイル時間外のファイルもコピーする"
257             arg4_output.addCheckOutofGpxTime(i18n.getString("label.520"), params);
258
259             // "EXIFの変換をする"
260             arg4_output.addCheckOutputExif(i18n.getString("label.540"), params);
261
262             // "ポイントマーカー<WPT>をGPXファイルに出力する"
263             arg4_output.addCheckOutputWpt(i18n.getString("label.550"), params);
264
265             // "ソースGPXの<MAGVAR>を無視する"
266             arg4_output.addCheckIgnoreMagvar(i18n.getString("label.560"), params);
267
268             // "出力GPXに[SPEED]を上書きする"
269             arg4_output.addCheckOutputSpeed(i18n.getString("label.570"), params);
270
271             // パネル表示
272             CardExifPerform card = new CardExifPerform(
273                 cardPanel, 
274                 arg2_basetime, arg3_gpxFile, arg4_output,
275                 AdjustTime.i18n.getString("tab.500"),
276                 2, -1
277             );
278             cardPanel.addTab(card.getTitle(), card);
279             cardPanel.setEnabledAt(cardNo, false);
280             cards[cardNo] = card;
281         }
282
283         //---------------------------------------------------------------------
284         // INIT_MENUS
285         menu1 = new java.awt.Menu("File");
286         miExit = new java.awt.MenuItem(i18n.getString("menu.quit"));
287         miExit.setFont(new Font("Dialog", Font.PLAIN, 12));
288         menu1.add(miExit);
289
290         miRestamp = new java.awt.MenuItem(i18n.getString("menu.restamp") + "...");
291         miRestamp.setFont(new Font("Dialog", Font.PLAIN, 12));
292         
293         menu2 = new java.awt.Menu(i18n.getString("menu.tools"));
294         menu2.setFont(new Font("Dialog", Font.PLAIN, 12));
295         menu2.add(miRestamp);
296
297         miAbout = new java.awt.MenuItem("About...");
298         miAbout.setFont(new Font("Dialog", Font.PLAIN, 12));
299
300         menu3 = new java.awt.Menu("Help");
301         menu3.setFont(new Font("Dialog", Font.PLAIN, 12));
302         menu3.add(miAbout);
303
304         mainMenuBar = new java.awt.MenuBar();
305         mainMenuBar.setHelpMenu(menu3);
306         mainMenuBar.add(menu1);
307         mainMenuBar.add(menu2);
308         mainMenuBar.add(menu3);
309         setMenuBar(mainMenuBar);
310
311         //{{REGISTER_LISTENERS
312         SymWindow aSymWindow = new SymWindow();
313         this.addWindowListener(aSymWindow);
314         SymAction lSymAction = new SymAction();
315         miAbout.addActionListener(lSymAction);
316         miRestamp.addActionListener(lSymAction);
317         miExit.addActionListener(lSymAction);
318         arg2_baseTimeImg.openButton.addActionListener(lSymAction);
319         //}}
320     }
321     
322     /**
323      * Shows or hides the component depending on the boolean flag b.
324      * @param b trueのときコンポーネントを表示; その他のとき, componentを隠す.
325      * @see java.awt.Component#isVisible
326      */
327     @Override
328     public void setVisible(boolean b) {
329         if(b) {
330             setLocation(50, 50);
331         }
332         super.setVisible(b);
333     }
334     
335     /**
336      * このクラスをインスタンスを生成して表示する。
337      * コマンドラインの引数はありません。
338      * @param args
339      */    
340     @SuppressWarnings("UseSpecificCatch")
341     static public void main(String args[]) {
342         SwingUtilities.invokeLater(() -> {
343             try {
344                 createAndShowGUI();
345             } catch (Exception e) {
346                 e.printStackTrace();
347             }
348         });
349     }
350     private static void createAndShowGUI() throws IOException {
351         (new AdjustTime()).setVisible(true);
352     }
353
354     @Override
355     public void addNotify()     {
356         // Record the size of the window prior to calling parents addNotify.
357         Dimension d = getSize();
358
359         super.addNotify();
360
361         if (fComponentsAdjusted)
362             return;
363
364         // Adjust components according to the insets
365         setSize(getInsets().left + getInsets().right + d.width, getInsets().top + getInsets().bottom + d.height);
366         Component components[] = getComponents();
367         for (Component component : components) {
368             Point p = component.getLocation();
369             p.translate(getInsets().left, getInsets().top);
370             component.setLocation(p);
371         }
372         fComponentsAdjusted = true;
373     }
374
375     void DbMang_WindowClosing(java.awt.event.WindowEvent event) {
376         setVisible(false);  // hide the Manager
377         dispose();                      // free the system resources
378         System.exit(0);         // close the application
379     }
380
381     void miAbout_Action(java.awt.event.ActionEvent event) {
382         // Action from About Create and show as modal
383         (new AboutDialog(this, true)).setVisible(true);
384     }
385     
386     void miRestamp_Action(java.awt.event.ActionEvent event) throws IOException {
387         (new RestampDialog(this, false)).setVisible(true);
388     }
389     
390     void miExit_Action(java.awt.event.ActionEvent event) {
391         // Action from Exit Create and show as modal
392         //(new hayashi.yuu.tools.gui.QuitDialog(this, true)).setVisible(true);
393         (new QuitDialog(this, true)).setVisible(true);
394     }
395     
396     void toEnable(final int cardNo, final boolean enable) {
397         if ((cardNo >= 0) && (cardNo < cards.length)) {
398             cardPanel.setEnabledAt(cardNo, enable);
399             if ((cardNo -1) >= 0) {
400                 cards[cardNo -1].nextButton.setEnabled(enable);
401             }
402             if ((cardNo +1) < cards.length) {
403                 cardPanel.setEnabledAt(cardNo+1, enable);
404                 cards[cardNo +1].backButton.setEnabled(enable);
405                 cards[cardNo].nextButton.setEnabled(enable);
406             }
407         }
408     }
409
410     //ImageIcon refImage;
411     
412     /** Returns an ImageIcon, or null if the path was invalid.
413      * @param path
414      * @return  */
415     public static ImageIcon createImageIcon(String path) {
416         java.net.URL imgURL = AdjustTime.class.getResource(path);
417         if (imgURL != null) {
418             return new ImageIcon(imgURL);
419         } else {
420             System.err.println("Couldn't find file: " + path);
421             return null;
422         }
423     }
424 }