/*
* Copyright 2004-2010 Information & Software Engineering Group (188/1)
* Institute of Software Technology and Interactive Systems
* Vienna University of Technology, Austria
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.ifs.tuwien.ac.at/dm/somtoolbox/license.html
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package at.tuwien.ifs.somtoolbox.apps.viewer.handlers;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.util.Hashtable;
import java.util.ListIterator;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import edu.umd.cs.piccolo.PNode;
import edu.umd.cs.piccolo.event.PBasicInputEventHandler;
import edu.umd.cs.piccolo.event.PInputEvent;
import edu.umd.cs.piccolo.nodes.PText;
import at.tuwien.ifs.somtoolbox.apps.viewer.controls.LabelEditColorChooser;
/**
* Event Listerner for double clicks on cluster- and manual labels. Contains also the dialoge for editing the label.
*
* @author Angela Roiger
* @version $Id: EditLabelEventListener.java 3877 2010-11-02 15:43:17Z frank $
*/
public class EditLabelEventListener extends PBasicInputEventHandler {
PText text;
JDialog editDialog = null;
TextArea newText;
JButton hideButton;
@Override
public void mouseClicked(PInputEvent event) {
PNode n = event.getInputManager().getMouseOver().getPickedNode();
if (event.getClickCount() == 2 && PText.class.isInstance(n)) {
// System.out.println("click");
if (editDialog != null) {
editDialog.setVisible(false);
editDialog = null;
}
text = (PText) n;
editDialog = new JDialog();
GridBagConstraints c = new GridBagConstraints();
editDialog.setSize(300, 300);
editDialog.setTitle("Edit Label");
editDialog.getContentPane().setLayout(new GridLayout(2, 1));
JPanel editText = new JPanel();
editText.add(new JLabel("Edit Text"));
// newText = new TextField(text.getText(),20);
newText = new TextArea(text.getText(), 4, 20);
newText.addTextListener(new TextListener() {
@Override
public void textValueChanged(TextEvent e) {
text.setText(newText.getText());
text.repaint();
}
});
editText.add(newText);
if (text.getVisible() == true) {
hideButton = new JButton("hide label");
} else {
hideButton = new JButton("show label");
}
hideButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (text.getVisible() == true) {
text.setVisible(false);
hideButton.setText("show Label");
} else {
text.setVisible(true);
hideButton.setText("hide Label");
}
}
});
editText.add(hideButton);
JButton deleteButton = new JButton("Delete");
deleteButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final PNode parent = text.getParent();
parent.removeChild(text);
editDialog.setVisible(false);
text = null;
}
});
editText.add(deleteButton);
editDialog.getContentPane().add(editText, c);
Container general = new Container();
general.setLayout(new GridLayout(3, 1));
JPanel size = new JPanel();
JSpinner spinner = new JSpinner(new SpinnerNumberModel(text.getFont().getSize(), 0, Integer.MAX_VALUE, 1));
spinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int newSize = ((Integer) ((JSpinner) e.getSource()).getValue()).intValue();
try {
text.setFont(new Font(text.getFont().getFontName(), text.getFont().getStyle(), newSize));
text.repaint();
} catch (java.lang.Exception ex) {
JOptionPane.showMessageDialog(null, ex);
}
}
});
size.add(new JLabel("Font Size:"));
size.add(spinner);
// change color...
JButton colorButton = new JButton("Color");
colorButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent a) {
new LabelEditColorChooser(editDialog, text);
}
});
size.add(colorButton);
general.add(size, c);
int start = new Double(text.getParent().getRotation() / (2 * Math.PI) * 360).intValue();
JSlider rot = new JSlider(0, 360, start);
Hashtable<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>();
labelTable.put(new Integer(0), new JLabel("0"));
labelTable.put(new Integer(90), new JLabel("90"));
labelTable.put(new Integer(180), new JLabel("180"));
labelTable.put(new Integer(270), new JLabel("270"));
labelTable.put(new Integer(360), new JLabel("360"));
rot.setLabelTable(labelTable);
rot.setPaintLabels(true);
rot.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int degree = ((JSlider) e.getSource()).getValue();
double d = new Double(degree).doubleValue() / 360 * 2 * Math.PI;
text.getParent().setRotation(d);
text.repaint();
}
});
JPanel rotate = new JPanel();
rotate.add(new JLabel("Rotate by"));
rotate.add(rot);
general.add(rotate);
JButton okButton = new JButton("OK");
okButton.setMnemonic('o');
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent a) {
PNode parent = text.getParent();
double yOffset = 0d;
// move labels up/down if size of other labels changed:
for (ListIterator<?> l = parent.getChildrenIterator(); l.hasNext();) {
PText currentLabel = (PText) l.next();
if (new String("clusterLabel").equals(currentLabel.getAttribute("type"))) {
yOffset = yOffset + currentLabel.getYOffset() + currentLabel.getHeight();
} else if (new String("smallClusterLabel").equals(currentLabel.getAttribute("type"))) {
currentLabel.setOffset(currentLabel.getXOffset(), yOffset);
yOffset = yOffset + currentLabel.getHeight();
}
currentLabel.repaint();
}
editDialog.setVisible(false);
editDialog = null;
// editDialog.dispose();
}
});
general.add(okButton);
editDialog.getContentPane().add(general);
editDialog.setModal(false);
editDialog.setVisible(true);
}
}
}