package com.levigo.samplelib.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTree;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreePath;
import com.levigo.samplelib.SampleManager;
import com.levigo.samplelib.ui.pages.DefaultDetailsPageFactory;
import com.levigo.samplelib.ui.pages.DetailsPage;
import com.levigo.samplelib.ui.pages.DetailsPageFactory;
public class ControllerFrame extends JFrame {
private final class ExitAction extends AbstractAction {
private static final long serialVersionUID = 1L;
private ExitAction(String name) {
super(name);
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_MASK));
putValue(MNEMONIC_KEY, KeyEvent.VK_X);
}
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
private static final long serialVersionUID = 1L;
private final SampleManager manager;
private final JPanel contentPanel;
private final DetailsPageFactory detailsPageFactory;
public ControllerFrame() {
super("Example Library");
manager = new SampleManager();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
detailsPageFactory = new DefaultDetailsPageFactory();
setJMenuBar(createMenuBar());
getContentPane().setLayout(new BorderLayout());
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(new EmptyBorder(20, 20, 0, 20));
// Kernel kernel = new Kernel(3, 3, new float[]{ //
// 1f / 9f, 1f / 9f, 1f / 9f, //
// 1f / 9f, 1f / 9f, 1f / 9f, //
// 1f / 9f, 1f / 9f, 1f / 9f
// //
// });
// LockableUI ui = new LockableUI(//
// new BufferedImageOpEffect(new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null)), //
// new BufferedImageOpEffect(new ConvolveOp(kernel)) //
// );
//
// final JXLayer<JComponent> l = new JXLayer<JComponent>(panel, ui);
// getContentPane().add(l);
getContentPane().add(panel);
initSamplesTree(panel);
contentPanel = initContent(panel);
separator(panel);
JLabel lblControllerSource = new JLabel("Showcase Controller Source Code");
GridBagConstraints gbc_lblControllerSource = new GridBagConstraints();
gbc_lblControllerSource.insets = new Insets(0, 0, 0, 5);
gbc_lblControllerSource.anchor = GridBagConstraints.WEST;
gbc_lblControllerSource.weightx = 1.0;
gbc_lblControllerSource.gridy = -1;
gbc_lblControllerSource.gridx = 0;
panel.add(lblControllerSource, gbc_lblControllerSource);
SourceButton button = new SourceButton(ControllerFrame.class, SourceViewerFrame.class);
GridBagConstraints gbc_button = new GridBagConstraints();
gbc_button.gridx = 2;
panel.add(button, gbc_button);
}
protected JMenuBar createMenuBar() {
final JMenuBar mBar = new JMenuBar();
// File menu
final JMenu fileMenu = new JMenu("File");
fileMenu.setMnemonic('f');
fileMenu.add(new JMenuItem(new ExitAction("Exit")));
mBar.add(fileMenu);
return mBar;
}
private JPanel initContent(JPanel panel) {
JPanel content = new JPanel();
content.setBackground(Color.WHITE);
content.setBorder(UIManager.getBorder("Table.scrollPaneBorder"));
content.setPreferredSize(new Dimension(400, 400));
final GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 4;
gbc.gridwidth = 1;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.insets = new Insets(0, 20, 0, 0);
gbc.fill = GridBagConstraints.BOTH;
panel.add(content, gbc);
return content;
}
private void initSamplesTree(JPanel panel) {
final JTree sampleTree = new JTree(new SampleTreeModel(manager));
sampleTree.setRootVisible(false);
sampleTree.setShowsRootHandles(true);
sampleTree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
final TreePath p = e.getPath();
if (p != null) {
final Object o = p.getLastPathComponent();
DetailsPage page = null;
if (o instanceof CategoryTreeNode) {
page = detailsPageFactory.createCategoryPage(((CategoryTreeNode) o).getCategory());
} else if (o instanceof SampleTreeNode) {
page = detailsPageFactory.createSamplePage(((SampleTreeNode) o).getSample());
}
if (page != null) {
setDetailsPage(page);
}
}
}
});
final GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridwidth = 3;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
final JScrollPane scrollPane = new JScrollPane(sampleTree);
scrollPane.setPreferredSize(new Dimension(200, 400));
panel.add(scrollPane, gbc);
}
protected void setDetailsPage(DetailsPage page) {
contentPanel.removeAll();
contentPanel.setLayout(new BorderLayout());
contentPanel.add(page, BorderLayout.CENTER);
contentPanel.revalidate();
}
private void separator(JPanel panel) {
JSeparator separator = new JSeparator();
GridBagConstraints gbc_separator = new GridBagConstraints();
gbc_separator.insets = new Insets(0, 0, 5, 0);
gbc_separator.gridx = 0;
gbc_separator.gridwidth = 3;
gbc_separator.weightx = 1.0;
gbc_separator.fill = GridBagConstraints.HORIZONTAL;
panel.add(separator, gbc_separator);
}
// private void initSamples(JPanel panel) {
//
// List<SampleDescriptor> sds = manager.getSamples();
//
// for (SampleDescriptor sd : sds) {
//
// final JLabel lbl = new JLabel(sd.getName());
// GridBagConstraints gbc = new GridBagConstraints();
// gbc.weightx = 1.0;
// gbc.anchor = GridBagConstraints.WEST;
// gbc.gridx = 0;
// gbc.gridy = -1;
//
// panel.add(lbl, gbc);
//
// JPanel buttonPanel = new JPanel();
//
// final Object si = manager.createSampleInstance(sd);
//
// // for now we're respecting only the first controller
// if (sd.getControllers().size() == 1) {
// final ControllerDescriptor c = sd.getControllers().get(0);
//
// if (c instanceof ExecutionControllerDescriptor) {
//
// final ExecutionController controller = ExecutionController.create(si, (ExecutionControllerDescriptor) c);
//
// buttonPanel.add(new ExecuteButton(controller));
//
// } else if (c instanceof StartStopControllerDescriptor) {
//
// final StartStopController controller = StartStopController.create(si, (StartStopControllerDescriptor) c);
// final StartStopSampleStateManager stateManager = new StartStopSampleStateManager(controller);
// buttonPanel.add(stateManager.getStartButton());
// buttonPanel.add(stateManager.getStopButton());
// }
//
// }
//
//
// gbc = new GridBagConstraints();
// gbc.gridx = 1;
// gbc.anchor = GridBagConstraints.EAST;
// panel.add(buttonPanel, gbc);
//
// gbc = new GridBagConstraints();
// gbc.gridx = 2;
// panel.add(new SourceButton(sd.getClasses().toArray(new Class[sd.getClasses().size()])), gbc);
//
// }
//
// }
}