package jas2.plot;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
public class EditableLabel extends JComponent implements JASPlotMouseListener, HasPopupItems
{
public EditableLabel(final String text, final String prefix, final int align)
{
sourceText = text;
this.prefix = prefix;
converter = new LabelTextConverter();
setLayout(new BorderLayout());
label = new JLabel(converter.convert(text), align);
label.setVerticalAlignment(JLabel.TOP);
label.setForeground(getForeground());
add(label,BorderLayout.CENTER);
}
public EditableLabel(final String text, final String prefix)
{
this(text,prefix,JLabel.CENTER);
}
public void addActionListener(ActionListener al)
{
if (listener == null) listener = new Vector();
listener.addElement(al);
}
public void removeActionListener(ActionListener al)
{
listener.removeElement(al);
}
protected void fireActionPerformed()
{
if (listener != null)
{
ActionEvent event = new ActionEvent(this,ActionEvent.ACTION_FIRST,null);
Enumeration e = listener.elements();
while (e.hasMoreElements())
{
((ActionListener) e.nextElement()).actionPerformed(event);
}
}
}
void edit()
{
textField = new JTextField(sourceText);
textField.setFont(getFont());
textField.setBorder(null);
textField.setHorizontalAlignment(label.getHorizontalAlignment());
textField.addActionListener(new ActionListener()
{
public void actionPerformed(final ActionEvent a)
{
finishTextEdit();
}
});
textField.addFocusListener(new FocusAdapter()
{
public void focusLost(final FocusEvent fe)
{
finishTextEdit();
}
});
remove(label);
add(textField,BorderLayout.CENTER);
textField.requestFocus();
revalidate();
textField.getCaret().setVisible(true);
}
public void mouseEventNotify(final MouseEvent me)
{
if (me.getID() == MouseEvent.MOUSE_CLICKED && textField == null && me.getClickCount() == 2)
{
edit();
}
}
private void finishTextEdit()
{
if (textField != null)
{
JTextField text = textField;
textField = null; // protect against recursive call
setText(text.getText());
remove(text);
add(label,BorderLayout.CENTER);
fireActionPerformed();
revalidate();
repaint();
}
}
public void addNotify()
{
super.addNotify();
label.setFont(getFont());
}
public void setFont(final Font f)
{
super.setFont(f);
label.setFont(f);
label.revalidate();
}
public String getText()
{
return label.getText();
}
public void setText(final String text)
{
sourceText = text;
label.setText(converter.convert(text));
}
public void modifyPopupMenu(final JPopupMenu menu, final Component source)
{
if (menu.getComponentCount() > 0) menu.addSeparator();
JMenuItem editMenuItem = new JMenuItem("Edit "+prefix+" Text")
{
final protected void fireActionPerformed(final ActionEvent e)
{
edit();
}
};
if (showFontMenuItem) menu.add(new FontMenuItem(this,prefix));
menu.add(editMenuItem);
}
public boolean isShowFontMenuItem()
{
return showFontMenuItem;
}
public void setShowFontMenuItem(boolean show)
{
showFontMenuItem = show;
}
public void paint(Graphics g) {
if ( g instanceof Graphics2D && isRotated) {
Graphics2D g2d = ((Graphics2D)g);
// AffineTransform at = new AffineTransform();
// at.setToRotation(-Math.PI/2.);
// g2d.transform(at);
g2d.rotate(-Math.PI/2.);
g2d.translate(-getHeight(),0);
// g2d.translate(-getPreferredSize().getWidth(), -getPreferredSize().getHeight()*3);
}
super.paint(g);
}
public void setRotated(boolean isRotated) {
this.isRotated = isRotated;
}
public boolean isRotated() {
return isRotated;
}
private Vector listener;
private boolean showFontMenuItem = true;
private final LabelTextConverter converter;
private String sourceText;
private JLabel label;
private JTextField textField;
private String prefix;
private boolean isRotated = false;
}
Ads help maintain this website.