| /******************************************************************************* |
| * Copyright (c) 2004, 2006 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.ui.internal.activities.ws; |
| |
| import com.ibm.icu.text.MessageFormat; |
| import java.util.Collection; |
| import java.util.HashSet; |
| import java.util.Properties; |
| import java.util.ResourceBundle; |
| import java.util.Set; |
| |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.viewers.CheckStateChangedEvent; |
| import org.eclipse.jface.viewers.CheckboxTableViewer; |
| import org.eclipse.jface.viewers.ICheckStateListener; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Font; |
| 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.Control; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.activities.IActivity; |
| import org.eclipse.ui.activities.IActivityManager; |
| import org.eclipse.ui.activities.NotDefinedException; |
| import org.eclipse.ui.activities.WorkbenchTriggerPointAdvisor; |
| |
| /** |
| * Dialog that will prompt the user and confirm that they wish to activate a set |
| * of activities. |
| * |
| * @since 3.0 |
| */ |
| public class EnablementDialog extends Dialog { |
| |
| /** |
| * The translation bundle in which to look up internationalized text. |
| */ |
| private final static ResourceBundle RESOURCE_BUNDLE = ResourceBundle |
| .getBundle(EnablementDialog.class.getName()); |
| |
| private Button dontAskButton; |
| |
| private Set activitiesToEnable = new HashSet(7); |
| |
| private Collection activityIds; |
| |
| private boolean dontAsk; |
| |
| private Button detailsButton; |
| |
| boolean showDetails = false; |
| |
| private Composite detailsComposite; |
| |
| private Label detailsLabel; |
| |
| private String selectedActivity; |
| |
| private Text detailsText; |
| |
| private Properties strings; |
| |
| /** |
| * Create a new instance of the reciever. |
| * |
| * @param parentShell the parent shell |
| * @param activityIds the candidate activities |
| * @param strings string overrides |
| */ |
| public EnablementDialog(Shell parentShell, Collection activityIds, Properties strings) { |
| super(parentShell); |
| this.activityIds = activityIds; |
| this.strings = strings; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) |
| */ |
| protected Control createDialogArea(Composite parent) { |
| Composite composite = (Composite) super.createDialogArea(parent); |
| Font dialogFont = parent.getFont(); |
| composite.setFont(dialogFont); |
| Label text = new Label(composite, SWT.NONE); |
| text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| text.setFont(dialogFont); |
| IActivityManager manager = PlatformUI.getWorkbench() |
| .getActivitySupport().getActivityManager(); |
| |
| if (activityIds.size() == 1) { |
| String activityId = (String) activityIds.iterator().next(); |
| activitiesToEnable.add(activityId); |
| selectedActivity = activityId; |
| |
| IActivity activity = manager.getActivity(activityId); |
| String activityText; |
| try { |
| activityText = activity.getName(); |
| } catch (NotDefinedException e) { |
| activityText = activity.getId(); |
| } |
| text.setText(MessageFormat.format(RESOURCE_BUNDLE |
| .getString("requiresSingle"), //$NON-NLS-1$ |
| new Object[] { activityText })); |
| |
| text = new Label(composite, SWT.NONE); |
| text |
| .setText(strings |
| .getProperty( |
| WorkbenchTriggerPointAdvisor.PROCEED_SINGLE, |
| RESOURCE_BUNDLE |
| .getString(WorkbenchTriggerPointAdvisor.PROCEED_SINGLE))); |
| text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| text.setFont(dialogFont); |
| } else { |
| text.setText(RESOURCE_BUNDLE.getString("requiresMulti")); //$NON-NLS-1$ |
| Set activityIdsCopy = new HashSet(activityIds); |
| CheckboxTableViewer viewer = CheckboxTableViewer.newCheckList( |
| composite, SWT.CHECK | SWT.BORDER | SWT.SINGLE); |
| viewer.setContentProvider(new ActivityContentProvider()); |
| viewer.setLabelProvider(new ActivityLabelProvider(manager)); |
| viewer.setInput(activityIdsCopy); |
| viewer.setCheckedElements(activityIdsCopy.toArray()); |
| viewer.addCheckStateListener(new ICheckStateListener() { |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent) |
| */ |
| public void checkStateChanged(CheckStateChangedEvent event) { |
| if (event.getChecked()) { |
| activitiesToEnable.add(event.getElement()); |
| } else { |
| activitiesToEnable.remove(event.getElement()); |
| } |
| |
| getButton(Window.OK).setEnabled( |
| !activitiesToEnable.isEmpty()); |
| } |
| }); |
| viewer.addSelectionChangedListener(new ISelectionChangedListener() { |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) |
| */ |
| public void selectionChanged(SelectionChangedEvent event) { |
| selectedActivity = (String) ((IStructuredSelection) event |
| .getSelection()).getFirstElement(); |
| setDetails(); |
| } |
| }); |
| activitiesToEnable.addAll(activityIdsCopy); |
| |
| viewer.getControl().setLayoutData( |
| new GridData(GridData.FILL_HORIZONTAL)); |
| viewer.getControl().setFont(dialogFont); |
| |
| text = new Label(composite, SWT.NONE); |
| text.setText(strings.getProperty(WorkbenchTriggerPointAdvisor.PROCEED_MULTI, RESOURCE_BUNDLE |
| .getString(WorkbenchTriggerPointAdvisor.PROCEED_MULTI))); |
| text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| text.setFont(dialogFont); |
| } |
| Label seperator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); |
| seperator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| |
| dontAskButton = new Button(composite, SWT.CHECK); |
| dontAskButton.setSelection(false); |
| dontAskButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| dontAskButton.setText(strings.getProperty( |
| WorkbenchTriggerPointAdvisor.DONT_ASK, RESOURCE_BUNDLE |
| .getString(WorkbenchTriggerPointAdvisor.DONT_ASK))); |
| dontAskButton.setFont(dialogFont); |
| |
| detailsComposite = new Composite(composite, SWT.NONE); |
| GridLayout layout = new GridLayout(); |
| layout.marginHeight = 0; |
| layout.marginWidth = 0; |
| detailsComposite.setLayout(layout); |
| detailsLabel = new Label(detailsComposite, SWT.NONE); |
| detailsLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| detailsLabel.setFont(dialogFont); |
| |
| detailsText = new Text(detailsComposite, SWT.WRAP | SWT.V_SCROLL |
| | SWT.BORDER | SWT.READ_ONLY); |
| detailsText.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| detailsText.setFont(dialogFont); |
| |
| setDetails(); |
| |
| GridData data = new GridData(GridData.FILL_BOTH); |
| detailsComposite.setLayoutData(data); |
| setDetailHints(); |
| |
| return composite; |
| } |
| |
| /** |
| * Set the text of the detail label and text area. |
| */ |
| protected void setDetails() { |
| if (selectedActivity == null) { |
| detailsLabel |
| .setText(strings |
| .getProperty( |
| WorkbenchTriggerPointAdvisor.NO_DETAILS, |
| RESOURCE_BUNDLE |
| .getString(WorkbenchTriggerPointAdvisor.NO_DETAILS))); |
| detailsText.setText(""); //$NON-NLS-1$ |
| } else { |
| IActivity activity = PlatformUI.getWorkbench().getActivitySupport() |
| .getActivityManager().getActivity(selectedActivity); |
| String name; |
| try { |
| name = activity.getName(); |
| } catch (NotDefinedException e1) { |
| name = selectedActivity; |
| } |
| String desc; |
| try { |
| desc = activity.getDescription(); |
| } catch (NotDefinedException e) { |
| desc = RESOURCE_BUNDLE.getString("noDescAvailable"); //$NON-NLS-1$ |
| } |
| detailsLabel.setText(MessageFormat.format(RESOURCE_BUNDLE |
| .getString("detailsLabel"), new Object[] { name })); //$NON-NLS-1$ |
| detailsText.setText(desc); |
| } |
| } |
| |
| /** |
| * |
| */ |
| protected void setDetailHints() { |
| GridData data = (GridData) detailsComposite.getLayoutData(); |
| if (showDetails) { |
| Composite parent = detailsComposite.getParent(); |
| data.widthHint = parent.getSize().x - ((GridLayout)parent.getLayout()).marginWidth * 2; |
| data.heightHint = convertHeightInCharsToPixels(5); |
| } else { |
| data.widthHint = 0; |
| data.heightHint = 0; |
| } |
| } |
| |
| /** |
| * Set the label of the detail button based on whether we're currently showing the description text. |
| */ |
| private void setDetailButtonLabel() { |
| if (!showDetails) { |
| detailsButton.setText(RESOURCE_BUNDLE.getString("showDetails")); //$NON-NLS-1$ |
| } else { |
| detailsButton.setText(RESOURCE_BUNDLE.getString("hideDetails")); //$NON-NLS-1$ |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) |
| */ |
| protected void configureShell(Shell newShell) { |
| super.configureShell(newShell); |
| newShell.setText(RESOURCE_BUNDLE.getString("title")); //$NON-NLS-1$ |
| } |
| |
| /** |
| * @return Returns whether the user has declared that there is to be no further |
| * prompting for the supplied activities |
| */ |
| public boolean getDontAsk() { |
| return dontAsk; |
| } |
| |
| /** |
| * @return Returns the activities to enable |
| */ |
| public Set getActivitiesToEnable() { |
| return activitiesToEnable; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.Dialog#okPressed() |
| */ |
| protected void okPressed() { |
| dontAsk = dontAskButton.getSelection(); |
| super.okPressed(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) |
| */ |
| protected void createButtonsForButtonBar(Composite parent) { |
| super.createButtonsForButtonBar(parent); |
| detailsButton = createButton(parent, IDialogConstants.DETAILS_ID, |
| "", false); //$NON-NLS-1$ |
| setDetailButtonLabel(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int) |
| */ |
| protected void buttonPressed(int buttonId) { |
| if (buttonId == IDialogConstants.DETAILS_ID) { |
| detailsPressed(); |
| return; |
| } |
| super.buttonPressed(buttonId); |
| } |
| |
| /** |
| * Handles selection of the Details button. |
| */ |
| private void detailsPressed() { |
| showDetails = !showDetails; |
| setDetailButtonLabel(); |
| setDetailHints(); |
| setDetails(); |
| ((Composite) getDialogArea()).layout(true); |
| getShell().setSize(getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT)); |
| } |
| } |