--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2011 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
+ * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 83258 [jar exporter] Deploy java application as executable jar
+ *******************************************************************************/
+package org.eclipse.jdt.internal.ui.jarpackager;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+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.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.TreeItem;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.wizard.IWizardPage;
+
+import org.eclipse.ui.PlatformUI;
+
+import org.eclipse.ltk.core.refactoring.RefactoringCore;
+import org.eclipse.ltk.core.refactoring.history.IRefactoringHistoryService;
+import org.eclipse.ltk.core.refactoring.history.RefactoringHistory;
+
+import org.eclipse.jdt.core.IClassFile;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaModel;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.refactoring.descriptors.JavaRefactoringDescriptor;
+
+import org.eclipse.jdt.ui.JavaElementComparator;
+import org.eclipse.jdt.ui.JavaElementLabelProvider;
+import org.eclipse.jdt.ui.ProblemsLabelDecorator;
+import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
+import org.eclipse.jdt.ui.jarpackager.JarPackageData;
+
+import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
+import org.eclipse.jdt.internal.ui.filters.EmptyInnerPackageFilter;
+import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
+import org.eclipse.jdt.internal.ui.util.SWTUtil;
+
+/**
+ * Page 1 of the JAR Package wizard
+ */
+class JarPackageWizardPage extends AbstractJarDestinationWizardPage {
+
+ private JarPackageData fJarPackage;
+ private IStructuredSelection fInitialSelection;
+ private CheckboxTreeAndListGroup fInputGroup;
+
+ // widgets
+ private Button fExportClassFilesCheckbox;
+ private Button fExportOutputFoldersCheckbox;
+ private Button fExportJavaFilesCheckbox;
+ private Button fExportRefactoringsCheckbox;
+ private Link fRefactoringLink;
+
+ private Button fCompressCheckbox;
+ private Button fOverwriteCheckbox;
+ private Button fIncludeDirectoryEntriesCheckbox;
+ private boolean fInitiallySelecting= true;
+
+ // dialog store id constants
+ private static final String PAGE_NAME= "JarPackageWizardPage"; //$NON-NLS-1$
+
+ private static final String STORE_EXPORT_CLASS_FILES= PAGE_NAME + ".EXPORT_CLASS_FILES"; //$NON-NLS-1$
+ private static final String STORE_EXPORT_OUTPUT_FOLDERS= PAGE_NAME + ".EXPORT_OUTPUT_FOLDER"; //$NON-NLS-1$
+ private static final String STORE_EXPORT_JAVA_FILES= PAGE_NAME + ".EXPORT_JAVA_FILES"; //$NON-NLS-1$
+
+ private static final String STORE_REFACTORINGS= PAGE_NAME + ".REFACTORINGS"; //$NON-NLS-1$
+ private static final String STORE_COMPRESS= PAGE_NAME + ".COMPRESS"; //$NON-NLS-1$
+ private final static String STORE_OVERWRITE= PAGE_NAME + ".OVERWRITE"; //$NON-NLS-1$
+ private final static String STORE_INCLUDE_DIRECTORY_ENTRIES= PAGE_NAME + ".INCLUDE_DIRECTORY_ENTRIES"; //$NON-NLS-1$
+
+ // other constants
+ private static final int SIZING_SELECTION_WIDGET_WIDTH= 480;
+ private static final int SIZING_SELECTION_WIDGET_HEIGHT= 150;
+
+ /**
+ * Create an instance of this class
+ *
+ * @param jarPackage an object containing all required information to make an export
+ * @param selection the initial selection
+ */
+ public JarPackageWizardPage(JarPackageData jarPackage, IStructuredSelection selection) {
+ super(PAGE_NAME, selection, jarPackage);
+ setTitle(JarPackagerMessages.JarPackageWizardPage_title);
+ setDescription(JarPackagerMessages.JarPackageWizardPage_description);
+ fJarPackage= jarPackage;
+ fInitialSelection= selection;
+ }
+
+ /*
+ * Method declared on IDialogPage.
+ */
+ @Override
+ public void createControl(final 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));
+
+ createPlainLabel(composite, JarPackagerMessages.JarPackageWizardPage_whatToExport_label);
+ createInputGroup(composite);
+
+ createExportTypeGroup(composite);
+
+ new Label(composite, SWT.NONE); // vertical spacer
+
+
+ createPlainLabel(composite, JarPackagerMessages.JarPackageWizardPage_whereToExport_label);
+ createDestinationGroup(composite);
+
+ createPlainLabel(composite, JarPackagerMessages.JarPackageWizardPage_options_label);
+ createOptionsGroup(composite);
+
+ restoreResourceSpecificationWidgetValues(); // superclass API defines this hook
+ restoreWidgetValues();
+ if (fInitialSelection != null)
+ BusyIndicator.showWhile(parent.getDisplay(), new Runnable() {
+ public void run() {
+ setupBasedOnInitialSelections();
+ }
+ });
+
+ setControl(composite);
+ update();
+ fRefactoringLink.setEnabled(fExportRefactoringsCheckbox.getSelection());
+ giveFocusToDestination();
+
+ Dialog.applyDialogFont(composite);
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.JARPACKAGER_WIZARD_PAGE);
+ }
+
+ /**
+ * Create the export options specification widgets.
+ *
+ * @param parent org.eclipse.swt.widgets.Composite
+ */
+ @Override
+ protected void createOptionsGroup(Composite parent) {
+ Composite optionsGroup= new Composite(parent, SWT.NONE);
+ GridLayout layout= new GridLayout();
+ layout.marginHeight= 0;
+ optionsGroup.setLayout(layout);
+
+ fCompressCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+ fCompressCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_compress_text);
+ fCompressCheckbox.addListener(SWT.Selection, this);
+
+ fIncludeDirectoryEntriesCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+ fIncludeDirectoryEntriesCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_includeDirectoryEntries_text);
+ fIncludeDirectoryEntriesCheckbox.addListener(SWT.Selection, this);
+
+ fOverwriteCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+ fOverwriteCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_overwrite_text);
+ fOverwriteCheckbox.addListener(SWT.Selection, this);
+ }
+
+ /**
+ * Returns an iterator over this page's collection of currently-specified
+ * elements to be exported. This is the primary element selection facility
+ * accessor for subclasses.
+ *
+ * @return an iterator over the collection of elements currently selected for export
+ */
+ @Override
+ protected Iterator<Object> getSelectedResourcesIterator() {
+ return fInputGroup.getAllCheckedListItems();
+ }
+
+ /**
+ * Persists resource specification control setting that are to be restored
+ * in the next instance of this page. Subclasses wishing to persist
+ * settings for their controls should extend the hook method
+ * <code>internalSaveWidgetValues</code>.
+ */
+ @Override
+ public final void saveWidgetValues() {
+ super.saveWidgetValues();
+ // update directory names history
+ IDialogSettings settings= getDialogSettings();
+ if (settings != null) {
+ settings.put(STORE_EXPORT_CLASS_FILES, fJarPackage.areClassFilesExported());
+ settings.put(STORE_EXPORT_OUTPUT_FOLDERS, fJarPackage.areOutputFoldersExported());
+ settings.put(STORE_EXPORT_JAVA_FILES, fJarPackage.areJavaFilesExported());
+
+ // options
+ settings.put(STORE_REFACTORINGS, fJarPackage.isRefactoringAware());
+ settings.put(STORE_COMPRESS, fJarPackage.isCompressed());
+ settings.put(STORE_INCLUDE_DIRECTORY_ENTRIES, fJarPackage.areDirectoryEntriesIncluded());
+ settings.put(STORE_OVERWRITE, fJarPackage.allowOverwrite());
+ }
+ // Allow subclasses to save values
+ internalSaveWidgetValues();
+ }
+
+ /**
+ * Hook method for subclasses to persist their settings.
+ */
+ @Override
+ protected void internalSaveWidgetValues() {
+ }
+
+ /**
+ * Hook method for restoring widget values to the values that they held
+ * last time this wizard was used to completion.
+ */
+ @Override
+ protected void restoreWidgetValues() {
+ if (!((JarPackageWizard)getWizard()).isInitializingFromJarPackage())
+ initializeJarPackage();
+
+ fExportClassFilesCheckbox.setSelection(fJarPackage.areClassFilesExported());
+ fExportOutputFoldersCheckbox.setSelection(fJarPackage.areOutputFoldersExported());
+ fExportJavaFilesCheckbox.setSelection(fJarPackage.areJavaFilesExported());
+
+ super.restoreWidgetValues();
+
+ // options
+ if (fExportRefactoringsCheckbox != null)
+ fExportRefactoringsCheckbox.setSelection(fJarPackage.isRefactoringAware());
+ fCompressCheckbox.setSelection(fJarPackage.isCompressed());
+ fIncludeDirectoryEntriesCheckbox.setSelection(fJarPackage.areDirectoryEntriesIncluded());
+ fOverwriteCheckbox.setSelection(fJarPackage.allowOverwrite());
+ }
+
+ /**
+ * Initializes the JAR package from last used wizard page values.
+ */
+ @Override
+ protected void initializeJarPackage() {
+ super.initializeJarPackage();
+
+ IDialogSettings settings= getDialogSettings();
+ if (settings != null) {
+ // source
+ fJarPackage.setElements(getSelectedElements());
+ fJarPackage.setExportClassFiles(settings.getBoolean(STORE_EXPORT_CLASS_FILES));
+ fJarPackage.setExportOutputFolders(settings.getBoolean(STORE_EXPORT_OUTPUT_FOLDERS));
+ fJarPackage.setExportJavaFiles(settings.getBoolean(STORE_EXPORT_JAVA_FILES));
+
+ // options
+ fJarPackage.setRefactoringAware(settings.getBoolean(STORE_REFACTORINGS));
+ fJarPackage.setCompress(settings.getBoolean(STORE_COMPRESS));
+ fJarPackage.setIncludeDirectoryEntries(settings.getBoolean(STORE_INCLUDE_DIRECTORY_ENTRIES));
+ fJarPackage.setOverwrite(settings.getBoolean(STORE_OVERWRITE));
+ }
+ }
+
+ /**
+ * Stores the widget values in the JAR package.
+ */
+ @Override
+ protected void updateModel() {
+ if (getControl() == null)
+ return;
+
+ // source
+ if (fExportClassFilesCheckbox.getSelection() && !fJarPackage.areClassFilesExported())
+ fExportOutputFoldersCheckbox.setSelection(false);
+ if (fExportOutputFoldersCheckbox.getSelection() && !fJarPackage.areOutputFoldersExported())
+ fExportClassFilesCheckbox.setSelection(false);
+ fJarPackage.setExportClassFiles(fExportClassFilesCheckbox.getSelection());
+ fJarPackage.setExportOutputFolders(fExportOutputFoldersCheckbox.getSelection());
+ fJarPackage.setExportJavaFiles(fExportJavaFilesCheckbox.getSelection());
+ fJarPackage.setElements(getSelectedElements());
+
+ super.updateModel();
+ // options
+ if (fExportRefactoringsCheckbox != null)
+ fJarPackage.setRefactoringAware(fExportRefactoringsCheckbox.getSelection());
+ else
+ fJarPackage.setRefactoringAware(false);
+ fJarPackage.setCompress(fCompressCheckbox.getSelection());
+ fJarPackage.setIncludeDirectoryEntries(fIncludeDirectoryEntriesCheckbox.getSelection());
+ fJarPackage.setOverwrite(fOverwriteCheckbox.getSelection());
+ }
+
+ /**
+ * Returns the resource for the specified path.
+ *
+ * @param path the path for which the resource should be returned
+ * @return the resource specified by the path or <code>null</code>
+ */
+ protected IResource findResource(IPath path) {
+ IWorkspace workspace= ResourcesPlugin.getWorkspace();
+ IStatus result= workspace.validatePath(
+ path.toString(),
+ IResource.ROOT | IResource.PROJECT | IResource.FOLDER | IResource.FILE);
+ if (result.isOK() && workspace.getRoot().exists(path))
+ return workspace.getRoot().findMember(path);
+ return null;
+ }
+
+ /**
+ * Creates the checkbox tree and list for selecting resources.
+ *
+ * @param parent the parent control
+ */
+ protected void createInputGroup(Composite parent) {
+ int labelFlags= JavaElementLabelProvider.SHOW_BASICS
+ | JavaElementLabelProvider.SHOW_OVERLAY_ICONS
+ | JavaElementLabelProvider.SHOW_SMALL_ICONS;
+ ITreeContentProvider treeContentProvider=
+ new StandardJavaElementContentProvider() {
+ @Override
+ public boolean hasChildren(Object element) {
+ // prevent the + from being shown in front of packages
+ return !(element instanceof IPackageFragment) && super.hasChildren(element);
+ }
+ };
+ final DecoratingLabelProvider provider= new DecoratingLabelProvider(new JavaElementLabelProvider(labelFlags), new ProblemsLabelDecorator(null));
+ fInputGroup= new CheckboxTreeAndListGroup(
+ parent,
+ JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()),
+ treeContentProvider,
+ provider,
+ new StandardJavaElementContentProvider(),
+ provider,
+ SWT.NONE,
+ SIZING_SELECTION_WIDGET_WIDTH,
+ SIZING_SELECTION_WIDGET_HEIGHT) {
+
+ @Override
+ protected void setTreeChecked(final Object element, final boolean state) {
+ if (fInitiallySelecting && element instanceof IResource) {
+ final IResource resource= (IResource) element;
+ if (resource.getName().charAt(0) == '.')
+ return;
+ }
+ super.setTreeChecked(element, state);
+ }
+ };
+ fInputGroup.addTreeFilter(new EmptyInnerPackageFilter());
+ fInputGroup.setTreeComparator(new JavaElementComparator());
+ fInputGroup.setListComparator(new JavaElementComparator());
+ fInputGroup.addTreeFilter(new ContainerFilter(ContainerFilter.FILTER_NON_CONTAINERS));
+ fInputGroup.addTreeFilter(new ViewerFilter() {
+ @Override
+ public boolean select(Viewer viewer, Object p, Object element) {
+ if (element instanceof IPackageFragmentRoot) {
+ IPackageFragmentRoot root= (IPackageFragmentRoot) element;
+ return !root.isArchive() && !root.isExternal();
+ }
+ return true;
+ }
+ });
+ fInputGroup.addListFilter(new ContainerFilter(ContainerFilter.FILTER_CONTAINERS));
+ fInputGroup.getTree().addListener(SWT.MouseUp, this);
+ fInputGroup.getTable().addListener(SWT.MouseUp, this);
+
+ SWTUtil.setAccessibilityText(fInputGroup.getTree(), JarPackagerMessages.JarPackageWizardPage_tree_accessibility_message);
+ SWTUtil.setAccessibilityText(fInputGroup.getTable(), JarPackagerMessages.JarPackageWizardPage_table_accessibility_message);
+
+ ICheckStateListener listener = new ICheckStateListener() {
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ update();
+ }
+ };
+
+ fInputGroup.addCheckStateListener(listener);
+ }
+
+ /**
+ * Creates the export type controls.
+ *
+ * @param parent
+ * the parent control
+ */
+ protected void createExportTypeGroup(Composite parent) {
+ Composite optionsGroup= new Composite(parent, SWT.NONE);
+ GridLayout layout= new GridLayout();
+ layout.marginHeight= 0;
+ optionsGroup.setLayout(layout);
+
+ fExportClassFilesCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+ fExportClassFilesCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_exportClassFiles_text);
+ fExportClassFilesCheckbox.addListener(SWT.Selection, this);
+
+ fExportOutputFoldersCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+ fExportOutputFoldersCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_exportOutputFolders_text);
+ fExportOutputFoldersCheckbox.addListener(SWT.Selection, this);
+
+ fExportJavaFilesCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+ fExportJavaFilesCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_exportJavaFiles_text);
+ fExportJavaFilesCheckbox.addListener(SWT.Selection, this);
+
+ Composite refactoringsGroup= new Composite(optionsGroup, SWT.NONE);
+ layout= new GridLayout();
+ layout.horizontalSpacing= 0;
+ layout.marginWidth= 0;
+ layout.marginHeight= 0;
+ layout.numColumns= 2;
+ refactoringsGroup.setLayout(layout);
+
+ fExportRefactoringsCheckbox= new Button(refactoringsGroup, SWT.CHECK | SWT.LEFT);
+ fExportRefactoringsCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_refactorings_text);
+ fExportRefactoringsCheckbox.addListener(SWT.Selection, this);
+
+ fRefactoringLink= new Link(refactoringsGroup, SWT.WRAP);
+ fRefactoringLink.setText(JarPackagerMessages.JarPackageWizardPage_configure_label);
+ fRefactoringLink.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ openRefactoringDialog();
+ }
+
+ });
+ fRefactoringLink.setToolTipText(JarPackagerMessages.JarPackageWizardPage_configure_tooltip);
+ GridData data= new GridData(GridData.BEGINNING | GridData.GRAB_HORIZONTAL);
+ fRefactoringLink.setLayoutData(data);
+
+ fExportRefactoringsCheckbox.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ fRefactoringLink.setEnabled(fExportRefactoringsCheckbox.getSelection());
+ }
+ });
+ }
+
+ /**
+ * Opens the dialog to configure refactorings.
+ */
+ protected void openRefactoringDialog() {
+ final RefactoringHistory[] history= { null};
+ final IRefactoringHistoryService service= RefactoringCore.getHistoryService();
+ try {
+ service.connect();
+ final Set<IProject> set= new HashSet<IProject>();
+ final Object[] elements= fJarPackage.getElements();
+ for (int index= 0; index < elements.length; index++) {
+ if (elements[index] instanceof IAdaptable) {
+ final IAdaptable adaptable= (IAdaptable) elements[index];
+ final IResource resource= (IResource) adaptable.getAdapter(IResource.class);
+ if (resource != null)
+ set.add(resource.getProject());
+ }
+ }
+ try {
+ getContainer().run(false, true, new IRunnableWithProgress() {
+
+ public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ history[0]= service.getRefactoringHistory(set.toArray(new IProject[set.size()]), 0, Long.MAX_VALUE, JavaRefactoringDescriptor.JAR_MIGRATION, monitor);
+ }
+ });
+ } catch (InvocationTargetException exception) {
+ ExceptionHandler.handle(exception, getShell(), JarPackagerMessages.JarPackageWizardPage_error_caption, JarPackagerMessages.JarPackageWizardPage_error_label);
+ return;
+ } catch (InterruptedException exception) {
+ return;
+ }
+ new JarRefactoringDialog(getShell(), getDialogSettings(), fJarPackage, history[0]).open();
+ updatePageCompletion();
+ } finally {
+ service.disconnect();
+ }
+ }
+
+ /**
+ * Updates the enablement of this page's controls. Subclasses may extend.
+ */
+ @Override
+ protected void updateWidgetEnablements() {
+ if (fExportRefactoringsCheckbox != null) {
+ final boolean selection= fExportRefactoringsCheckbox.getSelection();
+ fIncludeDirectoryEntriesCheckbox.setEnabled(!selection);
+ if (selection) {
+ fIncludeDirectoryEntriesCheckbox.setSelection(true);
+ fJarPackage.setIncludeDirectoryEntries(true);
+ }
+ }
+ }
+
+ /*
+ * Overrides method from IJarPackageWizardPage
+ */
+ @Override
+ public boolean isPageComplete() {
+ boolean complete= validateSourceGroup();
+ complete= validateDestinationGroup() && complete;
+ complete= validateOptionsGroup() && complete;
+ if (complete)
+ setErrorMessage(null);
+ return complete;
+ }
+
+ @Override
+ protected void updatePageCompletion() {
+ boolean pageComplete= isPageComplete();
+ setPageComplete(pageComplete);
+ if (pageComplete)
+ setErrorMessage(null);
+ updateRefactoringMessage();
+ }
+
+ protected void updateRefactoringMessage() {
+ String currentMessage= getMessage();
+ if (fJarPackage.isRefactoringAware() && fJarPackage.getRefactoringDescriptors().length == 0) {
+ if (currentMessage == null)
+ setMessage(JarPackagerMessages.JarPackageWizardPage_no_refactorings_selected, IMessageProvider.INFORMATION);
+ } else if (JarPackagerMessages.JarPackageWizardPage_no_refactorings_selected.equals(currentMessage))
+ setMessage(null);
+ }
+
+ /*
+ * Overrides method from WizardDataTransferPage
+ */
+ @Override
+ protected boolean validateOptionsGroup() {
+ return true;
+ }
+
+ /*
+ * Overrides method from WizardDataTransferPage
+ */
+ @Override
+ protected boolean validateSourceGroup() {
+ if (!(fExportClassFilesCheckbox.getSelection() || fExportOutputFoldersCheckbox.getSelection() || fExportJavaFilesCheckbox.getSelection())) {
+ setErrorMessage(JarPackagerMessages.JarPackageWizardPage_error_noExportTypeChecked);
+ return false;
+ }
+
+ if (getSelectedResources().size() == 0) {
+ if (getErrorMessage() != null)
+ setErrorMessage(null);
+ return false;
+ }
+ if (fExportClassFilesCheckbox.getSelection() || fExportOutputFoldersCheckbox.getSelection())
+ return true;
+
+ // Source file only export - check if there are source files
+ Iterator<Object> iter= getSelectedResourcesIterator();
+ while (iter.hasNext()) {
+ Object element= iter.next();
+ if (element instanceof IClassFile) {
+ IPackageFragmentRoot root= (IPackageFragmentRoot)((IClassFile)element).getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
+ if (root == null)
+ continue;
+ IClasspathEntry cpEntry;
+ try {
+ cpEntry= root.getRawClasspathEntry();
+ } catch (JavaModelException e) {
+ continue;
+ }
+ if (cpEntry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
+ return true;
+ }
+ } else {
+ return true;
+ }
+ }
+
+ if (getErrorMessage() != null)
+ setErrorMessage(null);
+ return false;
+ }
+
+ /**
+ * Creates a file resource handle for the file with the given workspace path.
+ * This method does not create the file resource; this is the responsibility
+ * of <code>createFile</code>.
+ *
+ * @param filePath the path of the file resource to create a handle for
+ * @return the new file resource handle
+ */
+ protected IFile createFileHandle(IPath filePath) {
+ if (filePath.isValidPath(filePath.toString()) && filePath.segmentCount() >= 2)
+ return ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
+ else
+ return null;
+ }
+
+ /*
+ * Overrides method from WizardExportResourcePage
+ */
+ @Override
+ protected void setupBasedOnInitialSelections() {
+ Iterator<?> iterator= fInitialSelection.iterator();
+ while (iterator.hasNext()) {
+ Object selectedElement= iterator.next();
+
+ if (selectedElement instanceof IResource && !((IResource)selectedElement).isAccessible())
+ continue;
+
+ if (selectedElement instanceof IJavaElement && !((IJavaElement)selectedElement).exists())
+ continue;
+
+ if (selectedElement instanceof ICompilationUnit || selectedElement instanceof IClassFile || selectedElement instanceof IFile)
+ fInputGroup.initialCheckListItem(selectedElement);
+ else {
+ if (selectedElement instanceof IFolder) {
+ // Convert resource to Java element if possible
+ IJavaElement je= JavaCore.create((IResource)selectedElement);
+ if (je != null && je.exists() && je.getJavaProject().isOnClasspath((IResource)selectedElement))
+ selectedElement= je;
+ }
+ try {
+ fInputGroup.initialCheckTreeItem(selectedElement);
+ } finally {
+ fInitiallySelecting= false;
+ }
+ }
+ }
+
+ TreeItem[] items= fInputGroup.getTree().getItems();
+ int i= 0;
+ while (i < items.length && !items[i].getChecked())
+ i++;
+ if (i < items.length) {
+ fInputGroup.getTree().setSelection(new TreeItem[] {items[i]});
+ fInputGroup.getTree().showSelection();
+ fInputGroup.populateListViewer(items[i].getData());
+ }
+ }
+
+ /*
+ * Method declared on IWizardPage.
+ */
+ @Override
+ public void setPreviousPage(IWizardPage page) {
+ super.setPreviousPage(page);
+ if (getControl() != null)
+ updatePageCompletion();
+ }
+
+ Object[] getSelectedElementsWithoutContainedChildren() {
+ Set<Object> closure= removeContainedChildren(fInputGroup.getWhiteCheckedTreeItems());
+ closure.addAll(getExportedNonContainers());
+ return closure.toArray();
+ }
+
+ private Set<Object> removeContainedChildren(Set<Object> elements) {
+ Set<Object> newList= new HashSet<Object>(elements.size());
+ Set<Object> javaElementResources= getCorrespondingContainers(elements);
+ Iterator<Object> iter= elements.iterator();
+ boolean removedOne= false;
+ while (iter.hasNext()) {
+ Object element= iter.next();
+ Object parent;
+ if (element instanceof IResource)
+ parent= ((IResource)element).getParent();
+ else if (element instanceof IJavaElement) {
+ parent= ((IJavaElement)element).getParent();
+ if (parent instanceof IPackageFragmentRoot) {
+ IPackageFragmentRoot pkgRoot= (IPackageFragmentRoot)parent;
+ try {
+ if (pkgRoot.getCorrespondingResource() instanceof IProject)
+ parent= pkgRoot.getJavaProject();
+ } catch (JavaModelException ex) {
+ // leave parent as is
+ }
+ }
+ }
+ else {
+ // unknown type
+ newList.add(element);
+ continue;
+ }
+ if (element instanceof IJavaModel || ((!(parent instanceof IJavaModel)) && (elements.contains(parent) || javaElementResources.contains(parent))))
+ removedOne= true;
+ else
+ newList.add(element);
+ }
+ if (removedOne)
+ return removeContainedChildren(newList);
+ else
+ return newList;
+ }
+
+ private Set<Object> getExportedNonContainers() {
+ Set<Object> whiteCheckedTreeItems= fInputGroup.getWhiteCheckedTreeItems();
+ Set<Object> exportedNonContainers= new HashSet<Object>(whiteCheckedTreeItems.size());
+ Set<Object> javaElementResources= getCorrespondingContainers(whiteCheckedTreeItems);
+ Iterator<Object> iter= fInputGroup.getAllCheckedListItems();
+ while (iter.hasNext()) {
+ Object element= iter.next();
+ Object parent= null;
+ if (element instanceof IResource)
+ parent= ((IResource)element).getParent();
+ else if (element instanceof IJavaElement)
+ parent= ((IJavaElement)element).getParent();
+ if (!whiteCheckedTreeItems.contains(parent) && !javaElementResources.contains(parent))
+ exportedNonContainers.add(element);
+ }
+ return exportedNonContainers;
+ }
+
+ /*
+ * Create a list with the folders / projects that correspond
+ * to the Java elements (Java project, package, package root)
+ */
+ private Set<Object> getCorrespondingContainers(Set<Object> elements) {
+ Set<Object> javaElementResources= new HashSet<Object>(elements.size());
+ Iterator<Object> iter= elements.iterator();
+ while (iter.hasNext()) {
+ Object element= iter.next();
+ if (element instanceof IJavaElement) {
+ IJavaElement je= (IJavaElement)element;
+ int type= je.getElementType();
+ if (type == IJavaElement.JAVA_PROJECT || type == IJavaElement.PACKAGE_FRAGMENT || type == IJavaElement.PACKAGE_FRAGMENT_ROOT) {
+ // exclude default package since it is covered by the root
+ if (!(type == IJavaElement.PACKAGE_FRAGMENT && ((IPackageFragment)element).isDefaultPackage())) {
+ Object resource;
+ try {
+ resource= je.getCorrespondingResource();
+ } catch (JavaModelException ex) {
+ resource= null;
+ }
+ if (resource != null)
+ javaElementResources.add(resource);
+ }
+ }
+ }
+ }
+ return javaElementResources;
+ }
+
+ private Object[] getSelectedElements() {
+ return getSelectedResources().toArray();
+ }
+}