]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/jarpackager/JarOptionsPage.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-before / ui / org / eclipse / jdt / internal / ui / jarpackager / JarOptionsPage.java
diff --git a/case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/jarpackager/JarOptionsPage.java b/case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/jarpackager/JarOptionsPage.java
new file mode 100644 (file)
index 0000000..7583dfc
--- /dev/null
@@ -0,0 +1,453 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+package org.eclipse.jdt.internal.ui.jarpackager;
+
+import org.eclipse.swt.SWT;
+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.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+
+import org.eclipse.core.resources.IFile;
+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.resource.JFaceResources;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+
+import org.eclipse.jdt.internal.corext.util.Messages;
+
+import org.eclipse.jdt.ui.jarpackager.JarPackageData;
+
+import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.util.SWTUtil;
+
+/**
+ *     Page 2 of the JAR Package wizard
+ */
+class JarOptionsPage extends WizardPage implements IJarPackageWizardPage {
+
+       // Untyped listener
+       private class UntypedListener implements Listener {
+               /*
+                * Implements method from Listener
+                */
+               public void handleEvent(Event e) {
+                       if (getControl() == null)
+                               return;
+                       update();
+               }
+       }
+
+       private JarPackageData fJarPackage;
+
+       // widgets
+       private Button          fExportErrorsCheckbox;
+       private Button          fExportWarningsCheckbox;
+       private Button          fUseSourceFoldersCheckbox;
+       private Composite       fDescriptionFileGroup;
+       private Button          fSaveDescriptionCheckbox;
+       private Label           fDescriptionFileLabel;
+       private Text            fDescriptionFileText;
+       private Button          fDescriptionFileBrowseButton;
+       private Button          fBuildIfNeededCheckbox;
+
+       // dialog store id constants
+       private final static String PAGE_NAME= "jarOptionsWizardPage"; //$NON-NLS-1$
+
+       private final static String STORE_EXPORT_WARNINGS= PAGE_NAME + ".EXPORT_WARNINGS"; //$NON-NLS-1$
+       private final static String STORE_EXPORT_ERRORS= PAGE_NAME + ".EXPORT_ERRORS"; //$NON-NLS-1$
+       private final static String STORE_SAVE_DESCRIPTION= PAGE_NAME + ".SAVE_DESCRIPTION"; //$NON-NLS-1$
+       private final static String STORE_DESCRIPTION_LOCATION= PAGE_NAME + ".DESCRIPTION_LOCATION"; //$NON-NLS-1$
+       private final static String STORE_USE_SRC_FOLDERS= PAGE_NAME + ".STORE_USE_SRC_FOLDERS"; //$NON-NLS-1$
+       private final static String STORE_BUILD_IF_NEEDED= PAGE_NAME + ".BUILD_IF_NEEDED"; //$NON-NLS-1$
+
+       /**
+        *      Create an instance of this class
+        * @param jarPackage
+        */
+       public JarOptionsPage(JarPackageData jarPackage) {
+               super(PAGE_NAME);
+               setTitle(JarPackagerMessages.JarOptionsPage_title);
+               setDescription(JarPackagerMessages.JarOptionsPage_description);
+               fJarPackage= jarPackage;
+       }
+
+       /*
+        * Method declared on IDialogPage.
+        */
+       public void createControl(Composite parent) {
+               Composite composite= new Composite(parent, SWT.NULL);
+               composite.setLayout(new GridLayout());
+               composite.setLayoutData(
+                       new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
+
+               createOptionsGroup(composite);
+
+               restoreWidgetValues();
+               setControl(composite);
+               update();
+
+               Dialog.applyDialogFont(composite);
+               PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.JAROPTIONS_WIZARD_PAGE);
+       }
+
+       /**
+        *      Create the export options specification widgets.
+        *
+        *      @param parent org.eclipse.swt.widgets.Composite
+        */
+       protected void createOptionsGroup(Composite parent) {
+
+               initializeDialogUnits(parent);
+
+               Composite optionsGroup= new Composite(parent, SWT.NONE);
+               GridLayout layout= new GridLayout();
+               layout.marginHeight= 0;
+               optionsGroup.setLayout(layout);
+
+               createLabel(optionsGroup, JarPackagerMessages.JarOptionsPage_howTreatProblems_label, false);
+
+               UntypedListener selectionListener= new UntypedListener();
+
+               fExportErrorsCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+               fExportErrorsCheckbox.setText(JarPackagerMessages.JarOptionsPage_exportErrors_text);
+               fExportErrorsCheckbox.addListener(SWT.Selection, selectionListener);
+
+               fExportWarningsCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+               fExportWarningsCheckbox.setText(JarPackagerMessages.JarOptionsPage_exportWarnings_text);
+               fExportWarningsCheckbox.addListener(SWT.Selection, selectionListener);
+
+               createSpacer(optionsGroup);
+
+               fUseSourceFoldersCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+               fUseSourceFoldersCheckbox.setText(JarPackagerMessages.JarOptionsPage_useSourceFoldersHierarchy);
+               fUseSourceFoldersCheckbox.addListener(SWT.Selection, selectionListener);
+               fUseSourceFoldersCheckbox.setEnabled(fJarPackage.areJavaFilesExported() && !fJarPackage.areGeneratedFilesExported());
+
+               createSpacer(optionsGroup);
+
+               fBuildIfNeededCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+               fBuildIfNeededCheckbox.setText(JarPackagerMessages.JarOptionsPage_buildIfNeeded);
+               fBuildIfNeededCheckbox.addListener(SWT.Selection, selectionListener);
+
+               createSpacer(optionsGroup);
+
+               fSaveDescriptionCheckbox= new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
+               fSaveDescriptionCheckbox.setText(JarPackagerMessages.JarOptionsPage_saveDescription_text);
+               fSaveDescriptionCheckbox.addListener(SWT.Selection, selectionListener);
+               createDescriptionFileGroup(parent);
+       }
+
+       /**
+        * 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>.
+        */
+       public final void saveWidgetValues() {
+               // update directory names history
+               IDialogSettings settings= getDialogSettings();
+               if (settings != null) {
+                       settings.put(STORE_EXPORT_WARNINGS, fJarPackage.exportWarnings());
+                       settings.put(STORE_EXPORT_ERRORS, fJarPackage.areErrorsExported());
+                       settings.put(STORE_USE_SRC_FOLDERS, fJarPackage.useSourceFolderHierarchy());
+                       settings.put(STORE_BUILD_IF_NEEDED, fJarPackage.isBuildingIfNeeded());
+                       settings.put(STORE_SAVE_DESCRIPTION, fJarPackage.isDescriptionSaved());
+                       settings.put(STORE_DESCRIPTION_LOCATION, fJarPackage.getDescriptionLocation().toString());
+               }
+               // Allow subclasses to save values
+               internalSaveWidgetValues();
+       }
+
+       /**
+        * Hook method for subclasses to persist their settings.
+        */
+       protected void internalSaveWidgetValues() {
+       }
+
+       /**
+        *      Hook method for restoring widget values to the values that they held
+        *      last time this wizard was used to completion.
+        */
+       protected void restoreWidgetValues() {
+               if (!((JarPackageWizard)getWizard()).isInitializingFromJarPackage())
+                       initializeJarPackage();
+
+               fExportWarningsCheckbox.setSelection(fJarPackage.exportWarnings());
+               fExportErrorsCheckbox.setSelection(fJarPackage.areErrorsExported());
+               fBuildIfNeededCheckbox.setSelection(fJarPackage.isBuildingIfNeeded());
+               fUseSourceFoldersCheckbox.setSelection(fJarPackage.useSourceFolderHierarchy());
+               fSaveDescriptionCheckbox.setSelection(fJarPackage.isDescriptionSaved());
+               fDescriptionFileText.setText(fJarPackage.getDescriptionLocation().toString());
+       }
+
+       /**
+        *      Initializes the JAR package from last used wizard page values.
+        */
+       protected void initializeJarPackage() {
+               IDialogSettings settings= getDialogSettings();
+               if (settings != null) {
+                       fJarPackage.setExportWarnings(settings.getBoolean(STORE_EXPORT_WARNINGS));
+                       fJarPackage.setExportErrors(settings.getBoolean(STORE_EXPORT_ERRORS));
+                       fJarPackage.setUseSourceFolderHierarchy(settings.getBoolean(STORE_USE_SRC_FOLDERS));
+                       fJarPackage.setSaveDescription(false); // bug 15877
+                       String pathStr= settings.get(STORE_DESCRIPTION_LOCATION);
+                       if (pathStr == null)
+                               pathStr= ""; //$NON-NLS-1$
+                       fJarPackage.setDescriptionLocation(new Path(pathStr));
+                       if (settings.get(STORE_BUILD_IF_NEEDED) != null)
+                               fJarPackage.setBuildIfNeeded(settings.getBoolean(STORE_BUILD_IF_NEEDED));
+               }
+       }
+
+       private void update() {
+               updateModel();
+               updateWidgetEnablements();
+               updatePageCompletion();
+       }
+
+       /**
+        *      Stores the widget values in the JAR package.
+        */
+       protected void updateModel() {
+               if (getControl() == null)
+                       return;
+               fJarPackage.setExportWarnings(fExportWarningsCheckbox.getSelection());
+               fJarPackage.setExportErrors(fExportErrorsCheckbox.getSelection());
+               fJarPackage.setBuildIfNeeded(fBuildIfNeededCheckbox.getSelection());
+               fJarPackage.setSaveDescription(fSaveDescriptionCheckbox.getSelection());
+               fJarPackage.setDescriptionLocation(new Path(fDescriptionFileText.getText()));
+               fJarPackage.setUseSourceFolderHierarchy(fUseSourceFoldersCheckbox.getSelection());
+       }
+
+       /**
+        *      Open an appropriate destination browser so that the user can specify a source
+        *      to import from
+        */
+       protected void handleDescriptionFileBrowseButtonPressed() {
+               SaveAsDialog dialog= new SaveAsDialog(getContainer().getShell());
+               dialog.create();
+               dialog.getShell().setText(JarPackagerMessages.JarOptionsPage_saveAsDialog_title);
+               dialog.setMessage(JarPackagerMessages.JarOptionsPage_saveAsDialog_message);
+               dialog.setOriginalFile(createFileHandle(fJarPackage.getDescriptionLocation()));
+               if (dialog.open() == Window.OK) {
+                       IPath path= dialog.getResult();
+                       path= path.removeFileExtension().addFileExtension(JarPackagerUtil.DESCRIPTION_EXTENSION);
+                       fDescriptionFileText.setText(path.toString());
+               }
+       }
+
+       /**
+        * Updates the enablements of this page's controls. Subclasses may extend.
+        */
+       protected void updateWidgetEnablements() {
+               boolean saveDescription= fSaveDescriptionCheckbox.getSelection();
+               fDescriptionFileGroup.setEnabled(saveDescription);
+               fDescriptionFileBrowseButton.setEnabled(saveDescription);
+               fDescriptionFileText.setEnabled(saveDescription);
+               fDescriptionFileLabel.setEnabled(saveDescription);
+
+               boolean exportClassFiles= fJarPackage.areClassFilesExported() && !fJarPackage.areOutputFoldersExported();
+               fExportWarningsCheckbox.setEnabled(exportClassFiles);
+               fExportErrorsCheckbox.setEnabled(exportClassFiles);
+
+               boolean isAutobuilding= ResourcesPlugin.getWorkspace().isAutoBuilding();
+               fBuildIfNeededCheckbox.setEnabled(exportClassFiles && !isAutobuilding);
+
+               fUseSourceFoldersCheckbox.setEnabled(fJarPackage.areJavaFilesExported() && !fJarPackage.areGeneratedFilesExported());
+       }
+
+       /*
+        * Implements method from IJarPackageWizardPage
+        */
+       @Override
+       public boolean isPageComplete() {
+               if (fJarPackage.isDescriptionSaved()){
+                       if (fJarPackage.getDescriptionLocation().toString().length() == 0) {
+                               setErrorMessage(null);
+                               return false;
+                       }
+                       IPath location= fJarPackage.getDescriptionLocation();
+                       if (!location.toString().startsWith("/")) { //$NON-NLS-1$
+                               setErrorMessage(JarPackagerMessages.JarOptionsPage_error_descriptionMustBeAbsolute);
+                               return false;
+                       }
+                       IResource resource= findResource(location);
+                       if (resource != null && resource.getType() != IResource.FILE) {
+                               setErrorMessage(JarPackagerMessages.JarOptionsPage_error_descriptionMustNotBeExistingContainer);
+                               return false;
+                       }
+                       resource= findResource(location.removeLastSegments(1));
+                       if (resource == null || resource.getType() == IResource.FILE) {
+                               setErrorMessage(JarPackagerMessages.JarOptionsPage_error_descriptionContainerDoesNotExist);
+                               return false;
+                       }
+                       String fileExtension= fJarPackage.getDescriptionLocation().getFileExtension();
+                       if (fileExtension == null || !fileExtension.equals(JarPackagerUtil.DESCRIPTION_EXTENSION)) {
+                               setErrorMessage(Messages.format(JarPackagerMessages.JarOptionsPage_error_invalidDescriptionExtension, JarPackagerUtil.DESCRIPTION_EXTENSION));
+                               return false;
+                       }
+               }
+               setErrorMessage(null);
+               return true;
+       }
+
+       @Override
+       public boolean canFlipToNextPage() {
+               return fJarPackage.areGeneratedFilesExported() && super.canFlipToNextPage();
+       }
+
+       /*
+        * Overrides method from WizardDataTransferPage
+        */
+       protected void createDescriptionFileGroup(Composite parent) {
+               // destination specification group
+               fDescriptionFileGroup= new Composite(parent, SWT.NONE);
+               GridLayout layout= new GridLayout();
+               layout.numColumns= 3;
+               fDescriptionFileGroup.setLayout(layout);
+               fDescriptionFileGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
+
+               fDescriptionFileLabel= new Label(fDescriptionFileGroup, SWT.NONE);
+               fDescriptionFileLabel.setText(JarPackagerMessages.JarOptionsPage_descriptionFile_label);
+
+               // destination name entry field
+               fDescriptionFileText= new Text(fDescriptionFileGroup, SWT.SINGLE | SWT.BORDER);
+               fDescriptionFileText.addListener(SWT.Modify, new UntypedListener());
+               GridData data= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
+               data.widthHint= convertWidthInCharsToPixels(40);
+               fDescriptionFileText.setLayoutData(data);
+
+               // destination browse button
+               fDescriptionFileBrowseButton= new Button(fDescriptionFileGroup, SWT.PUSH);
+               fDescriptionFileBrowseButton.setText(JarPackagerMessages.JarOptionsPage_browseButton_text);
+               fDescriptionFileBrowseButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+               SWTUtil.setButtonDimensionHint(fDescriptionFileBrowseButton);
+               fDescriptionFileBrowseButton.addSelectionListener(new SelectionAdapter() {
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               handleDescriptionFileBrowseButtonPressed();
+                       }
+               });
+       }
+
+       /**
+        * 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 JavaPlugin.getWorkspace().getRoot().getFile(filePath);
+               else
+                       return null;
+       }
+       /*
+        * Method declared on IWizardPage.
+        */
+       @Override
+       public void setPreviousPage(IWizardPage page) {
+               super.setPreviousPage(page);
+               updateWidgetEnablements();
+               if (getControl() != null)
+                       updatePageCompletion();
+       }
+
+       /*
+        * Implements method from IJarPackageWizardPage.
+        */
+       public void finish() {
+               saveWidgetValues();
+       }
+
+       /**
+        * Creates a new label with a bold font.
+        *
+        * @param parent the parent control
+        * @param text the label text
+        * @param bold bold or not
+        * @return the new label control
+        */
+       protected Label createLabel(Composite parent, String text, boolean bold) {
+               Label label= new Label(parent, SWT.NONE);
+               if (bold)
+                       label.setFont(JFaceResources.getBannerFont());
+               label.setText(text);
+               GridData data= new GridData();
+               data.verticalAlignment= GridData.FILL;
+               data.horizontalAlignment= GridData.FILL;
+               label.setLayoutData(data);
+               return label;
+       }
+
+       /**
+        * Creates a horizontal spacer line that fills the width of its container.
+        *
+        * @param parent the parent control
+        */
+       protected void createSpacer(Composite parent) {
+               Label spacer= new Label(parent, SWT.NONE);
+               GridData data= new GridData();
+               data.horizontalAlignment= GridData.FILL;
+               data.verticalAlignment= GridData.BEGINNING;
+               spacer.setLayoutData(data);
+       }
+
+       /**
+        * Determine if the page is complete and update the page appropriately.
+        */
+       protected void updatePageCompletion() {
+               boolean pageComplete= isPageComplete();
+               setPageComplete(pageComplete);
+               if (pageComplete) {
+                       setErrorMessage(null);
+               }
+       }
+
+       /**
+        * 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= JavaPlugin.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;
+       }
+}