/******************************************************************************* * Copyright (c) 2005, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.ui.properties; import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants; import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment; import org.eclipse.bpel.common.ui.flatui.FlatFormData; import org.eclipse.bpel.common.ui.flatui.FlatFormLayout; import org.eclipse.bpel.ui.Messages; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.TypedListener; import org.eclipse.ui.forms.widgets.FormToolkit; /** * Collection of widgets for specifying a duration. * * TODO: rewrite this to be independent of serialization format. Move that code elsewhere. */ public class DurationSelector extends Composite { /** The id of the text widget (property) */ static final String ID = "id"; //$NON-NLS-1$ /** The text of the widget, tracked in focus listener */ static final String TEXT = "text"; //$NON-NLS-1$ protected Composite topComposite; protected Composite[] composite; protected Label[] label; protected Text[] text; protected Object lastWidgetChanged; protected static final int YEAR=0, MONTH=1, DAY=2, HOUR=3, MINUTE=4, SECOND=5; protected static final String[] labelStrings = { Messages.DurationSelector_Years_1, Messages.DurationSelector_Months_1, Messages.DurationSelector_Days_2, Messages.DurationSelector_Hours_3, Messages.DurationSelector_Minutes_4, Messages.DurationSelector_Seconds_5 }; // private Label timeSep, timeSep2; // // protected String dateSepText = "/"; // protected String timeSepText = ":"; private FormToolkit wf; public DurationSelector(FormToolkit toolkit, Composite parent, int style) { super(parent, style); this.wf = toolkit; setLayout(new FillLayout()); createControls(this); } private void createControls(Composite parent){ FlatFormData data; topComposite = wf.createComposite(parent); GridLayout gridLayout = new GridLayout(3, true); gridLayout.marginWidth = gridLayout.marginHeight = 0; gridLayout.verticalSpacing = IDetailsAreaConstants.VSPACE; gridLayout.horizontalSpacing = IDetailsAreaConstants.HSPACE; topComposite.setLayout(gridLayout); composite = new Composite[6]; text = new Text[6]; label = new Label[6]; for (int i = 0; i<6; i++) { composite[i] = wf.createComposite(topComposite); composite[i].setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); FlatFormLayout formLayout = new FlatFormLayout(); formLayout.marginWidth = formLayout.marginHeight = 0; composite[i].setLayout(formLayout); // Accessibility: create each Label right before the corresponding Text. label[i] = wf.createLabel(composite[i], labelStrings[i], SWT.CENTER); text[i] = wf.createText(composite[i], "0"); //$NON-NLS-1$ text[i].setData(ID, Integer.valueOf( i )); data = new FlatFormData(); data.left = new FlatFormAttachment(0,0); data.right = new FlatFormAttachment(100,0); data.top = new FlatFormAttachment(0,0); label[i].setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0,0); data.right = new FlatFormAttachment(100,0); data.top = new FlatFormAttachment(label[i], IDetailsAreaConstants.VSPACE); text[i].setLayoutData(data); } // timeSep = wf.createLabel(composite, timeSepText, SWT.CENTER); // timeSep2 = wf.createLabel(composite, timeSepText, SWT.CENTER); addListeners(); layout(true); } private void addListeners() { // TODO: if we use text widgets, we need to support committers. // when spinners are implemented we might still need to support committers.. /** * We use a focus listener to track modifications in the widgets. Only when one * of the text widgets is truly modified we fire up a change event to whoever * is listening on us. */ FocusListener focusListener = new FocusListener() { public void focusGained(FocusEvent e) { Text w = (Text) e.widget; w.setData(TEXT,w.getText().trim()); } public void focusLost(FocusEvent e) { Text w = (Text) e.widget; String cv = w.getText(); String ct = cv.trim(); String ov = (String) w.getData(TEXT); if (isValidValue (ct, (Integer) w.getData(ID) ) == false) { w.setText(ov); return ; } // ignore any spaces around the text if (ct.equals ( cv ) == false ) { w.setText(ct); } // if the trimmed value is different from the original one, then we // do have a change. if (ct.equals(ov) == false) { lastWidgetChanged = w.getData( ID ); selectionChanged(); } } }; for (int i = 0; i<6; i++) { text[i].addFocusListener(focusListener); } } /** * Determines if the value entered is valid for this type of field. * * @param value the value as string. * @param type the type * @return true/false */ boolean isValidValue ( String value, Integer type ) { int n = numberValue(value); if (n < 0) { return false; } switch ( type.intValue()) { case YEAR : return n < 999; case MONTH : return n < 12; case DAY : return n < 31; case HOUR : return n < 24; case MINUTE : case SECOND : return n < 59 ; default : return false; } } protected int numberValue(String s) { int result = 0; try { result = Integer.parseInt(s); } catch (NumberFormatException e) { // do nothing } return result; } /** * Return the values as a 6 element string. * @return the values present in this "editor" */ public int[] getValues() { int[] result = new int[6]; for (int i = 0; i<6; i++) { result[i] = numberValue(text[i].getText()); } return result; } /** * Sets the values of the duration in the editor. * * @param duration * @return true on success */ public boolean setValues(int[] duration) { for (int i = 0; i<6; i++) { text[i].setText(String.valueOf(duration[i])); } return true; } void selectionChanged() { Event e = new Event(); e.type = SWT.Selection; e.widget = this; e.widget.notifyListeners(e.type, e); } /** * @param listener */ public void addSelectionListener (SelectionListener listener ) { TypedListener typedListener = new TypedListener (listener); addListener (SWT.Selection,typedListener); } /** * Return the user context for this editor. This will help restore the editor * to the previous state when activated again. * * @return the user context */ public Object getUserContext() { return lastWidgetChanged; } /** * Restore the user context, restore editor to the last state. * @param userContext */ public void restoreUserContext(Object userContext) { int i = ((Integer)userContext).intValue(); if (i >= 0) { text[i].setFocus(); } } /** * Enable this editor. * * @see org.eclipse.swt.widgets.Control#setEnabled(boolean) */ @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); for (int i = 0; i < text.length; i++) { text[i].setEnabled(enabled); } } }