source: java/main/src/main/java/com/framsticks/gui/Browser.java @ 102

Last change on this file since 102 was 102, checked in by psniegowski, 11 years ago

HIGHLIGHTS:

for Joinables running

CHANGELOG:
Add WorkPackageLogic? and classes representing prime experiment state.

Add classes for PrimeExperiment? state.

Extract single netload routine in Simulator.

Working netload with dummy content in PrimeExperiment?.

More development with NetLoadSaveLogic? and PrimeExperiment?.

Improvement around prime.

Improve BufferedDispatcher?.isActive logic.

Add prime-all.xml configuration.

Manual connecting to existing simulators from GUI.

Guard in SimulatorConnector? against expdef mismatch.

Guard against empty target dispatcher in BufferedDispatcher?.

Make BufferedDispatcher? a Dispatcher (and Joinable).

Minor improvements.

Done StackedJoinable?, improve Experiment.

Develop StackedJoinable?.

Add StackedJoinable? utility joinables controller.

Add dependency on apache-commons-lang.

Add ready ListChange? on Simulators.

Improve hints in ListChange?.

Several improvements.

Found bug with dispatching in Experiment.

Minor improvements.

Fix bug with early finishing Server.

Many changes in Dispatching.

Fix bug with connection.

Do not obfuscate log with socket related exceptions.

Add SocketClosedException?.

Add SimulatorConnector?.

Work out conception of experiment composing of logics building blocks.

Rename SinkInterface? to Sink.

Move saving of Accesses into AccessOperations?.

Some improvements to Experiment.

Improve joinables.

Fix issue with joinables closing.

Add direct and managed consoles to popup menu.

