aboutsummaryrefslogtreecommitdiff
path: root/src/uk/org/ury/frontend/FrontendFrame.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/org/ury/frontend/FrontendFrame.java')
-rw-r--r--src/uk/org/ury/frontend/FrontendFrame.java205
1 files changed, 184 insertions, 21 deletions
diff --git a/src/uk/org/ury/frontend/FrontendFrame.java b/src/uk/org/ury/frontend/FrontendFrame.java
index 6324512..ef2a31a 100644
--- a/src/uk/org/ury/frontend/FrontendFrame.java
+++ b/src/uk/org/ury/frontend/FrontendFrame.java
@@ -4,26 +4,20 @@
package uk.org.ury.frontend;
import java.awt.BorderLayout;
-import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
-import java.awt.FlowLayout;
-import javax.swing.BorderFactory;
-import javax.swing.ImageIcon;
import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
/**
- * A frame that hosts a FrontendPanel, used for serving frontend
+ * A frame that hosts a FrontendModulePanel, used for serving frontend
* panels in a window (application mode).
*
* @author Matt Windsor
*
*/
-public class FrontendFrame extends JFrame
+public class FrontendFrame extends JFrame implements FrontendMaster
{
/**
*
@@ -31,31 +25,24 @@ public class FrontendFrame extends JFrame
private static final long serialVersionUID = 740928181256928433L;
- private FrontendPanel parent;
+ private FrontendBanner banner;
+ private FrontendModulePanel child;
+ private FrontendControlPanel cpanel;
public
- FrontendFrame (FrontendPanel parent)
+ FrontendFrame (FrontendModulePanel parent)
{
super (parent.getName ());
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
- this.parent = parent;
+ this.child = parent;
Container cp = getContentPane ();
// Banner
- JPanel banner = new JPanel ();
- JLabel bannerLabel = new JLabel ("<html><h1><font color=white>"
- + parent.getName () + "</font></h1></html>");
-
- bannerLabel.setBorder (BorderFactory.createEmptyBorder (5, 15, 5, 5));
-
- banner.setLayout (new FlowLayout (FlowLayout.LEFT));
- banner.setBackground (new Color (0, 0, 0));
- banner.add (new JLabel (new ImageIcon (getClass ().getResource ("images/ury.png"))));
- banner.add (bannerLabel);
+ banner = new FrontendBanner (parent.getName ());
// Composition
@@ -67,4 +54,180 @@ public class FrontendFrame extends JFrame
pack ();
setVisible (true);
}
+
+
+ /**
+ * Load a module into the frontend frame.
+ *
+ * Loading will fail with a fatal error if the class is not found,
+ * or is not an implementor of FrontendModule.
+ *
+ * @param moduleName The fully qualified class-name of the module,
+ * minus the leading "uk.org.ury." domain.
+ */
+
+ @Override
+ public void
+ loadModule (String moduleName)
+ {
+ Class<?> moduleClass = null;
+
+ try
+ {
+ moduleClass = Class.forName ("uk.org.ury." + moduleName);
+ }
+ catch (ClassNotFoundException e)
+ {
+ FrontendError.reportFatal ("Could not load module: " + e.getMessage (), this);
+ }
+
+
+ if (FrontendModule.class.isAssignableFrom (moduleClass))
+ {
+ FrontendModulePanel temp = child;
+
+ try
+ {
+ child = ((FrontendModule) moduleClass.newInstance ()).runFrontend (this);
+ }
+ catch (InstantiationException e)
+ {
+ FrontendError.reportFatal ("Could not load module: " + e.getMessage (), this);
+ }
+ catch (IllegalAccessException e)
+ {
+ FrontendError.reportFatal ("Could not load module: " + e.getMessage (), this);
+ }
+
+ remove (temp);
+ add (child);
+
+ banner.setTitle (child.getName ());
+ pack ();
+ }
+ }
+
+
+ /**
+ * Load a module into the frontend frame, additionally installing
+ * a control panel to communicate with the previous module.
+ *
+ * Loading will fail with a fatal error if the class is not found,
+ * or is not an implementor of FrontendModule.
+ *
+ * @param moduleName The fully qualified class-name of the module,
+ * minus the leading "uk.org.ury." domain.
+ *
+ * @param cPanelName The fully qualified class-name of the control
+ * panel to install, minus the leading
+ * "uk.org.ury." domain.
+ */
+
+ @Override
+ public void
+ loadModule (String moduleName, String cPanelName)
+ {
+ FrontendModulePanel newParent = child;
+ loadModule (moduleName);
+ FrontendModulePanel newChild = child;
+
+ loadControlPanel (cPanelName, newParent, newChild);
+ }
+
+
+ /**
+ * Load and install a control panel class given the class name.
+ *
+ * @param cPanelName The fully qualified class-name of the control
+ * panel to load, minus the leading
+ * "uk.org.ury." domain.
+ *
+ * @param parent The parent panel in the relationship modelled
+ * by the control panel interface.
+ *
+ * @param child The child panel in the relationship modelled
+ * by the control panel interface.
+ */
+
+ private void
+ loadControlPanel (String cPanelName, FrontendModulePanel parent,
+ FrontendModulePanel child)
+ {
+ Class<?> cPanelClass = null;
+
+ try
+ {
+ cPanelClass = Class.forName ("uk.org.ury." + cPanelName);
+ }
+ catch (ClassNotFoundException e)
+ {
+ FrontendError.reportFatal ("Could not load control panel: " + e.getMessage (), this);
+ }
+
+
+ if (FrontendControlPanel.class.isAssignableFrom (cPanelClass))
+ {
+ FrontendControlPanel temp = cpanel;
+
+ try
+ {
+ cpanel = ((FrontendControlPanel) cPanelClass.newInstance ());
+ }
+ catch (InstantiationException e)
+ {
+ FrontendError.reportFatal ("Could not load module: " + e.getMessage (), this);
+ }
+ catch (IllegalAccessException e)
+ {
+ FrontendError.reportFatal ("Could not load module: " + e.getMessage (), this);
+ }
+
+ if (temp != null)
+ remove (temp);
+
+ cpanel.setPanels (parent, child);
+ cpanel.setMaster (this);
+ cpanel.setPreviousCPanel (temp);
+
+ add (cpanel, BorderLayout.SOUTH);
+ pack ();
+ }
+ }
+
+
+ /**
+ * Restore an existing module and control panel into the frontend
+ * frame.
+ *
+ * @param mpanel The module panel to restore.
+ *
+ * @param cpanel The control panel to restore, if any. A null
+ * value signifies a lack of control panel.
+ *
+ * @throws IllegalArgumentException if the mpanel is null.
+ */
+
+ @Override
+ public void
+ restoreModule (FrontendModulePanel mpanel,
+ FrontendControlPanel cpanel)
+ {
+ if (mpanel == null)
+ throw new IllegalArgumentException ("mpanel is null.");
+
+ remove (child);
+ remove (this.cpanel);
+
+ child = mpanel;
+ add (child);
+ banner.setTitle (child.getName ());
+
+ if (cpanel != null)
+ add (cpanel, BorderLayout.SOUTH);
+
+ this.cpanel = cpanel;
+
+ pack ();
+ repaint ();
+ }
}