package bibliothek.demonstration; import java.awt.CardLayout; import java.awt.Component; import java.util.List; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import bibliothek.extension.gui.dock.theme.FlatTheme; import bibliothek.gui.DockController; import bibliothek.gui.DockStation; import bibliothek.gui.Dockable; import bibliothek.gui.dock.DefaultDockable; import bibliothek.gui.dock.SplitDockStation; import bibliothek.gui.dock.accept.DockAcceptance; import bibliothek.gui.dock.action.ActionPopupSuppressor; import bibliothek.gui.dock.station.split.DockableSplitDockTree; /** * A panel that can show a list of {@link Demonstration}s. The panel is * divided in a {@link JList} showing all <code>Demonstration</code>s, and * a detailed view of the current selection. * @author Benjamin Sigg * */ public class MainPanel extends SplitDockStation { /** the list of all {@link Demonstration}s */ private JList list = new JList(); /** the layout of {@link #panel} */ private CardLayout layout = new CardLayout(); /** contains the detailed views for each {@link Demonstration} */ private JPanel panel; /** * Creates a new panel. * @param core the center of the application, used to startup some * {@link Demonstration} * @param demos list of <code>Demonstration</code>s which should * be available to the user */ public MainPanel( Core core, List<Demonstration> demos ){ DockController.disableCoreWarning(); DockController controller = new DockController(); controller.setRestrictedEnvironment( true ); controller.addAcceptance( new DockAcceptance(){ public boolean accept( DockStation parent, Dockable child ){ return true; } public boolean accept( DockStation parent, Dockable child, Dockable next ){ return false; } }); controller.setTheme( new FlatTheme() ); controller.setPopupSuppressor( ActionPopupSuppressor.SUPPRESS_ALWAYS ); controller.add( this ); setContinousDisplay( true ); DefaultListModel model = new DefaultListModel(); panel = new JPanel( layout ); int index = 0; for( Demonstration demo : demos ){ model.addElement( demo ); DemoPanel demoPanel = new DemoPanel( core, demo ); panel.add( demoPanel, String.valueOf( index ) ); index++; } DockableSplitDockTree tree = new DockableSplitDockTree(); tree.root( tree.horizontal( new DefaultDockable( new JScrollPane( list ), "Demonstrations" ), new DefaultDockable( panel, "Selection" ), 0.25 )); dropTree( tree ); list.addListSelectionListener( new ListSelectionListener(){ public void valueChanged( ListSelectionEvent e ){ layout.show( panel, String.valueOf( list.getSelectedIndex())); } }); list.setModel( model ); list.setCellRenderer( new Renderer() ); if( model.getSize() > 0 ) list.setSelectedIndex( 0 ); } /** * A {@link ListCellRenderer} used in {@link MainPanel#list} to show * a {@link Demonstration}. * @author Benjamin Sigg */ private class Renderer extends DefaultListCellRenderer{ @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus ){ Demonstration demo = (Demonstration)value; super.getListCellRendererComponent( list, demo.getName(), index, isSelected, cellHasFocus ); setIcon( demo.getIcon() ); return this; } } }