package org.jbpm.gd.common.properties; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; import org.jbpm.gd.common.model.NamedElement; public class NamedElementConfigurationComposite implements FocusListener, PropertyChangeListener { public static NamedElementConfigurationComposite create(TabbedPropertySheetWidgetFactory widgetFactory, Composite parent) { NamedElementConfigurationComposite result = new NamedElementConfigurationComposite(); result.widgetFactory = widgetFactory; result.parent = parent; result.create(); return result; } private TabbedPropertySheetWidgetFactory widgetFactory; private Composite parent; private Label nameLabel; private Text nameText; private NamedElement namedElement; private NamedElementConfigurationComposite() {} public void setNamedElement(NamedElement namedElement) { if (this.namedElement == namedElement) return; unhookListeners(); clearControls(); this.namedElement = namedElement; updateControls(); hookListeners(); } private void hookListeners() { nameText.addFocusListener(this); if (namedElement != null) { namedElement.addPropertyChangeListener(this); } } private void unhookListeners() { nameText.removeFocusListener(this); if (namedElement != null) { namedElement.removePropertyChangeListener(this); } } private void clearControls() { if (!nameText.isDisposed()) { nameText.setText(""); } } private void updateControls() { if (namedElement != null && !nameText.isDisposed()) { String name = namedElement.getName(); nameText.setText(name == null ? "" : name); } } private void create() { nameLabel = widgetFactory.createLabel(parent, "Name"); nameText = widgetFactory.createText(parent, ""); nameLabel.setLayoutData(createNameLabelLayoutData()); nameText.setLayoutData(createNameTextLayoutData()); } private FormData createNameTextLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(0, 85); data.top = new FormAttachment(0, 0); data.right = new FormAttachment(100, 0); return data; } private FormData createNameLabelLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(0, 0); data.top = new FormAttachment(0, 2); return data; } private String getNameText() { String text = nameText.getText().trim(); if ("".equals(text) && !namedElement.isNameMandatory()) { text = null; } return text; } public void focusGained(FocusEvent e) { } public void focusLost(FocusEvent e) { if (e.widget == nameText) { namedElement.setName(getNameText()); } } public void propertyChange(PropertyChangeEvent evt) { if ("name".equals(evt.getPropertyName()) && !nameText.isDisposed()) { nameText.setText(evt.getNewValue() != null ? (String)evt.getNewValue() : ""); } } }