/*
* Open Source Physics software is free software as described near the bottom of this code file.
*
* For additional information and documentation on Open Source Physics please see:
* <http://www.opensourcephysics.org/>
*/
package org.opensourcephysics.display3d.simple3d;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.rmi.RemoteException;
import java.util.Iterator;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import org.opensourcephysics.controls.OSPLog;
import org.opensourcephysics.controls.XML;
import org.opensourcephysics.controls.XMLControl;
import org.opensourcephysics.controls.XMLControlElement;
import org.opensourcephysics.controls.XMLTreeChooser;
import org.opensourcephysics.controls.XMLTreePanel;
import org.opensourcephysics.display.DisplayRes;
import org.opensourcephysics.display.GUIUtils;
import org.opensourcephysics.display.OSPFrame;
import org.opensourcephysics.display.OSPRuntime;
import org.opensourcephysics.display3d.core.CameraInspector;
import org.opensourcephysics.tools.ExportTool;
import org.opensourcephysics.tools.LocalJob;
import org.opensourcephysics.tools.SnapshotTool;
import org.opensourcephysics.tools.Tool;
import org.opensourcephysics.tools.VideoTool;
/**
* DrawingFrame: a frame that contains a generic drawing panel.
* @author Francisco Esquembre
* @author Adapted from Wolfgang Christian
* @version March 2005
*/
public class DrawingFrame3D extends OSPFrame implements ClipboardOwner, org.opensourcephysics.display3d.core.DrawingFrame3D {
protected JMenu fileMenu, editMenu;
protected JMenuItem copyItem, pasteItem, replaceItem;
protected JMenu visualMenu, displayMenu, decorationMenu, cursorMenu;
protected JMenuItem displayPerspectiveItem, displayNoPerspectiveItem, displayXYItem, displayXZItem, displayYZItem;
protected JMenuItem decorationCubeItem, decorationNoneItem, decorationAxesItem;
protected JMenuItem cursorNoneItem, cursorCubeItem, cursorXYZItem, cursorCrosshairItem;
protected JMenuItem zoomToFitItem, resetCameraItem, cameraItem, lightItem;
protected JFrame cameraInspectorFrame, lightInspectorFrame;
protected JMenuBar menuBar = new JMenuBar();
protected org.opensourcephysics.display3d.core.DrawingPanel3D drawingPanel;
protected final static int MENU_SHORTCUT_KEY_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
/**
* Default DrawingFrame constructor
*/
public DrawingFrame3D() {
this(DisplayRes.getString("DrawingFrame.DefaultTitle"), null); //$NON-NLS-1$
}
/**
* DrawingFrame constructor specifying the DrawingPanel that will be placed
* in the center of the content pane.
* @param drawingPanel
*/
public DrawingFrame3D(DrawingPanel3D drawingPanel) {
this(DisplayRes.getString("DrawingFrame.DefaultTitle"), drawingPanel); //$NON-NLS-1$
}
/**
* DrawingFrame constructor specifying the title and the DrawingPanel that
* will be placed in the center of the content pane.
*
* @param title
* @param _drawingPanel
*/
public DrawingFrame3D(String title, DrawingPanel3D _drawingPanel) {
super(title);
drawingPanel = _drawingPanel;
if(drawingPanel!=null) {
getContentPane().add((JPanel) drawingPanel, BorderLayout.CENTER);
}
pack();
if(!OSPRuntime.appletMode) {
createMenuBar();
}
setAnimated(true); // simulations will automatically render this frame after "doStep."
setEnabledPaste(true);
setEnabledReplace(true);
}
/**
* Renders the drawing panel if the frame is showing and not iconified.
*/
public void render() {
drawingPanel.render();
}
/**
* Shows a message in a yellow text box in the lower right hand corner.
*
* @param msg
*/
public void setMessage(String msg) {
((org.opensourcephysics.display3d.simple3d.DrawingPanel3D) drawingPanel).setMessage(msg); // the default message box
}
/**
* Shows a message in a yellow text box.
*
* location 0=bottom left
* location 1=bottom right
* location 2=top right
* location 3=top left
*
* @param msg
* @param location
*/
public void setMessage(String msg, int location) {
((org.opensourcephysics.display3d.simple3d.DrawingPanel3D) drawingPanel).setMessage(msg, location);
}
/**
* Gets the drawing panel.
*
* @return the drawingPanel
*/
public org.opensourcephysics.display3d.core.DrawingPanel3D getDrawingPanel3D() {
return drawingPanel;
}
/**
* Adds the drawing panel to the the frame. The panel is added to the center
* of the frame's content pane.
*
* @param _drawingPanel
*/
public void setDrawingPanel3D(org.opensourcephysics.display3d.core.DrawingPanel3D _drawingPanel) {
if(drawingPanel!=null) { // remove the old drawing panel.
getContentPane().remove((JPanel) drawingPanel);
}
drawingPanel = _drawingPanel;
if(drawingPanel!=null) {
getContentPane().add((JPanel) drawingPanel, BorderLayout.CENTER);
}
pack();
}
/**
* Getting the pointer to the real JFrame in it
* @return JFrame
*/
public javax.swing.JFrame getJFrame() {
return this;
}
/**
* Enables the paste edit menu item.
* @param enable boolean
*/
public void setEnabledPaste(boolean enable) {
pasteItem.setEnabled(enable);
}
/**
* Paste action
*
*/
protected void pasteAction() {
try {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable data = clipboard.getContents(null);
XMLControlElement control = new XMLControlElement();
control.readXML((String) data.getTransferData(DataFlavor.stringFlavor));
// get Drawables using an xml tree chooser
XMLTreeChooser chooser = new XMLTreeChooser(DisplayRes.getString("DrawingFrame3D.XMLChooser.Title"), //$NON-NLS-1$
DisplayRes.getString("DrawingFrame3D.XMLChooser.Message"), //$NON-NLS-1$
this);
java.util.List<?> props = chooser.choose(control, Element.class);
if(!props.isEmpty()) {
Iterator<?> it = props.iterator();
while(it.hasNext()) {
XMLControl prop = (XMLControl) it.next();
Element element = (Element) prop.loadObject(null);
System.out.println("Adding element "+element); //$NON-NLS-1$
drawingPanel.addElement(element);
}
}
if(drawingPanel!=null) {
drawingPanel.repaint();
}
} catch(UnsupportedFlavorException ex) {}
catch(IOException ex) {}
catch(HeadlessException ex) {}
}
/**
* Enables the replace edit menu item.
* @param enable boolean
*/
public void setEnabledReplace(boolean enable) {
replaceItem.setEnabled(enable);
}
/**
* Replaces the drawables with the drawables found in the specified XML control.
*/
public void replaceAction() {
drawingPanel.removeAllElements();
pasteAction();
}
/**
* Copies objects found in the specified xml control.
*/
protected void copyAction() {
XMLControlElement control = new XMLControlElement(DrawingFrame3D.this);
control.saveObject(null);
StringSelection data = new StringSelection(control.toXML());
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(data, this);
}
/**
* Implementation of ClipboardOwner interface.
*
* Override this method to receive notification that data copied to the clipboard has changed.
*
* @param clipboard Clipboard
* @param contents Transferable
*/
public void lostOwnership(Clipboard clipboard, Transferable contents) {}
/**
* Enables the copy edit menu item.
* @param enable boolean
*/
public void setEnabledCopy(boolean enable) {
copyItem.setEnabled(enable);
}
/**
* Whether this implementation supports LightInspectors
* @return
*/
protected boolean supportsLightInspectors() {
return false;
}
/**
* Dummy creator of a LightInspector. To be overwritten by packages that offer light inspectors
* @param drawingPanel
* @return
*/
protected JFrame createLightInspectorFrame(org.opensourcephysics.display3d.core.DrawingPanel3D drawingPanel) {
return null;
}
/**
* Creates a standard DrawingFrame menu bar and adds it to the frame.
*/
private void createMenuBar() {
fileMenu = new JMenu(DisplayRes.getString("DrawingFrame.File_menu_item")); //$NON-NLS-1$
JMenuItem printItem = new JMenuItem(DisplayRes.getString("DrawingFrame.Print_menu_item")); //$NON-NLS-1$
printItem.setAccelerator(KeyStroke.getKeyStroke('P', MENU_SHORTCUT_KEY_MASK));
printItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
PrinterJob printerJob = PrinterJob.getPrinterJob();
printerJob.setPrintable((Printable) drawingPanel);
if(printerJob.printDialog()) {
try {
printerJob.print();
} catch(PrinterException pe) {
JOptionPane.showMessageDialog(DrawingFrame3D.this, DisplayRes.getString("DrawingFrame.PrintErrorMessage"), //$NON-NLS-1$
DisplayRes.getString("DrawingFrame.Error"), //$NON-NLS-1$
JOptionPane.ERROR_MESSAGE);
}
}
}
});
JMenuItem saveXMLItem = new JMenuItem(DisplayRes.getString("DrawingFrame.SaveXML_menu_item")); //$NON-NLS-1$
saveXMLItem.setAccelerator(KeyStroke.getKeyStroke('S', MENU_SHORTCUT_KEY_MASK));
saveXMLItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveXML();
}
});
JMenuItem exportItem = new JMenuItem(DisplayRes.getString("DrawingFrame.Export_menu_item")); //$NON-NLS-1$
exportItem.setAccelerator(KeyStroke.getKeyStroke('E', MENU_SHORTCUT_KEY_MASK));
exportItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
ExportTool.getTool().send(new LocalJob(drawingPanel), null);
} catch(RemoteException ex) {}
}
});
JMenuItem saveAsPSItem = new JMenuItem(DisplayRes.getString("DrawingFrame.SaveFrameAsEPS_menu_item")); //$NON-NLS-1$
saveAsPSItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// GUIUtils.saveImage(drawingPanel.getComponent(), "eps", DrawingFrame3D.this);
GUIUtils.saveImage((JPanel) drawingPanel.getComponent(), "eps", DrawingFrame3D.this); //$NON-NLS-1$
}
});
JMenuItem inspectItem = new JMenuItem(DisplayRes.getString("DrawingFrame.InspectMenuItem")); //$NON-NLS-1$
inspectItem.setAccelerator(KeyStroke.getKeyStroke('I', MENU_SHORTCUT_KEY_MASK));
inspectItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
inspectXML(); // cannot use a static method here because of run-time binding
}
});
fileMenu.add(printItem);
fileMenu.add(saveXMLItem);
fileMenu.add(exportItem);
fileMenu.add(saveAsPSItem);
fileMenu.add(inspectItem);
menuBar.add(fileMenu);
editMenu = new JMenu(DisplayRes.getString("DrawingFrame.Edit_menu_title")); //$NON-NLS-1$
menuBar.add(editMenu);
copyItem = new JMenuItem(DisplayRes.getString("DrawingFrame.Copy_menu_item")); //$NON-NLS-1$
copyItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
copyAction();
}
});
editMenu.add(copyItem);
pasteItem = new JMenuItem(DisplayRes.getString("DrawingFrame.Paste_menu_item")); //$NON-NLS-1$
pasteItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pasteAction();
}
});
pasteItem.setEnabled(false); // not supported yet
editMenu.add(pasteItem);
replaceItem = new JMenuItem(DisplayRes.getString("DrawingFrame.Replace_menu_item")); //$NON-NLS-1$
replaceItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
replaceAction();
}
});
replaceItem.setEnabled(false); // not supported yet
editMenu.add(replaceItem);
setJMenuBar(menuBar);
cameraItem = new JMenuItem(DisplayRes.getString("DrawingFrame3D.Camera_menu_item")); //$NON-NLS-1$
cameraItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel!=null) {
if(cameraInspectorFrame==null) {
cameraInspectorFrame = CameraInspector.createFrame(drawingPanel);
}
cameraInspectorFrame.setVisible(true);
}
}
});
if(supportsLightInspectors()) {
lightItem = new JMenuItem(DisplayRes.getString("DrawingFrame3D.Light_menu_item")); //$NON-NLS-1$
lightItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel!=null) {
if(lightInspectorFrame==null) {
lightInspectorFrame = createLightInspectorFrame(drawingPanel);
}
lightInspectorFrame.setVisible(true);
}
}
});
}
decorationMenu = new JMenu(DisplayRes.getString("DrawingFrame3D.Decoration_menu")); //$NON-NLS-1$
decorationNoneItem = new JMenuItem(DisplayRes.getString("DrawingFrame3D.DecorationNone_menu_item")); //$NON-NLS-1$
decorationNoneItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel!=null) {
drawingPanel.getVisualizationHints().setDecorationType(org.opensourcephysics.display3d.core.VisualizationHints.DECORATION_NONE);
drawingPanel.repaint();
}
}
});
decorationMenu.add(decorationNoneItem);
decorationCubeItem = new JMenuItem(DisplayRes.getString("DrawingFrame3D.DecorationCube_menu_item")); //$NON-NLS-1$
decorationCubeItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel!=null) {
drawingPanel.getVisualizationHints().setDecorationType(org.opensourcephysics.display3d.core.VisualizationHints.DECORATION_CUBE);
drawingPanel.repaint();
}
}
});
decorationMenu.add(decorationCubeItem);
decorationAxesItem = new JMenuItem(DisplayRes.getString("DrawingFrame3D.DecorationAxes_menu_item")); //$NON-NLS-1$
decorationAxesItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel!=null) {
drawingPanel.getVisualizationHints().setDecorationType(org.opensourcephysics.display3d.core.VisualizationHints.DECORATION_AXES);
drawingPanel.repaint();
}
}
});
decorationMenu.add(decorationAxesItem);
cursorMenu = new JMenu(DisplayRes.getString("DrawingFrame3D.Cursor_menu")); //$NON-NLS-1$
cursorNoneItem = new JMenuItem(DisplayRes.getString("DrawingFrame3D.CursorNone_menu_item")); //$NON-NLS-1$
cursorNoneItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel!=null) {
drawingPanel.getVisualizationHints().setCursorType(org.opensourcephysics.display3d.core.VisualizationHints.CURSOR_NONE);
drawingPanel.repaint();
}
}
});
cursorMenu.add(cursorNoneItem);
cursorCubeItem = new JMenuItem(DisplayRes.getString("DrawingFrame3D.CursorCube_menu_item")); //$NON-NLS-1$
cursorCubeItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel!=null) {
drawingPanel.getVisualizationHints().setCursorType(org.opensourcephysics.display3d.core.VisualizationHints.CURSOR_CUBE);
drawingPanel.repaint();
}
}
});
cursorMenu.add(cursorCubeItem);
cursorXYZItem = new JMenuItem(DisplayRes.getString("DrawingFrame3D.CursorXYZ_menu_item")); //$NON-NLS-1$
cursorXYZItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel!=null) {
drawingPanel.getVisualizationHints().setCursorType(org.opensourcephysics.display3d.core.VisualizationHints.CURSOR_XYZ);
drawingPanel.repaint();
}
}
});
cursorMenu.add(cursorXYZItem);
cursorCrosshairItem = new JMenuItem(DisplayRes.getString("DrawingFrame3D.CursorCrosshair_menu_item")); //$NON-NLS-1$
cursorCrosshairItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel!=null) {
drawingPanel.getVisualizationHints().setCursorType(org.opensourcephysics.display3d.core.VisualizationHints.CURSOR_CROSSHAIR);
drawingPanel.repaint();
}
}
});
cursorMenu.add(cursorCrosshairItem);
zoomToFitItem = new JMenuItem(DisplayRes.getString("DrawingFrame3D.ZoomToFit_menu_item")); //$NON-NLS-1$
zoomToFitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel!=null) {
drawingPanel.zoomToFit();
drawingPanel.repaint();
}
}
});
visualMenu = new JMenu(DisplayRes.getString("DrawingFrame3D.Visual_menu")); //$NON-NLS-1$
visualMenu.add(cameraItem);
if(supportsLightInspectors()) {
visualMenu.add(lightItem);
}
visualMenu.add(decorationMenu);
visualMenu.add(cursorMenu);
visualMenu.add(zoomToFitItem);
menuBar.add(visualMenu);
loadToolsMenu();
JMenu helpMenu = new JMenu(DisplayRes.getString("DrawingFrame.Help_menu_item")); //$NON-NLS-1$
menuBar.add(helpMenu);
JMenuItem aboutItem = new JMenuItem(DisplayRes.getString("DrawingFrame.AboutOSP_menu_item")); //$NON-NLS-1$
aboutItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OSPRuntime.showAboutDialog(DrawingFrame3D.this);
}
});
helpMenu.add(aboutItem);
}
/**
* Adds a Tools menu to the menu bar.
*/
protected JMenu loadToolsMenu() {
JMenuBar menuBar = getJMenuBar();
if(menuBar==null) {
return null;
}
// create Tools menu item
JMenu toolsMenu = new JMenu(DisplayRes.getString("DrawingFrame.Tools_menu_title")); //$NON-NLS-1$
menuBar.add(toolsMenu);
JMenuItem snapshotItem = new JMenuItem(DisplayRes.getString("DisplayPanel.Snapshot_menu_item")); //$NON-NLS-1$
toolsMenu.add(snapshotItem);
snapshotItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SnapshotTool tool = SnapshotTool.getTool();
if(drawingPanel!=null) {
tool.saveImage(null, drawingPanel.getComponent());
} else {
tool.saveImage(null, getContentPane());
}
}
});
// create video capture menu item
JMenuItem videoItem = new JMenuItem(DisplayRes.getString("DrawingFrame.MenuItem.Capture")); //$NON-NLS-1$
toolsMenu.add(videoItem);
Class<?> videoToolClass = null;
if(OSPRuntime.loadVideoTool) {
try {
videoToolClass = Class.forName("org.opensourcephysics.tools.VideoCaptureTool"); //$NON-NLS-1$
} catch(ClassNotFoundException ex) {
OSPRuntime.loadVideoTool = false;
videoItem.setEnabled(false);
OSPLog.finest("Cannot instantiate video capture tool class:\n"+ex.toString()); //$NON-NLS-1$
}
}
final Class<?> finalVideoToolClass = videoToolClass; // class must be final for action listener
videoItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(drawingPanel.getVideoTool()==null) {
try {
Method m = finalVideoToolClass.getMethod("getTool", (Class[]) null); //$NON-NLS-1$
Tool tool = (Tool) m.invoke(null, (Object[]) null); // tool is a VideoTool
drawingPanel.setVideoTool((VideoTool) tool);
((VideoTool) tool).setVisible(true);
((VideoTool) tool).clear();
} catch(Exception ex) {}
} else {
drawingPanel.getVideoTool().setVisible(true);
}
}
});
return toolsMenu;
}
/**
* Gets a menu with the given name from the menu bar. Returns null if menu item does not exist.
*
* @param menuName String
* @return JMenu
*/
public JMenu getMenuItem(String menuName) {
menuName = menuName.trim();
JMenu menu = null;
for(int i = 0; i<menuBar.getMenuCount(); i++) {
JMenu next = menuBar.getMenu(i);
if(next.getText().equals(menuName)) {
menu = next;
break;
}
}
return menu;
}
/**
* Removes a menu with the given name from the menu bar and returns the removed item.
* Returns null if menu item does not exist.
*
* @param menuName String
* @return JMenu
*/
public JMenu removeMenuItem(String menuName) {
menuName = menuName.trim();
JMenu menu = null;
for(int i = 0; i<menuBar.getMenuCount(); i++) {
JMenu next = menuBar.getMenu(i);
if(next.getText().equals(menuName)) {
menu = next;
menuBar.remove(i);
break;
}
}
return menu;
}
/**
* Inspects the drawing frame by using an xml document tree.
*/
public void inspectXML() {
XMLControlElement xml = null;
try {
// if drawingPanel provides an xml loader, inspect the drawingPanel
Method method = drawingPanel.getClass().getMethod("getLoader", (java.lang.Class[]) null); //$NON-NLS-1$
if((method!=null)&&Modifier.isStatic(method.getModifiers())) {
xml = new XMLControlElement(drawingPanel);
}
} catch(NoSuchMethodException ex) {
// this drawing panel cannot be inspected
return;
}
// display a TreePanel in a modal dialog
XMLTreePanel treePanel = new XMLTreePanel(xml);
JDialog dialog = new JDialog((java.awt.Frame) null, true);
dialog.setContentPane(treePanel);
dialog.setSize(new Dimension(600, 300));
dialog.setVisible(true);
}
public void saveXML() {
JFileChooser chooser = OSPRuntime.getChooser();
int result = chooser.showSaveDialog(null);
if(result==JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
// check to see if file already exists
if(file.exists()) {
int selected = JOptionPane.showConfirmDialog(null, DisplayRes.getString("DrawingFrame.ReplaceExisting_message")+file.getName() //$NON-NLS-1$
+DisplayRes.getString("DrawingFrame.QuestionMark"), //$NON-NLS-1$
DisplayRes.getString("DrawingFrame.ReplaceFile_option_title"), //$NON-NLS-1$
JOptionPane.YES_NO_CANCEL_OPTION);
if(selected!=JOptionPane.YES_OPTION) {
return;
}
}
String fileName = XML.getRelativePath(file.getAbsolutePath());
if((fileName==null)||fileName.trim().equals("")) { //$NON-NLS-1$
return;
}
int i = fileName.toLowerCase().lastIndexOf(".xml"); //$NON-NLS-1$
if(i!=fileName.length()-4) {
fileName += ".xml"; //$NON-NLS-1$
}
try {
// if drawingPanel provides an xml loader, save the drawingPanel
Method method = drawingPanel.getClass().getMethod("getLoader", (java.lang.Class[]) null); //$NON-NLS-1$
if((method!=null)&&Modifier.isStatic(method.getModifiers())) {
XMLControl xml = new XMLControlElement(drawingPanel);
xml.write(fileName);
}
} catch(NoSuchMethodException ex) {
// this drawingPanel cannot be saved
return;
}
}
}
// ----------------------------------------------------
// XML loader
// ----------------------------------------------------
public static XML.ObjectLoader getLoader() {
return new org.opensourcephysics.display3d.core.DrawingFrame3D.Loader();
}
}
/*
//CJB
private static final GridBagConstraints gbc;
static {
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.CENTER;
}
private JPanel wrapInBackgroundImage(JComponent component,Icon backgroundIcon,
int verticalAlignment, int horizontalAlignment) {
// make the passed in swing component transparent
component.setOpaque(false);
// create wrapper JPanel
JPanel backgroundPanel = new JPanel(new GridBagLayout());
// add the passed in swing component first to ensure that it is in front
backgroundPanel.add(component, gbc);
// create a label to paint the background image
JLabel backgroundImage = new JLabel(backgroundIcon);
// set minimum and preferred sizes so that the size of the image
backgroundImage.setPreferredSize(new Dimension(1,1));
backgroundImage.setMinimumSize(new Dimension(1,1));
// align the image as specified.
backgroundImage.setVerticalAlignment(verticalAlignment);
backgroundImage.setHorizontalAlignment(horizontalAlignment);
// add the background label
backgroundPanel.add(backgroundImage, gbc);
return backgroundPanel;
}
public void setBackground(String name){
//Image Transformation (Escale Factor)
ImageIcon image = null;
image = new ImageIcon(this.getClass().getClassLoader().getResource(name));
this.add(wrapInBackgroundImage((JPanel)this.getComponent(),image, JLabel.TOP, JLabel.LEADING));
}
//CJB*/
/*
* Open Source Physics software is free software; you can redistribute
* it and/or modify it under the terms of the GNU General Public License (GPL) as
* published by the Free Software Foundation; either version 2 of the License,
* or(at your option) any later version.
* Code that uses any portion of the code in the org.opensourcephysics package
* or any subpackage (subdirectory) of this package must must also be be released
* under the GNU GPL license.
*
* This software 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA
* or view the license online at http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2007 The Open Source Physics project
* http://www.opensourcephysics.org
*/