/*******************************************************************************
* Copyright (c) 2007, 2009 Symbian Software Limited 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:
* Bala Torati (Symbian) - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.templateengine.uitree.uiwidgets;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import com.ibm.icu.text.MessageFormat;
import org.eclipse.cdt.ui.templateengine.Messages;
import org.eclipse.cdt.ui.templateengine.event.PatternEvent;
import org.eclipse.cdt.ui.templateengine.uitree.InputUIElement;
import org.eclipse.cdt.ui.templateengine.uitree.UIAttributes;
import org.eclipse.cdt.ui.templateengine.uitree.UIElement;
/**
* This gives a Label and Combo widget.
*/
public class UISelectWidget extends InputUIElement {
protected Label label;
protected Combo combo;
/**
* Mapping from values stored by this combo, to their associated names in UI
*/
protected Map<String, String> value2name;
/**
* The default name to select
*/
protected String defaultValue;
/**
* The currently selected name. May be null.
*/
protected String currentValue;
/**
* Constructor for Select Widget.
*
* @param attribute
* attribute associated with this widget.
*/
public UISelectWidget(UIAttributes attribute, Map<String, String> value2name, String defaultValue) {
super(attribute);
this.value2name= value2name;
this.defaultValue= defaultValue;
}
/*
* @see org.eclipse.cdt.ui.templateengine.uitree.UIElement#getValues()
*/
@Override
public Map<String, String> getValues() {
Map<String, String> values = new HashMap<String, String>();
if(currentValue != null) {
values.put(uiAttributes.get(InputUIElement.ID), currentValue);
}
return values;
}
/*
* @see org.eclipse.cdt.ui.templateengine.uitree.UIElement#setValues(java.util.Map)
*/
@Override
public void setValues(Map<String, String> valueMap) {
defaultValue= valueMap.get(uiAttributes.get(InputUIElement.ID));
if (combo != null) {
String[] items= combo.getItems();
for (int i=0; i < items.length; i++) {
if (items[i].equals(defaultValue)) {
combo.select(i);
break;
}
}
}
}
/*
* @see org.eclipse.cdt.ui.templateengine.uitree.UIElement#createWidgets(org.eclipse.cdt.ui.templateengine.uitree.uiwidgets.UIComposite)
*/
@Override
public void createWidgets(final UIComposite uiComposite) {
label= new Label(uiComposite, SWT.LEFT);
label.setText(uiAttributes.get(InputUIElement.WIDGETLABEL));
Composite comboComposite = new Composite(uiComposite, SWT.NONE);
comboComposite.setLayout(GridLayoutFactory.swtDefaults().create());
comboComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
combo= new Combo(comboComposite, SWT.DROP_DOWN | SWT.READ_ONLY);
combo.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
combo.setData(".uid", uiAttributes.get(UIElement.ID)); //$NON-NLS-1$
// populate combo
int index= 0, defaultIndex= 0;
for(String value : value2name.keySet()) {
combo.add(value2name.get(value));
if(value.equals(defaultValue)) {
defaultIndex= index;
}
index++;
}
combo.select(defaultIndex);
combo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
currentValue= getValue(combo.getItem(combo.getSelectionIndex()));
uiComposite.firePatternEvent(createPatternEvent());
}
});
uiComposite.firePatternEvent(createPatternEvent());
}
private PatternEvent createPatternEvent() {
String msg= MessageFormat.format(Messages.getString("UISelectWidget_ErrorNoneSelected0"), new String[] {label.getText()}); //$NON-NLS-1$
return new PatternEvent(this, msg, isValid());
}
/**
* @return whether this widget has been set to a valid state. For this
* widget type that means whether the user has selected a non-empty string name.
*/
@Override
public boolean isValid() {
boolean retVal = true;
if(Boolean.parseBoolean(uiAttributes.get(InputUIElement.MANDATORY))
&& ! InputUIElement.SELECTTYPE.equals(uiAttributes.get(InputUIElement.TYPE)) ) {
retVal= currentValue!= null && currentValue.trim().length()>0;
}
return retVal;
}
private String getValue(String name) {
for(String value : value2name.keySet()) {
if(value2name.get(value).equals(name)) {
return value;
}
}
throw new IllegalStateException();
}
/*
* @see org.eclipse.cdt.ui.templateengine.uitree.UIElement#disposeWidget()
*/
@Override
public void disposeWidget() {
label.dispose();
combo.dispose();
}
}