/** * */ package org.concord.otrunk.view; import java.awt.BorderLayout; import java.lang.reflect.Method; import java.util.HashMap; import javax.swing.JFrame; import org.concord.framework.otrunk.OTID; import org.concord.framework.otrunk.OTObject; import org.concord.framework.otrunk.view.OTFrame; import org.concord.framework.otrunk.view.OTFrameManager; import org.concord.framework.otrunk.view.OTViewContext; import org.concord.framework.otrunk.view.OTViewEntry; import org.concord.framework.otrunk.view.OTViewFactory; public class OTFrameManagerImpl implements OTFrameManager { HashMap<OTID, FrameContainer> frameContainers = new HashMap<OTID, FrameContainer>(); OTViewFactory viewFactory; private JFrame jFrame; private int oldX = 0; private int oldY = 0; private JFrame mainJFrame; public class FrameContainer { OTViewContainerPanel container; JFrame frame; } public void setViewFactory(OTViewFactory viewFactory) { this.viewFactory = viewFactory; } public void putObjectInFrame(OTObject otObject, OTFrame otFrame) { putObjectInFrame(otObject, null, otFrame, null); } public void putObjectInFrame(OTObject otObject, OTFrame otFrame, int positionX, int positionY) { putObjectInFrame(otObject, null, otFrame, null, positionX, positionY); } public void putObjectInFrame(OTObject otObject, OTViewEntry viewEntry, OTFrame otFrame) { putObjectInFrame(otObject, viewEntry, otFrame, null); } public void putObjectInFrame(OTObject otObject, OTViewEntry viewEntry, OTFrame otFrame, String viewMode) { putObjectInFrame(otObject, viewEntry, otFrame, viewMode, 30, 30); } public void putObjectInFrame(OTObject otObject, OTViewEntry viewEntry, OTFrame otFrame, String viewMode, int positionX, int positionY) { putObjectInFrame(otObject, viewEntry, otFrame, viewMode, positionX, positionY, true); } public void putObjectInFrame(OTObject otObject, OTViewEntry viewEntry, OTFrame otFrame, String viewMode, int positionX, int positionY, boolean forceReloadOTObject) { // look up view container with the frame. FrameContainer frameContainer = frameContainers.get(otFrame.getGlobalId()); if(frameContainer == null || oldX != positionX || oldY != positionY) { jFrame = new JFrame(otFrame.getTitle()); frameContainer = new FrameContainer(); frameContainer.frame = jFrame; OTViewContainerPanel otContainer = new OTViewContainerPanel(this); otContainer.setTopLevelContainer(true); otContainer.setUseScrollPane(otFrame.getUseScrollPane()); frameContainer.container = otContainer; OTViewContext factoryContext = viewFactory.getViewContext(); frameContainer.container.setOTViewFactory(factoryContext.createChildViewFactory()); jFrame.getContentPane().setLayout(new BorderLayout()); jFrame.getContentPane().add(otContainer, BorderLayout.CENTER); jFrame.setBounds(positionX, positionY, otFrame.getWidth(), otFrame.getHeight()); oldX = positionX; oldY = positionY; if (otFrame.getBorderlessPopup()){ jFrame.setUndecorated(true); } // This is only available on Java 1.5 if (otFrame.isResourceSet("alwaysOnTop")){ try { Method setAlwaysOnTopMethod = jFrame.getClass().getMethod("setAlwaysOnTop", new Class []{Boolean.TYPE}); setAlwaysOnTopMethod.invoke(jFrame, new Object[]{new Boolean(otFrame.getAlwaysOnTop())}); } catch (Exception e) { System.err.println("alwaysOnTop property of OTFrame is only available on Java 1.5"); e.printStackTrace(); } } frameContainers.put(otFrame.getGlobalId(), frameContainer); } // call setCurrentObject on that view container with a null // frame OTObject currenOTObject = frameContainer.container.getCurrentObject(); frameContainer.container.setViewMode(viewMode); if (forceReloadOTObject || currenOTObject != otObject){ frameContainer.container.setCurrentObject(otObject, viewEntry); } frameContainer.frame.setVisible(true); } public JFrame getMainFrame() { return this.mainJFrame; } public void setMainFrame(JFrame frame) { this.mainJFrame = frame; } public void destroyFrame(){ jFrame.dispose(); } }