/******************************************************************************* * 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.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.jboss.tools.common.meta.action.SpecialWizard; import org.jboss.tools.common.model.ui.ModelUIMessages; import org.jboss.tools.common.model.ui.action.CommandBar; import org.jboss.tools.common.model.ui.action.CommandBarListener; import org.jboss.tools.common.model.ui.widgets.IWidgetSettings; public class MutableMultipleChoiceFieldEditor extends MultipleChoiceFieldEditor implements CommandBarListener, IMutableFieldEditor { static String NEW = ModelUIMessages.MutableMultipleChoiceFieldEditor_New; static String SELECT_ALL = ModelUIMessages.MutableMultipleChoiceFieldEditor_SelectAll; static String DESELECT_ALL = ModelUIMessages.MutableMultipleChoiceFieldEditor_DeselectAll; CommandBar bar = new CommandBar(); String[] commands = {NEW, SELECT_ALL, DESELECT_ALL}; private Composite composite; private SpecialWizard change; public MutableMultipleChoiceFieldEditor() { this(null); } public MutableMultipleChoiceFieldEditor(IWidgetSettings settings) { super(settings); bar.setCommands(commands); bar.getLayout().direction = SWT.VERTICAL; bar.getLayout().setMargins(0, 0, 0, 0); bar.addCommandBarListener(this); bar.setWidgetSettings(settings); } public void setChange(SpecialWizard change) { this.change = change; } protected void adjustForNumColumns(int numColumns) { GridData gd = (GridData)getListControl().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 = getListChangeControl(parent); control.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); } protected Composite getListChangeControl(Composite parent) { createListChangeControl(parent); return composite; } protected Control createListChangeControl(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 listControl = createListControl(composite); gd = new GridData(GridData.FILL_BOTH); listControl.setLayoutData(gd); control = new Label(composite, SWT.NONE); control.setBackground(parent.getBackground()); gd = new GridData(); gd.widthHint = 5; control.setLayoutData(gd); control = getChangeControl(composite); return composite; } protected Control getChangeControl(Composite parent) { if(bar.getControl() != null && !bar.getControl().isDisposed()) { return bar.getControl(); } return bar.createControl(parent); } public void action(String command) { if(NEW.equals(command)) { String newValue = changePressed(); if (newValue != null) { resetChoices(); } } else if(SELECT_ALL.equals(command)) { Choice[] cs= (Choice[])choicesArray.toArray(new Choice[0]); for (int i = 0; i < cs.length; i++) { cs[i].setSelected(true); } fireValueChange(); } else if(DESELECT_ALL.equals(command)) { Choice[] cs= (Choice[])choicesArray.toArray(new Choice[0]); for (int i = 0; i < cs.length; i++) { cs[i].setSelected(false); } fireValueChange(); } } protected String changePressed() { if(change == null) return null; Properties p = new Properties(); p.put("shell", bar.getControl().getShell()); //$NON-NLS-1$ change.setObject(p); int i = change.execute(); if(i != 0) return null; return p.getProperty("value"); //$NON-NLS-1$ } public Control[] getControls(Composite parent) { return new Control[] {getLabelComposite(parent), getListChangeControl(parent)}; } }