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.