Skip to content

Commit 8b2447d

Browse files
committed
Merge branch 'feature/gui-update'
2 parents a80cdcd + 4df2e8c commit 8b2447d

13 files changed

+709
-67
lines changed

pom.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,11 @@
363363
<artifactId>batik-anim</artifactId>
364364
<version>1.8</version>
365365
</dependency>
366-
366+
<dependency>
367+
<groupId>org.dockingframes</groupId>
368+
<artifactId>docking-frames-common</artifactId>
369+
<version>1.1.1</version>
370+
</dependency>
367371
<dependency>
368372
<groupId>junit</groupId>
369373
<artifactId>junit</artifactId>

src/main/java/org/tros/torgo/ControllerBase.java

Lines changed: 135 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,31 @@
1515
*/
1616
package org.tros.torgo;
1717

18+
import bibliothek.gui.dock.DefaultDockable;
19+
import bibliothek.gui.dock.common.CControl;
20+
import bibliothek.gui.dock.common.CGrid;
21+
import bibliothek.gui.dock.common.CLocation;
22+
import bibliothek.gui.dock.common.DefaultSingleCDockable;
23+
import bibliothek.gui.dock.common.mode.ExtendedMode;
24+
import bibliothek.gui.dock.common.SingleCDockable;
25+
import bibliothek.gui.dock.common.SingleCDockableFactory;
26+
import bibliothek.util.xml.XElement;
27+
import bibliothek.util.xml.XIO;
1828
import org.tros.torgo.interpreter.CodeBlock;
1929
import org.tros.torgo.interpreter.InterpreterListener;
2030
import org.tros.torgo.interpreter.InterpreterThread;
2131
import org.tros.torgo.interpreter.Scope;
2232
import java.awt.BorderLayout;
33+
import java.awt.Component;
2334
import java.awt.Container;
2435
import java.awt.Desktop;
2536
import java.awt.event.ActionEvent;
2637
import java.awt.event.ActionListener;
2738
import java.awt.event.WindowEvent;
2839
import java.awt.event.WindowListener;
29-
import java.beans.PropertyChangeEvent;
30-
import java.beans.PropertyChangeListener;
3140
import java.io.File;
41+
import java.io.FileInputStream;
42+
import java.io.FileNotFoundException;
3243
import java.io.FileOutputStream;
3344
import java.io.IOException;
3445
import java.io.StringWriter;
@@ -48,17 +59,18 @@
4859
import javax.swing.JMenuBar;
4960
import javax.swing.JMenuItem;
5061
import javax.swing.JOptionPane;
51-
import javax.swing.JSplitPane;
5262
import javax.swing.JToolBar;
5363
import javax.swing.SwingUtilities;
5464
import org.apache.commons.io.IOUtils;
5565
import org.apache.commons.lang3.event.EventListenerSupport;
66+
import org.apache.commons.lang3.tuple.ImmutablePair;
5667
import static org.tros.torgo.Main.IMAGE_ICON_CLASS_PATH;
5768
import org.tros.torgo.swing.AboutWindow;
5869
import org.tros.torgo.swing.Localization;
5970
import org.tros.torgo.swing.TorgoMenuBar;
6071
import org.tros.utils.swing.NamedWindow;
6172
import org.tros.utils.AutoResetEvent;
73+
import org.tros.utils.PathUtils;
6274

6375
/**
6476
* The main application. Controls GUI and interpreting process.
@@ -74,6 +86,7 @@ public abstract class ControllerBase implements Controller {
7486
private String filename;
7587
protected final AutoResetEvent step;
7688
protected final AtomicBoolean isStepping;
89+
private CControl dockControl;
7790

7891
private final ArrayList<JCheckBoxMenuItem> viz = new ArrayList<>();
7992

@@ -157,6 +170,55 @@ protected ControllerBase() {
157170
*/
158171
protected abstract InterpreterThread createInterpreterThread(String source);
159172

