package org.openflexo.swing.layout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import org.openflexo.swing.layout.MultiSplitLayout.Divider;
import org.openflexo.swing.layout.MultiSplitLayout.Leaf;
import org.openflexo.swing.layout.MultiSplitLayout.Node;
import org.openflexo.swing.layout.MultiSplitLayout.Split;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonIOException;
import com.google.gson.JsonSyntaxException;
public class TestMultiSplitPane {
public static final String LEFT = "left";
public static final String CENTER = "center";
public static final String RIGHT = "right";
public static final String TOP = "top";
public static final String MIDDLE = "middle";
public static final String BOTTOM = "bottom";
protected void initUI() {
Split root = getDefaultLayout();
final MultiSplitLayout layout = new MultiSplitLayout();
layout.setLayoutByWeight(false);
layout.setFloatingDividers(false);
JXMultiSplitPane splitPane = new JXMultiSplitPane(layout);
splitPane.setDividerPainter(new KnobDividerPainter());
addButton(LEFT + TOP, splitPane);
addButton(CENTER + TOP, splitPane);
addButton(RIGHT + TOP, splitPane);
addButton(LEFT + BOTTOM, splitPane);
addButton(CENTER + BOTTOM, splitPane);
addButton(RIGHT + BOTTOM, splitPane);
restoreLayout(layout, root);
splitPane.setPreferredSize(layout.getModel().getBounds().getSize());
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
saveLayout(layout);
System.exit(0);
}
});
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
frame.add(splitPane);
frame.pack();
frame.setVisible(true);
}
protected Split getDefaultLayout() {
Split root = new Split();
root.setName("ROOT");
Split left = getVerticalSplit(LEFT, 0.5, 0.5);
left.setWeight(0);
left.setName(LEFT);
Split center = getVerticalSplit(CENTER, 0.8, 0.2);
center.setWeight(1.0);
center.setName(CENTER);
Split right = getVerticalSplit(RIGHT, 0.5, 0.5);
right.setWeight(0);
right.setName(RIGHT);
root.setChildren(left, new Divider(), center, new Divider(), right);
return root;
}
protected void addButton(final String buttonName, final JXMultiSplitPane splitPane) {
final JButton button = new JButton(buttonName);
splitPane.add(buttonName, button);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MultiSplitLayout layout = splitPane.getMultiSplitLayout();
restoreLayout(layout, getDefaultLayout());
splitPane.revalidate();
}
});
}
public Split getVerticalSplit(String name, double topWeight, double bottomWeight) {
Split split = new Split();
split.setRowLayout(false);
Leaf top = new Leaf(name + TOP);
top.setWeight(topWeight);
Leaf bottom = new Leaf(name + BOTTOM);
bottom.setWeight(bottomWeight);
split.setChildren(top, new Divider(), bottom);
return split;
}
protected void restoreLayout(MultiSplitLayout layout, Node defaultModel) {
Node model = defaultModel;
try {
model = getGson().fromJson(new InputStreamReader(new FileInputStream(getLayoutFile()), "UTF-8"), Split.class);
} catch (JsonSyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonIOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
layout.setModel(model);
}
protected void saveLayout(MultiSplitLayout layout) {
Gson gson = getGson();
String json = gson.toJson(layout.getModel());
FileOutputStream fos = null;
try {
fos = new FileOutputStream(getLayoutFile());
fos.write(json.getBytes("UTF-8"));
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
protected Gson getGson() {
GsonBuilder builder = new GsonBuilder().registerTypeAdapterFactory(new MultiSplitLayoutTypeAdapterFactory());
Gson gson = builder.create();
return gson;
}
protected File getLayoutFile() {
return new File("testlayout");
}
public static void main(String[] args) {
/*BeanInfo info = Introspector.getBeanInfo(JTextField.class);
PropertyDescriptor[] propertyDescriptors = info.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; ++i) {
PropertyDescriptor pd = propertyDescriptors[i];
if (pd.getName().equals("text")) {
pd.setValue("transient", Boolean.TRUE);
}
}*/
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestMultiSplitPane().initUI();
}
});
}
}