blob: 8ed73599e1197afbbede1e040bba20b4eaa87a4a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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.debug.internal.ui.importexport.breakpoints;
import java.lang.reflect.InvocationTargetException;
import com.ibm.icu.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
import org.eclipse.debug.internal.ui.SWTUtil;
import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsViewer;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.actions.ExportBreakpointsOperation;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
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.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.PlatformUI;
/**
* <p>
* This class provides an internal implementation of a WizardPage, which is used
* in the Export Breakpoints wizard.
* </p>
* <p>
* The implementation presents the breakpoints to the user as they are shown in
* their current breakpoint view.
* </p>
* <p>
* Possible extensions would include:
* <ul>
* <li> Able to change the views as in the breakpoints view itself
* <li> Able to reorder groups from within the wizard - easier in the viewer itself though
* </ul>
* </p>
* This class is used by <code>WizardExportBreakpoints</code>
*
* @since 3.2
*/
public class WizardExportBreakpointsPage extends WizardPage implements Listener {
// widgets
private Button fOverwriteExistingFilesCheckbox = null;
private Text fDestinationNameField = null;
private Button fDestinationBrowseButton = null;
private IPath fPath = null;
private EmbeddedBreakpointsViewer fTView = null;
private IStructuredSelection fSelection = null;
private Button fSelectAll = null;
private Button fDeselectAll = null;
//state constants
private static final String OVERWRITE_ALL_STATE = "overwrite"; //$NON-NLS-1$
private static final String DESTINATION_FILE_NAME = "filename"; //$NON-NLS-1$
/**
* This is the default constructor. It accepts the name for the tab as a
* parameter and an existing selection
*
* @param pageName the name of the page
*/
public WizardExportBreakpointsPage(String pageName, IStructuredSelection selection) {
super(pageName, ImportExportMessages.WizardExportBreakpoints_0, null);
fSelection = selection;
}
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event event) {
Widget source = event.widget;
if (source == fDestinationBrowseButton) {
handleDestinationBrowseButtonPressed();
}
else if (source == fDestinationNameField) {
handlePathTextModifiedEvent();
}
else if(source == fSelectAll) {
handleSelectAllPressed();
}
else if(source == fDeselectAll) {
handleDeselectAllPressed();
}
}
/**
* Handles the select all button pressed
*
*/
private void handleSelectAllPressed() {
BreakpointsViewer viewer = fTView.getViewer();
viewer.getTree().selectAll();
viewer.setCheckedElements(((IStructuredSelection)viewer.getSelection()).toArray());
viewer.setGrayedElements(new Object[] {});
viewer.getTree().deselectAll();
setPageComplete(detectPageComplete());
}
/**
* Handles the deselect all button pressed
*
*/
private void handleDeselectAllPressed() {
BreakpointsViewer viewer = fTView.getViewer();
viewer.setCheckedElements(new Object[] {});
viewer.setGrayedElements(new Object[] {});
setPageComplete(detectPageComplete());
}
/**
* This method handles the modified event fomr the path combobox.
*/
protected void handlePathTextModifiedEvent() {
setPageComplete(detectPageComplete());
}
/**
* Open the SaveAsDialog so the user can save the listing of selected breakpoints
*/
protected void handleDestinationBrowseButtonPressed() {
FileDialog dialog = new FileDialog(getContainer().getShell(), SWT.SAVE);
dialog.setFilterExtensions(new String[]{"*."+IImportExportConstants.EXTENSION}); //$NON-NLS-1$
dialog.setText(ImportExportMessages.WizardExportBreakpoints_0);
String file = dialog.open();
if(file != null) {
fPath = new Path(file);
if (fPath != null) {
setErrorMessage(null);
if(fPath.getFileExtension() == null) {
fPath = fPath.addFileExtension(IImportExportConstants.EXTENSION);
}
else if(!fPath.getFileExtension().equals(IImportExportConstants.EXTENSION)) {
fPath = fPath.addFileExtension(IImportExportConstants.EXTENSION);
}
fDestinationNameField.setText(fPath.toString());
}
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayout(new GridLayout());
composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
fTView = new EmbeddedBreakpointsViewer(composite, DebugPlugin.getDefault().getBreakpointManager(), fSelection);
fTView.getViewer().addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
setPageComplete(detectPageComplete());
}
});
fTView.getViewer().setSelection(fSelection);
createButtonsGroup(composite);
createDestinationGroup(composite);
createOptionsGroup(composite);
setControl(composite);
setPageComplete(detectPageComplete());
restoreWidgetState();
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.EXPORT_BREAKPOINTS_WIZARD_PAGE);
Dialog.applyDialogFont(parent);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#getImage()
*/
public Image getImage() {
return DebugUITools.getImage(IInternalDebugUIConstants.IMG_WIZBAN_EXPORT_BREAKPOINTS);
}
/**
* Creates the buttons for selecting all or none of the elements.
*
* @param parent the parent control
*/
private void createButtonsGroup(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
GridLayout layout = new GridLayout();
layout.numColumns = 3;
layout.makeColumnsEqualWidth = true;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
fSelectAll = SWTUtil.createPushButton(composite, ImportExportMessages.WizardBreakpointsPage_1, null);
fSelectAll.addListener(SWT.Selection, this);
fDeselectAll = SWTUtil.createPushButton(composite, ImportExportMessages.WizardBreakpointsPage_2, null);
fDeselectAll.addListener(SWT.Selection, this);
}
/**
* This method is used to determine if the page can be "finished".
*
* To be determined "finishable" there must be a save path and there must be
* a selection in the tree.
*
* @return if the prerequesites of the wizard are met to allow the wizard to complete.
*/
private boolean detectPageComplete() {
boolean emptyFile = fDestinationNameField.getText().trim().equals(""); //$NON-NLS-1$
if (emptyFile) {
setMessage(ImportExportMessages.WizardExportBreakpointsPage_0, IMessageProvider.NONE);
return false;
}
int size = fTView.getCheckedElements().size();
if (size == 0) {
setMessage(ImportExportMessages.WizardExportBreakpointsPage_1, IMessageProvider.ERROR);
return false;
}
setMessage(ImportExportMessages.WizardBreakpointsPage_4);
return true;
}
/**
* Create the Options specification widgets.
*
* @param parent the parent to add this
*/
protected void createOptionsGroup(Composite parent) {
Font font = parent.getFont();
// Options group
Group OptionsGroup = new Group(parent, SWT.NONE);
GridLayout layout = new GridLayout();
OptionsGroup.setLayout(layout);
OptionsGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
OptionsGroup.setText(ImportExportMessages.WizardBreakpointsPage_5);
OptionsGroup.setFont(parent.getFont());
fOverwriteExistingFilesCheckbox = new Button(OptionsGroup, SWT.CHECK | SWT.LEFT);
fOverwriteExistingFilesCheckbox.setText(ImportExportMessages.WizardBreakpointsPage_6);
fOverwriteExistingFilesCheckbox.setFont(font);
}
/**
* Create the export destination specification widgets
*
* @param parent org.eclipse.swt.widgets.Composite
*/
protected void createDestinationGroup(Composite parent) {
Font font = parent.getFont();
// destination specification group
Composite destinationSelectionGroup = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
destinationSelectionGroup.setLayout(layout);
destinationSelectionGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
destinationSelectionGroup.setFont(font);
Label destinationLabel = new Label(destinationSelectionGroup, SWT.NONE);
destinationLabel.setText(ImportExportMessages.WizardBreakpointsPage_7);
destinationLabel.setFont(font);
fDestinationNameField = new Text(destinationSelectionGroup, SWT.BORDER);
fDestinationNameField.addListener(SWT.Modify, this);
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
fDestinationNameField.setLayoutData(data);
fDestinationNameField.setFont(font);
fDestinationBrowseButton = new Button(destinationSelectionGroup, SWT.PUSH);
fDestinationBrowseButton.setText(ImportExportMessages.WizardBreakpointsPage_8);
fDestinationBrowseButton.addListener(SWT.Selection, this);
fDestinationBrowseButton.setFont(font);
setButtonLayoutData(fDestinationBrowseButton);
}
/**
* Save the state of the widgets select, for successive invocations of the wizard
*/
private void saveWidgetState() {
IDialogSettings settings = getDialogSettings();
if(settings != null) {
settings.put(OVERWRITE_ALL_STATE, fOverwriteExistingFilesCheckbox.getSelection());
settings.put(DESTINATION_FILE_NAME, fDestinationNameField.getText().trim());
}
}
/**
* Restores the state of the wizard from previous invocations
*/
private void restoreWidgetState() {
IDialogSettings settings = getDialogSettings();
if(settings != null) {
fOverwriteExistingFilesCheckbox.setSelection(Boolean.valueOf(settings.get(OVERWRITE_ALL_STATE)).booleanValue());
String filename = settings.get(DESTINATION_FILE_NAME);
if (filename != null) {
fDestinationNameField.setText(filename);
}
}
}
/**
* The Finish button is clicked on the main wizard
* dialog to export the breakpoints, we write them out with all persistnat
* information to a simple XML file via the use of XMLMemento.
*
* @return if the save operation was successful or not
*/
public boolean finish() {
try {
//name typed in without using selection box
if(fPath == null) {
fPath = new Path(fDestinationNameField.getText().trim());
if(fPath.getFileExtension() == null) {
fPath = fPath.addFileExtension(IImportExportConstants.EXTENSION);
}
else if(!fPath.getFileExtension().equals(IImportExportConstants.EXTENSION)) {
fPath = fPath.addFileExtension(IImportExportConstants.EXTENSION);
}
}
saveWidgetState();
if(fPath.toFile().exists() && !fOverwriteExistingFilesCheckbox.getSelection()) {
if (!MessageDialog.openQuestion(null, ImportExportMessages.WizardBreakpointsPage_12, MessageFormat.format(ImportExportMessages.ImportExportOperations_0, new String[] {fPath.toPortableString()}))) {
return false;
}
}
// collect breakpoints
Object[] elements = fTView.getCheckedElements().toArray();
List breakpoints = new ArrayList();
for (int i = 0; i < elements.length; i++) {
Object object = elements[i];
if (object instanceof IBreakpoint) {
breakpoints.add(object);
}
}
getContainer().run(true, true, new ExportBreakpointsOperation((IBreakpoint[]) breakpoints.toArray(new IBreakpoint[breakpoints.size()]), fPath.toOSString()));
}
catch (InterruptedException e) {
DebugPlugin.log(e);
return false;
}
catch (InvocationTargetException e) {
DebugPlugin.log(e);
return false;
}
return true;
}
}