/* * Freeplane - mind map editor * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev * * This file is created by Dimitry Polivaev in 2008. * * 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, see <http://www.gnu.org/licenses/>. */ package org.freeplane.features.styles.mindmapmode; import java.awt.Container; import java.awt.GraphicsEnvironment; import java.util.Collection; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import org.freeplane.core.ui.FixedBasicComboBoxEditor; import org.freeplane.features.map.IMapChangeListener; import org.freeplane.features.map.IMapSelection; import org.freeplane.features.map.IMapSelectionListener; import org.freeplane.features.map.INodeChangeListener; import org.freeplane.features.map.INodeSelectionListener; import org.freeplane.features.map.MapChangeEvent; import org.freeplane.features.map.MapModel; import org.freeplane.features.map.NodeChangeEvent; import org.freeplane.features.map.NodeModel; import org.freeplane.features.mode.Controller; import org.freeplane.features.mode.ModeController; import org.freeplane.features.nodestyle.NodeStyleController; import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController; import org.freeplane.features.styles.IStyle; import org.freeplane.features.styles.LogicalStyleController; import org.freeplane.features.styles.MapStyle; import org.freeplane.features.styles.MapStyleModel; public class MUIFactory implements INodeSelectionListener, INodeChangeListener, IMapChangeListener, IMapSelectionListener { // final private Controller controller; private boolean ignoreChangeEvent = false; final private DefaultComboBoxModel fonts, size, styles; // private final MModeController modeController; public DefaultComboBoxModel getStyles() { return styles; } final static public String[] FONT_SIZES = new String[] { "2", "4", "6", "8", "10", "12", "14", "16", "18", "20", "22", "24", "30", "36", "48", "72" }; public MUIFactory() { size = new DefaultComboBoxModel(MUIFactory.FONT_SIZES); styles = new DefaultComboBoxModel(); final ModeController modeController = Controller.getCurrentModeController(); final MNodeStyleController styleController = (MNodeStyleController) modeController .getExtension(NodeStyleController.class); final GraphicsEnvironment gEnv = GraphicsEnvironment.getLocalGraphicsEnvironment(); final String[] envFonts = gEnv.getAvailableFontFamilyNames(); fonts = new DefaultComboBoxModel(envFonts); final ListDataListener fontsListener = new ListDataListener() { public void intervalRemoved(final ListDataEvent e) { } public void intervalAdded(final ListDataEvent e) { } public void contentsChanged(final ListDataEvent e) { if (e.getIndex0() != -1) { return; } if (ignoreChangeEvent) { return; } ignoreChangeEvent = true; final DefaultComboBoxModel source = (DefaultComboBoxModel) e.getSource(); styleController.setFontFamily((String) source.getSelectedItem()); ignoreChangeEvent = false; } }; fonts.addListDataListener(fontsListener); final ListDataListener sizeListener = new ListDataListener() { public void intervalRemoved(final ListDataEvent e) { } public void intervalAdded(final ListDataEvent e) { } public void contentsChanged(final ListDataEvent e) { if (e.getIndex0() != -1) { return; } if (ignoreChangeEvent) { return; } try { final DefaultComboBoxModel source = (DefaultComboBoxModel) e.getSource(); final int intSize = Integer.parseInt(((String) source.getSelectedItem())); styleController.setFontSize(intSize); } catch (final NumberFormatException nfe) { } } }; size.addListDataListener(sizeListener); final ListDataListener styleListener = new ListDataListener() { public void intervalRemoved(final ListDataEvent e) { } public void intervalAdded(final ListDataEvent e) { } public void contentsChanged(final ListDataEvent e) { if (e.getIndex0() != -1) { return; } if (ignoreChangeEvent) { return; } final DefaultComboBoxModel source = (DefaultComboBoxModel) e.getSource(); final IStyle style = (IStyle) source.getSelectedItem(); final MLogicalStyleController controller = (MLogicalStyleController) modeController .getExtension(LogicalStyleController.class); controller.setStyle(style); } }; styles.addListDataListener(styleListener); } private void changeToolbar(final NodeModel node) { final Controller controller = Controller.getCurrentController(); final MNodeStyleController styleController = (MNodeStyleController) controller.getModeController() .getExtension(NodeStyleController.class); selectFontSize(Integer.toString(styleController.getFontSize(node))); selectFontName(styleController.getFontFamilyName(node)); final LogicalStyleController logicalStyleController = LogicalStyleController.getController(); ignoreChangeEvent = true; styles.setSelectedItem(logicalStyleController.getFirstStyle(node)); ignoreChangeEvent = false; } public void nodeChanged(final NodeChangeEvent event) { //DOCEAR: if nothing is selected (map is opened in background for updating) IMapSelection selection = Controller.getCurrentController().getSelection(); if (selection != null) { if (event.getNode() != Controller.getCurrentController().getSelection().getSelected()) { return; } changeToolbar(event.getNode()); } } public void onDeselect(final NodeModel node) { } public void onSelect(final NodeModel node) { changeToolbar(node); } private void selectFontName(final String fontName) { if (ignoreChangeEvent) { return; } ignoreChangeEvent = true; fonts.setSelectedItem(fontName); ignoreChangeEvent = false; } private void selectFontSize(final String fontSize) { ignoreChangeEvent = true; size.setSelectedItem(fontSize); ignoreChangeEvent = false; } public Container createStyleBox() { final JComboBox stylesBox = new JComboBox(styles); stylesBox.setRenderer(new ComboBoxRendererWithTooltip(stylesBox)); return stylesBox; } public Container createSizeBox() { final JComboBox sizeBox = new JComboBox(size); sizeBox.setPreferredSize(sizeBox.getPreferredSize()); sizeBox.setEditor(new FixedBasicComboBoxEditor()); sizeBox.setEditable(true); return sizeBox; } public Container createFontBox() { final JComboBox fontsBox = new JComboBox(fonts); fontsBox.setMaximumRowCount(9); fontsBox.setRenderer(new ComboBoxRendererWithTooltip(fontsBox)); return fontsBox; } public void mapChanged(final MapChangeEvent event) { final Object property = event.getProperty(); if (property.equals(MapStyle.MAP_STYLES)) { updateMapStyles(event.getMap()); final Controller controller = Controller.getCurrentController(); changeToolbar(controller.getSelection().getSelected()); return; } } public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) { } public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) { } public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent, final NodeModel child, final int newIndex) { } public void onPreNodeDelete(final NodeModel oldParent, final NodeModel selectedNode, final int index) { } public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent, final NodeModel child, final int newIndex) { } public void afterMapChange(final MapModel oldMap, final MapModel newMap) { updateMapStyles(newMap); } private void updateMapStyles(final MapModel newMap) { ignoreChangeEvent = true; styles.removeAllElements(); if (newMap == null) { return; } final Collection<IStyle> styleObjects = MapStyleModel.getExtension(newMap).getStyles(); for (final IStyle style : styleObjects) { styles.addElement(style); } ignoreChangeEvent = false; } public void beforeMapChange(final MapModel oldMap, final MapModel newMap) { } }