blob: d42c29b1a765275d37758fdda29eadb7c24f4e5b [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2002, 2005 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.gmf.runtime.common.ui.preferences;
import java.util.ArrayList;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
/**
* Constructs a field editor with a label and a drop down combo box.
*
* @author Wayne Diu, wdiu
*/
public class ComboFieldEditor
extends FieldEditor {
/**
* Whether the label and combo should be on separate lines
*/
protected boolean separateLine = false;
/**
* Whether you can type into the combo box
*/
protected boolean readOnly = false;
/**
* Indent of controls
*/
protected int indent = 0;
/**
* Width of combo box.
*/
protected int width = 0;
/**
* The combo box control.
*/
protected Combo combo = null;
/*
* static final types for determining how preferences are saved.
*/
/** STRING_TYPE saves the actual string. */
public static final int STRING_TYPE = 0;
/** INT_TYPE saves the index. */
public static final int INT_TYPE = 1;
/** INT_TYPE_INDEXED saves an associated value for the index value */
public static final int INT_TYPE_INDEXED = 2;
/**
* The type that was chosen for saving preferences
*/
protected int type;
/**
* Index of list contains value of preference to store
*/
protected ArrayList indexToValue = new ArrayList();
/**
* True for automatically loading and storing and false for manual loading
* and storing of values in the combo box.
*/
public boolean autoStorage = true;
/**
* Constructor to create the combo field editor
*
* @param name
* String containing unique name of field editor
* @param labelText
* String containing text to display
* @param parent
* Composite the parent composite that contains this field editor
*/
public ComboFieldEditor(String name, String labelText, Composite parent) {
this(name, labelText, parent, 0, false, STRING_TYPE, 0, false);
}
/**
* Constructor to create the combo field editor
*
* @param name
* String containing unique name of field editor
* @param labelText
* String containing text to display
* @param parent
* Composite the parent composite that contains this field editor
* @param aType
* int, either INT_TYPE or STRING_TYPE which describes the way
* that we will be saving preferences. INT_TYPE will save
* according to the index and STRING_TYPE will save the actual
* string.
* @param aSeparateLine
* boolean. Set to true to make labelText and the combo appear on
* separate lines. Set to false to make labelText appear to the
* left of the combo box.
* @param anIndent
* How much to indent on the left side.
* @param aWidth
* is the width of the combo.
* @param aReadOnly
* true to be read only, false to be read write
*/
public ComboFieldEditor(String name, String labelText, Composite parent,
int aType, boolean aSeparateLine, int anIndent, int aWidth,
boolean aReadOnly) {
this.separateLine = aSeparateLine;
this.indent = anIndent;
this.width = aWidth;
this.readOnly = aReadOnly;
this.type = aType;
init(name, labelText);
createControl(parent);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#adjustForNumColumns(int)
*/
protected void adjustForNumColumns(int numColumns) {
/* empty method body */
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#doFillIntoGrid(org.eclipse.swt.widgets.Composite,
* int)
*/
protected void doFillIntoGrid(Composite parent, int numColumns) {
GridData labelGridData = new GridData();
getLabelControl(parent).setLayoutData(labelGridData);
labelGridData.horizontalIndent = indent;
getLabelControl(parent);
GridData gd = new GridData();
//We don't need to decrease the number of columns when
//it's going on a separate line.
if (separateLine) {
gd.horizontalSpan = numColumns;
} else {
gd.horizontalSpan = numColumns - 1;
}
//Width is affected only if it was specified and
//not zero
if (width == 0) {
gd.horizontalAlignment = GridData.FILL;
gd.grabExcessHorizontalSpace = true;
} else {
gd.widthHint = width;
}
//we must indent only if it's a separate line
if (separateLine) {
gd.horizontalIndent = indent;
}
int flags = SWT.CLIP_CHILDREN | SWT.CLIP_SIBLINGS | SWT.DROP_DOWN;
if (readOnly) {
flags = flags | SWT.READ_ONLY;
}
combo = new Combo(parent, flags);
combo.setLayoutData(gd);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#doLoad()
*/
protected void doLoad() {
if (!autoStorage)
return;
if (combo != null) {
if (type == STRING_TYPE) {
combo.setText(getPreferenceStore().getString(
getPreferenceName()));
} else if (type == INT_TYPE) {
combo.select(getPreferenceStore().getInt(getPreferenceName()));
} else if (type == INT_TYPE_INDEXED) {
int storeValue = getPreferenceStore().getInt(
getPreferenceName());
int index = indexToValue.indexOf(Integer.valueOf(storeValue));
combo.select(index);
}
//else, we have a problem because the
//type is not recognized and assert didn't catch it!
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#doLoadDefault()
*/
protected void doLoadDefault() {
if (!autoStorage)
return;
if (combo != null) {
if (type == STRING_TYPE) {
combo.setText(getPreferenceStore().getDefaultString(
getPreferenceName()));
} else if (type == INT_TYPE) {
combo.select(getPreferenceStore().getDefaultInt(
getPreferenceName()));
} else if (type == INT_TYPE_INDEXED) {
int storeValue = getPreferenceStore().getDefaultInt(
getPreferenceName());
int index = indexToValue.indexOf(Integer.valueOf(storeValue));
combo.select(index);
}
//else, we have a problem because the
//type is not recognized
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#doStore()
*/
protected void doStore() {
if (!autoStorage)
return;
//otherwise, make sure either save as string or int
if (type == STRING_TYPE) {
getPreferenceStore().setValue(getPreferenceName(), combo.getText());
} else if (type == INT_TYPE) {
getPreferenceStore().setValue(getPreferenceName(),
combo.getSelectionIndex());
} else if (type == INT_TYPE_INDEXED) {
//get the value we want to save, for the selected
//index
Integer storeValue = (Integer) indexToValue.get(combo
.getSelectionIndex());
getPreferenceStore().setValue(getPreferenceName(),
storeValue.intValue());
}
}
/**
* Returns this field editor's current value.
*
* @return the value of the combo box as a String
*/
public String getStringValue() {
return combo.getText();
}
/**
* Returns the number of controls in this editor
*
* @return int 2 since there's the combo and the label
*/
public int getNumberOfControls() {
return 2;
}
/**
* Returns the actual combo box contained in the field editor.
*
* @return combo which is the actual combo box.
*/
public Combo getComboControl() {
return combo;
}
/**
* Returns whether or not the given string is already in the combo box. You
* could call this method to check to see if the string is already there
* before inserting if you do not want duplicates.
*
* @param value
* the String to check
* @return boolean true if it exists, false if it doesn't
*/
public boolean existsInCombo(String value) {
//make sure it's not already in there.
for (int i = 0; i < combo.getItemCount(); i++) {
//get out of function since not going to
//add something that's already there
if (combo.getItem(i).compareToIgnoreCase(value) == 0)
return true;
}
return false;
}
/**
* Sets the automatic loading and storing of contents for the combo box.
* Default is true.
*
* @param anAutoStorage
* true for automatically loading and storing and false for
* manual loading and storing
*/
public void setAutoStorage(boolean anAutoStorage) {
this.autoStorage = anAutoStorage;
}
/**
* Adds an item to the combo. Also stores the value to be saved to the
* preference store when the index is the selection. (As opposed to saving
* the index value.)
*
* @param stringValue
* String value of the item
* @param storeValue
* int value of the item
*/
public void addIndexedItemToCombo(String stringValue, int storeValue) {
assert type == INT_TYPE_INDEXED : "type is not equal to INT_TYPE_INDEXED"; //$NON-NLS-1$
combo.add(stringValue);
indexToValue.add(Integer.valueOf(storeValue));
}
}