| /******************************************************************************* |
| * Copyright (c) 2006 Sybase, Inc. 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: |
| * Sybase, Inc. - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.jsf.common.ui.internal.dialogfield; |
| |
| import java.util.Map; |
| import java.util.TreeMap; |
| import java.util.Map.Entry; |
| |
| import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.DisposeEvent; |
| import org.eclipse.swt.events.DisposeListener; |
| import org.eclipse.swt.events.FocusAdapter; |
| import org.eclipse.swt.events.FocusEvent; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.PaintEvent; |
| import org.eclipse.swt.events.PaintListener; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.graphics.GC; |
| import org.eclipse.swt.graphics.Rectangle; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.forms.FormColors; |
| import org.eclipse.ui.forms.widgets.FormToolkit; |
| |
| /** |
| * A dialog field for style combos |
| * |
| */ |
| public class StyleComboDialogField extends DialogFieldBase implements |
| ISupportTextValue { |
| final static private int WIDTH_HINT = 10; |
| |
| private String _text; |
| |
| private int _selectionIndex; |
| |
| private String[] _items; |
| |
| private StyleCombo _comboControl; |
| |
| private ModifyListener _modifyListener; |
| |
| private int _flags; |
| |
| private boolean _pending = false; |
| |
| private Map _entryMap; |
| |
| private String _defaultValue; |
| |
| |
| /** |
| * @param defaultValue |
| */ |
| public void setDefaultValue(String defaultValue) { |
| this._defaultValue = defaultValue; |
| if (_comboControl != null && ! _comboControl.isDisposed()) |
| _comboControl.setDefaultValue(_defaultValue); |
| } |
| |
| /** |
| * @param flags |
| */ |
| public StyleComboDialogField(int flags) { |
| super(); |
| _text = ""; //$NON-NLS-1$ |
| _items = new String[0]; |
| _flags = flags; |
| _selectionIndex = -1; |
| } |
| |
| // ------- layout helpers |
| |
| |
| /* |
| * @see DialogField#doFillIntoGrid |
| */ |
| public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent, |
| int nColumns) { |
| assertEnoughColumns(nColumns); |
| |
| Control requiredLabel = getRequiredLabelControl(toolkit, parent); |
| requiredLabel.setLayoutData(gridDataForLabel(1)); |
| |
| Control label = getLabelControl(toolkit, parent); |
| label.setLayoutData(gridDataForLabel(1)); |
| |
| StyleCombo combo = getComboControl(toolkit, parent); |
| combo.setLayoutData(gridDataForCombo(nColumns - 2)); |
| |
| return new Control[] { requiredLabel, label, combo }; |
| } |
| |
| /* |
| * @see DialogField#getNumberOfControls |
| */ |
| public int getNumberOfControls() { |
| return 3; |
| } |
| |
| /** |
| * @param span |
| * @return the grid data for the combo |
| */ |
| protected static GridData gridDataForCombo(int span) { |
| GridData gd = new GridData(); |
| gd.horizontalAlignment = GridData.FILL; |
| gd.grabExcessHorizontalSpace = false; |
| gd.horizontalSpan = span; |
| gd.widthHint = WIDTH_HINT; |
| return gd; |
| } |
| |
| // ------- focus methods |
| |
| /* |
| * @see DialogField#setFocus |
| */ |
| public boolean setFocus() { |
| if (isOkToUse(_comboControl)) { |
| _comboControl.setFocus(); |
| } |
| return true; |
| } |
| |
| // ------- ui creation |
| |
| /** |
| * Creates or returns the created combo control. |
| * @param toolkit |
| * |
| * @param parent |
| * The parent composite or <code>null</code> when the widget |
| * has already been created. |
| * @return the combo control |
| */ |
| public StyleCombo getComboControl(FormToolkit toolkit, |
| final Composite parent) { |
| if (_comboControl == null || _comboControl.isDisposed()) { |
| assertCompositeNotNull(parent); |
| _modifyListener = new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| doModifyText(e); |
| } |
| }; |
| SelectionListener selectionListener = new SelectionListener() { |
| public void widgetSelected(SelectionEvent e) { |
| doSelectionChanged(e); |
| } |
| |
| public void widgetDefaultSelected(SelectionEvent e) { |
| handleDefaultSelection(e); |
| } |
| }; |
| |
| if (toolkit != null) { |
| _comboControl = new StyleCombo(parent, _flags); |
| final FormColors colors = new FormColors(parent.getDisplay()); |
| parent.addPaintListener(new PaintListener() { |
| |
| public void paintControl(PaintEvent event) { |
| Composite composite = (Composite) event.widget; |
| Control[] children = composite.getChildren(); |
| for (int i = 0; i < children.length; i++) { |
| Control c = children[i]; |
| if (!(c instanceof StyleCombo) || !c.isVisible()) { |
| continue; |
| } |
| Rectangle b = c.getBounds(); |
| GC gc = event.gc; |
| gc.setForeground(colors.getBorderColor()); |
| gc.drawRectangle(b.x - 1, b.y - 1, b.width + 1, |
| b.height + 1); |
| } |
| } |
| }); |
| |
| // when the parent is disposed, the colors should no |
| // no longer be needed. |
| parent.addDisposeListener(new DisposeListener() |
| { |
| public void widgetDisposed(DisposeEvent e) { |
| colors.dispose(); |
| } |
| } |
| ); |
| toolkit.adapt(_comboControl); |
| } else { |
| _comboControl = new StyleCombo(parent, _flags | SWT.BORDER); |
| _comboControl.setBackground(Display.getCurrent() |
| .getSystemColor(SWT.COLOR_LIST_BACKGROUND)); |
| } |
| |
| // moved up due to 1GEUNW2 |
| _comboControl.setItems(_items); |
| _comboControl.setDefaultValue(_defaultValue); |
| if (_selectionIndex != -1) { |
| _comboControl.select(_selectionIndex); |
| } else { |
| _comboControl.setText(_text); |
| } |
| _comboControl.setFont(parent.getFont()); |
| _comboControl.addModifyListener(_modifyListener); |
| _comboControl.addSelectionListener(selectionListener); |
| _comboControl.addFocusListener(new FocusAdapter() { |
| public void focusLost(FocusEvent e) { |
| doFocusLost(e); |
| } |
| }); |
| _comboControl.setEnabled(isEnabled()); |
| _comboControl.setToolTipText(getToolTip()); |
| } |
| return _comboControl; |
| } |
| |
| /** |
| * @param e |
| */ |
| protected void handleDefaultSelection(SelectionEvent e) { |
| // commit value |
| if (_pending) { |
| _pending = false; |
| dialogFieldApplied(); |
| } |
| } |
| |
| /** |
| * @param e |
| */ |
| protected void doFocusLost(FocusEvent e) { |
| if (_pending) { |
| _pending = false; |
| dialogFieldApplied(); |
| } |
| } |
| |
| private void doModifyText(ModifyEvent e) { |
| if (isOkToUse(_comboControl)) { |
| _text = getEntryKey(_comboControl.getText()); |
| _selectionIndex = _comboControl.getSelectionIndex(); |
| } |
| _pending = true; |
| dialogFieldChanged(); |
| } |
| |
| private void doSelectionChanged(SelectionEvent e) { |
| if (isOkToUse(_comboControl)) { |
| _items = _comboControl.getItems(); |
| _text = getEntryKey(_comboControl.getText()); |
| _selectionIndex = _comboControl.getSelectionIndex(); |
| } |
| _pending = false; |
| dialogFieldChangedAndApplied(); |
| } |
| |
| // ------ enable / disable management |
| |
| /* |
| * @see DialogField#updateEnableState |
| */ |
| protected void updateEnableState() { |
| super.updateEnableState(); |
| if (isOkToUse(_comboControl)) { |
| _comboControl.setEnabled(isEnabled()); |
| } |
| } |
| |
| // ------ text access |
| |
| /** |
| * Sets the combo items. Triggers a dialog-changed event. |
| * @param items |
| */ |
| public void setItems(String[] items) { |
| _items = items; |
| if (isOkToUse(_comboControl)) { |
| _comboControl.setItems(items); |
| } |
| _pending = false; |
| // dialogFieldChangedAndApplied(); |
| } |
| |
| /** |
| * @param map |
| */ |
| public void setEntryMap(Map map) { |
| this._entryMap = map; |
| if (_entryMap == null) { |
| _entryMap = new TreeMap(); |
| } |
| Entry[] entries = (Entry[]) _entryMap.entrySet().toArray(new Entry[0]); |
| String[] items = new String[entries.length]; |
| for (int i = 0; i < entries.length; i++) { |
| items[i] = entries[i].getValue().toString(); |
| } |
| setItems(items); |
| } |
| |
| /** |
| * Gets the text. |
| */ |
| public String getText() { |
| return _text; |
| } |
| |
| /** |
| * Sets the text. Triggers a dialog-changed event. |
| */ |
| public void setText(String text) { |
| setTextWithoutUpdate(text); |
| _pending = false; |
| dialogFieldChangedAndApplied(); |
| } |
| |
| /** |
| * Selects an item. |
| * @param index |
| */ |
| public void selectItem(int index) { |
| if (isOkToUse(_comboControl)) { |
| _comboControl.select(index); |
| } else { |
| if (index >= 0 && index < _items.length) { |
| _text = getEntryKey(_items[index]); |
| _selectionIndex = index; |
| } |
| } |
| dialogFieldChangedAndApplied(); |
| } |
| |
| /** |
| * @return the selection index |
| */ |
| public int getSelectionIndex() { |
| return _selectionIndex; |
| } |
| |
| /** |
| * Sets the text without triggering a dialog-changed event. |
| */ |
| public void setTextWithoutUpdate(String text) { |
| _pending = false; |
| if (text == null) { |
| text = "";//$NON-NLS-1$ |
| } |
| _text = text; |
| if (isOkToUse(_comboControl)) { |
| _comboControl.removeModifyListener(_modifyListener); |
| _comboControl.setText(getEntryValue(text)); |
| _comboControl.addModifyListener(_modifyListener); |
| } |
| } |
| |
| private String getEntryValue(String key) { |
| if (_entryMap == null || !_entryMap.containsKey(key)) { |
| return key; |
| } |
| return _entryMap.get(key).toString(); |
| } |
| |
| private String getEntryKey(String value) { |
| if (_entryMap == null || !_entryMap.containsValue(value)) { |
| return value; |
| } |
| |
| Entry[] entries = (Entry[]) _entryMap.entrySet().toArray(new Entry[0]); |
| for (int i = 0; i < entries.length; i++) { |
| if (entries[i].getValue() == value |
| || (value != null && value.equals(entries[i].getValue()))) { |
| return entries[i].getKey().toString(); |
| } |
| } |
| return value; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal() |
| */ |
| public void handleGrabHorizontal() { |
| LayoutUtil.setGrabHorizontal(_comboControl, true); |
| } |
| } |