ベータ版移行版。作業部屋IDの綴り修正
修订版 | 2b17489650e3e70d5dcc1985b80fb6a4e17c8e7e (tree) |
---|---|
时间 | 2015-07-17 21:42:06 |
作者 | MirrgieRiana Kurilab |
Commiter | MirrgieRiana Kurilab |
ChlorophyllUploader: add: Main ver2
@@ -0,0 +1,30 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.core; | |
2 | + | |
3 | +import java.util.function.BooleanSupplier; | |
4 | + | |
5 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.packet.PacketChlorofilSender; | |
6 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.ContainerTerminal; | |
7 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.Terminal.EnumStateTerminal; | |
8 | + | |
9 | +public class ContainerTerminalOutput extends ContainerTerminal<TerminalOutput> | |
10 | +{ | |
11 | + | |
12 | + public ContainerTerminalOutput(BooleanSupplier isDisposed) | |
13 | + { | |
14 | + super(isDisposed); | |
15 | + } | |
16 | + | |
17 | + public void accept(PacketChlorofilSender packet) | |
18 | + { | |
19 | + for (TerminalOutput terminal : terminals) { | |
20 | + | |
21 | + if (terminal.getState() == EnumStateTerminal.RUNNING) { | |
22 | + | |
23 | + terminal.accept(packet); | |
24 | + | |
25 | + } | |
26 | + | |
27 | + } | |
28 | + } | |
29 | + | |
30 | +} |
@@ -0,0 +1,147 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.core; | |
2 | + | |
3 | +import java.awt.BorderLayout; | |
4 | +import java.awt.CardLayout; | |
5 | +import java.awt.Container; | |
6 | +import java.net.URL; | |
7 | + | |
8 | +import javax.swing.ImageIcon; | |
9 | +import javax.swing.JLabel; | |
10 | +import javax.swing.JMenu; | |
11 | +import javax.swing.JMenuBar; | |
12 | +import javax.swing.JMenuItem; | |
13 | +import javax.swing.JSplitPane; | |
14 | + | |
15 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.ContainerTerminal; | |
16 | +import mirrg.swing.helium.FrameMirrg; | |
17 | +import mirrg.swing.helium.logging.HLog; | |
18 | + | |
19 | +public class FrameChlorofilSender extends FrameMirrg | |
20 | +{ | |
21 | + | |
22 | + private ContainerTerminal<TerminalInput> containerTerminaInput; | |
23 | + private ContainerTerminalOutput containerTerminalOutput; | |
24 | + | |
25 | + public FrameChlorofilSender() | |
26 | + { | |
27 | + super("ChlorofilSender"); | |
28 | + | |
29 | + { | |
30 | + JMenuBar menuBar = new JMenuBar(); | |
31 | + setJMenuBar(menuBar); | |
32 | + | |
33 | + /* | |
34 | + { | |
35 | + JMenu menu = new JMenu("ウィンドウ(W)"); | |
36 | + menuBar.add(menu); | |
37 | + | |
38 | + menu.setMnemonic('W'); | |
39 | + | |
40 | + { | |
41 | + JMenuItem menuItem = new JMenuItem("送信ウィンドウ(S)"); | |
42 | + menu.add(menuItem); | |
43 | + | |
44 | + menuItem.setMnemonic('S'); | |
45 | + menuItem.addActionListener(e -> { | |
46 | + | |
47 | + showFramePacketChlorofilSender(); | |
48 | + | |
49 | + }); | |
50 | + } | |
51 | + | |
52 | + { | |
53 | + JMenuItem menuItem = new JMenuItem("ログウィンドウ(L)"); | |
54 | + menu.add(menuItem); | |
55 | + | |
56 | + menuItem.setMnemonic('L'); | |
57 | + menuItem.addActionListener(e -> { | |
58 | + | |
59 | + showFrameLog(); | |
60 | + | |
61 | + }); | |
62 | + } | |
63 | + | |
64 | + } | |
65 | + */ | |
66 | + | |
67 | + { | |
68 | + JMenu menu = new JMenu("入力(I)"); | |
69 | + menuBar.add(menu); | |
70 | + | |
71 | + menu.setMnemonic('I'); | |
72 | + | |
73 | + RegistryChlorophyllUploader.listInputTerminal.forEach(category -> { | |
74 | + JMenuItem menuItem = category.createMenuItem(); | |
75 | + menu.add(menuItem); | |
76 | + | |
77 | + menuItem.addActionListener(e -> { | |
78 | + | |
79 | + category.create(containerTerminaInput::addTerminal, | |
80 | + containerTerminalOutput::accept); | |
81 | + | |
82 | + }); | |
83 | + | |
84 | + }); | |
85 | + | |
86 | + } | |
87 | + | |
88 | + { | |
89 | + JMenu menu = new JMenu("出力(O)"); | |
90 | + menuBar.add(menu); | |
91 | + | |
92 | + menu.setMnemonic('O'); | |
93 | + | |
94 | + RegistryChlorophyllUploader.listOutputTerminal.forEach(category -> { | |
95 | + JMenuItem menuItem = category.createMenuItem(); | |
96 | + menu.add(menuItem); | |
97 | + | |
98 | + menuItem.addActionListener(e -> { | |
99 | + | |
100 | + category.create(containerTerminalOutput::addTerminal); | |
101 | + | |
102 | + }); | |
103 | + | |
104 | + }); | |
105 | + | |
106 | + } | |
107 | + | |
108 | + } | |
109 | + | |
110 | + { | |
111 | + containerTerminaInput = new ContainerTerminal<>(this::isDisposed); | |
112 | + containerTerminalOutput = new ContainerTerminalOutput(this::isDisposed); | |
113 | + | |
114 | + onDisposed(e -> containerTerminaInput.dispose()); | |
115 | + onDisposed(e -> containerTerminalOutput.dispose()); | |
116 | + | |
117 | + Container containerUp = new Container(); | |
118 | + containerUp.setLayout(new BorderLayout()); | |
119 | + containerUp.add(new JLabel("入力"), BorderLayout.NORTH); | |
120 | + containerUp.add(containerTerminaInput, BorderLayout.CENTER); | |
121 | + | |
122 | + Container containerDown = new Container(); | |
123 | + containerDown.setLayout(new BorderLayout()); | |
124 | + containerDown.add(new JLabel("出力"), BorderLayout.NORTH); | |
125 | + containerDown.add(containerTerminalOutput, BorderLayout.CENTER); | |
126 | + | |
127 | + JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, | |
128 | + containerUp, | |
129 | + containerDown); | |
130 | + splitPane.setResizeWeight(0.5); | |
131 | + | |
132 | + add(splitPane); | |
133 | + setLayout(new CardLayout()); | |
134 | + } | |
135 | + | |
136 | + { | |
137 | + URL url = getClass().getResource("icon.png"); | |
138 | + if (url != null) { | |
139 | + setIconImage(new ImageIcon(url).getImage()); | |
140 | + } else { | |
141 | + HLog.warning("アイコンファイルの読み込みに失敗しました。"); | |
142 | + } | |
143 | + } | |
144 | + | |
145 | + prepareFrame(); | |
146 | + } | |
147 | +} |
@@ -0,0 +1,34 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.core; | |
2 | + | |
3 | +import java.util.function.Consumer; | |
4 | + | |
5 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.packet.PacketChlorofilSender; | |
6 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.ICategory; | |
7 | + | |
8 | +public interface ICategoryInput extends ICategory<TerminalInput> | |
9 | +{ | |
10 | + | |
11 | + /** | |
12 | + * 新しいインスタンス作成のためのダイアログを表示する。 | |
13 | + * | |
14 | + * @param consumerTerminal | |
15 | + * 正常にインスタンスが生成された場合に、生成したインスタンスが報告される。 | |
16 | + * 複数回呼び出してもよい。 | |
17 | + */ | |
18 | + public void create(Consumer<TerminalInput> consumerTerminal, Consumer<PacketChlorofilSender> consumerPacket); | |
19 | + | |
20 | + /** | |
21 | + * 保存用オブジェクトから読み込む。 | |
22 | + * | |
23 | + * @param data | |
24 | + * 読み込むためのデータ。 | |
25 | + * @param consumerTerminal | |
26 | + * 正常に読み込めた場合に、生成したインスタンスが報告される。 | |
27 | + * 複数回呼び出してもよい。 | |
28 | + * @param onException | |
29 | + * 不正な{@link ICategory}により読み込めなかった場合に呼び出される。 | |
30 | + * 複数呼び出し可。 | |
31 | + */ | |
32 | + public void load(Object data, Consumer<TerminalInput> consumerTerminal, Consumer<PacketChlorofilSender> consumerPacket, Consumer<Exception> onException); | |
33 | + | |
34 | +} |
@@ -0,0 +1,33 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.core; | |
2 | + | |
3 | +import java.util.function.Consumer; | |
4 | + | |
5 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.ICategory; | |
6 | + | |
7 | +public interface ICategoryOutput extends ICategory<TerminalOutput> | |
8 | +{ | |
9 | + | |
10 | + /** | |
11 | + * 新しいインスタンス作成のためのダイアログを表示する。 | |
12 | + * | |
13 | + * @param consumerTerminal | |
14 | + * 正常にインスタンスが生成された場合に、生成したインスタンスが報告される。 | |
15 | + * 複数回呼び出してもよい。 | |
16 | + */ | |
17 | + public void create(Consumer<TerminalOutput> consumerTerminal); | |
18 | + | |
19 | + /** | |
20 | + * 保存用オブジェクトから読み込む。 | |
21 | + * | |
22 | + * @param data | |
23 | + * 読み込むためのデータ。 | |
24 | + * @param consumerTerminal | |
25 | + * 正常に読み込めた場合に、生成したインスタンスが報告される。 | |
26 | + * 複数回呼び出してもよい。 | |
27 | + * @param onException | |
28 | + * 不正な{@link ICategory}により読み込めなかった場合に呼び出される。 | |
29 | + * 複数呼び出し可。 | |
30 | + */ | |
31 | + public void load(Object data, Consumer<TerminalOutput> consumerTerminal, Consumer<Exception> onException); | |
32 | + | |
33 | +} |
@@ -0,0 +1,22 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.core; | |
2 | + | |
3 | +import java.util.ArrayList; | |
4 | + | |
5 | +public class RegistryChlorophyllUploader | |
6 | +{ | |
7 | + | |
8 | + public static ArrayList<ICategoryInput> listInputTerminal = new ArrayList<>(); | |
9 | + | |
10 | + public static void registerTerminalInput(ICategoryInput category) | |
11 | + { | |
12 | + listInputTerminal.add(category); | |
13 | + } | |
14 | + | |
15 | + public static ArrayList<ICategoryOutput> listOutputTerminal = new ArrayList<>(); | |
16 | + | |
17 | + public static void registerTerminalOutput(ICategoryOutput category) | |
18 | + { | |
19 | + listOutputTerminal.add(category); | |
20 | + } | |
21 | + | |
22 | +} |
@@ -0,0 +1,18 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.core; | |
2 | + | |
3 | +import java.util.function.Consumer; | |
4 | + | |
5 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.packet.PacketChlorofilSender; | |
6 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.Terminal; | |
7 | + | |
8 | +public abstract class TerminalInput extends Terminal | |
9 | +{ | |
10 | + | |
11 | + protected Consumer<PacketChlorofilSender> consumer; | |
12 | + | |
13 | + public TerminalInput(Consumer<PacketChlorofilSender> consumer) | |
14 | + { | |
15 | + this.consumer = consumer; | |
16 | + } | |
17 | + | |
18 | +} |
@@ -0,0 +1,11 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.core; | |
2 | + | |
3 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.packet.PacketChlorofilSender; | |
4 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.Terminal; | |
5 | + | |
6 | +public abstract class TerminalOutput extends Terminal | |
7 | +{ | |
8 | + | |
9 | + public abstract void accept(PacketChlorofilSender packet); | |
10 | + | |
11 | +} |
@@ -0,0 +1,201 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal; | |
2 | + | |
3 | +import java.awt.Component; | |
4 | +import java.awt.Dimension; | |
5 | +import java.util.ArrayList; | |
6 | +import java.util.Vector; | |
7 | +import java.util.function.BooleanSupplier; | |
8 | + | |
9 | +import javax.swing.JButton; | |
10 | +import javax.swing.JComponent; | |
11 | +import javax.swing.JScrollPane; | |
12 | +import javax.swing.JTable; | |
13 | +import javax.swing.table.DefaultTableModel; | |
14 | + | |
15 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.Terminal.EnumStateTerminal; | |
16 | +import jp.hishidama.swing.layout.GroupLayoutUtil; | |
17 | +import mirrg.swing.helium.logging.HLog; | |
18 | + | |
19 | +public class ContainerTerminal<T extends Terminal> extends JComponent | |
20 | +{ | |
21 | + | |
22 | + protected BooleanSupplier supplierDisposed; | |
23 | + protected DefaultTableModel tableModel; | |
24 | + protected JTable table; | |
25 | + | |
26 | + public ContainerTerminal(BooleanSupplier supplierDisposed) | |
27 | + { | |
28 | + this.supplierDisposed = supplierDisposed; | |
29 | + | |
30 | + tableModel = new DefaultTableModel(); | |
31 | + table = new JTable(tableModel); | |
32 | + tableModel.addColumn("ON"); | |
33 | + table.getColumnModel().getColumn(0).setPreferredWidth(30); | |
34 | + table.getColumnModel().getColumn(0).setWidth(30); | |
35 | + tableModel.addColumn("カテゴリ"); | |
36 | + table.getColumnModel().getColumn(1).setPreferredWidth(150); | |
37 | + table.getColumnModel().getColumn(1).setWidth(150); | |
38 | + tableModel.addColumn("説明"); | |
39 | + table.getColumnModel().getColumn(2).setPreferredWidth(220); | |
40 | + table.getColumnModel().getColumn(2).setWidth(220); | |
41 | + | |
42 | + JScrollPane scrollPane = new JScrollPane(table); | |
43 | + scrollPane.setPreferredSize(new Dimension(400, 100)); | |
44 | + | |
45 | + JButton buttonEdit = new JButton("編集"); | |
46 | + buttonEdit.addActionListener(e -> { | |
47 | + T terminal = getSelectedTerminal(); | |
48 | + if (terminal != null) terminal.showEditDialog(); | |
49 | + }); | |
50 | + | |
51 | + JButton buttonStart = new JButton("開始"); | |
52 | + buttonStart.addActionListener(e -> { | |
53 | + T terminal = getSelectedTerminal(); | |
54 | + if (terminal != null) terminal.start(); | |
55 | + }); | |
56 | + | |
57 | + JButton buttonStop = new JButton("停止"); | |
58 | + buttonStop.addActionListener(e -> { | |
59 | + T terminal = getSelectedTerminal(); | |
60 | + if (terminal != null) terminal.stop(); | |
61 | + }); | |
62 | + | |
63 | + JButton buttonDelete = new JButton("除去"); | |
64 | + buttonDelete.addActionListener(e -> { | |
65 | + T terminal = getSelectedTerminal(); | |
66 | + if (terminal != null) removeTerminal(terminal); | |
67 | + }); | |
68 | + | |
69 | + { | |
70 | + Component[][] components = { | |
71 | + { | |
72 | + scrollPane, | |
73 | + GroupLayoutUtil.SAME_L, | |
74 | + GroupLayoutUtil.SAME_L, | |
75 | + GroupLayoutUtil.SAME_L, | |
76 | + }, | |
77 | + { | |
78 | + buttonEdit, | |
79 | + buttonStart, | |
80 | + buttonStop, | |
81 | + buttonDelete, | |
82 | + }, | |
83 | + }; | |
84 | + | |
85 | + GroupLayoutUtil groupLayoutUtil = new GroupLayoutUtil(); | |
86 | + | |
87 | + groupLayoutUtil.setComponents(components); | |
88 | + groupLayoutUtil.setGroupLayoutTo(this); | |
89 | + | |
90 | + groupLayoutUtil.getGroupLayout().setAutoCreateContainerGaps(false); | |
91 | + groupLayoutUtil.getGroupLayout().setAutoCreateGaps(true); | |
92 | + } | |
93 | + } | |
94 | + | |
95 | + protected ArrayList<T> terminals = new ArrayList<>(); | |
96 | + | |
97 | + public T getTerminal(int index) | |
98 | + { | |
99 | + return terminals.get(index); | |
100 | + } | |
101 | + | |
102 | + public int getTerminalIndex(T terminal) | |
103 | + { | |
104 | + return terminals.indexOf(terminal); | |
105 | + } | |
106 | + | |
107 | + public T getSelectedTerminal() | |
108 | + { | |
109 | + int row = table.getSelectedRow(); | |
110 | + if (row != -1) { | |
111 | + return getTerminal(row); | |
112 | + } | |
113 | + return null; | |
114 | + } | |
115 | + | |
116 | + protected String getLocalizedState(EnumStateTerminal state) | |
117 | + { | |
118 | + switch (state) { | |
119 | + case DIRTY: | |
120 | + return "OFF(汚濁)"; | |
121 | + case RUNNABLE: | |
122 | + return "OFF(清純)"; | |
123 | + case RUNNING: | |
124 | + return "ON"; | |
125 | + case DISPOSED: | |
126 | + return "OFF(破棄)"; | |
127 | + case UNINITIALIZED: | |
128 | + return "OFF(未初期化)"; | |
129 | + } | |
130 | + throw new RuntimeException(); | |
131 | + } | |
132 | + | |
133 | + public void addTerminal(T terminal) | |
134 | + { | |
135 | + int row = tableModel.getRowCount(); | |
136 | + tableModel.addRow((Vector<?>) null); | |
137 | + | |
138 | + terminals.add(terminal); | |
139 | + tableModel.setValueAt(getLocalizedState(terminal.getState()), row, 0); | |
140 | + tableModel.setValueAt(terminal.getCategory().getName(), row, 1); | |
141 | + tableModel.setValueAt(terminal.getDescription(), row, 2); | |
142 | + | |
143 | + terminal.addListenerStateChanged((state, runnableStopListening) -> { | |
144 | + | |
145 | + tableModel.setValueAt(getLocalizedState(state), row, 0); | |
146 | + | |
147 | + if (supplierDisposed.getAsBoolean() || getTerminalIndex(terminal) == -1) { | |
148 | + runnableStopListening.run(); | |
149 | + } | |
150 | + }); | |
151 | + | |
152 | + terminal.init(); | |
153 | + } | |
154 | + | |
155 | + public void removeTerminal(T terminal) | |
156 | + { | |
157 | + if (terminal.getState() == EnumStateTerminal.RUNNING) { | |
158 | + terminal.stop(); | |
159 | + } | |
160 | + terminal.dispose(); | |
161 | + | |
162 | + int index = getTerminalIndex(terminal); | |
163 | + | |
164 | + terminals.remove(terminal); | |
165 | + tableModel.removeRow(index); | |
166 | + } | |
167 | + | |
168 | + public void startTerminal(T terminal) | |
169 | + { | |
170 | + if (terminal.getState() == EnumStateTerminal.RUNNABLE) { | |
171 | + terminal.reset(); | |
172 | + terminal.start(); | |
173 | + } else { | |
174 | + HLog.warning(String.format("既に実行しています: %s/%s", | |
175 | + terminal.getCategory().getName(), | |
176 | + terminal.getDescription())); | |
177 | + } | |
178 | + } | |
179 | + | |
180 | + public void stopTerminal(T terminal) | |
181 | + { | |
182 | + if (terminal.getState() == EnumStateTerminal.RUNNING) { | |
183 | + terminal.stop(); | |
184 | + } else { | |
185 | + HLog.warning(String.format("実行されていません: %s/%s", | |
186 | + terminal.getCategory().getName(), | |
187 | + terminal.getDescription())); | |
188 | + } | |
189 | + } | |
190 | + | |
191 | + public void dispose() | |
192 | + { | |
193 | + for (T terminal : terminals) { | |
194 | + if (terminal.getState() == EnumStateTerminal.RUNNING) { | |
195 | + terminal.stop(); | |
196 | + } | |
197 | + terminal.dispose(); | |
198 | + } | |
199 | + } | |
200 | + | |
201 | +} |
@@ -0,0 +1,29 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal; | |
2 | + | |
3 | +import javax.swing.JMenuItem; | |
4 | + | |
5 | +public interface ICategory<T extends Terminal> | |
6 | +{ | |
7 | + | |
8 | + public String getMenuItemLabel(); | |
9 | + | |
10 | + /** | |
11 | + * @return Swingのショートカットキー。 | |
12 | + */ | |
13 | + public int getMnemonic(); | |
14 | + | |
15 | + /** | |
16 | + * @return 表示用のカテゴリ名称。 | |
17 | + */ | |
18 | + public String getName(); | |
19 | + | |
20 | + public default JMenuItem createMenuItem() | |
21 | + { | |
22 | + JMenuItem menuItem = new JMenuItem(getMenuItemLabel()); | |
23 | + | |
24 | + menuItem.setMnemonic(getMnemonic()); | |
25 | + | |
26 | + return menuItem; | |
27 | + } | |
28 | + | |
29 | +} |
@@ -0,0 +1,127 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal; | |
2 | + | |
3 | +import java.util.ArrayList; | |
4 | +import java.util.Iterator; | |
5 | +import java.util.function.BiConsumer; | |
6 | + | |
7 | +/** | |
8 | + * 3つのステートが存在する。 | |
9 | + * <ul> | |
10 | + * <li>未初期化状態(初期状態)</li> | |
11 | + * <li>未実行・汚濁状態</li> | |
12 | + * <li>未実行・清純状態</li> | |
13 | + * <li>実行状態</li> | |
14 | + * <li>破棄状態</li> | |
15 | + * </ul> | |
16 | + */ | |
17 | +public abstract class Terminal | |
18 | +{ | |
19 | + | |
20 | + public Terminal() | |
21 | + { | |
22 | + setState(EnumStateTerminal.UNINITIALIZED); | |
23 | + } | |
24 | + | |
25 | + /** | |
26 | + * @return 端末のインスタンスを生成したカテゴリ。 | |
27 | + */ | |
28 | + public abstract ICategory<?> getCategory(); | |
29 | + | |
30 | + /** | |
31 | + * @return 同カテゴリの別のインスタンスとの違いが分かるような文字列。 | |
32 | + */ | |
33 | + public abstract String getDescription(); | |
34 | + | |
35 | + /** | |
36 | + * @return 保存に使われる、この端末の設定を記述したXStreamオブジェクト。 | |
37 | + */ | |
38 | + public abstract Object getData(); | |
39 | + | |
40 | + /** | |
41 | + * このインスタンスを編集するダイアログを表示する。 | |
42 | + * キャンセルを実装する場合、キャンセルしたら何もする必要はない。 | |
43 | + * 編集が成功した場合は、このインスタンスを改変する。 | |
44 | + * その際、必要であれば{@link #stop()}や{@link #reset()}などを呼び出してよい。 | |
45 | + */ | |
46 | + public abstract void showEditDialog(); | |
47 | + | |
48 | + /** | |
49 | + * インスタンスを初期化する。1回だけ呼び出される。未実行・汚濁状態に移行。 | |
50 | + */ | |
51 | + public void init() | |
52 | + { | |
53 | + setState(EnumStateTerminal.DIRTY); | |
54 | + } | |
55 | + | |
56 | + /** | |
57 | + * 未実行・汚濁状態にのみ呼び出される。未実行・清純状態に移行。 | |
58 | + */ | |
59 | + public void reset() | |
60 | + { | |
61 | + setState(EnumStateTerminal.RUNNABLE); | |
62 | + } | |
63 | + | |
64 | + /** | |
65 | + * 未実行・清純状態にのみ呼び出される。実行状態に移行。 | |
66 | + */ | |
67 | + public void start() | |
68 | + { | |
69 | + setState(EnumStateTerminal.RUNNING); | |
70 | + } | |
71 | + | |
72 | + /** | |
73 | + * 実行状態にのみ呼び出される。未実行・汚濁状態に移行。 | |
74 | + */ | |
75 | + public void stop() | |
76 | + { | |
77 | + setState(EnumStateTerminal.DIRTY); | |
78 | + } | |
79 | + | |
80 | + /** | |
81 | + * 未実行状態にのみ呼び出される。1回だけ呼び出される。インスタンスを破棄する。 | |
82 | + */ | |
83 | + public void dispose() | |
84 | + { | |
85 | + setState(EnumStateTerminal.DISPOSED); | |
86 | + } | |
87 | + | |
88 | + protected ArrayList<BiConsumer<EnumStateTerminal, Runnable>> listeners = new ArrayList<>(); | |
89 | + | |
90 | + /** | |
91 | + * @param listener | |
92 | + * (state ,runnableStopListening) | |
93 | + */ | |
94 | + public void addListenerStateChanged(BiConsumer<EnumStateTerminal, Runnable> listener) | |
95 | + { | |
96 | + listeners.add(listener); | |
97 | + } | |
98 | + | |
99 | + private EnumStateTerminal state; | |
100 | + | |
101 | + public EnumStateTerminal getState() | |
102 | + { | |
103 | + return state; | |
104 | + } | |
105 | + | |
106 | + public void setState(EnumStateTerminal state) | |
107 | + { | |
108 | + this.state = state; | |
109 | + | |
110 | + Iterator<BiConsumer<EnumStateTerminal, Runnable>> iterator = listeners.iterator(); | |
111 | + while (iterator.hasNext()) { | |
112 | + BiConsumer<EnumStateTerminal, Runnable> listener = iterator.next(); | |
113 | + | |
114 | + listener.accept(state, iterator::remove); | |
115 | + } | |
116 | + } | |
117 | + | |
118 | + public static enum EnumStateTerminal | |
119 | + { | |
120 | + UNINITIALIZED, | |
121 | + DIRTY, | |
122 | + RUNNABLE, | |
123 | + RUNNING, | |
124 | + DISPOSED, | |
125 | + } | |
126 | + | |
127 | +} |
@@ -0,0 +1,118 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.ver2; | |
2 | + | |
3 | +import java.util.function.Consumer; | |
4 | + | |
5 | +import javax.swing.WindowConstants; | |
6 | + | |
7 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.core.ICategoryInput; | |
8 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.core.TerminalInput; | |
9 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.packet.FramePacketChlorofilSender; | |
10 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.packet.PacketChlorofilSender; | |
11 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.ICategory; | |
12 | + | |
13 | +public class CategoryInputDialog implements ICategoryInput | |
14 | +{ | |
15 | + | |
16 | + @Override | |
17 | + public String getMenuItemLabel() | |
18 | + { | |
19 | + return "送信ウィンドウ(W)..."; | |
20 | + } | |
21 | + | |
22 | + @Override | |
23 | + public int getMnemonic() | |
24 | + { | |
25 | + return 'W'; | |
26 | + } | |
27 | + | |
28 | + @Override | |
29 | + public String getName() | |
30 | + { | |
31 | + return "送信ウィンドウ"; | |
32 | + } | |
33 | + | |
34 | + @Override | |
35 | + public void create(Consumer<TerminalInput> consumerTerminal, Consumer<PacketChlorofilSender> consumerPacket) | |
36 | + { | |
37 | + // TODO 自動生成されたメソッド・スタブ | |
38 | + consumerTerminal.accept(new TerminalInput(consumerPacket) { | |
39 | + | |
40 | + @Override | |
41 | + public void showEditDialog() | |
42 | + { | |
43 | + // TODO 自動生成されたメソッド・スタブ | |
44 | + | |
45 | + } | |
46 | + | |
47 | + @Override | |
48 | + public String getDescription() | |
49 | + { | |
50 | + // TODO 自動生成されたメソッド・スタブ | |
51 | + return "desc"; | |
52 | + } | |
53 | + | |
54 | + @Override | |
55 | + public Object getData() | |
56 | + { | |
57 | + // TODO 自動生成されたメソッド・スタブ | |
58 | + return new String[] { | |
59 | + "aiueo" | |
60 | + }; | |
61 | + } | |
62 | + | |
63 | + FramePacketChlorofilSender frame; | |
64 | + | |
65 | + @Override | |
66 | + public void init() | |
67 | + { | |
68 | + frame = new FramePacketChlorofilSender(consumer); | |
69 | + frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); | |
70 | + frame.onHidden(e -> { | |
71 | + setState(EnumStateTerminal.DIRTY); | |
72 | + }); | |
73 | + | |
74 | + super.init(); | |
75 | + } | |
76 | + | |
77 | + @Override | |
78 | + public void start() | |
79 | + { | |
80 | + frame.setVisible(true); | |
81 | + | |
82 | + super.start(); | |
83 | + | |
84 | + } | |
85 | + | |
86 | + @Override | |
87 | + public void stop() | |
88 | + { | |
89 | + frame.setVisible(false); | |
90 | + | |
91 | + super.stop(); | |
92 | + } | |
93 | + | |
94 | + @Override | |
95 | + public void dispose() | |
96 | + { | |
97 | + frame.dispose(); | |
98 | + | |
99 | + super.dispose(); | |
100 | + } | |
101 | + | |
102 | + @Override | |
103 | + public ICategory<?> getCategory() | |
104 | + { | |
105 | + return CategoryInputDialog.this; | |
106 | + } | |
107 | + | |
108 | + }); | |
109 | + } | |
110 | + | |
111 | + @Override | |
112 | + public void load(Object data, Consumer<TerminalInput> consumerTerminal, Consumer<PacketChlorofilSender> consumerPacket, Consumer<Exception> onException) | |
113 | + { | |
114 | + // TODO 自動生成されたメソッド・スタブ | |
115 | + create(consumerTerminal, consumerPacket); | |
116 | + } | |
117 | + | |
118 | +} |
@@ -0,0 +1,97 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.ver2; | |
2 | + | |
3 | +import java.util.function.Consumer; | |
4 | + | |
5 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.core.ICategoryInput; | |
6 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.core.TerminalInput; | |
7 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.packet.PacketChlorofilSender; | |
8 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.ICategory; | |
9 | + | |
10 | +public class CategoryInputFileWatcherSpawning implements ICategoryInput | |
11 | +{ | |
12 | + | |
13 | + @Override | |
14 | + public String getMenuItemLabel() | |
15 | + { | |
16 | + return "監視フォルダの追加(F)..."; | |
17 | + } | |
18 | + | |
19 | + @Override | |
20 | + public int getMnemonic() | |
21 | + { | |
22 | + return 'F'; | |
23 | + } | |
24 | + | |
25 | + @Override | |
26 | + public String getName() | |
27 | + { | |
28 | + return "監視フォルダ"; | |
29 | + } | |
30 | + | |
31 | + @Override | |
32 | + public void create(Consumer<TerminalInput> consumerTerminal, Consumer<PacketChlorofilSender> consumerPacket) | |
33 | + { | |
34 | + // TODO 自動生成されたメソッド・スタブ | |
35 | + consumerTerminal.accept(new TerminalInput(consumerPacket) { | |
36 | + | |
37 | + @Override | |
38 | + public void showEditDialog() | |
39 | + { | |
40 | + // TODO 自動生成されたメソッド・スタブ | |
41 | + | |
42 | + } | |
43 | + | |
44 | + @Override | |
45 | + public String getDescription() | |
46 | + { | |
47 | + // TODO 自動生成されたメソッド・スタブ | |
48 | + return "desc"; | |
49 | + } | |
50 | + | |
51 | + @Override | |
52 | + public Object getData() | |
53 | + { | |
54 | + // TODO 自動生成されたメソッド・スタブ | |
55 | + return new String[] { | |
56 | + "aiueo" | |
57 | + }; | |
58 | + } | |
59 | + | |
60 | + @Override | |
61 | + public void reset() | |
62 | + { | |
63 | + // TODO 自動生成されたメソッド・スタブ | |
64 | + super.reset(); | |
65 | + } | |
66 | + | |
67 | + @Override | |
68 | + public void start() | |
69 | + { | |
70 | + // TODO 自動生成されたメソッド・スタブ | |
71 | + super.start(); | |
72 | + } | |
73 | + | |
74 | + @Override | |
75 | + public void stop() | |
76 | + { | |
77 | + // TODO 自動生成されたメソッド・スタブ | |
78 | + super.stop(); | |
79 | + } | |
80 | + | |
81 | + @Override | |
82 | + public ICategory<?> getCategory() | |
83 | + { | |
84 | + return CategoryInputFileWatcherSpawning.this; | |
85 | + } | |
86 | + | |
87 | + }); | |
88 | + } | |
89 | + | |
90 | + @Override | |
91 | + public void load(Object data, Consumer<TerminalInput> consumerTerminal, Consumer<PacketChlorofilSender> consumerPacket, Consumer<Exception> onException) | |
92 | + { | |
93 | + // TODO 自動生成されたメソッド・スタブ | |
94 | + create(consumerTerminal, consumerPacket); | |
95 | + } | |
96 | + | |
97 | +} |
@@ -0,0 +1,104 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.ver2; | |
2 | + | |
3 | +import java.util.function.Consumer; | |
4 | + | |
5 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.core.ICategoryOutput; | |
6 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.core.TerminalOutput; | |
7 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.packet.PacketChlorofilSender; | |
8 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.terminal.ICategory; | |
9 | + | |
10 | +public class CategoryOutputTunnelSerialToIEEE1888 implements ICategoryOutput | |
11 | +{ | |
12 | + | |
13 | + @Override | |
14 | + public String getMenuItemLabel() | |
15 | + { | |
16 | + return "Arduino - TunnelSerialToIEEE1888@AcsSerial(A)..."; | |
17 | + } | |
18 | + | |
19 | + @Override | |
20 | + public int getMnemonic() | |
21 | + { | |
22 | + return 'A'; | |
23 | + } | |
24 | + | |
25 | + @Override | |
26 | + public String getName() | |
27 | + { | |
28 | + return "Arduino Output"; | |
29 | + } | |
30 | + | |
31 | + @Override | |
32 | + public void create(Consumer<TerminalOutput> consumerTerminal) | |
33 | + { | |
34 | + // TODO 自動生成されたメソッド・スタブ | |
35 | + consumerTerminal.accept(new TerminalOutput() { | |
36 | + | |
37 | + @Override | |
38 | + public void showEditDialog() | |
39 | + { | |
40 | + // TODO 自動生成されたメソッド・スタブ | |
41 | + | |
42 | + } | |
43 | + | |
44 | + @Override | |
45 | + public String getDescription() | |
46 | + { | |
47 | + // TODO 自動生成されたメソッド・スタブ | |
48 | + return "desc"; | |
49 | + } | |
50 | + | |
51 | + @Override | |
52 | + public Object getData() | |
53 | + { | |
54 | + // TODO 自動生成されたメソッド・スタブ | |
55 | + return new String[] { | |
56 | + "aiueo" | |
57 | + }; | |
58 | + } | |
59 | + | |
60 | + @Override | |
61 | + public void reset() | |
62 | + { | |
63 | + // TODO 自動生成されたメソッド・スタブ | |
64 | + super.reset(); | |
65 | + } | |
66 | + | |
67 | + @Override | |
68 | + public void start() | |
69 | + { | |
70 | + // TODO 自動生成されたメソッド・スタブ | |
71 | + super.start(); | |
72 | + } | |
73 | + | |
74 | + @Override | |
75 | + public void stop() | |
76 | + { | |
77 | + // TODO 自動生成されたメソッド・スタブ | |
78 | + super.stop(); | |
79 | + } | |
80 | + | |
81 | + @Override | |
82 | + public ICategory<?> getCategory() | |
83 | + { | |
84 | + return CategoryOutputTunnelSerialToIEEE1888.this; | |
85 | + } | |
86 | + | |
87 | + @Override | |
88 | + public void accept(PacketChlorofilSender packet) | |
89 | + { | |
90 | + // TODO 自動生成されたメソッド・スタブ | |
91 | + System.out.println(packet.encode().get()); | |
92 | + } | |
93 | + | |
94 | + }); | |
95 | + } | |
96 | + | |
97 | + @Override | |
98 | + public void load(Object data, Consumer<TerminalOutput> consumerTerminal, Consumer<Exception> onException) | |
99 | + { | |
100 | + // TODO 自動生成されたメソッド・スタブ | |
101 | + create(consumerTerminal); | |
102 | + } | |
103 | + | |
104 | +} |
@@ -0,0 +1,22 @@ | ||
1 | +package jp.ac.kisarazu.j.kurilab.chlorophylluploader.ver2; | |
2 | + | |
3 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.core.FrameChlorofilSender; | |
4 | +import jp.ac.kisarazu.j.kurilab.chlorophylluploader.core.RegistryChlorophyllUploader; | |
5 | +import mirrg.swing.helium.HSwing; | |
6 | + | |
7 | +public class Main | |
8 | +{ | |
9 | + | |
10 | + public static void main(String[] args) | |
11 | + { | |
12 | + System.loadLibrary("rxtxSerial"); | |
13 | + HSwing.tryAddWebLookAndFeel(); | |
14 | + HSwing.setWindowsLookAndFeel(); | |
15 | + | |
16 | + RegistryChlorophyllUploader.registerTerminalInput(new CategoryInputFileWatcherSpawning()); | |
17 | + RegistryChlorophyllUploader.registerTerminalInput(new CategoryInputDialog()); | |
18 | + RegistryChlorophyllUploader.registerTerminalOutput(new CategoryOutputTunnelSerialToIEEE1888()); | |
19 | + | |
20 | + new FrameChlorofilSender().setVisible(true); | |
21 | + } | |
22 | +} |