]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/preferences/BuildPathsPropertyPage.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-after / ui / org / eclipse / jdt / internal / ui / preferences / BuildPathsPropertyPage.java
diff --git a/case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/preferences/BuildPathsPropertyPage.java b/case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/preferences/BuildPathsPropertyPage.java
new file mode 100644 (file)
index 0000000..c657d65
--- /dev/null
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2012 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.preferences;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.preference.IPreferencePageContainer;
+
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
+
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+
+import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.actions.WorkbenchRunnableAdapter;
+import org.eclipse.jdt.internal.ui.dialogs.StatusUtil;
+import org.eclipse.jdt.internal.ui.util.BusyIndicatorRunnableContext;
+import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
+import org.eclipse.jdt.internal.ui.wizards.IStatusChangeListener;
+import org.eclipse.jdt.internal.ui.wizards.buildpaths.BuildPathsBlock;
+
+/**
+ * Property page for configuring the Java build path
+ */
+public class BuildPathsPropertyPage extends PropertyPage implements IStatusChangeListener {
+
+       public static final String PROP_ID= "org.eclipse.jdt.ui.propertyPages.BuildPathsPropertyPage"; //$NON-NLS-1$
+
+       private static final String PAGE_SETTINGS= "BuildPathsPropertyPage"; //$NON-NLS-1$
+       private static final String INDEX= "pageIndex"; //$NON-NLS-1$
+
+       public static final Object DATA_ADD_ENTRY= "add_classpath_entry"; //$NON-NLS-1$
+
+       public static final Object DATA_REVEAL_ENTRY= "select_classpath_entry"; //$NON-NLS-1$
+       public static final Object DATA_REVEAL_ATTRIBUTE_KEY= "select_classpath_attribute_key"; //$NON-NLS-1$
+
+       public static final Object DATA_BLOCK= "block_until_buildpath_applied"; //$NON-NLS-1$
+
+       public BuildPathsBlock fBuildPathsBlock;
+       private boolean fBlockOnApply= false;
+
+       /*
+        * @see PreferencePage#createControl(Composite)
+        */
+       @Override
+       protected Control createContents(Composite parent) {
+               // ensure the page has no special buttons
+               noDefaultAndApplyButton();
+
+               IProject project= getProject();
+               Control result;
+               if (project == null || !isJavaProject(project)) {
+                       result= createWithoutJava(parent);
+               } else if (!project.isOpen()) {
+                       result= createForClosedProject(parent);
+               } else {
+                       result= createWithJava(parent, project);
+               }
+               Dialog.applyDialogFont(result);
+               return result;
+       }
+
+       /*
+        * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+        */
+       @Override
+       public void createControl(Composite parent) {
+               super.createControl(parent);
+               PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IJavaHelpContextIds.BUILD_PATH_PROPERTY_PAGE);
+       }
+
+       private IDialogSettings getSettings() {
+               IDialogSettings javaSettings= JavaPlugin.getDefault().getDialogSettings();
+               IDialogSettings pageSettings= javaSettings.getSection(PAGE_SETTINGS);
+               if (pageSettings == null) {
+                       pageSettings= javaSettings.addNewSection(PAGE_SETTINGS);
+                       pageSettings.put(INDEX, 3);
+               }
+               return pageSettings;
+       }
+
+       /*
+        * @see org.eclipse.jface.preference.PreferencePage#okToLeave()
+        * @since 3.5
+        */
+       @Override
+       public boolean okToLeave() {
+               if (fBuildPathsBlock != null && fBuildPathsBlock.hasChangesInDialog()) {
+                       String title= PreferencesMessages.BuildPathsPropertyPage_unsavedchanges_title;
+                       String message= PreferencesMessages.BuildPathsPropertyPage_unsavedchanges_message;
+                       String[] buttonLabels= new String[] {
+                                       PreferencesMessages.BuildPathsPropertyPage_unsavedchanges_button_save,
+                                       PreferencesMessages.BuildPathsPropertyPage_unsavedchanges_button_discard,
+                                       PreferencesMessages.BuildPathsPropertyPage_unsavedchanges_button_ignore
+                       };
+                       MessageDialog dialog= new MessageDialog(getShell(), title, null, message, MessageDialog.QUESTION, buttonLabels, 0);
+                       int res= dialog.open();
+                       if (res == 0) { //save
+                               fBlockOnApply= true;
+                               return performOk() && super.okToLeave();
+                       } else if (res == 1) { // discard
+                               fBuildPathsBlock.init(JavaCore.create(getProject()), null, null);
+                       } else {
+                               // keep unsaved
+                       }
+               }
+               return super.okToLeave();
+       }
+       
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.dialogs.IDialogPage#setVisible(boolean)
+        */
+       @Override
+       public void setVisible(boolean visible) {
+               if (fBuildPathsBlock != null) {
+                       if (visible) {
+                               fBuildPathsBlock.generated_5487073823433925416(this);
+                       }
+               }
+               super.setVisible(visible);
+       }
+
+       /*
+        * Content for valid projects.
+        */
+       private Control createWithJava(Composite parent, IProject project) {
+               IWorkbenchPreferenceContainer pageContainer= null;
+               IPreferencePageContainer container= getContainer();
+               if (container instanceof IWorkbenchPreferenceContainer) {
+                       pageContainer= (IWorkbenchPreferenceContainer) container;
+               }
+
+               fBuildPathsBlock= new BuildPathsBlock(new BusyIndicatorRunnableContext(), this, getSettings().getInt(INDEX), false, pageContainer);
+               return fBuildPathsBlock.generated_1340988248691876684(parent, project);
+       }
+
+       /*
+        * Content for non-Java projects.
+        */
+       private Control createWithoutJava(Composite parent) {
+               Label label= new Label(parent, SWT.LEFT);
+               label.setText(PreferencesMessages.BuildPathsPropertyPage_no_java_project_message);
+
+               fBuildPathsBlock= null;
+               setValid(true);
+               return label;
+       }
+
+       /*
+        * Content for closed projects.
+        */
+       private Control createForClosedProject(Composite parent) {
+               Label label= new Label(parent, SWT.LEFT);
+               label.setText(PreferencesMessages.BuildPathsPropertyPage_closed_project_message);
+
+               fBuildPathsBlock= null;
+               setValid(true);
+               return label;
+       }
+
+       public IProject getProject() {
+        IAdaptable adaptable= getElement();
+               return adaptable == null ? null : (IProject)adaptable.getAdapter(IProject.class);
+       }
+
+       private boolean isJavaProject(IProject proj) {
+               try {
+                       return proj.hasNature(JavaCore.NATURE_ID);
+               } catch (CoreException e) {
+                       JavaPlugin.log(e);
+               }
+               return false;
+       }
+
+       /*
+        * @see IPreferencePage#performOk
+        */
+       @Override
+       public boolean performOk() {
+               if (fBuildPathsBlock != null) {
+                       getSettings().put(INDEX, fBuildPathsBlock.getPageIndex());
+                       if (fBuildPathsBlock.hasChangesInDialog() || fBuildPathsBlock.isClassfileMissing()) {
+                               IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
+                                       public void run(IProgressMonitor monitor)       throws CoreException, OperationCanceledException {
+                                               fBuildPathsBlock.configureJavaProject(monitor);
+                                       }
+                               };
+                               WorkbenchRunnableAdapter op= new WorkbenchRunnableAdapter(runnable);
+                               if (fBlockOnApply) {
+                                       try {
+                                               new ProgressMonitorDialog(getShell()).run(true, true, op);
+                                       } catch (InvocationTargetException e) {
+                                               ExceptionHandler.handle(e, getShell(), PreferencesMessages.BuildPathsPropertyPage_error_title, PreferencesMessages.BuildPathsPropertyPage_error_message);
+                                               return false;
+                                       } catch (InterruptedException e) {
+                                               return false;
+                                       }
+                               } else {
+                                       op.runAsUserJob(PreferencesMessages.BuildPathsPropertyPage_job_title, null);
+                               }
+                       }
+               }
+               return true;
+       }
+
+       /* (non-Javadoc)
+        * @see IStatusChangeListener#statusChanged
+        */
+       public void statusChanged(IStatus status) {
+               setValid(!status.matches(IStatus.ERROR));
+               StatusUtil.applyToStatusLine(this, status);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.preference.PreferencePage#applyData(java.lang.Object)
+        */
+       @Override
+       public void applyData(Object data) {
+               if (data instanceof Map) {
+                       Map<?, ?> map= (Map<?, ?>) data;
+                       Object selectedLibrary= map.get(DATA_REVEAL_ENTRY);
+                       if (selectedLibrary instanceof IClasspathEntry) {
+                               IClasspathEntry entry= (IClasspathEntry) selectedLibrary;
+                               Object attr= map.get(DATA_REVEAL_ATTRIBUTE_KEY);
+                               String attributeKey= attr instanceof String ? (String) attr : null;
+                               if (fBuildPathsBlock != null) {
+                                       fBuildPathsBlock.setElementToReveal(entry, attributeKey);
+                               }
+                       }
+                       Object entryToAdd= map.get(DATA_ADD_ENTRY);
+                       if (entryToAdd instanceof IClasspathEntry) {
+                               if (fBuildPathsBlock != null) {
+                                       fBuildPathsBlock.addElement((IClasspathEntry) entryToAdd);
+                               }
+                       }
+                       fBlockOnApply= Boolean.TRUE.equals(map.get(DATA_BLOCK));
+               }
+       }
+
+}