173+
public static class TorgoSingleDockable extends DefaultSingleCDockable {
174+
175+
public TorgoSingleDockable(String title, final Component panel) {
176+
super(title);
177+
super.setTitleText(title);
178+
super.add(panel);
179+
}
180+
}
181+
182+
public static class TorgoDockable extends DefaultDockable {
183+
184+
public TorgoDockable(String title, final Component panel) {
185+
super(title);
186+
super.setTitleText(title);
187+
super.add(panel);
188+
}
189+
}
190+
191+
/* This method simulates the creation of a layout */
192+
private static XElement createLayout(Component display, ArrayList<ImmutablePair<String, Component>> input) {
193+
/* This method simulates the creation of a layout */
194+
CControl control = new CControl();
195+
control.getContentArea();
196+
197+
CGrid grid = new CGrid(control);
198+
199+
DefaultSingleCDockable displayDock = display != null ? new TorgoSingleDockable("Display", display) : null;
200+
if (displayDock != null) {
201+
grid.add(0, 0, 10, 10, displayDock);
202+
displayDock.setLocation(CLocation.base().minimalWest());
203+
displayDock.setExtendedMode(ExtendedMode.NORMALIZED);
204+
}
205+
206+
int count = 1;
207+
for (ImmutablePair<String, Component> key : input) {
208+
DefaultSingleCDockable dock = new TorgoSingleDockable(key.left, key.right);
209+
grid.add(10, 0, 6, count, dock);
210+
dock.setExtendedMode(ExtendedMode.NORMALIZED);
211+
count += 1;
212+
}
213+
214+
control.getContentArea().deploy(grid);
215+
216+
XElement root = new XElement("root");
217+
control.writeXML(root);
218+
control.destroy();
219+
return root;
220+
}
221+
160222
/**
161223
* Initialize the window. This is called here from run() and not the
162224
* constructor so that the Service Provider doesn't load up all of the
@@ -173,22 +235,72 @@ private void initSwing() {
173235
contentPane.add(tb, BorderLayout.NORTH);
174236
}
175237

176-
final java.util.prefs.Preferences prefs = java.util.prefs.Preferences.userNodeForPackage(NamedWindow.class);
238+
dockControl = new CControl(window);
239+
window.add(dockControl.getContentArea(), BorderLayout.CENTER);
240+
final ArrayList<String> presetFilter = new ArrayList<>();
177241
if (torgoCanvas != null) {
178-
final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, torgoCanvas.getComponent(), torgoPanel.getComponent());
179-
int dividerLocation = prefs.getInt(this.getClass().getName() + "divider-location", window.getWidth() - 300);
180-
splitPane.setDividerLocation(dividerLocation);
181-
splitPane.addPropertyChangeListener(new PropertyChangeListener() {
182-
183-
@Override
184-
public void propertyChange(PropertyChangeEvent pce) {
185-
prefs.putInt(this.getClass().getName() + "divider-location", splitPane.getDividerLocation());
242+
presetFilter.add("Display");
243+
}
244+
for (ImmutablePair<String, Component> pair : torgoPanel.getTorgoComponents()) {
245+
presetFilter.add(pair.left);
246+
}
247+
bibliothek.util.Filter<String> filter = new bibliothek.util.Filter<String>() {
248+
@Override
249+
public boolean includes(String item) {
250+
return presetFilter.contains(item);
251+
}
252+
};
253+
dockControl.addSingleDockableFactory(filter, new SingleCDockableFactory() {
254+
@Override
255+
public SingleCDockable createBackup(String id) {
256+
TorgoSingleDockable ret = null;
257+
if ("Display".equals(id)) {
258+
ret = new TorgoSingleDockable(id, torgoCanvas.getComponent());
259+
} else {
260+
for (ImmutablePair<String, Component> pair : torgoPanel.getTorgoComponents()) {
261+
if (pair.left.equals(id)) {
262+
ret = new TorgoSingleDockable(pair.left, pair.right);
263+
}
264+
}
265+
}
266+
if (ret != null) {
267+
ImageIcon icon = Main.getIcon("layouts/" + ret.getTitleText().toLowerCase() + "-24x24.png");
268+
ret.setTitleIcon(icon);
186269
}
187-
});
270+
return ret;
271+
}
272+
});
188273

189-
contentPane.add(splitPane);
190-
} else {
191-
contentPane.add(torgoPanel.getComponent());
274+
// Try to load a saved layout.
275+
// If no layout exists or it fails, load from CLASSPATH/resources.
276+
// If that fails, dynamically generate something.
277+
String layoutFileName = PathUtils.getApplicationConfigDirectory(TorgoInfo.INSTANCE) + java.io.File.separatorChar + getLang() + "-layout.xml";
278+
File layoutFile = new File(layoutFileName);
279+
boolean loaded = false;
280+
if (layoutFile.exists()) {
281+
try {
282+
XElement elem = XIO.readUTF(new FileInputStream(layoutFile));
283+
dockControl.readXML(elem);
284+
loaded = true;
285+
} catch (FileNotFoundException ex) {
286+
Logger.getLogger(ControllerBase.class.getName()).log(Level.SEVERE, null, ex);
287+
} catch (IOException ex) {
288+
Logger.getLogger(ControllerBase.class.getName()).log(Level.SEVERE, null, ex);
289+
}
290+
}
291+
if (!loaded) {
292+
try {
293+
java.util.Enumeration<URL> resources = ClassLoader.getSystemClassLoader().getResources("layouts/" + this.getLang() + "-layout.xml");
294+
XElement elem = XIO.readUTF(resources.nextElement().openStream());
295+
dockControl.readXML(elem);
296+
loaded = true;
297+
} catch (IOException | java.util.NoSuchElementException ex) {
298+
Logger.getLogger(ControllerBase.class.getName()).log(Level.WARNING, "Layout Error: Auto-generating: {0}", ex.getMessage());
299+
}
300+
}
301+
if (!loaded) {
302+
XElement elem = createLayout(torgoCanvas != null ? torgoCanvas.getComponent() : null, torgoPanel.getTorgoComponents());
303+
dockControl.readXML(elem);
192304
}
193305

194306
JMenuBar mb = createMenuBar();
@@ -291,13 +403,19 @@ public void windowOpened(WindowEvent e) {
291403

292404
/**
293405
* We only care if the window is closing so we can kill the
294-
* interpreter thread.
406+
* interpreter thread and save the layout.
295407
*
296408
* @param e
297409
*/
298410
@Override
299411
public void windowClosing(WindowEvent e) {
300412
stopInterpreter();
413+
try {
414+
String layoutFile = PathUtils.getApplicationConfigDirectory(TorgoInfo.INSTANCE) + java.io.File.separatorChar + getLang() + "-layout.xml";
415+
dockControl.writeXML(new java.io.File(layoutFile));
416+
} catch (IOException ex) {
417+
Logger.getLogger(ControllerBase.class.getName()).log(Level.SEVERE, null, ex);
418+
}
301419
}
302420

