/*
* $Id$
*
* Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
package org.jdesktop.swingxset;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXMultiSplitPane;
import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.JXTaskPane;
import org.jdesktop.swingx.JXTaskPaneContainer;
import org.jdesktop.swingx.MultiSplitLayout;
import org.jdesktop.swingx.SwingXUtilities;
/**
*
*/
public class LoadedPanelExperiments {
@SuppressWarnings("unused")
private static final Logger LOG = Logger
.getLogger(LoadedPanelExperiments.class.getName());
private JComponent createSplitPane() {
final JComponent demoContainer = new JXPanel();
demoContainer.setLayout(new BorderLayout()); //BoxLayout(demoContainer, BoxLayout.LINE_AXIS));
demoContainer.setBorder(BorderFactory.createLineBorder(Color.RED));
// <snip> MultiSplit layout declaration
String layout =
"(ROW " +
"(LEAF name=selector weight=0.3)" +
"(COLUMN weight=0.7 " +
"(LEAF name= demo weight=0.7)" +
"(LEAF name=source weight=0.3)" +
")" +
")";
MultiSplitLayout multiSplitLayout = new MultiSplitLayout(MultiSplitLayout.parseModel(layout));
// </snip>
JXMultiSplitPane splitPane = new JXMultiSplitPane();
splitPane.setLayout(multiSplitLayout);
splitPane.add("selector", createButtonStack(demoContainer));
splitPane.add("demo", demoContainer);
return splitPane;
}
private JComponent createPlainContent() {
final JComponent demoContainer = new JXPanel(new BorderLayout());
demoContainer.setBorder(BorderFactory.createLineBorder(Color.RED));
JComponent splitPane = new JXPanel(new BorderLayout());
splitPane.add(createButtonStack(demoContainer), BorderLayout.WEST);
splitPane.add(demoContainer);
return splitPane;
}
private JComponent createButtonStack(JComponent demoContainer) {
JComponent buttonStack = new JXTaskPaneContainer();
JXTaskPane taskPane = new JXTaskPane();
taskPane.setTitle("demo");
taskPane.add(createTextAction(demoContainer));
taskPane.add(createPageAction(demoContainer));
buttonStack.add(taskPane);
return buttonStack;
}
/**
* @param demoContainer
* @return
*/
private Action createTextAction(final JComponent demoContainer) {
Action action = new AbstractAction("add editor - setText") {
@Override
public void actionPerformed(ActionEvent e) {
demoContainer.removeAll();
demoContainer.add(new JScrollPane(createEditorSetText()));
JXMultiSplitPane pane = SwingXUtilities.getAncestor(JXMultiSplitPane.class, demoContainer);
if (pane != null) {
pane.revalidate();
} else {
demoContainer.revalidate();
}
}
};
return action;
}
/**
* @param demoContainer
* @return
*/
private Action createPageAction(final JComponent demoContainer) {
Action page = new AbstractAction("add editor - setPage") {
@Override
public void actionPerformed(ActionEvent e) {
demoContainer.removeAll();
demoContainer.add(new JScrollPane(createEditorSetPage()));
demoContainer.revalidate();
}
};
return page;
}
/**
* @return
*/
protected JComponent createEditorSetPage() {
final JEditorPane editor = createEditor();
URL descriptionURL = getHTMLDescription();
try {
editor.setPage(descriptionURL);
} catch (IOException e) {
System.err.println("couldn't load description from URL:" + descriptionURL);
}
PropertyChangeListener l = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
JXMultiSplitPane pane = SwingXUtilities.getAncestor(JXMultiSplitPane.class, editor);
if (pane != null) {
MultiSplitLayout layout = pane.getMultiSplitLayout();
layout.layoutByWeight(pane.getParent());
}
}
};
editor.addPropertyChangeListener("page", l);
return editor;
}
/**
* @return
*/
protected JComponent createEditorSetText() {
final JEditorPane editor = createEditor();
editor.setText(dummyText);
return editor;
}
/**
* @return
*/
private JEditorPane createEditor() {
final JEditorPane editor = new JEditorPane();
editor.setContentType("text/html");
editor.setEditable(false);
editor.setOpaque(true);
return editor;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createFrame(new LoadedPanelExperiments().createPlainContent(), false);
createFrame(new LoadedPanelExperiments().createSplitPane(), true);
}
/**
* @param content
* @param split
*/
private JXFrame createFrame(JComponent content, boolean split) {
JXFrame frame = new JXFrame("LoadedPanelExperiments" + (split ? " MultiSplitPane" : " Plain"));
frame.add(content);
frame.setSize(400, 200);
if (split) {
frame.setLocation(frame.getLocation().x + 400, frame.getLocation().y);
}
frame.setVisible(true);
return frame;
}
});
}
public URL getHTMLDescription() {
// by default look for an html file with the same name as the demo class
return getClass().getResource(htmlURL);
}
private String htmlURL = "MultiSplitPaneDemo.html";
String dummyText =
"<html>"
+" <head>"
+" <title>JXMultiSplitPane Demo</title>"
+"</head>"
+"<body>"
+"JXMultiSplitPane is a container that can be split into multiple resizeable"
+"areas. The layout is configured using MultiSplitLayout layout manager."
+"<p>"
+"The MultiSplitLayout layout manager recursively arranges its components in"
+"row and column groups called Splits. Elements of the layout are"
+"separated by gaps called Dividers. The overall layout is defined with a"
+"simple tree model whose nodes are instances of MultiSplitLayout.Split,"
+"MultiSplitLayout. Divider, and MultiSplitLayout.Leaf. Named Leaf nodes"
+"represent the space allocated to a component that was added with a"
+"constraint that matches the Leaf's name. Extra space is distributed among"
+"row/column siblings according to their 0.0 to 1.0 weight. If no weights"
+"are specified then the last sibling always gets all of the extra space,"
+"or space reduction."
+"<p>"
+"Although MultiSplitLayout can be used with any Container, it's the default"
+"layout manager for JXMultiSplitPane. JXMultiSplitPane supports"
+"interactively dragging the Dividers, accessibility, and other features"
+"associated with split panes."
+"</body>"
+"</html>";
}