/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.attribute.editor; import java.util.Properties; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.Assert; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.jboss.tools.common.meta.action.SpecialWizard; import org.jboss.tools.common.model.ui.widgets.IWidgetSettings; public class MutableComboBoxFieldEditor extends ComboBoxFieldEditor implements IMutableFieldEditor { private Button changeButton; private String changeButtonText = "New..."; private Composite composite; private SpecialWizard change; public MutableComboBoxFieldEditor() { } public MutableComboBoxFieldEditor(IWidgetSettings settings) { super(settings); } public void setChange(SpecialWizard change) { this.change = change; } protected void adjustForNumColumns(int numColumns) { GridData gd = (GridData)getComboField().getLayoutData(); gd.horizontalSpan = numColumns - 2; // We only grab excess space if we have to // If another field editor has more columns then // we assume it is setting the width. gd.grabExcessHorizontalSpace = gd.horizontalSpan == 1; } protected void doFillIntoGrid(Composite parent, int numColumns) { getLabelComposite(parent); Control control = getTextChangeControl(parent); control.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); } protected Composite getTextChangeControl(Composite parent) { //if (composite == null) createTextChangeControl(parent); return composite; } protected Control createTextChangeControl(Composite parent) { GridData gd; Control control; if(composite == null) composite = new Composite(parent, SWT.NONE); composite.setBackground(parent.getBackground()); GridLayout gridLayout = new GridLayout(3, false); gridLayout.marginHeight = 0; gridLayout.marginWidth = 0; gridLayout.horizontalSpacing = 0; gridLayout.verticalSpacing = 0; composite.setLayout(gridLayout); Control textControl = getComboControl(composite); gd = new GridData(GridData.FILL_HORIZONTAL); textControl.setLayoutData(gd); control = new Label(composite, SWT.NONE); control.setBackground(parent.getBackground()); gd = new GridData(); gd.widthHint = 5; control.setLayoutData(gd); control = getChangeControl(composite); gd = new GridData(); gd.widthHint = convertHorizontalDLUsToPixels(control, IDialogConstants.BUTTON_WIDTH); gd.heightHint = textControl.computeSize(SWT.DEFAULT, SWT.DEFAULT).y; control.setLayoutData(gd); /* // init data if (valueProvider!=null) { String value = valueProvider.getStringValue(Boolean.TRUE.booleanValue()); getTextField().setText(value); if (getLabelAction()!=null) { getLabelAction().setEnabled((value!=null && value.length()>0)); } } */ return composite; } protected Button getChangeControl(Composite parent) { if (changeButton == null) { int style = getSettings().getStyle("Button.Style"); //$NON-NLS-1$ if (style==SWT.DEFAULT) style = SWT.NONE; if (style==0) style = SWT.PUSH; Color bg = getSettings().getColor("Button.Background"); //$NON-NLS-1$ Color fg = getSettings().getColor("Button.Foreground"); //$NON-NLS-1$ Font font = getSettings().getFont("Button.Font"); //$NON-NLS-1$ changeButton = new Button(parent, style); changeButton.setFont(font); changeButton.setBackground(bg); changeButton.setBackground(bg); changeButton.setForeground(fg); //changeButton = new Button(parent, SWT.PUSH); if (changeButtonText == null) changeButtonText = JFaceResources.getString("openChange");//$NON-NLS-1$ changeButton.setText(changeButtonText); changeButton.setFont(parent.getFont()); changeButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { String newValue = changePressed(); setNewValue(newValue); } }); changeButton.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent event) { changeButton = null; } }); } else { checkParent(changeButton, parent); } return changeButton; } public void setNewValue(String newValue) { if (newValue != null) { getComboField().setItems(getTags()); setStringValue(newValue); } } public int getNumberOfControls() { return 3; } protected Shell getShell() { if (changeButton == null) return null; return changeButton.getShell(); } public void setChangeButtonText(String text) { Assert.isNotNull(text); changeButtonText = text; if (changeButton != null) changeButton.setText(text); } public void setEnabled(boolean enabled){ super.setEnabled(enabled); // label if (getComboControl()!=null) { getComboControl().setEnabled(enabled); } if (this.changeButton!=null) { this.changeButton.setEnabled(enabled); } } protected Button getChangeControl() { return changeButton; } public Control[] getControls(Composite parent) { return new Control[] {getLabelComposite(parent), getTextChangeControl(parent)}; } protected String changePressed() { if(change == null) return null; Properties p = new Properties(); p.put("shell", changeButton.getShell()); //$NON-NLS-1$ change.setObject(p); int i = change.execute(); if(i != 0) return null; return p.getProperty("value"); //$NON-NLS-1$ } }