1 package osm.jp.gpx.matchtime.gui;
3 import osm.jp.gpx.matchtime.gui.restamp.RestampDialog;
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;
12 import javax.swing.event.DocumentEvent;
14 import osm.jp.gpx.matchtime.gui.restamp.CardImageFile;
15 import osm.jp.gpx.matchtime.gui.restamp.CardSourceFolder;
20 @SuppressWarnings("serial")
21 public class AdjustTime extends JFrame
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";
28 public static SimpleDateFormat dfjp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
30 // Used for addNotify check.
31 boolean fComponentsAdjusted = false;
32 public static ResourceBundle i18n = ResourceBundle.getBundle("i18n");
35 JTabbedPane cardPanel; // ウィザード形式パネル(タブ型)
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 & 書き出しフォルダ
47 java.awt.MenuBar mainMenuBar;
49 java.awt.MenuItem miDoNewFileList;
50 java.awt.MenuItem miDoDirSize;
51 java.awt.MenuItem miDoReadXML;
52 java.awt.MenuItem miExit;
54 java.awt.MenuItem miRestamp;
56 java.awt.MenuItem miAbout;
59 class SymWindow extends java.awt.event.WindowAdapter {
62 * このパネルが閉じられたら、このアプリケーションも終了させる。
65 public void windowClosing(java.awt.event.WindowEvent event) {
66 Object object = event.getSource();
67 if (object == AdjustTime.this) {
68 DbMang_WindowClosing(event);
73 class SymAction implements java.awt.event.ActionListener {
75 public void actionPerformed(java.awt.event.ActionEvent event) {
76 Object object = event.getSource();
77 if (object == miAbout) {
78 miAbout_Action(event);
80 else if (object == miRestamp) {
82 miRestamp_Action(event);
83 } catch (IOException ex) {
84 Logger.getLogger(AdjustTime.class.getName()).log(Level.SEVERE, null, ex);
87 else if (object == miExit) {
94 * データベース内のテーブルを一覧で表示するFrame
97 @SuppressWarnings("OverridableMethodCallInConstructor")
98 public AdjustTime() throws IOException
100 dfjp.setTimeZone(TimeZone.getTimeZone("JST"));
103 Container container = getContentPane();
104 container.setLayout(new BorderLayout());
106 getInsets().left + getInsets().right + 720,
107 getInsets().top + getInsets().bottom + 480
109 setTitle(AdjustTime.PROGRAM_NAME +" v"+ AdjustTime.PROGRAM_VARSION);
112 JPanel mainPanel = new JPanel();
113 mainPanel.setLayout(new BorderLayout());
114 container.add(mainPanel, BorderLayout.CENTER);
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);
123 container.add(Box.createVerticalStrut(30), BorderLayout.NORTH);
124 container.add(Box.createHorizontalStrut(10), BorderLayout.WEST);
125 container.add(Box.createHorizontalStrut(10), BorderLayout.EAST);
127 params = new AppParameters();
129 //---------------------------------------------------------------------
130 cardPanel = new JTabbedPane(JTabbedPane.LEFT);
131 mainPanel.add(cardPanel, BorderLayout.CENTER);
136 //---------------------------------------------------------------------
139 arg1_srcFolder = new ParameterPanelFolder(
140 i18n.getString("label.110") +": ",
141 params.getProperty(AppParameters.IMG_SOURCE_FOLDER)
143 arg1_srcFolder.argField
145 .addDocumentListener(
146 new SimpleDocumentListener() {
148 public void update(DocumentEvent e) {
149 toEnable(0, arg1_srcFolder.isEnable());
154 Card card = new CardSourceFolder(cardPanel, arg1_srcFolder);
155 cardPanel.addTab(card.getTitle(), card);
156 cardPanel.setEnabledAt(cardNo, true);
157 cards[cardNo] = card;
161 //---------------------------------------------------------------------
166 arg2_baseTimeImg = new ParameterPanelImageFile(
167 i18n.getString("label.210") +": ",
173 arg2_basetime = new ParameterPanelTime(
174 i18n.getString("label.310"),
178 arg2_basetime.argField.getDocument().addDocumentListener(
179 new SimpleDocumentListener() {
181 public void update(DocumentEvent e) {
182 toEnable(1, arg2_basetime.isEnable());
188 arg2_basetime.addExifBase(i18n.getString("label.220"), params);
191 arg2_basetime.addFileUpdate(i18n.getString("label.230"), params);
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;
202 //---------------------------------------------------------------------
206 arg3_gpxFile = new ParameterPanelGpx(
207 i18n.getString("label.410") + ": ",
208 params.getProperty(AppParameters.GPX_SOURCE_FOLDER)
210 arg3_gpxFile.argField.getDocument().addDocumentListener(
211 new SimpleDocumentListener() {
213 public void update(DocumentEvent e) {
214 toEnable(2, arg3_gpxFile.isEnable());
219 // "セグメント'trkseg'の最初の1ノードは無視する。"
220 arg3_gpxFile.addNoFirstNode(i18n.getString("label.420"), params);
222 // "生成されたGPXファイル(ファイル名が'_.gpx'で終わるもの)も変換の対象にする"
223 arg3_gpxFile.addGpxReuse(i18n.getString("label.430"), params);
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;
235 //---------------------------------------------------------------------
236 // 4.EXIF更新設定画面 & 実行画面
240 arg4_output = new ParameterPanelOutput(
241 i18n.getString("label.530") + ": ",
242 params.getProperty(AppParameters.IMG_OUTPUT_FOLDER)
244 arg4_output.argField.getDocument().addDocumentListener(
245 new SimpleDocumentListener() {
247 public void update(DocumentEvent e) {
248 toEnable(3, arg4_output.isEnable());
254 arg4_output.addCheckChangeImage(i18n.getString("label.510"), params);
256 // "GPXファイル時間外のファイルもコピーする"
257 arg4_output.addCheckOutofGpxTime(i18n.getString("label.520"), params);
260 arg4_output.addCheckOutputExif(i18n.getString("label.540"), params);
262 // "ポイントマーカー<WPT>をGPXファイルに出力する"
263 arg4_output.addCheckOutputWpt(i18n.getString("label.550"), params);
265 // "ソースGPXの<MAGVAR>を無視する"
266 arg4_output.addCheckIgnoreMagvar(i18n.getString("label.560"), params);
268 // "出力GPXに[SPEED]を上書きする"
269 arg4_output.addCheckOutputSpeed(i18n.getString("label.570"), params);
272 CardExifPerform card = new CardExifPerform(
274 arg2_basetime, arg3_gpxFile, arg4_output,
275 AdjustTime.i18n.getString("tab.500"),
278 cardPanel.addTab(card.getTitle(), card);
279 cardPanel.setEnabledAt(cardNo, false);
280 cards[cardNo] = card;
283 //---------------------------------------------------------------------
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));
290 miRestamp = new java.awt.MenuItem(i18n.getString("menu.restamp") + "...");
291 miRestamp.setFont(new Font("Dialog", Font.PLAIN, 12));
293 menu2 = new java.awt.Menu(i18n.getString("menu.tools"));
294 menu2.setFont(new Font("Dialog", Font.PLAIN, 12));
295 menu2.add(miRestamp);
297 miAbout = new java.awt.MenuItem("About...");
298 miAbout.setFont(new Font("Dialog", Font.PLAIN, 12));
300 menu3 = new java.awt.Menu("Help");
301 menu3.setFont(new Font("Dialog", Font.PLAIN, 12));
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);
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);
323 * Shows or hides the component depending on the boolean flag b.
324 * @param b trueのときコンポーネントを表示; その他のとき, componentを隠す.
325 * @see java.awt.Component#isVisible
328 public void setVisible(boolean b) {
336 * このクラスをインスタンスを生成して表示する。
340 @SuppressWarnings("UseSpecificCatch")
341 static public void main(String args[]) {
342 SwingUtilities.invokeLater(() -> {
345 } catch (Exception e) {
350 private static void createAndShowGUI() throws IOException {
351 (new AdjustTime()).setVisible(true);
355 public void addNotify() {
356 // Record the size of the window prior to calling parents addNotify.
357 Dimension d = getSize();
361 if (fComponentsAdjusted)
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);
372 fComponentsAdjusted = true;
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
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);
386 void miRestamp_Action(java.awt.event.ActionEvent event) throws IOException {
387 (new RestampDialog(this, false)).setVisible(true);
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);
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);
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);
410 //ImageIcon refImage;
412 /** Returns an ImageIcon, or null if the path was invalid.
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);
420 System.err.println("Couldn't find file: " + path);