]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/preferences/formatter/ProfileConfigurationBlock.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-after / ui / org / eclipse / jdt / internal / ui / preferences / formatter / ProfileConfigurationBlock.java
diff --git a/case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/preferences/formatter/ProfileConfigurationBlock.java b/case-study/jdt-after/ui/org/eclipse/jdt/internal/ui/preferences/formatter/ProfileConfigurationBlock.java
new file mode 100644 (file)
index 0000000..e2c0238
--- /dev/null
@@ -0,0 +1,492 @@
+/*******************************************************************************
+ * 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.preferences.formatter;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Observable;
+import java.util.Observer;
+
+import org.osgi.service.prefs.BackingStoreException;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.StatusDialog;
+import org.eclipse.jface.layout.PixelConverter;
+import org.eclipse.jface.window.Window;
+
+import org.eclipse.jdt.core.JavaCore;
+
+import org.eclipse.jdt.internal.corext.util.Messages;
+
+import org.eclipse.jdt.ui.JavaUI;
+
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.preferences.PreferencesAccess;
+import org.eclipse.jdt.internal.ui.preferences.PreferencesMessages;
+import org.eclipse.jdt.internal.ui.preferences.formatter.ProfileManager.CustomProfile;
+import org.eclipse.jdt.internal.ui.preferences.formatter.ProfileManager.Profile;
+import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
+import org.eclipse.jdt.internal.ui.util.SWTUtil;
+import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
+
+
+public abstract class ProfileConfigurationBlock {
+
+       private class StoreUpdater implements Observer {
+
+               public StoreUpdater() {
+                       fProfileManager.addObserver(this);
+               }
+
+               public void update(Observable o, Object arg) {
+                       try {
+                               fPreferenceListenerEnabled= false;
+                       final int value= ((Integer)arg).intValue();
+                       switch (value) {
+                       case ProfileManager.PROFILE_DELETED_EVENT:
+                       case ProfileManager.PROFILE_RENAMED_EVENT:
+                       case ProfileManager.PROFILE_CREATED_EVENT:
+                       case ProfileManager.SETTINGS_CHANGED_EVENT:
+                               try {
+                                       fProfileStore.writeProfiles(fProfileManager.getSortedProfiles(), fInstanceScope); // update profile store
+                                       fProfileManager.commitChanges(fCurrContext);
+                               } catch (CoreException x) {
+                                       JavaPlugin.log(x);
+                               }
+                               break;
+                       case ProfileManager.SELECTION_CHANGED_EVENT:
+                               fProfileManager.commitChanges(fCurrContext);
+                               break;
+                       }
+                       } finally {
+                               fPreferenceListenerEnabled= true;
+                       }
+               }
+       }
+
+       class ProfileComboController implements Observer, SelectionListener {
+
+               private final List<Profile> fSortedProfiles;
+
+               public ProfileComboController() {
+                       fSortedProfiles= fProfileManager.getSortedProfiles();
+                       fProfileCombo.addSelectionListener(this);
+                       fProfileManager.addObserver(this);
+                       updateProfiles();
+                       updateSelection();
+               }
+
+               public void widgetSelected(SelectionEvent e) {
+                       final int index= fProfileCombo.getSelectionIndex();
+                       fProfileManager.setSelected(fSortedProfiles.get(index));
+               }
+
+               public void widgetDefaultSelected(SelectionEvent e) {}
+
+               public void update(Observable o, Object arg) {
+                       if (arg == null) return;
+                       final int value= ((Integer)arg).intValue();
+                       switch (value) {
+                       case ProfileManager.PROFILE_CREATED_EVENT:
+                       case ProfileManager.PROFILE_DELETED_EVENT:
+                       case ProfileManager.PROFILE_RENAMED_EVENT:
+                               updateProfiles();
+                               updateSelection();
+                               break;
+                       case ProfileManager.SELECTION_CHANGED_EVENT:
+                               updateSelection();
+                               break;
+                       }
+               }
+
+               private void updateProfiles() {
+                       fProfileCombo.setItems(fProfileManager.getSortedDisplayNames());
+               }
+
+               private void updateSelection() {
+                       fProfileCombo.setText(fProfileManager.getSelected().getName());
+               }
+       }
+
+       class ButtonController implements Observer, SelectionListener {
+
+               public ButtonController() {
+                       fProfileManager.addObserver(this);
+                       fNewButton.addSelectionListener(this);
+                       fEditButton.addSelectionListener(this);
+                       fDeleteButton.addSelectionListener(this);
+                       fLoadButton.addSelectionListener(this);
+                       fExportAllButton.addSelectionListener(this);
+                       update(fProfileManager, null);
+               }
+
+               public void update(Observable o, Object arg) {
+                       Profile selected= ((ProfileManager)o).getSelected();
+                       final boolean notBuiltIn= !selected.isBuiltInProfile();
+                       fDeleteButton.setEnabled(notBuiltIn);
+               }
+
+               public void widgetSelected(SelectionEvent e) {
+                       final Button button= (Button)e.widget;
+                       if (button == fEditButton)
+                               modifyButtonPressed();
+                       else if (button == fDeleteButton)
+                               deleteButtonPressed();
+                       else if (button == fNewButton)
+                               newButtonPressed();
+                       else if (button == fLoadButton)
+                               loadButtonPressed();
+                       else if(button == fExportAllButton)
+                               exportAllButtonPressed();
+               }
+
+               /**
+                * Exports all the profiles to a file.
+                * 
+                * @since 3.6
+                */
+               private void exportAllButtonPressed() {
+                       final FileDialog dialog= new FileDialog(fComposite.getShell(), SWT.SAVE);
+                       dialog.setText(FormatterMessages.CodingStyleConfigurationBlock_export_profiles_dialog_title);
+                       dialog.setFilterExtensions(new String [] {"*.xml"}); //$NON-NLS-1$
+                       final String lastPath= JavaPlugin.getDefault().getDialogSettings().get(fLastSaveLoadPathKey + ".loadpath"); //$NON-NLS-1$
+                       if (lastPath != null) {
+                               dialog.setFilterPath(lastPath);
+                       }
+                       final String path= dialog.open();
+                       if (path == null)
+                               return;
+
+                       JavaPlugin.getDefault().getDialogSettings().put(fLastSaveLoadPathKey + ".savepath", dialog.getFilterPath()); //$NON-NLS-1$
+
+                       final File file= new File(path);
+                       if (file.exists() && !MessageDialog.openQuestion(fComposite.getShell(), FormatterMessages.CodingStyleConfigurationBlock_export_profiles_overwrite_title, Messages.format(FormatterMessages.CodingStyleConfigurationBlock_export_profiles_overwrite_message, BasicElementLabels.getPathLabel(file)))) {
+                               return;
+                       }
+                       String encoding= ProfileStore.ENCODING;
+                       final IContentType type= Platform.getContentTypeManager().getContentType("org.eclipse.core.runtime.xml"); //$NON-NLS-1$
+                       if (type != null)
+                               encoding= type.getDefaultCharset();
+                       final Collection<Profile> profiles= new ArrayList<Profile>();
+                       profiles.addAll(fProfileManager.getSortedProfiles());
+                       try {
+                               fProfileStore.writeProfilesToFile(profiles, file, encoding);
+                       } catch (CoreException e) {
+                               final String title= FormatterMessages.CodingStyleConfigurationBlock_export_profiles_error_title;
+                               final String message= FormatterMessages.CodingStyleConfigurationBlock_export_profiles_error_message;
+                               ExceptionHandler.handle(e, fComposite.getShell(), title, message);
+                       }
+
+               }
+
+               public void widgetDefaultSelected(SelectionEvent e) {
+               }
+
+               private void modifyButtonPressed() {
+                       final StatusDialog modifyDialog= createModifyDialog(fComposite.getShell(), fProfileManager.getSelected(), fProfileManager, fProfileStore, false);
+                       modifyDialog.open();
+               }
+
+               private void deleteButtonPressed() {
+                       if (MessageDialog.openQuestion(
+                                       fComposite.getShell(),
+                                       FormatterMessages.CodingStyleConfigurationBlock_delete_confirmation_title,
+                                       Messages.format(FormatterMessages.CodingStyleConfigurationBlock_delete_confirmation_question, fProfileManager.getSelected().getName()))) {
+                               fProfileManager.deleteSelected();
+                       }
+               }
+
+               private void newButtonPressed() {
+                       final CreateProfileDialog p= new CreateProfileDialog(fComposite.getShell(), fProfileManager, fProfileVersioner);
+                       if (p.open() != Window.OK)
+                               return;
+                       if (!p.openEditDialog())
+                               return;
+                       final StatusDialog modifyDialog= createModifyDialog(fComposite.getShell(), p.getCreatedProfile(), fProfileManager, fProfileStore, true);
+                       modifyDialog.open();
+               }
+
+               private void loadButtonPressed() {
+                       final FileDialog dialog= new FileDialog(fComposite.getShell(), SWT.OPEN);
+                       dialog.setText(FormatterMessages.CodingStyleConfigurationBlock_load_profile_dialog_title);
+                       dialog.setFilterExtensions(new String [] {"*.xml"}); //$NON-NLS-1$
+                       final String lastPath= JavaPlugin.getDefault().getDialogSettings().get(fLastSaveLoadPathKey + ".loadpath"); //$NON-NLS-1$
+                       if (lastPath != null) {
+                               dialog.setFilterPath(lastPath);
+                       }
+                       final String path= dialog.open();
+                       if (path == null)
+                               return;
+                       JavaPlugin.getDefault().getDialogSettings().put(fLastSaveLoadPathKey + ".loadpath", dialog.getFilterPath()); //$NON-NLS-1$
+
+                       final File file= new File(path);
+                       Collection<Profile> profiles= null;
+                       try {
+                               profiles= fProfileStore.readProfilesFromFile(file);
+                       } catch (CoreException e) {
+                               final String title= FormatterMessages.CodingStyleConfigurationBlock_load_profile_error_title;
+                               final String message= FormatterMessages.CodingStyleConfigurationBlock_load_profile_error_message;
+                               ExceptionHandler.handle(e, fComposite.getShell(), title, message);
+                       }
+                       if (profiles == null || profiles.isEmpty())
+                               return;
+                       Iterator<Profile> iter=profiles.iterator();
+                       while (iter.hasNext()) {
+                               final CustomProfile profile= (CustomProfile)iter.next();
+
+                               if (!fProfileVersioner.getProfileKind().equals(profile.getKind())) {
+                                       final String title= FormatterMessages.CodingStyleConfigurationBlock_load_profile_error_title;
+                                       final String message= Messages.format(FormatterMessages.ProfileConfigurationBlock_load_profile_wrong_profile_message, new String[] { fProfileVersioner.getProfileKind(),
+                                                       profile.getKind() });
+                                       MessageDialog.openError(fComposite.getShell(), title, message);
+                                       return;
+                               }
+
+                               if (profile.getVersion() > fProfileVersioner.getCurrentVersion()) {
+                                       final String title= FormatterMessages.CodingStyleConfigurationBlock_load_profile_error_too_new_title;
+                                       final String message= FormatterMessages.CodingStyleConfigurationBlock_load_profile_error_too_new_message;
+                                       MessageDialog.openWarning(fComposite.getShell(), title, message);
+                               }
+
+                               if (fProfileManager.containsName(profile.getName())) {
+                                       final AlreadyExistsDialog aeDialog= new AlreadyExistsDialog(fComposite.getShell(), profile, fProfileManager);
+                                       if (aeDialog.open() != Window.OK)
+                                               return;
+                               }
+                               fProfileVersioner.update(profile);
+                               fProfileManager.addProfile(profile);
+                       }
+               }
+       }
+
+       /**
+        * The GUI controls
+        */
+       private Composite fComposite;
+       private Combo fProfileCombo;
+       private Button fEditButton;
+       private Button fDeleteButton;
+       private Button fNewButton;
+       private Button fLoadButton;
+       private Button fExportAllButton;
+
+       private PixelConverter fPixConv;
+       /**
+        * The ProfileManager, the model of this page.
+        */
+       final ProfileManager fProfileManager;
+       final IScopeContext fCurrContext;
+       final IScopeContext fInstanceScope;
+       final ProfileStore fProfileStore;
+       private final IProfileVersioner fProfileVersioner;
+       private final String fLastSaveLoadPathKey;
+       private IPreferenceChangeListener fPreferenceListener;
+       private final PreferencesAccess fPreferenceAccess;
+       private boolean fPreferenceListenerEnabled;
+
+       public ProfileConfigurationBlock(IProject project, final PreferencesAccess access, String lastSaveLoadPathKey) {
+
+               fPreferenceAccess= access;
+               fLastSaveLoadPathKey= lastSaveLoadPathKey;
+
+               fProfileVersioner= createProfileVersioner();
+               fProfileStore= createProfileStore(fProfileVersioner);
+               fInstanceScope= access.getInstanceScope();
+               if (project != null) {
+                       fCurrContext= access.getProjectScope(project);
+               } else {
+                       fCurrContext= fInstanceScope;
+               }
+
+               List<Profile> profiles= null;
+        profiles= fProfileStore.generated_6519699636150707677(this, profiles);
+
+               fProfileManager= createProfileManager(profiles, fCurrContext, access, fProfileVersioner);
+
+               new StoreUpdater();
+
+               fPreferenceListenerEnabled= true;
+               fPreferenceListener= new IPreferenceChangeListener() {
+                       public void preferenceChange(PreferenceChangeEvent event) {
+                               if (fPreferenceListenerEnabled) {
+                                       preferenceChanged(event);
+                               }
+                       }
+               };
+               access.getInstanceScope().getNode(JavaUI.ID_PLUGIN).addPreferenceChangeListener(fPreferenceListener);
+
+       }
+
+       /**
+        * Notifies that a preference has been changed.
+        * 
+        * @param event the preference change event
+        */
+       protected void preferenceChanged(PreferenceChangeEvent event) {
+
+       }
+
+       protected abstract IProfileVersioner createProfileVersioner();
+
+       protected abstract ProfileStore createProfileStore(IProfileVersioner versioner);
+
+       protected abstract ProfileManager createProfileManager(List<Profile> profiles, IScopeContext context, PreferencesAccess access, IProfileVersioner profileVersioner);
+
+       protected abstract ModifyDialog createModifyDialog(Shell shell, Profile profile, ProfileManager profileManager, ProfileStore profileStore, boolean newProfile);
+
+       protected abstract void configurePreview(Composite composite, int numColumns, ProfileManager profileManager);
+
+       private static Button createButton(Composite composite, String text, final int style) {
+               final Button button= new Button(composite, SWT.PUSH);
+               button.setFont(composite.getFont());
+               button.setText(text);
+
+               final GridData gd= new GridData(style);
+               gd.widthHint= SWTUtil.getButtonWidthHint(button);
+               button.setLayoutData(gd);
+               return button;
+       }
+
+       /**
+        * Create the contents
+        * @param parent Parent composite
+        * @return Created control
+        */
+       public Composite createContents(Composite parent) {
+
+               final int numColumns = 5;
+
+               fPixConv = new PixelConverter(parent);
+               fComposite = createComposite(parent, numColumns);
+
+               Label profileLabel= new Label(fComposite, SWT.NONE);
+               profileLabel.setText(PreferencesMessages.CleanUpPreferencePage_Description);
+               GridData data= new GridData(SWT.FILL, SWT.FILL, true, false);
+               data.horizontalSpan= numColumns;
+               profileLabel.setLayoutData(data);
+
+               fProfileCombo= createProfileCombo(fComposite, 3, fPixConv.convertWidthInCharsToPixels(20));
+               fEditButton= createButton(fComposite, FormatterMessages.CodingStyleConfigurationBlock_edit_button_desc, GridData.HORIZONTAL_ALIGN_BEGINNING);
+               fDeleteButton= createButton(fComposite, FormatterMessages.CodingStyleConfigurationBlock_remove_button_desc, GridData.HORIZONTAL_ALIGN_BEGINNING);
+
+               fNewButton= createButton(fComposite, FormatterMessages.CodingStyleConfigurationBlock_new_button_desc, GridData.HORIZONTAL_ALIGN_BEGINNING);
+               fLoadButton= createButton(fComposite, FormatterMessages.CodingStyleConfigurationBlock_load_button_desc, GridData.HORIZONTAL_ALIGN_END);
+               fExportAllButton= createButton(fComposite, FormatterMessages.CodingStyleConfigurationBlock_export_all_button_desc, GridData.HORIZONTAL_ALIGN_BEGINNING);
+               createLabel(fComposite, "", 3); //$NON-NLS-1$
+
+               configurePreview(fComposite, numColumns, fProfileManager);
+
+               new ButtonController();
+               new ProfileComboController();
+
+               return fComposite;
+       }
+
+       private static Combo createProfileCombo(Composite composite, int span, int widthHint) {
+               final GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+               gd.horizontalSpan = span;
+               gd.widthHint= widthHint;
+
+               final Combo combo= new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY );
+               combo.setFont(composite.getFont());
+               SWTUtil.setDefaultVisibleItemCount(combo);
+               combo.setLayoutData(gd);
+               return combo;
+       }
+
+       protected static Label createLabel(Composite composite, String text, int numColumns) {
+               final GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+               gd.horizontalSpan = numColumns;
+               gd.widthHint= 0;
+
+               final Label label = new Label(composite, SWT.WRAP);
+               label.setFont(composite.getFont());
+               label.setText(text);
+               label.setLayoutData(gd);
+               return label;
+       }
+
+       private Composite createComposite(Composite parent, int numColumns) {
+               final Composite composite = new Composite(parent, SWT.NONE);
+               composite.setFont(parent.getFont());
+
+               final GridLayout layout = new GridLayout(numColumns, false);
+               layout.marginHeight = 0;
+               layout.marginWidth = 0;
+               composite.setLayout(layout);
+               return composite;
+       }
+
+       public final boolean hasProjectSpecificOptions(IProject project) {
+               if (project != null) {
+                       return fProfileManager.hasProjectSpecificSettings(new ProjectScope(project));
+               }
+               return false;
+       }
+
+       public boolean performOk() {
+               return true;
+       }
+
+       public void performApply() {
+               try {
+                       fCurrContext.getNode(JavaUI.ID_PLUGIN).flush();
+                       fCurrContext.getNode(JavaCore.PLUGIN_ID).flush();
+                       if (fCurrContext != fInstanceScope) {
+                               fInstanceScope.getNode(JavaUI.ID_PLUGIN).flush();
+                               fInstanceScope.getNode(JavaCore.PLUGIN_ID).flush();
+                       }
+               } catch (BackingStoreException e) {
+                       JavaPlugin.log(e);
+               }
+       }
+
+       public void performDefaults() {
+               fProfileManager.generated_1703534309629590810();
+       }
+
+       public void dispose() {
+               if (fPreferenceListener != null) {
+                       fPreferenceAccess.getInstanceScope().getNode(JavaUI.ID_PLUGIN).removePreferenceChangeListener(fPreferenceListener);
+                       fPreferenceListener= null;
+               }
+       }
+
+       public void enableProjectSpecificSettings(boolean useProjectSpecificSettings) {
+               fProfileManager.generated_8852049940323631497(this, useProjectSpecificSettings);
+       }
+
+}