303421
@Override
@@ -517,9 +635,6 @@ public void startInterpreter() {
517635
TorgoToolkit.getVisualization(item.getText()).create().watch(this.getLang(), this, interp);
518636
}
519637
}
520-
// viz.stream().filter((item) -> (item.getState())).map((item) -> TorgoToolkit.getVisualization(item.getText()).create()).forEach((visualization) -> {
521-
// visualization.watch(this.getLang(), this, interp);
522-
// });
523638

524639
for (InterpreterListener l : listeners.getListeners()) {
525640
interp.addInterpreterListener(l);
@@ -568,9 +683,6 @@ public void debugInterpreter() {
568683
TorgoToolkit.getVisualization(item.getText()).create().watch(this.getLang(), this, interp);
569684
}
570685
}
571-
// viz.stream().filter((item) -> (item.getState())).map((item) -> TorgoToolkit.getVisualization(item.getText()).create()).forEach((visualization) -> {
572-
// visualization.watch(this.getLang(), this, interp);
573-
// });
574686

575687
for (InterpreterListener l : listeners.getListeners()) {
576688
interp.addInterpreterListener(l);

src/main/java/org/tros/torgo/Main.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,21 @@ public void run() {
199199
public static final String IMAGE_ICON_CLASS_PATH = "torgo-48x48.png";
200200

201201
public static void loadIcon(Window frame) {
202+
frame.setIconImage(getIcon().getImage());
203+
}
204+
205+
public static ImageIcon getIcon() {
206+
return getIcon(IMAGE_ICON_CLASS_PATH);
207+
}
208+
209+
public static ImageIcon getIcon(String path) {
202210
try {
203-
java.util.Enumeration<URL> resources = ClassLoader.getSystemClassLoader().getResources(IMAGE_ICON_CLASS_PATH);
211+
java.util.Enumeration<URL> resources = ClassLoader.getSystemClassLoader().getResources(path);
204212
ImageIcon ico = new ImageIcon(resources.nextElement());
205-
frame.setIconImage(ico.getImage());
213+
return ico;
206214
} catch (IOException ex) {
207215
org.tros.utils.logging.Logging.getLogFactory().getLogger(Main.class).warn(null, ex);
208216
}
217+
return null;
209218
}
210219
}

src/main/java/org/tros/torgo/TorgoTextConsole.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
package org.tros.torgo;
1717

1818
import java.awt.Component;
19+
import java.util.ArrayList;
20+
import java.util.Map;
21+
import org.apache.commons.lang3.tuple.ImmutablePair;
1922

2023
/**
2124
* I/O interface. Get source and print messages.
@@ -98,5 +101,5 @@ public interface TorgoTextConsole {
98101
*
99102
* @return
100103
*/
101-
Component getComponent();
104+
ArrayList<ImmutablePair<String, Component>> getTorgoComponents();
102105
}

0 commit comments

Comments
 (0)