Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Rennie2007-10-02 20:58:59 +0000
committerMichael Rennie2007-10-02 20:58:59 +0000
commite3d8a4714560089edc10d9232cce56acc0607d7d (patch)
treeda82b8994f4f60e2e92752190fb7dbc23bf21e86 /org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java
parent4187b162f297be47991870f2ba491fddf17656f9 (diff)
downloadeclipse.platform.debug-e3d8a4714560089edc10d9232cce56acc0607d7d.tar.gz
eclipse.platform.debug-e3d8a4714560089edc10d9232cce56acc0607d7d.tar.xz
eclipse.platform.debug-e3d8a4714560089edc10d9232cce56acc0607d7d.zip
Bug 12898 [launching] Import/Export of launch configs
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java')
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java390
1 files changed, 390 insertions, 0 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java
new file mode 100644
index 000000000..0fb9ed215
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java
@@ -0,0 +1,390 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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.launchconfigurations;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
+import org.eclipse.debug.internal.core.LaunchConfiguration;
+import org.eclipse.debug.internal.ui.DebugUIPlugin;
+import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
+import org.eclipse.debug.internal.ui.SWTFactory;
+import org.eclipse.debug.internal.ui.launchConfigurations.MultiLaunchGroupFilter;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.debug.ui.ILaunchGroup;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.model.WorkbenchViewerComparator;
+import org.eclipse.ui.progress.UIJob;
+
+import com.ibm.icu.text.MessageFormat;
+
+/**
+ * This calls provides the one and only wizard page to the
+ * export launch configurations wizard.
+ * @since 3.4.0
+ */
+public class ExportLaunchConfigurationsWizardPage extends WizardPage {
+
+ /**
+ * The content provider for the tree viewer
+ * @since 3.4.0
+ */
+ class ConfigContentProvider implements ITreeContentProvider {
+
+ ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager();
+
+ public Object[] getChildren(Object parentElement) {
+ if(parentElement instanceof ILaunchConfigurationType) {
+ try {
+ return lm.getLaunchConfigurations((ILaunchConfigurationType) parentElement);
+ }
+ catch (Exception e) {
+ DebugUIPlugin.logErrorMessage(e.getMessage());
+ }
+ }
+ return null;
+ }
+ public Object getParent(Object element) {
+ if(element instanceof ILaunchConfiguration) {
+ try {
+ return ((ILaunchConfiguration)element).getType();
+ } catch (CoreException e) {
+ return null;
+ }
+ }
+ return null;
+ }
+ public boolean hasChildren(Object element) {
+ return element instanceof ILaunchConfigurationType;
+ }
+ public Object[] getElements(Object inputElement) {
+ return lm.getLaunchConfigurationTypes();
+ }
+ public void dispose() {lm = null;}
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
+
+ }
+ private String OVERWRITE = "overwrite"; //$NON-NLS-1$
+ private String OLD_PATH = "oldpath"; //$NON-NLS-1$
+ private CheckboxTreeViewer fViewer = null;
+ private Text fFilePath = null;
+ private Button fOverwrite = null;
+
+ /**
+ * Constructor
+ */
+ protected ExportLaunchConfigurationsWizardPage() {
+ super(WizardMessages.ExportLaunchConfigurationsWizard_0);
+ setTitle(WizardMessages.ExportLaunchConfigurationsWizard_0);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createControl(Composite parent) {
+ Composite comp = SWTFactory.createComposite(parent, 2, 1, GridData.FILL_BOTH);
+ //add the check table
+ createViewer(comp);
+ //add the file path and browse button
+ createFilePath(comp);
+ //add the overwrite option
+ fOverwrite = SWTFactory.createCheckButton(comp, WizardMessages.ExportLaunchConfigurationsWizardPage_1, null, getDialogSettings().getBoolean(OVERWRITE), 2);
+ setControl(comp);
+ PlatformUI .getWorkbench().getHelpSystem().setHelp(comp, IDebugHelpContextIds.EXPORT_LAUNCH_CONFIGURATIONS_PAGE);
+ setMessage(WizardMessages.ExportLaunchConfigurationsWizardPage_7);
+ //do not set page complete, Eclipse UI guidelines states wizards cannot start off with an error showing
+ setPageComplete(false);
+ }
+
+ /**
+ * Creates the check table viewer portion of the control
+ * @param parent the parent to add the check table viewer to
+ */
+ protected void createViewer(Composite parent) {
+ SWTFactory.createWrapLabel(parent, WizardMessages.ExportLaunchConfigurationsWizardPage_3, 2);
+ Tree tree = new Tree(parent, SWT.BORDER | SWT.SINGLE | SWT.CHECK);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.horizontalSpan = 2;
+ tree.setLayoutData(gd);
+ fViewer = new CheckboxTreeViewer(tree);
+ fViewer.setLabelProvider(DebugUITools.newDebugModelPresentation());
+ fViewer.setComparator(new WorkbenchViewerComparator());
+ fViewer.setContentProvider(new ConfigContentProvider());
+ fViewer.setInput(DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes());
+ //we don't want to see builders....
+ ILaunchGroup[] groups = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroups();
+ ArrayList list = new ArrayList();
+ for(int i = 0; i < groups.length; i++) {
+ if(!"org.eclipse.ui.externaltools.launchGroup.builder".equals(groups[i].getIdentifier())) { //$NON-NLS-1$
+ list.add(groups[i]);
+ }
+ }
+ fViewer.addFilter(new MultiLaunchGroupFilter((ILaunchGroup[]) list.toArray(new ILaunchGroup[list.size()])));
+ //need to force load the children so that select all works initially
+ fViewer.expandAll();
+ fViewer.collapseAll();
+ fViewer.addCheckStateListener(new ICheckStateListener() {
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ updateCheckedState(event.getElement());
+ setPageComplete(isComplete());
+ }
+ });
+ Composite buttoncomp = SWTFactory.createComposite(parent, parent.getFont(), 2, 2, GridData.FILL_HORIZONTAL, 0, 0);
+ Button button = SWTFactory.createPushButton(buttoncomp, WizardMessages.ExportLaunchConfigurationsWizardPage_8, null);
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ fViewer.setAllChecked(true);
+ setPageComplete(isComplete());
+ }
+ });
+ button = SWTFactory.createPushButton(buttoncomp, WizardMessages.ExportLaunchConfigurationsWizardPage_9, null);
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ fViewer.setAllChecked(false);
+ setPageComplete(isComplete());
+ }
+ });
+ }
+
+ /**
+ * Updates the checked state of child launch configurations if the parent type is checked
+ * @param item
+ */
+ protected void updateCheckedState(Object element) {
+ boolean state = fViewer.getChecked(element);
+ if(element instanceof ILaunchConfigurationType) {
+ Object[] items = ((ConfigContentProvider)fViewer.getContentProvider()).getChildren(element);
+ for(int i = 0; i < items.length; i++) {
+ fViewer.setChecked(items[i], state);
+ }
+ fViewer.setGrayed(element, false);
+ }
+ else if(element instanceof ILaunchConfiguration) {
+ ConfigContentProvider ccp = (ConfigContentProvider) fViewer.getContentProvider();
+ Object parent = ccp.getParent(element);
+ Object[] items = ccp.getChildren(parent);
+ boolean checked = true;
+ boolean onechecked = false;
+ for(int i = 0; i < items.length; i++) {
+ state = fViewer.getChecked(items[i]);
+ checked &= state;
+ if(state) {
+ onechecked = true;
+ }
+ }
+ fViewer.setGrayed(parent, onechecked & !checked);
+ fViewer.setChecked(parent, checked | onechecked);
+ }
+ }
+
+ /**
+ * Creates the controls for the file path selection area of the page
+ * @param parent
+ */
+ protected void createFilePath(Composite parent) {
+ Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 3, 2, GridData.FILL_HORIZONTAL, 0, 10);
+ SWTFactory.createLabel(comp, WizardMessages.ExportLaunchConfigurationsWizardPage_4, 1);
+ fFilePath = SWTFactory.createText(comp, SWT.SINGLE | SWT.BORDER, 1);
+ String opath = getDialogSettings().get(OLD_PATH);
+ fFilePath.setText((opath == null ? IInternalDebugCoreConstants.EMPTY_STRING : opath));
+ Button button = SWTFactory.createPushButton(comp, WizardMessages.ExportLaunchConfigurationsWizardPage_0, null, GridData.END);
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ DirectoryDialog dd = new DirectoryDialog(getContainer().getShell());
+ dd.setText(WizardMessages.ExportLaunchConfigurationsWizard_0);
+ String file = dd.open();
+ if(file != null) {
+ IPath path = new Path(file);
+ if (path != null) {
+ fFilePath.setText(path.toString());
+ setPageComplete(isComplete());
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * Returns if the page is complete
+ * @return true if the page is complete and can be 'finished', false otherwise
+ */
+ protected boolean isComplete() {
+ Object[] elements = fViewer.getCheckedElements();
+ boolean oneconfig = false;
+ for(int i = 0; i < elements.length; i++) {
+ if(elements[i] instanceof ILaunchConfiguration) {
+ oneconfig = true;
+ break;
+ }
+ }
+ if(elements.length < 1 || !oneconfig) {
+ setErrorMessage(WizardMessages.ExportLaunchConfigurationsWizardPage_5);
+ return false;
+ }
+ if(fFilePath.getText().trim().equals(IInternalDebugCoreConstants.EMPTY_STRING)) {
+ setErrorMessage(WizardMessages.ExportLaunchConfigurationsWizardPage_6);
+ return false;
+ }
+ setErrorMessage(null);
+ setMessage(WizardMessages.ExportLaunchConfigurationsWizardPage_7);
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.WizardPage#getImage()
+ */
+ public Image getImage() {
+ return DebugUITools.getImage(IDebugUIConstants.IMG_WIZBAN_RUN);
+ }
+
+ /**
+ * This method performs the work of the page
+ * @return if the export job was successful or not
+ */
+ public boolean finish() {
+ final String dpath = fFilePath.getText().trim();
+ IDialogSettings settings = getDialogSettings();
+ settings.put(OVERWRITE, fOverwrite.getSelection());
+ settings.put(OLD_PATH, dpath);
+ final Object[] configs = fViewer.getCheckedElements();
+ final boolean overwrite = fOverwrite.getSelection();
+ UIJob exportjob = new UIJob(getContainer().getShell().getDisplay(), WizardMessages.ExportLaunchConfigurationsWizard_0) {
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if(monitor == null) {
+ monitor = new NullProgressMonitor();
+ }
+ IPath destpath = new Path(dpath);
+ File destfolder = destpath.toFile();
+ if(!destfolder.exists()) {
+ destfolder.mkdirs();
+ }
+ monitor.beginTask(WizardMessages.ExportLaunchConfigurationsWizardPage_10, configs.length);
+ try {
+ File file = null, newfile = null;
+ boolean owall = false, nowall = false;
+ MessageDialog dialog = null;
+ for(int i = 0; i < configs.length; i++) {
+ if(monitor.isCanceled()) {
+ return Status.CANCEL_STATUS;
+ }
+ if(configs[i] instanceof ILaunchConfiguration) {
+ file = new File(((LaunchConfiguration) configs[i]).getLocation().toOSString());
+ try {
+ newfile = new File(destpath.append(file.getName()).toOSString());
+ if(newfile.exists() & !overwrite) {
+ if(nowall) {
+ continue;
+ }
+ dialog = new MessageDialog(DebugUIPlugin.getShell(),
+ WizardMessages.ExportLaunchConfigurationsWizardPage_11,
+ null,
+ MessageFormat.format(WizardMessages.ExportLaunchConfigurationsWizardPage_12, new String[] {file.getName()}),
+ MessageDialog.QUESTION, new String[] {WizardMessages.ExportLaunchConfigurationsWizardPage_13, WizardMessages.ExportLaunchConfigurationsWizardPage_14, WizardMessages.ExportLaunchConfigurationsWizardPage_15, WizardMessages.ExportLaunchConfigurationsWizardPage_16, WizardMessages.ExportLaunchConfigurationsWizardPage_17}, 0);
+ if(!owall) {
+ int ret = dialog.open();
+ switch(ret) {
+ case 0: {
+ copyFile(file, newfile);
+ break;
+ }
+ case 1: {
+ owall = true;
+ copyFile(file, newfile);
+ break;
+ }
+ case 3: {
+ nowall = true;
+ break;
+ }
+ case 4: {
+ monitor.setCanceled(true);
+ break;
+ }
+ }
+ }
+ else if(!nowall) {
+ copyFile(file, newfile);
+ }
+ }
+ else {
+ copyFile(file, newfile);
+ }
+ }
+ catch (Exception e) {
+ DebugUIPlugin.logErrorMessage(e.getMessage());
+ }
+ }
+ if(!monitor.isCanceled()) {
+ monitor.worked(1);
+ }
+ }
+ return Status.OK_STATUS;
+ }
+ finally {
+ monitor.done();
+ }
+ }
+ };
+ exportjob.schedule();
+ return true;
+ }
+
+ /**
+ * Copies a file from one location to another
+ * @param in the file to copy
+ * @param out the file to be copied out to
+ * @throws Exception
+ */
+ protected void copyFile(File in, File out) throws Exception {
+ FileInputStream fis = new FileInputStream(in);
+ FileOutputStream fos = new FileOutputStream(out);
+ byte[] buf = new byte[1024];
+ int i = 0;
+ while((i = fis.read(buf)) != -1) {
+ fos.write(buf, 0, i);
+ }
+ fis.close();
+ fos.close();
+ }
+}

Back to the top