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