package org.eclipse.stem.ui.grapheditor;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;

public class DynamicText extends Text implements ModifyListener {

	public DynamicText(Composite parent, boolean editable) {
		super(parent, SWT.NONE);
		addModifyListener(this);
		setEditable(editable);
		setBackground(ColorConstants.white);
	}

	@Override
	public Point computeSize(int wHint, int hHint, boolean changed) {
		Point size = super.computeSize(wHint, hHint, changed);

		if (getEditable()) {
			return new Point(size.x + 10, size.y);
		} else {
			return size;
		}
	}

	@Override
	protected void checkSubclass() {
	}

	@Override
	public void modifyText(ModifyEvent e) {
		getParent().layout(true);		
	}

}
