/*FreeMind - A Program for creating and viewing Mindmaps *Copyright (C) 2000-2007 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitri Polivaev and others. *See COPYING for Details * *This program is free software; you can redistribute it and/or *modify it under the terms of the GNU General Public License *as published by the Free Software Foundation; either version 2 *of the License, or (at your option) any later version. * *This program 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 program; if not, write to the Free Software *Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package freemind.view.mindmapview; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.LayoutManager; import javax.swing.JComponent; import freemind.modes.EdgeAdapter; import freemind.modes.MindMapNode; class NodeViewFactory { private static class ContentPane extends JComponent { static private LayoutManager layoutManager = new ContentPaneLayout(); ContentPane() { setLayout(layoutManager); } } private static class ContentPaneLayout implements LayoutManager { public void addLayoutComponent(String name, Component comp) { } public void layoutContainer(Container parent) { final int componentCount = parent.getComponentCount(); final int width = parent.getWidth(); int y = 0; for (int i = 0; i < componentCount; i++) { final Component component = parent.getComponent(i); if (component.isVisible()) { final Dimension preferredCompSize = component .getPreferredSize(); if (component instanceof MainView) { component.setBounds(0, y, width, preferredCompSize.height); } else { int x = (int) (component.getAlignmentX() * (width - preferredCompSize.width)); component.setBounds(x, y, preferredCompSize.width, preferredCompSize.height); } y += preferredCompSize.height; } } } public Dimension minimumLayoutSize(Container parent) { return preferredLayoutSize(parent); } public Dimension preferredLayoutSize(Container parent) { final Dimension prefSize = new Dimension(0, 0); final int componentCount = parent.getComponentCount(); for (int i = 0; i < componentCount; i++) { final Component component = parent.getComponent(i); if (component.isVisible()) { final Dimension preferredCompSize = component .getPreferredSize(); prefSize.height += preferredCompSize.height; prefSize.width = Math.max(prefSize.width, preferredCompSize.width); } } return prefSize; } public void removeLayoutComponent(Component comp) { } } private static NodeViewFactory factory; private EdgeView sharpBezierEdgeView; private EdgeView sharpLinearEdgeView; private EdgeView bezierEdgeView; private EdgeView linearEdgeView; // Singleton private NodeViewFactory() { } static NodeViewFactory getInstance() { if (factory == null) { factory = new NodeViewFactory(); } return factory; } EdgeView getEdge(NodeView newView) { final int edgeStyle = newView.getModel().getEdge().getStyleAsInt(); switch(edgeStyle) { case EdgeAdapter.INT_EDGESTYLE_LINEAR: return getLinearEdgeView(); case EdgeAdapter.INT_EDGESTYLE_BEZIER: return getBezierEdgeView(); case EdgeAdapter.INT_EDGESTYLE_SHARP_LINEAR: return getSharpLinearEdgeView(); case EdgeAdapter.INT_EDGESTYLE_SHARP_BEZIER: return getSharpBezierEdgeView(); default: return getLinearEdgeView(); } } private EdgeView getSharpBezierEdgeView() { if (sharpBezierEdgeView == null) { sharpBezierEdgeView = new SharpBezierEdgeView(); } return sharpBezierEdgeView; } private EdgeView getSharpLinearEdgeView() { if (sharpLinearEdgeView == null) { sharpLinearEdgeView = new SharpLinearEdgeView(); } return sharpLinearEdgeView; } private EdgeView getBezierEdgeView() { if (bezierEdgeView == null) { bezierEdgeView = new BezierEdgeView(); } return bezierEdgeView; } private EdgeView getLinearEdgeView() { if (linearEdgeView == null) { linearEdgeView = new LinearEdgeView(); } return linearEdgeView; } /** * Factory method which creates the right NodeView for the model. */ NodeView newNodeView(MindMapNode model, int position, MapView map, Container parent) { NodeView newView = new NodeView(model, position, map, parent); if (model.isRoot()) { final MainView mainView = new RootMainView(); newView.setMainView(mainView); newView.setLayout(VerticalRootNodeViewLayout.getInstance()); } else { newView.setMainView(newMainView(model)); if (newView.isLeft()) { newView.setLayout(LeftNodeViewLayout.getInstance()); } else { newView.setLayout(RightNodeViewLayout.getInstance()); } } model.addViewer(newView); newView.update(); fireNodeViewCreated(newView); return newView; } MainView newMainView(MindMapNode model) { if (model.isRoot()) { return new RootMainView(); } if (model.getStyle().equals(MindMapNode.STYLE_FORK)) { return new ForkMainView(); } else if (model.getStyle().equals(MindMapNode.STYLE_BUBBLE)) { return new BubbleMainView(); } else { System.err.println("Tried to create a NodeView of unknown Style."); return new ForkMainView(); } } private void fireNodeViewCreated(NodeView newView) { newView.getMap().getModel().getModeController() .onViewCreatedHook(newView); } JComponent newContentPane(NodeView view) { return new ContentPane(); } }