/******************************************************************************* * 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)); } }