/******************************************************************************* * Copyright (c) 2005, 2012 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.bpel.ui.dialogs; import org.eclipse.bpel.ui.Messages; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.TwoPaneElementSelector; import org.eclipse.ui.progress.WorkbenchJob; /** * A selection dialog that also lets the user create a new element. */ public class SelectionAndCreationDialog extends TwoPaneElementSelector { protected boolean allowCreateNewArtifact; public SelectionAndCreationDialog(Shell parent, ILabelProvider elementRenderer, ILabelProvider qualifierRenderer) { super(parent, elementRenderer, qualifierRenderer); allowCreateNewArtifact = true; } @Override protected Text createFilterText(Composite parent) { Composite newComposite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginHeight = 0; layout.marginWidth = 0; newComposite.setLayout(layout); newComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); Text filterText = super.createFilterText(newComposite); ((GridData)filterText.getLayoutData()).verticalAlignment = GridData.VERTICAL_ALIGN_CENTER; filterText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { // We need to run the update in a job because the selection also // runs in a job and we have to update the OK button status only // after the selection is updated. WorkbenchJob job = new WorkbenchJob(Display.getCurrent(), "") { //$NON-NLS-1$ @Override public IStatus runInUIThread(IProgressMonitor monitor) { updateOkState(); return Status.OK_STATUS; } }; job.schedule(); } }); if (allowCreateNewArtifact) { Button button = new Button(newComposite, SWT.PUSH); button.setFont(newComposite.getFont()); button.setText(Messages.SelectionAndCreationDialog_New_1); GridData data = new GridData(); data.verticalAlignment = GridData.VERTICAL_ALIGN_CENTER; button.setLayoutData(data); button.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { handleNewButtonPushed(); } public void widgetDefaultSelected(SelectionEvent e) { // do nothing } }); } return filterText; } /** * Called when the user pushes the "New..." button. */ protected void handleNewButtonPushed() { } /** * Sets whether this dialog should have a "New..." button. */ public void setAllowCreateNewArtifact(boolean allowCreateNewArtifact) { this.allowCreateNewArtifact = allowCreateNewArtifact; } @Override protected void okPressed() { // check if there's a selection if (getSelectedElements().length == 0) { // We can get into the state of not having a selection due to timing issues. // The enablement of the OK button is based on a selection. Selections can // depend on the table being updated and that is done in a background thread // for performance reasons. Sometimes (not often) the user can get into a state // where the OK button is enabled but there are no selections. If the user hits // OK we have to at least show a dialog saying that no selections were made so // we can't close the dialog using the OK button. MessageDialog.openError(getShell(), Messages.SelectionAndCreationDialog_Error_2, Messages.SelectionAndCreationDialog_No_elements_were_selected_3); return; } super.okPressed(); } }