/*FreeMind - A Program for creating and viewing Mindmaps
*Copyright (C) 2000-2006 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.
*/
/*
* Created on 30.03.2004
*
*/
package accessories.plugins;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import freemind.main.FreeMindMain;
import freemind.main.XMLElement;
import freemind.modes.mindmapmode.hooks.PermanentMindMapNodeHookAdapter;
import freemind.view.mindmapview.NodeView;
/**
* @author foltin
*
*/
public class FormularEditor extends PermanentMindMapNodeHookAdapter {
private static final String XML_FORMULAR_TYPE = "TYPE";
private abstract class FormularEntity {
private String value;
private String label;
private String type;
private String displayLabel;
public String getValue() {
return value;
}
public void setValue(String string) {
value = string;
}
public String getLabel() {
return label;
}
public void setLabel(String string) {
label = string;
}
public FormularEntity(String name, String value, String type,
String display) {
this.label = name;
this.value = value;
this.type = type;
this.displayLabel = display;
}
public void addToPanel(JPanel panel, GridBagLayout l, int y) {
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = y;
c.weightx = 50;
c.weighty = 100;
c.fill = GridBagConstraints.VERTICAL;
c.anchor = GridBagConstraints.EAST;
JLabel jlabel = new JLabel(getLabel());
if (getDisplayLabel() != null)
jlabel.setText(getDisplayLabel());
l.setConstraints(jlabel, c);
panel.add(jlabel);
}
/**
* @param child
*/
public void save(XMLElement child) {
child.setAttribute("NAME", getLabel());
child.setAttribute("VALUE", getValue());
if (getDisplayLabel() != null)
child.setAttribute("DISPLAY", getDisplayLabel());
child.setAttribute(XML_FORMULAR_TYPE, getType());
}
/**
* @return
*/
private String getDisplayLabel() {
return displayLabel;
}
/**
* @param paramChild
*/
public FormularEntity(XMLElement paramChild) {
this(paramChild.getStringAttribute("NAME"), paramChild
.getStringAttribute("VALUE"), paramChild
.getStringAttribute(XML_FORMULAR_TYPE), paramChild
.getStringAttribute("DISPLAY"));
}
/**
* @return
*/
public String getType() {
return type;
}
/**
* @param string
*/
public void setDisplayLabel(String string) {
displayLabel = string;
}
}
private class StringEntity extends FormularEntity {
public void addToPanel(JPanel panel, GridBagLayout l, int y) {
super.addToPanel(panel, l, y);
GridBagConstraints c = new GridBagConstraints();
c.gridx = 1;
c.gridy = y;
c.weightx = 100;
c.weighty = 100;
c.fill = GridBagConstraints.BOTH;
final JTextField text = new JTextField(getValue());
l.setConstraints(text, c);
panel.add(text);
text.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent arg0) {
changedUpdate(arg0);
}
public void removeUpdate(DocumentEvent arg0) {
changedUpdate(arg0);
}
public void changedUpdate(DocumentEvent e) {
try {
String text = e.getDocument().getText(0,
e.getDocument().getLength());
setValue(text);
nodeChanged(getNode());
} catch (BadLocationException e1) {
freemind.main.Resources.getInstance().logException(e1);
}
}
});
}
/**
* @param paramChild
*/
public StringEntity(XMLElement paramChild) {
super(paramChild);
}
}
private class CheckBoxEntity extends FormularEntity {
public CheckBoxEntity(XMLElement paramChild) {
super(paramChild);
}
public void addToPanel(JPanel panel, GridBagLayout l, int y) {
super.addToPanel(panel, l, y);
GridBagConstraints c = new GridBagConstraints();
c.gridx = 1;
c.gridy = y;
c.weightx = 100;
c.weighty = 100;
c.fill = GridBagConstraints.BOTH;
final JCheckBox text = new JCheckBox();
text.setSelected(getValue().equals("true") ? true : false);
l.setConstraints(text, c);
panel.add(text);
text.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.DESELECTED) {
setValue("false");
} else {
setValue("true");
}
}
});
}
}
private class ChoiceEntity extends FormularEntity {
private class ChoiceElement {
public String enumStr;
public String displayValue;
public ChoiceElement(XMLElement child) {
enumStr = child.getStringAttribute("ENUM");
displayValue = child.getStringAttribute("DISPLAY");
}
/**
* @param enumChild
*/
public void save(XMLElement enumChild) {
enumChild.setAttribute("ENUM", enumStr);
enumChild.setAttribute("DISPLAY", displayValue);
}
}
ChoiceElement[] possibles;
public void addToPanel(JPanel panel, GridBagLayout l, int y) {
super.addToPanel(panel, l, y);
GridBagConstraints c = new GridBagConstraints();
c.gridx = 1;
c.gridy = y;
c.weightx = 100;
c.weighty = 100;
c.fill = GridBagConstraints.BOTH;
final JComboBox choice = new JComboBox();
int found = -1;
for (int i = 0; i < possibles.length; ++i) {
String itemName = possibles[i].enumStr;
if (possibles[i].displayValue != null)
itemName = possibles[i].displayValue;
choice.addItem(itemName);
if (possibles[i].enumStr.equals(getValue())) {
found = i;
}
}
if (found < 0) {
throw new IllegalArgumentException("Enum " + getValue()
+ " not found in possibles " + possibles);
}
choice.setSelectedIndex(found);
l.setConstraints(choice, c);
panel.add(choice);
choice.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
setValue(possibles[choice.getSelectedIndex()].enumStr);
nodeChanged(getNode());
}
});
}
/**
* @param paramChild
*/
public ChoiceEntity(XMLElement paramChild) {
super(paramChild);
possibles = new ChoiceElement[paramChild.getChildren().size()];
for (int i = 0; i < paramChild.getChildren().size(); ++i) {
XMLElement child = (XMLElement) paramChild.getChildren().get(i);
if (child != null) {
possibles[i] = new ChoiceElement(child);
}
}
}
/*
* (non-Javadoc)
*
* @see
* accessories.plugins.FormularEditor.FormularEntity#save(freemind.main
* .XMLElement)
*/
public void save(XMLElement child) {
super.save(child);
for (int i = 0; i < possibles.length; ++i) {
XMLElement enumChild = new XMLElement();
enumChild.setName("value");
possibles[i].save(enumChild);
child.addChild(enumChild);
}
}
}
private JPanel panel;
private List entities;
/**
*
*/
public FormularEditor() {
super();
entities = new Vector();
}
/*
* (non-Javadoc)
*
* @see
* freemind.extensions.PermanentNodeHook#loadFrom(freemind.main.XMLElement)
*/
public void loadFrom(XMLElement child) {
super.loadFrom(child);
entities.clear();
for (int i = 0; i < child.getChildren().size(); ++i) {
XMLElement paramChild = (XMLElement) child.getChildren().get(i);
if (paramChild != null) {
String type = paramChild.getStringAttribute(XML_FORMULAR_TYPE);
if (type == null)
continue;
if (type.equals("string")) {
entities.add(new StringEntity(paramChild));
} else if (type.equals("enumerator")) {
entities.add(new ChoiceEntity(paramChild));
} else if (type.equals("checkbox")) {
entities.add(new CheckBoxEntity(paramChild));
}
}
}
}
/*
* (non-Javadoc)
*
* @see freemind.extensions.PermanentNodeHook#save(freemind.main.XMLElement)
*/
public void save(XMLElement xml) {
super.save(xml);
for (Iterator i = entities.iterator(); i.hasNext();) {
FormularEntity entity = (FormularEntity) i.next();
XMLElement child = new XMLElement();
child.setName("formular");
entity.save(child);
xml.addChild(child);
}
}
/*
* (non-Javadoc)
*
* @see freemind.extensions.PermanentNodeHook#onDeselectHook()
*/
public void onLostFocusNode(NodeView nodeView) {
super.onLostFocusNode(nodeView);
shutDownDisplay();
}
private void shutDownDisplay() {
if (panel != null) {
// int y =0;
// // remove all display components
// for(Iterator i=entities.iterator(); i.hasNext();) {
// FormularEntity entity = (FormularEntity) i.next();
// entity.removeFromPanel(panel,(GridBagLayout) panel.getLayout(),
// y);
// y++;
// }
// shut down the display:
panel.setVisible(false);
FreeMindMain frame = getController().getFrame();
frame.removeSplitPane();
panel = null;
}
}
/*
* (non-Javadoc)
*
* @see freemind.extensions.PermanentNodeHook#onSelectHook()
*/
public void onFocusNode(NodeView nodeView) {
super.onFocusNode(nodeView);
if (panel == null) {
// panel:
panel = new JPanel(null);
GridBagLayout gridbag = new GridBagLayout();
int y = 0;
for (Iterator i = entities.iterator(); i.hasNext();) {
FormularEntity entity = (FormularEntity) i.next();
entity.addToPanel(panel, gridbag, y);
y++;
}
panel.setLayout(gridbag);
FreeMindMain frame = getController().getFrame();
frame.insertComponentIntoSplitPane(panel);
}
}
/*
* (non-Javadoc)
*
* @see freemind.extensions.MindMapHook#shutdownMapHook()
*/
public void shutdownMapHook() {
shutDownDisplay();
super.shutdownMapHook();
}
}