• R/O
  • HTTP
  • SSH
  • HTTPS

importpicture: Commit


Commit MetaInfo

Revisiona2a710a13d01deb52111b88d3f82520c97cdf5b6 (tree)
Time2019-10-16 05:57:35
Authorhaya4 <hayashi.yuu@gmai...>
Commiterhaya4

Log Message

Restamp ワンパス通った

Change Summary

Incremental Difference

--- a/src/i18n.properties
+++ b/src/i18n.properties
@@ -38,6 +38,8 @@ label.410=GPX folder
3838 label.420=Ignore the first node of segment 'trkseg'
3939 label.430=Also make the generated GPX file (the one whose filename ends with '_.gpx') as the target of conversion
4040
41+tab.restamp.400=4. Perform RESTAMP
42+
4143 tab.500=4. perform EXIF conversion
4244 label.500=Select whether to perform EXIF conversion
4345 label.501=When performing EXIF conversion, you also need to specify the folder to output the converted file.
--- a/src/i18n_ja_JP.properties
+++ b/src/i18n_ja_JP.properties
@@ -52,6 +52,8 @@ label.550=\u30dd\u30a4\u30f3\u30c8\u30de\u30fc\u30ab\u30fc<WPT>\u3092GPX\u30d5\u
5252 label.560=\u30bd\u30fc\u30b9GPX\u306e<MAGVAR>\u3092\u7121\u8996\u3059\u308b
5353 label.570=\u51fa\u529bGPX\u306b<SPEED>\u3092\u4e0a\u66f8\u304d\u3059\u308b
5454
55+tab.restamp.400=4. \u5909\u63db\u306e\u5b9f\u884c
56+
5557 msg.100=GPX\u30d5\u30a1\u30a4\u30eb\u307e\u305f\u306f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002('%s')
5658 msg.110=\u5bfe\u8c61\u3068\u306a\u308bGPX\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093('%s')
5759 msg.120=\u8907\u6570\u306eGPX\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308b\u3068\u304d\u306b\u306f\u3001'IMG.OUTPUT_ALL'\u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u6307\u5b9a\u3067\u304d\u307e\u305b\u3093\u3002
--- a/src/osm/jp/gpx/Restamp.java
+++ b/src/osm/jp/gpx/Restamp.java
@@ -18,6 +18,8 @@ import org.apache.commons.imaging.ImageReadException;
1818 * @author yuu
1919 */
2020 public class Restamp extends Thread {
21+ static public final String TIME_PATTERN = "yyyy-MM-dd HH:mm:ss z";
22+
2123 /**
2224 * 実行中に発生したExceptionを保持する場所
2325 */
@@ -103,9 +105,9 @@ public class Restamp extends Thread {
103105 * @param argv
104106 * argv[0] = 画像ファイルが格納されているディレクトリ --> imgDir
105107 * argv[1] = 時刻補正の基準とする画像ファイル --> baseFile
106- * argv[2] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd_HH:mm:ss" --> baseTime
108+ * argv[2] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd HH:mm:ss z" --> baseTime
107109 * argv[3] = 時刻補正の基準とする画像ファイル --> baseFile
108- * argv[4] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd_HH:mm:ss" --> baseTime
110+ * argv[4] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd HH:mm:ss z" --> baseTime
109111 *
110112 * @throws IOException
111113 * @throws ImageReadException
@@ -141,7 +143,7 @@ public class Restamp extends Thread {
141143 return;
142144 }
143145
144- DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'_'HH:mm:ss");
146+ DateFormat df1 = new SimpleDateFormat(TIME_PATTERN);
145147 Date baseTime1 = df1.parse(argv[2]);
146148
147149 File baseFile2 = new File(imgDir, argv[3]);
@@ -156,7 +158,7 @@ public class Restamp extends Thread {
156158 return;
157159 }
158160
159- DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'_'HH:mm:ss");
161+ DateFormat df2 = new SimpleDateFormat(TIME_PATTERN);
160162 Date baseTime2 = df2.parse(argv[4]);
161163
162164 Restamp obj = new Restamp();
--- a/src/osm/jp/gpx/matchtime/gui/AdjustTime.java
+++ b/src/osm/jp/gpx/matchtime/gui/AdjustTime.java
@@ -305,6 +305,7 @@ public class AdjustTime extends JFrame
305305 // 3.GPXファイル設定画面
306306 cardNo++;
307307 {
308+ // 3. GPXファイルを選択
308309 Card card = new Card(cardPanel, i18n.getString("tab.400"), 2, 4);
309310 cardPanel.addTab(card.getTitle(), card);
310311 cards[cardNo] = card;
@@ -750,7 +751,7 @@ public class AdjustTime extends JFrame
750751 e.printStackTrace();
751752 }
752753
753- (new DoDialog(this, argv)).setVisible(true);
754+ (new DoDialog(argv)).setVisible(true);
754755
755756 doButton.setEnabled(true);
756757 }
--- a/src/osm/jp/gpx/matchtime/gui/Command.java
+++ b/src/osm/jp/gpx/matchtime/gui/Command.java
@@ -3,7 +3,7 @@ package osm.jp.gpx.matchtime.gui;
33 import java.lang.reflect.InvocationTargetException;
44 import java.text.SimpleDateFormat;
55
6-class Command extends Thread {
6+public class Command extends Thread {
77 String[] args; // コマンドパラメータ
88 private String commandName = ""; // コマンド名
99 @SuppressWarnings({ "rawtypes" })
--- a/src/osm/jp/gpx/matchtime/gui/DoDialog.java
+++ b/src/osm/jp/gpx/matchtime/gui/DoDialog.java
@@ -21,7 +21,6 @@ public class DoDialog extends JDialog {
2121 String[] args;
2222
2323 //{{DECLARE_CONTROLS
24- JFrame parentFrame; // MatchTime.class
2524 JPanel buttonPanel; // ボタン配置パネル (下部)
2625 JButton closeButton; // [クローズ]ボタン
2726 JButton doButton; // [実行]ボタン
@@ -29,16 +28,15 @@ public class DoDialog extends JDialog {
2928 //}}
3029
3130 @SuppressWarnings("OverridableMethodCallInConstructor")
32- public DoDialog(JFrame parentFrame, String[] args) {
33- super(parentFrame, true); // モーダルダイアログを基盤にする
34- this.parentFrame = parentFrame;
31+ public DoDialog(String[] args) {
32+ super(); // モーダルダイアログを基盤にする
3533 this.args = args;
3634
3735 // INIT_CONTROLS
3836 @SuppressWarnings("OverridableMethodCallInConstructor")
3937 Container container = getContentPane();
4038 container.setLayout(new BorderLayout());
41- parentFrame.setVisible(false);
39+ //parentFrame.setVisible(false);
4240 setSize(getInsets().left + getInsets().right + 980, getInsets().top + getInsets().bottom + 480);
4341 setTitle(DoDialog.TITLE);
4442
@@ -88,7 +86,7 @@ public class DoDialog extends JDialog {
8886 }
8987
9088 // JFrameの表示
91- parentFrame.setVisible(true);
89+ //parentFrame.setVisible(true);
9290 }
9391
9492 /**
--- a/src/osm/jp/gpx/matchtime/gui/ParameterPanelGpx.java
+++ b/src/osm/jp/gpx/matchtime/gui/ParameterPanelGpx.java
@@ -18,19 +18,11 @@ public class ParameterPanelGpx extends ParameterPanel implements ActionListener
1818 super(label, text);
1919
2020 // "選択..."
21- openButton = new JButton(
22- i18n.getString("button.select"),
23- AdjustTime.createImageIcon("images/Open16.gif")
24- );
21+ openButton = new JButton(i18n.getString("button.select"), AdjustTime.createImageIcon("images/Open16.gif"));
2522 openButton.addActionListener(this);
2623 this.add(openButton);
2724 }
2825
29- public void setEnable(boolean f) {
30- super.setEnabled(f);
31- openButton.setEnabled(f);
32- }
33-
3426 @Override
3527 public void actionPerformed(ActionEvent e) {
3628 if (e.getSource() == openButton){
@@ -55,12 +47,34 @@ public class ParameterPanelGpx extends ParameterPanel implements ActionListener
5547 }
5648 }
5749
50+ public File getGpxFile() {
51+ if (isEnable()) {
52+ return new File(getText());
53+ }
54+ return null;
55+ }
56+
5857 /**
5958 * このフィールドに有効な値が設定されているかどうか
6059 * @return
6160 */
6261 @Override
6362 public boolean isEnable() {
64- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
63+ String text = this.argField.getText();
64+ if (text != null) {
65+ File file = new File(text);
66+ if (file.exists()) {
67+ if (file.isFile()) {
68+ String name = file.getName().toUpperCase();
69+ if (name.endsWith(".GPX")) {
70+ return true;
71+ }
72+ }
73+ else if (file.isDirectory()) {
74+ return true;
75+ }
76+ }
77+ }
78+ return false;
6579 }
6680 }
--- a/src/osm/jp/gpx/matchtime/gui/ParameterPanelTime.java
+++ b/src/osm/jp/gpx/matchtime/gui/ParameterPanelTime.java
@@ -7,6 +7,7 @@ import java.text.DateFormat;
77 import java.text.SimpleDateFormat;
88 import java.util.Date;
99 import javax.swing.JButton;
10+import osm.jp.gpx.Restamp;
1011 import osm.jp.gpx.matchtime.gui.restamp.DialogCorectTime;
1112
1213 /**
@@ -14,7 +15,6 @@ import osm.jp.gpx.matchtime.gui.restamp.DialogCorectTime;
1415 * この1インスタンスで、1パラメータをあらわす。
1516 */
1617 public class ParameterPanelTime extends ParameterPanel {
17- static final String TIME_PATTERN = "yyyy.MM.dd HH:mm:ss z";
1818 SimpleDateFormat sdf = (SimpleDateFormat)DateFormat.getDateTimeInstance();
1919 ParameterPanelImageFile imageFile;
2020 public JButton updateButton;
@@ -82,7 +82,7 @@ public class ParameterPanelTime extends ParameterPanel {
8282 if (param.imageFile.isEnable()) {
8383 File file = param.imageFile.getImageFile();
8484 long lastModified = file.lastModified();
85- sdf.applyPattern(TIME_PATTERN);
85+ sdf.applyPattern(Restamp.TIME_PATTERN);
8686 param.argField.setText(sdf.format(new Date(lastModified)));
8787 }
8888 else {
@@ -101,7 +101,7 @@ public class ParameterPanelTime extends ParameterPanel {
101101 String text = this.argField.getText();
102102 if (text != null) {
103103 try {
104- sdf.applyPattern(TIME_PATTERN);
104+ sdf.applyPattern(Restamp.TIME_PATTERN);
105105 sdf.parse(text);
106106 return true;
107107 }
--- /dev/null
+++ b/src/osm/jp/gpx/matchtime/gui/restamp/CardGpxFile.java
@@ -0,0 +1,91 @@
1+package osm.jp.gpx.matchtime.gui.restamp;
2+
3+import java.awt.BorderLayout;
4+import java.awt.Dimension;
5+import javax.swing.BoxLayout;
6+import javax.swing.JCheckBox;
7+import javax.swing.JLabel;
8+import javax.swing.JPanel;
9+import javax.swing.JTabbedPane;
10+import osm.jp.gpx.matchtime.gui.AdjustTime;
11+import static osm.jp.gpx.matchtime.gui.AdjustTime.i18n;
12+import osm.jp.gpx.matchtime.gui.Card;
13+import osm.jp.gpx.matchtime.gui.PanelAction;
14+import osm.jp.gpx.matchtime.gui.ParameterPanelGpx;
15+
16+/**
17+ * [GPXファイル]選択パネル
18+ * @author yuu
19+ */
20+public class CardGpxFile extends Card implements PanelAction {
21+ //JPanel argsPanel; // パラメータ設定パネル (上部)
22+ ParameterPanelGpx arg_gpxFile;
23+ JCheckBox noFirstNode; // GPX: <trkseg>セグメントの最初の1ノードは無視する。 {ON | OFF}
24+ JCheckBox gpxReuse; // 生成されたGPXファイル(ファイル名が'_.gpx'で終わるもの)も対象にする。 {ON | OFF}
25+ private final boolean gpxReuseV;
26+
27+ /**
28+ * コンストラクタ
29+ * @param tabbe parent panel
30+ * @param arg_gpxFile // 開始画像の基準時刻:
31+ * @param noFirstNodeV
32+ * @param gpxReuseV
33+ */
34+ public CardGpxFile(
35+ JTabbedPane tabbe,
36+ ParameterPanelGpx arg_gpxFile,
37+ boolean noFirstNodeV,
38+ boolean gpxReuseV
39+ ) {
40+ super(tabbe, AdjustTime.i18n.getString("tab.400"), 2, 4);
41+ this.arg_gpxFile = arg_gpxFile;
42+
43+ JPanel argsPanel = new JPanel();
44+ argsPanel.setLayout(new BoxLayout(argsPanel, BoxLayout.PAGE_AXIS));
45+ argsPanel.add(packLine(new JLabel(i18n.getString("label.400")), new JPanel()));
46+ argsPanel.add(arg_gpxFile);
47+
48+ // "セグメント'trkseg'の最初の1ノードは無視する。"
49+ noFirstNode = new JCheckBox(
50+ i18n.getString("label.420"),
51+ noFirstNodeV
52+ );
53+ argsPanel.add(noFirstNode);
54+
55+ // "生成されたGPXファイル(ファイル名が'_.gpx'で終わるもの)も変換の対象にする"
56+ gpxReuse = new JCheckBox(i18n.getString("label.430"), gpxReuseV);
57+ gpxReuse.setEnabled(true);
58+ argsPanel.add(gpxReuse);
59+
60+ JPanel space = new JPanel();
61+ space.setMinimumSize(new Dimension(40, 20));
62+ space.setMaximumSize(new Dimension(40, Short.MAX_VALUE));
63+ argsPanel.add(space);
64+
65+ this.mainPanel.add(argsPanel, BorderLayout.CENTER);
66+ this.gpxReuseV = gpxReuseV;
67+ }
68+
69+ /**
70+ * "セグメント'trkseg'の最初の1ノードは無視する。"
71+ * @return
72+ */
73+ public boolean getNoFirstNode() {
74+ return noFirstNode.isSelected();
75+ }
76+
77+ /**
78+ * 入力条件が満たされているかどうか
79+ * @return
80+ */
81+ @Override
82+ public boolean isEnable() {
83+ return (arg_gpxFile.isEnable());
84+ }
85+
86+ @Override
87+ @SuppressWarnings("empty-statement")
88+ public void openAction() {
89+ ; // 何もしない
90+ }
91+}
--- /dev/null
+++ b/src/osm/jp/gpx/matchtime/gui/restamp/CardPerformFile.java
@@ -0,0 +1,111 @@
1+package osm.jp.gpx.matchtime.gui.restamp;
2+
3+import java.awt.BorderLayout;
4+import java.awt.Dialog;
5+import java.io.File;
6+import java.util.ArrayList;
7+import javax.swing.BoxLayout;
8+import javax.swing.JButton;
9+import javax.swing.JLabel;
10+import javax.swing.JPanel;
11+import javax.swing.JTabbedPane;
12+import osm.jp.gpx.matchtime.gui.AdjustTime;
13+import static osm.jp.gpx.matchtime.gui.AdjustTime.i18n;
14+import osm.jp.gpx.matchtime.gui.Card;
15+import osm.jp.gpx.matchtime.gui.DoDialog;
16+import osm.jp.gpx.matchtime.gui.PanelAction;
17+import osm.jp.gpx.matchtime.gui.ParameterPanelImageFile;
18+import osm.jp.gpx.matchtime.gui.ParameterPanelTime;
19+
20+/**
21+ * [基準画像(開始/終了)]選択パネル
22+ * @author yuu
23+ */
24+public class CardPerformFile extends Card implements PanelAction {
25+ //JPanel argsPanel; // パラメータ設定パネル (上部)
26+ ParameterPanelTime arg1_basetime;
27+ ParameterPanelTime arg2_basetime;
28+ JButton doButton; // [処理実行]ボタン
29+
30+ /**
31+ * コンストラクタ
32+ * @param tabbe parent panel
33+ * @param arg1_basetime // 開始画像の基準時刻:
34+ * @param arg2_basetime // 開始画像の基準時刻:
35+ */
36+ public CardPerformFile(
37+ JTabbedPane tabbe,
38+ ParameterPanelTime arg1_basetime,
39+ ParameterPanelTime arg2_basetime
40+ ) {
41+ super(tabbe, AdjustTime.i18n.getString("tab.restamp.400"), 2, 4);
42+ this.arg1_basetime = arg1_basetime;
43+ this.arg2_basetime = arg2_basetime;
44+
45+ JPanel argsPanel = new JPanel();
46+ argsPanel.setLayout(new BoxLayout(argsPanel, BoxLayout.PAGE_AXIS));
47+ argsPanel.add(packLine(new JLabel(i18n.getString("label.200")), new JPanel()));
48+
49+ // [処理実行]ボタン
50+ doButton = new JButton(
51+ i18n.getString("button.execute"),
52+ AdjustTime.createImageIcon("images/media_playback_start.png")
53+ );
54+ argsPanel.add(doButton);
55+
56+ this.mainPanel.add(argsPanel, BorderLayout.CENTER);
57+
58+ //{{REGISTER_LISTENERS
59+ SymAction lSymAction = new SymAction();
60+ doButton.addActionListener(lSymAction);
61+ //}}
62+ }
63+
64+ class SymAction implements java.awt.event.ActionListener {
65+ @Override
66+ public void actionPerformed(java.awt.event.ActionEvent event) {
67+ Object object = event.getSource();
68+ if (object == doButton) {
69+ doButton_Action(event);
70+ }
71+ }
72+ }
73+
74+ /**
75+ * [実行]ボタンをクリックしたときの動作
76+ * @param event
77+ */
78+ @SuppressWarnings("UseSpecificCatch")
79+ void doButton_Action(java.awt.event.ActionEvent event) {
80+ doButton.setEnabled(false);
81+
82+ ArrayList<String> arry = new ArrayList<>();
83+ File file = arg1_basetime.getImageFile().getImageFile();
84+ File dir = file.getParentFile();
85+ arry.add(dir.getAbsolutePath());
86+ arry.add(file.getName());
87+ arry.add(arg1_basetime.argField.getText());
88+ file = arg2_basetime.getImageFile().getImageFile();
89+ arry.add(file.getName());
90+ arry.add(arg2_basetime.argField.getText());
91+ String[] argv = arry.toArray(new String[arry.size()]);
92+ (new DoRestamp(argv)).setVisible(true);
93+
94+ doButton.setEnabled(true);
95+ }
96+
97+ /**
98+ * 入力条件が満たされているかどうか
99+ * @return
100+ */
101+ @Override
102+ public boolean isEnable() {
103+ return (arg1_basetime.isEnable() && arg2_basetime.isEnable());
104+ }
105+
106+ @Override
107+ @SuppressWarnings("empty-statement")
108+ public void openAction() {
109+ ; // 何もしない
110+ }
111+}
--- /dev/null
+++ b/src/osm/jp/gpx/matchtime/gui/restamp/DoRestamp.java
@@ -0,0 +1,231 @@
1+package osm.jp.gpx.matchtime.gui.restamp;
2+import osm.jp.gpx.matchtime.gui.Command;
3+import java.awt.BorderLayout;
4+import java.awt.Component;
5+import java.awt.Container;
6+import java.awt.Dimension;
7+import java.awt.Font;
8+import java.awt.Point;
9+import java.awt.event.ActionEvent;
10+import java.io.*;
11+import javax.swing.*;
12+
13+/**
14+ * 処理
15+ */
16+@SuppressWarnings("serial")
17+public class DoRestamp extends JDialog {
18+ public static final String TITLE = "Do Command";
19+
20+ // Used for addNotify check.
21+ boolean fComponentsAdjusted = false;
22+ String[] args;
23+
24+ //{{DECLARE_CONTROLS
25+ JPanel buttonPanel; // ボタン配置パネル (下部)
26+ JButton closeButton; // [クローズ]ボタン
27+ JButton doButton; // [実行]ボタン
28+ JTextArea textArea; // 実行結果を表示するJTextArea (中央)
29+ //}}
30+
31+ @SuppressWarnings("OverridableMethodCallInConstructor")
32+ public DoRestamp(String[] args) {
33+ super(); // モーダルダイアログを基盤にする
34+ this.args = args;
35+
36+ // INIT_CONTROLS
37+ @SuppressWarnings("OverridableMethodCallInConstructor")
38+ Container container = getContentPane();
39+ container.setLayout(new BorderLayout());
40+ //parentFrame.setVisible(false);
41+ setSize(getInsets().left + getInsets().right + 980, getInsets().top + getInsets().bottom + 480);
42+ setTitle(DoRestamp.TITLE);
43+
44+ // コントロールパネル
45+ buttonPanel = new JPanel();
46+
47+ doButton = new JButton("実行");
48+ doButton.setToolTipText("処理を実行します.");
49+ doButton.setEnabled(true);
50+ doButton.addActionListener((ActionEvent event) -> {
51+ // 処理中であることを示すため
52+ // ボタンの文字列を変更し,使用不可にする
53+ doButton.setText("処理中...");
54+ doButton.setEnabled(false);
55+
56+ // SwingWorker を生成し,実行する
57+ LongTaskWorker worker = new LongTaskWorker(doButton);
58+ worker.execute();
59+ });
60+ buttonPanel.add(doButton);
61+
62+ closeButton = new JButton("閉じる");
63+ closeButton.setToolTipText("処理を終了します.");
64+ closeButton.addActionListener((ActionEvent event) -> {
65+ dispose();
66+ });
67+ buttonPanel.add(closeButton);
68+
69+ this.getContentPane().add("South", buttonPanel);
70+
71+ // 説明文
72+ textArea = new JTextArea();
73+ JScrollPane sc=new JScrollPane(textArea);
74+ textArea.setFont(new Font(Font.MONOSPACED,Font.PLAIN,12));
75+ textArea.setTabSize(4);
76+ this.getContentPane().add("Center", sc);
77+
78+ try {
79+ textArea.append("> java -cp import.jar osm.jp.gpx.Restamp");
80+ for (String arg : args) {
81+ textArea.append(" '" + arg + "'");
82+ }
83+ textArea.append("\n\n");
84+ }
85+ catch (Exception e) {
86+ System.out.println(e.toString());
87+ }
88+
89+ // JFrameの表示
90+ //parentFrame.setVisible(true);
91+ }
92+
93+ /**
94+ * Shows or hides the component depending on the boolean flag b.
95+ * @param b trueのときコンポーネントを表示; その他のとき, componentを隠す.
96+ * @see java.awt.Component#isVisible
97+ */
98+ @Override
99+ public void setVisible(boolean b) {
100+ if(b) {
101+ setLocation(80, 80);
102+ }
103+ super.setVisible(b);
104+ }
105+
106+ @Override
107+ public void addNotify() {
108+ // Record the size of the window prior to calling parents addNotify.
109+ Dimension d = getSize();
110+
111+ super.addNotify();
112+
113+ if (fComponentsAdjusted) {
114+ return;
115+ }
116+
117+ // Adjust components according to the insets
118+ setSize(getInsets().left + getInsets().right + d.width, getInsets().top + getInsets().bottom + d.height);
119+ Component components[] = getComponents();
120+ for (Component component : components) {
121+ Point p = component.getLocation();
122+ p.translate(getInsets().left, getInsets().top);
123+ component.setLocation(p);
124+ }
125+ fComponentsAdjusted = true;
126+ }
127+
128+
129+ /**
130+ * JTextAreaに書き出すOutputStream
131+ */
132+ public static class JTextAreaOutputStream extends OutputStream {
133+ private final ByteArrayOutputStream os;
134+
135+ /** 書き出し対象 */
136+ private final JTextArea textArea;
137+ private final String encode;
138+
139+ public JTextAreaOutputStream(JTextArea textArea, String encode) {
140+ this.textArea = textArea;
141+ this.encode = encode;
142+ this.os = new ByteArrayOutputStream();
143+ }
144+
145+ /**
146+ * OutputStream#write(byte[])のオーバーライド
147+ * @param arg
148+ * @throws java.io.IOException
149+ */
150+ @Override
151+ public void write(int arg) throws IOException {
152+ this.os.write(arg);
153+ }
154+
155+ /**
156+ * flush()でJTextAreaに書き出す
157+ * @throws java.io.IOException
158+ */
159+ @Override
160+ public void flush() throws IOException {
161+ // 文字列のエンコード
162+ final String str = new String(this.os.toByteArray(), this.encode);
163+ // 実際の書き出し処理
164+ SwingUtilities.invokeLater(
165+ new Runnable(){
166+ @Override
167+ public void run() {
168+ JTextAreaOutputStream.this.textArea.append(str);
169+ }
170+ }
171+ );
172+ // 書き出した内容はクリアする
173+ this.os.reset();
174+ }
175+ }
176+
177+ // 非同期に行う処理を記述するためのクラス
178+ class LongTaskWorker extends SwingWorker<Object, Object> {
179+ private final JButton button;
180+
181+ public LongTaskWorker(JButton button) {
182+ this.button = button;
183+ }
184+
185+ // 非同期に行われる処理
186+ @Override
187+ @SuppressWarnings("SleepWhileInLoop")
188+ public Object doInBackground() {
189+ // ながーい処理
190+ PrintStream defOut = System.out;
191+ PrintStream defErr = System.err;
192+
193+ OutputStream os = new JTextAreaOutputStream(textArea, "UTF-8");
194+ PrintStream stdout = new PrintStream(os, true); // 自動flushをtrueにしておく
195+
196+ // System.out にJTextAreaOutputStreamに書き出すPrintStreamを設定
197+ System.setOut(stdout);
198+ System.setErr(stdout);
199+
200+ try {
201+ Command command = new Command(osm.jp.gpx.Restamp.class);
202+ command.setArgs(args);
203+ command.start(); // コマンドを実行
204+ while (command.isAlive()) {
205+ try {
206+ Thread.sleep(1000);
207+ } catch (InterruptedException e) {}
208+ }
209+ }
210+ catch(Exception e) {
211+ e.printStackTrace(stdout);
212+ }
213+ finally {
214+ System.setOut(defOut);
215+ System.setErr(defErr);
216+ doButton.setEnabled(true);
217+ }
218+
219+ return null;
220+ }
221+
222+ // 非同期処理後に実行
223+ @Override
224+ protected void done() {
225+ // 処理が終了したので,文字列を元に戻し
226+ // ボタンを使用可能にする
227+ button.setText("実行");
228+ button.setEnabled(true);
229+ }
230+ }
231+}
--- a/src/osm/jp/gpx/matchtime/gui/restamp/RestampDialog.java
+++ b/src/osm/jp/gpx/matchtime/gui/restamp/RestampDialog.java
@@ -97,7 +97,7 @@ public class RestampDialog extends Dialog implements Observer
9797
9898 //---------------------------------------------------------------------
9999 params = new AppParameters();
100- cards = new Card[3];
100+ cards = new Card[4];
101101 cardPanel = new JTabbedPane(JTabbedPane.LEFT);
102102 mainPanel.add(cardPanel, BorderLayout.CENTER);
103103 int cardNo = 0;
@@ -191,6 +191,20 @@ public class RestampDialog extends Dialog implements Observer
191191 cardNo++;
192192 }
193193
194+ //---------------------------------------------------------------------
195+ // 4. 実行画面
196+ {
197+ CardPerformFile card = new CardPerformFile(
198+ cardPanel,
199+ arg2_basetime,
200+ arg3_basetime
201+ );
202+ cardPanel.addTab(card.getTitle(), card);
203+ cardPanel.setEnabledAt(cardNo, false);
204+ cards[cardNo] = card;
205+ cardNo++;
206+ }
207+
194208 //{{REGISTER_LISTENERS
195209 SymWindow aSymWindow = new SymWindow();
196210 this.addWindowListener(aSymWindow);
Show on old repository browser