/*
* $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.Dimension;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.jdesktop.application.Application;
import org.jdesktop.application.ApplicationActionMap;
import org.jdesktop.swingx.JXPanel;
import com.sun.swingset3.DemoProperties;
/**
* {@code DefaultDemoPanel} ensures the creation of demos using a standard format.
* <ol>
* <li>Create the demo components.</li>
* <li>Inject properties and resources.</li>
* <li>Bind components together.</li>
*
* @author Karl George Schaefer
*/
public abstract class DefaultDemoPanel extends JXPanel {
/**
* The application action map for this demo.
*/
protected final ApplicationActionMap map;
/**
* Used to ensure that DefaultDemoPanel.injectResources is called.
* <p>
* TODO replace with JSR-305
* <a href="http://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/OverridingMethodsMustInvokeSuper.java">
* OverridingMethodsMustInvokeSuper</a>
*/
private boolean injectRan = false;
public DefaultDemoPanel() {
createDemo();
injectResources();
if (!injectRan) {
throw new IllegalStateException("must call super.injectReources");
}
map = Application.getInstance().getContext().getActionMap(this);
bind();
}
/**
* A utility method for demo panels to run standalone. Should be invoked in main.
*
* @param clazz
* the class to run
*/
protected static void runDemo(final Class<? extends DefaultDemoPanel> clazz) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
JFrame frame = new JFrame(clazz.getAnnotation(DemoProperties.class).value());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(clazz.newInstance());
frame.setPreferredSize(new Dimension(800, 600));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
});
}
/**
* This method creates the demo components and layout. This method is called by the constructor.
*/
protected abstract void createDemo();
/**
* This method injects resource into the demo. This method is called by the constructor.
* <p>
* Overriding classes must call super, failure to do so will result in an error.
*/
protected void injectResources() {
injectRan = true;
Application.getInstance().getContext().getResourceMap(getClass()).injectComponents(this);
}
/**
* This method binds objects together. This method is called by the constructor.
*/
protected void bind() {
//does nothing
}
}