File size: 10.6 KB
Line 
1package com.framsticks.gui;
2
3import com.framsticks.communication.File;
4import com.framsticks.communication.queries.NeedFile;
5import com.framsticks.communication.queries.NeedFileAcceptor;
6import com.framsticks.core.*;
7import com.framsticks.gui.console.Console;
8import com.framsticks.gui.console.DirectConsole;
9import com.framsticks.gui.console.ManagedConsole;
10import com.framsticks.gui.console.TrackConsole;
11import com.framsticks.gui.table.ColumnsConfig;
12import com.framsticks.gui.table.ListPanelProvider;
13import com.framsticks.params.annotations.AutoAppendAnnotation;
14import com.framsticks.params.annotations.FramsClassAnnotation;
15import com.framsticks.params.annotations.ParamAnnotation;
16import com.framsticks.parsers.FileSource;
17import com.framsticks.remote.RemoteTree;
18import com.framsticks.util.FramsticksException;
19import com.framsticks.util.dispatching.AbstractJoinable;
20import com.framsticks.util.dispatching.Dispatcher;
21import com.framsticks.util.dispatching.Dispatching;
22import com.framsticks.util.dispatching.ExceptionResultHandler;
23import com.framsticks.util.dispatching.Future;
24import com.framsticks.util.dispatching.Joinable;
25import com.framsticks.util.dispatching.JoinableCollection;
26import com.framsticks.util.dispatching.JoinableParent;
27import com.framsticks.util.dispatching.JoinableState;
28
29import javax.swing.*;
30import javax.swing.filechooser.FileNameExtensionFilter;
31
32import org.apache.logging.log4j.Logger;
33import org.apache.logging.log4j.LogManager;
34
35import java.awt.Dimension;
36import java.awt.Toolkit;
37import java.awt.datatransfer.StringSelection;
38import java.awt.event.ActionEvent;
39import java.awt.event.ActionListener;
40import java.awt.event.WindowAdapter;
41import java.awt.event.WindowEvent;
42import java.io.IOException;
43import java.util.ArrayList;
44import java.util.LinkedList;
45import java.util.List;
46import java.util.regex.Matcher;
47import java.util.regex.Pattern;
48
49import com.framsticks.util.dispatching.RunAt;
50import com.framsticks.util.lang.Strings;
51
52/**
53 * @author Piotr Sniegowski
54 */
55@FramsClassAnnotation
56public class Browser extends AbstractJoinable implements Dispatcher<Browser>, JoinableParent, ExceptionResultHandler {
57
58        private static final Logger log = LogManager.getLogger(Browser.class);
59
60        protected final JoinableCollection<Frame> frames = new JoinableCollection<Frame>(JoinableCollection.FinishPolicy.OnAll).setObservableName("frames");
61        protected final JoinableCollection<Tree> trees = new JoinableCollection<Tree>(JoinableCollection.FinishPolicy.Never).setObservableName("trees");
62        protected final JoinableCollection<Console> consoles = new JoinableCollection<Console>(JoinableCollection.FinishPolicy.Never).setObservableName("consoles");
63
64        protected final List<PopupMenuEntryProvider> popupMenuEntryProviders = new LinkedList<>();
65        // protected final SwingDispatcher
66
67        protected final MainFrame mainFrame;
68        protected final List<PanelProvider> panelProviders = new ArrayList<PanelProvider>();
69        protected Dimension defaultFrameDimension;
70
71        String name;
72
73        public void addFrame(Frame frame) {
74                frames.add(frame);
75        }
76
77        protected final StandardPanelProvider standardPanelProvider;
78        protected final ListPanelProvider listPanelProvider;
79
80        public Browser() {
81                setName("browser");
82                JPopupMenu.setDefaultLightWeightPopupEnabled(false);
83                addPanelProvider(standardPanelProvider = new StandardPanelProvider());
84                addPanelProvider(listPanelProvider = new ListPanelProvider());
85
86                mainFrame = new MainFrame(Browser.this);
87
88                // mainFrame.getStatusBar().setExceptionHandler(ThrowExceptionHandler.getInstance());
89
90                addFrame(mainFrame);
91
92                addPopupMenuEntryProvider(new PopupMenuEntryProvider() {
93                        @Override
94                        public void provide(JPopupMenu menu, Path path) {
95                                menu.add(new JMenuItem(path.getFullTextual()));
96                                menu.addSeparator();
97                        }
98                });
99
100                addPopupMenuEntryProvider(new PopupMenuEntryProvider() {
101                        @SuppressWarnings("serial")
102                        @Override
103                        public void provide(JPopupMenu menu, final Path path) {
104                                menu.add(new AbstractAction("Copy path to clipboard") {
105                                        @Override
106                                        public void actionPerformed(ActionEvent e) {
107                                                Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(path.getFullTextual()), null);
108                                        }
109                                });
110                        }
111                });
112
113                addPopupMenuEntryProvider(new PopupMenuEntryProvider() {
114                        @SuppressWarnings("serial")
115                        @Override
116                        public void provide(JPopupMenu menu, final Path path) {
117                                if (!(path.getTree() instanceof RemoteTree)) {
118                                        return;
119                                }
120                                final RemoteTree remoteTree = (RemoteTree) path.getTree();
121                                menu.add(new AbstractAction("Open tracking console") {
122                                        @Override
123                                        public void actionPerformed(ActionEvent e) {
124                                                consoles.add(new TrackConsole().setConnection(remoteTree.getConnection()));
125                                        }
126                                });
127                                menu.add(new AbstractAction("Open managed console") {
128                                        @Override
129                                        public void actionPerformed(ActionEvent e) {
130                                                consoles.add(new ManagedConsole().setTree(remoteTree));
131                                        }
132                                });
133                                menu.add(new AbstractAction("Open direct console") {
134                                        @Override
135                                        public void actionPerformed(ActionEvent e) {
136                                                consoles.add(new DirectConsole().setAddress(remoteTree.getAddress()));
137                                        }
138                                });
139                        }
140                });
141
142        }
143
144        @AutoAppendAnnotation
145        public void addPanelProvider(PanelProvider panelProvider) {
146                log.debug("added panel provider of type: {}", panelProvider.getClass().getCanonicalName());
147                panelProviders.add(panelProvider);
148        }
149
150        @AutoAppendAnnotation
151        public void addColumnsConfig(ColumnsConfig columnsConfig) {
152                listPanelProvider.addColumnsConfig(columnsConfig);
153        }
154
155        @AutoAppendAnnotation
156        public void addPopupMenuEntryProvider(PopupMenuEntryProvider popupMenuEntryProvider) {
157                popupMenuEntryProviders.add(popupMenuEntryProvider);
158        }
159
160        protected static final Pattern extensionFilterPattern = Pattern.compile("\\*\\.(\\S+)");
161
162        @AutoAppendAnnotation
163        public void addTree(final Tree tree) {
164                log.debug("adding tree: {}", tree);
165                tree.setDispatcher(new SwingDispatcher<Tree>());
166                tree.setExceptionHandler(this);
167                trees.add(tree);
168
169                final NeedFileAcceptor acceptor = new NeedFileAcceptor() {
170
171                        protected boolean done = false;
172
173                        @Override
174                        public boolean acceptNeed(final NeedFile needFile) {
175                                final JFileChooser chooser = new JFileChooser();
176                                final JFrame frame = new JFrame();
177
178                                frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
179
180                                frame.addWindowListener(new WindowAdapter() {
181                                        @Override
182                                        public void windowClosing(WindowEvent e) {
183                                                if (!done) {
184                                                        needFile.getFuture().handle(new FramsticksException().msg("user closed the window"));
185                                                }
186                                                frame.setVisible(false);
187                                                frame.dispose();
188                                        }
189                                });
190
191                                frame.setTitle(Strings.toStringEmptyProof(needFile.getDescription(), "Choose file"));
192                                chooser.setMultiSelectionEnabled(false);
193                                Matcher matcher = extensionFilterPattern.matcher(needFile.getSuggestedName());
194                                if (matcher.matches()) {
195                                        chooser.setFileFilter(new FileNameExtensionFilter(Strings.toStringEmptyProof(needFile.getDescription(), "file"), Strings.takeGroup(needFile.getSuggestedName(), matcher, 1).toString()));
196                                }
197
198                                frame.getContentPane().add(chooser);
199
200                                chooser.addActionListener(new ActionListener() {
201
202                                        @Override
203                                        public void actionPerformed(ActionEvent event) {
204                                                if (event.getActionCommand().equals("CancelSelection")) {
205                                                        needFile.getFuture().handle(new FramsticksException().msg("user cancelled choose"));
206                                                        frame.setVisible(false);
207                                                        frame.dispose();
208                                                }
209                                                if (event.getActionCommand().equals("ApproveSelection")) {
210                                                        File file = null;
211                                                        String filename = chooser.getSelectedFile().getAbsolutePath();
212                                                        try {
213                                                                file = new File("", new FileSource(filename));
214                                                        } catch (IOException e) {
215                                                                needFile.getFuture().handle(new FramsticksException().msg("failed to open choosed file").arg("filename", filename).cause(e));
216                                                        }
217                                                        if (file != null) {
218                                                                done = true;
219                                                                needFile.getFuture().pass(file);
220                                                        }
221                                                        frame.setVisible(false);
222                                                        frame.dispose();
223                                                }
224                                        }
225                                });
226                                frame.setVisible(true);
227                                return true;
228                        }
229                };
230
231                tree.dispatch(new RunAt<Tree>(this) {
232                        @Override
233                        protected void runAt() {
234                                log.debug("adding need file acceptor: {}", acceptor);
235                                tree.addNeedFileAcceptor(Integer.MAX_VALUE, acceptor);
236                        }
237                });
238
239        }
240
241        public void autoResolvePath(final String path, final Future<Path> future) {
242                // final Tree i = trees.get("localhost");
243                // i.dispatch(new RunAt<Tree>(future) {
244                //      @Override
245                //      protected void runAt() {
246                //              TreeOperations.tryGet(i, path, new FutureHandler<Path>(future) {
247                //                      @Override
248                //                      protected void result(final Path p) {
249                //                              future.pass(p);
250                //                              mainFrame.dispatch(new RunAt<Frame>(future) {
251                //                                      @Override
252                //                                      protected void runAt() {
253                //                                              mainFrame.goTo(p);
254                //                                      }
255                //                              });
256                //                      }
257                //              });
258                //      }
259                // });
260        }
261
262        public void clear() {
263                assert isActive();
264                for (Frame f : frames) {
265                        f.clear();
266                }
267        }
268
269        @Override
270        protected void joinableStart() {
271                Dispatching.use(frames, this);
272                Dispatching.use(trees, this);
273                Dispatching.use(consoles, this);
274
275                dispatch(new RunAt<Browser>(this) {
276                        @Override
277                        protected void runAt() {
278
279                                for (final Tree i : trees) {
280                                        i.dispatch(new RunAt<Tree>(this) {
281                                                @Override
282                                                protected void runAt() {
283                                                        final Path p = Path.to(i, "/");
284                                                        log.debug("adding path: {}", p);
285                                                        dispatch(new RunAt<Browser>(this) {
286                                                                @Override
287                                                                protected void runAt() {
288                                                                        mainFrame.addRootPath(p);
289                                                                }
290                                                        });
291                                                }
292                                        });
293                                }
294                        }
295                });
296        }
297
298        /**
299         * @return the tree
300         */
301        public JoinableCollection<Tree> getTrees() {
302                return trees;
303        }
304
305        /**
306         * @return the mainFrame
307         */
308        public MainFrame getMainFrame() {
309                return mainFrame;
310        }
311
312        /**
313         * @return the name
314         */
315        @ParamAnnotation
316        public String getName() {
317                return name;
318        }
319
320        /**
321         * @param name the name to set
322         */
323        @ParamAnnotation
324        public void setName(String name) {
325                this.name = name;
326        }
327
328        @Override
329        public boolean isActive() {
330                return SwingDispatcher.getInstance().isActive();
331        }
332
333        @Override
334        public void dispatch(RunAt<? extends Browser> runnable) {
335                SwingDispatcher.getInstance().dispatch(runnable);
336        }
337
338        @Override
339        protected void joinableJoin() throws InterruptedException {
340                Dispatching.join(frames);
341                Dispatching.join(trees);
342                Dispatching.join(consoles);
343                // super.join();
344        }
345
346        @Override
347        protected void joinableInterrupt() {
348                Dispatching.drop(consoles, this);
349                Dispatching.drop(frames, this);
350                Dispatching.drop(trees, this);
351        }
352
353        @Override
354        public void childChangedState(Joinable joinable, JoinableState state) {
355                if (joinable == frames) {
356                        proceedToState(state);
357                }
358
359        }
360
361        @Override
362        protected void joinableFinish() {
363
364        }
365
366        @Override
367        public String toString() {
368                return getName();
369        }
370
371        @Override
372        public void handle(FramsticksException exception) {
373                mainFrame.handle(exception);
374        }
375
376}
Note: See TracBrowser for help on using the repository browser.