/*FreeMind - A Program for creating and viewing Mindmaps
*Copyright (C) 2000-2001 Joerg Mueller <joergmueller@bigfoot.com>
*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.
*/
/*$Id: MindMapToolBar.java,v 1.12.18.1.12.5 2009/07/04 20:38:27 christianfoltin Exp $*/
package freemind.modes.mindmapmode;
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Vector;
import javax.swing.Action;
import javax.swing.JComboBox;
import javax.swing.JToolBar;
import freemind.controller.Controller;
import freemind.controller.FreeMindToolBar;
import freemind.controller.StructuredMenuHolder;
import freemind.controller.ZoomListener;
import freemind.main.Tools;
public class MindMapToolBar extends FreeMindToolBar implements ZoomListener {
/**
* A combo box that doesn't fill the complete screen.
* See http://stackoverflow.com/questions/13345640/does-anyone-know-how-to-layout-a-jtoolbar-that-doest-move-or-re-size-any-compon
*/
private final class FreeMindComboBox extends JComboBox {
private FreeMindComboBox(Vector pItems) {
super(pItems);
}
public FreeMindComboBox(String[] pItems) {
super(pItems);
}
public java.awt.Dimension getMaximumSize() {
return getPreferredSize();
}
}
private static final String[] sizes = { "8", "10", "12", "14", "16", "18",
"20", "24", "28" };
private MindMapController c;
private JComboBox fonts, size;
private JAutoScrollBarPane iconToolBarScrollPane;
private JToolBar iconToolBar;
private boolean fontSize_IgnoreChangeEvent = false;
private boolean fontFamily_IgnoreChangeEvent = false;
private ItemListener fontsListener;
private ItemListener sizeListener;
private JComboBox zoom;
private String userDefinedZoom;
protected static java.util.logging.Logger logger = null;
public MindMapToolBar(MindMapController controller) {
super();
this.c = controller;
if (logger == null) {
logger = freemind.main.Resources.getInstance().getLogger(
this.getClass().getName());
}
this.setRollover(true);
fonts = new FreeMindComboBox(Tools.getAvailableFontFamilyNamesAsVector());
fonts.setFocusable(false);
size = new FreeMindComboBox(sizes);
size.setFocusable(false);
iconToolBar = new FreeMindToolBar();
iconToolBarScrollPane = new JAutoScrollBarPane(iconToolBar);
iconToolBar.setOrientation(JToolBar.VERTICAL);
iconToolBar.setRollover(true);
iconToolBarScrollPane.getVerticalScrollBar().setUnitIncrement(100);
fontsListener = new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() != ItemEvent.SELECTED) {
return;
}
// TODO: this is super-dirty, why doesn't the toolbar know the
// model?
if (fontFamily_IgnoreChangeEvent) {
// fc, 27.8.2004: I don't understand, why the ignore type is
// resetted here.
// let's see: fontFamily_IgnoreChangeEvent = false;
return;
}
fontFamily_IgnoreChangeEvent = true;
c.fontFamily.actionPerformed((String) e.getItem());
fontFamily_IgnoreChangeEvent = false;
}
};
fonts.addItemListener(fontsListener);
sizeListener = new ItemListener() {
public void itemStateChanged(ItemEvent e) {
// System.err.println("ce:"+e);
if (e.getStateChange() != ItemEvent.SELECTED) {
return;
}
// change the font size
// TODO: this is super-dirty, why doesn't the toolbar know the
// model?
if (fontSize_IgnoreChangeEvent) {
// fc, 27.8.2004: I don't understand, why the ignore type is
// resetted here.
// let's see: fontSize_IgnoreChangeEvent = false;
return;
}
// call action:
c.fontSize.actionPerformed((String) e.getItem());
}
};
size.addItemListener(sizeListener);
userDefinedZoom = controller.getText("user_defined_zoom");
zoom = new FreeMindComboBox(controller.getController().getZooms());
zoom.setSelectedItem("100%");
zoom.addItem(userDefinedZoom);
// Focus fix.
zoom.setFocusable(false);
zoom.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
// todo: dialog with user zoom value, if user zoom is chosen.
// change proposed by dimitri:
if (e.getStateChange() == ItemEvent.SELECTED) {
setZoomByItem(e.getItem());
}
}
});
}
private void setZoomByItem(Object item) {
if (((String) item).equals(userDefinedZoom))
return;
String dirty = (String) item;
String cleaned = dirty.substring(0, dirty.length() - 1);
// change representation ("125" to 1.25)
float zoomValue = Float.parseFloat(cleaned) / 100F; // nothing to do...
// remove '%' sign
getController().setZoom(zoomValue);
}
protected Controller getController() {
return c.getController();
}
public void update(StructuredMenuHolder holder) {
this.removeAll();
holder.updateMenus(this, "mindmapmode_toolbar/");
add(zoom);
fonts.setMaximumRowCount(30);
add(fonts);
// size.setEditor(new BasicComboBoxEditor());
// size.setEditable(true);
add(size);
// button tool bar.
iconToolBar.removeAll();
iconToolBar.add(c.removeLastIconAction);
iconToolBar.add(c.removeAllIconsAction);
iconToolBar.addSeparator();
for (int i = 0; i < c.iconActions.size(); ++i) {
iconToolBar.add((Action) c.iconActions.get(i));
}
}
// Daniel Polansky: both the following methods trigger item listeners above.
// Those listeners obtain two events: first DESELECTED and then
// SELECTED. Both events are to be ignored - we don't want to update
// a node with its own font. The item listeners should react only
// to a user change, not to our change.
public void selectFontSize(String fontSize) // (DiPo)
{
fontSize_IgnoreChangeEvent = true;
size.setSelectedItem(fontSize);
fontSize_IgnoreChangeEvent = false;
}
Component getLeftToolBar() {
return iconToolBarScrollPane;
}
public void selectFontName(String fontName) // (DiPo)
{
if (fontFamily_IgnoreChangeEvent) {
return;
}
fontFamily_IgnoreChangeEvent = true;
fonts.setEditable(true);
fonts.setSelectedItem(fontName);
fonts.setEditable(false);
fontFamily_IgnoreChangeEvent = false;
}
void setAllActions(boolean enabled) {
fonts.setEnabled(enabled);
size.setEnabled(enabled);
}
/* (non-Javadoc)
* @see freemind.controller.ZoomListener#setZoom(float)
*/
public void setZoom(float f) {
logger.fine("setZoomComboBox is called with " + f + ".");
String toBeFound = getItemForZoom(f);
for (int i = 0; i < zoom.getItemCount(); ++i) {
if (toBeFound.equals((String) zoom.getItemAt(i))) {
// found
zoom.setSelectedItem(toBeFound);
return;
}
}
zoom.setSelectedItem(userDefinedZoom);
}
private String getItemForZoom(float f) {
return (int) (f * 100F) + "%";
}
public void startup() {
getController().registerZoomListener(this);
}
public void shutdown() {
getController().deregisterZoomListener(this);
}
}