blob: 247f6be06dbcde7e24c32462a698717ebdc83f14 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}
}