*******************************************************************************/
package net.sourceforge.phpdt.internal.ui.preferences;
-import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;
+import java.util.Map.Entry;
import net.sourceforge.phpdt.core.IJavaProject;
import net.sourceforge.phpdt.core.JavaCore;
-import net.sourceforge.phpdt.internal.ui.util.ExceptionHandler;
import net.sourceforge.phpdt.internal.ui.wizards.IStatusChangeListener;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Widget;
/**
- */
+ * Abstract options configuration block providing a general implementation for setting up
+ * an options configuration page.
+ *
+ * @since 2.1
+ */
public abstract class OptionsConfigurationBlock {
protected static class ControlData {
}
public int getSelection(String value) {
- for (int i= 0; i < fValues.length; i++) {
- if (value.equals(fValues[i])) {
- return i;
+ if (value != null) {
+ for (int i= 0; i < fValues.length; i++) {
+ if (value.equals(fValues[i])) {
+ return i;
+ }
}
}
- return 0;
+ return fValues.length -1; // assume the last option is the least severe
}
}
protected IStatusChangeListener fContext;
protected IJavaProject fProject; // project or null
+ protected String[] fAllKeys;
private Shell fShell;
- public OptionsConfigurationBlock(IStatusChangeListener context, IJavaProject project) {
+ public OptionsConfigurationBlock(IStatusChangeListener context, IJavaProject project, String[] allKeys) {
fContext= context;
fProject= project;
+ fAllKeys= allKeys;
fWorkingValues= getOptions(true);
+ testIfOptionsComplete(fWorkingValues, allKeys);
fCheckBoxes= new ArrayList();
fComboBoxes= new ArrayList();
fLabels= new HashMap();
}
- protected abstract String[] getAllKeys();
-
+ private void testIfOptionsComplete(Map workingValues, String[] allKeys) {
+ for (int i= 0; i < allKeys.length; i++) {
+ if (workingValues.get(allKeys[i]) == null) {
+ PHPeclipsePlugin.logErrorMessage("preference option missing: " + allKeys[i] + " (" + this.getClass().getName() +')'); //$NON-NLS-1$//$NON-NLS-2$
+ }
+ }
+ }
+
protected Map getOptions(boolean inheritJavaCoreOptions) {
if (fProject != null) {
return fProject.getOptions(inheritJavaCoreOptions);
public final boolean hasProjectSpecificOptions() {
if (fProject != null) {
Map settings= fProject.getOptions(false);
- String[] allKeys= getAllKeys();
+ String[] allKeys= fAllKeys;
for (int i= 0; i < allKeys.length; i++) {
if (settings.get(allKeys[i]) != null) {
return true;
protected void setOptions(Map map) {
if (fProject != null) {
+ Map oldOptions= fProject.getOptions(false);
fProject.setOptions(map);
+ firePropertyChangeEvents(oldOptions, map);
} else {
JavaCore.setOptions((Hashtable) map);
}
}
+ /**
+ * Computes the differences between the given old and new options and fires corresponding
+ * property change events on the Java plugin's mockup preference store.
+ * @param oldOptions The old options
+ * @param newOptions The new options
+ */
+ private void firePropertyChangeEvents(Map oldOptions, Map newOptions) {
+ oldOptions= new HashMap(oldOptions);
+ Object source= fProject.getProject();
+ MockupPreferenceStore store= PHPeclipsePlugin.getDefault().getMockupPreferenceStore();
+ Iterator iter= newOptions.entrySet().iterator();
+ while (iter.hasNext()) {
+ Entry entry= (Entry) iter.next();
+
+ String name= (String) entry.getKey();
+ Object oldValue= oldOptions.get(name);
+ Object newValue= entry.getValue();
+
+ if ((oldValue != null && !oldValue.equals(newValue)) || (oldValue == null && newValue != null))
+ store.firePropertyChangeEvent(source, name, oldValue, newValue);
+ oldOptions.remove(name);
+ }
+
+ iter= oldOptions.entrySet().iterator();
+ while (iter.hasNext()) {
+ Entry entry= (Entry) iter.next();
+ store.firePropertyChangeEvent(source, (String) entry.getKey(), entry.getValue(), null);
+ }
+ }
+
protected Shell getShell() {
return fShell;
}
checkBox.setLayoutData(gd);
checkBox.addSelectionListener(getSelectionListener());
- String currValue= (String)fWorkingValues.get(key);
+ String currValue= (String)fWorkingValues.get(key);
checkBox.setSelection(data.getSelection(currValue) == 0);
fCheckBoxes.add(checkBox);
fLabels.put(textBox, labelControl);
String currValue= (String) fWorkingValues.get(key);
- textBox.setText(currValue);
+ if (currValue != null) {
+ textBox.setText(currValue);
+ }
textBox.addModifyListener(getTextModifyListener());
GridData data= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
public boolean performOk(boolean enabled) {
- String[] allKeys= getAllKeys();
+ String[] allKeys= fAllKeys;
Map actualOptions= getOptions(false);
// preserve other options
String val= null;
if (enabled) {
val= (String) fWorkingValues.get(key);
- if (!val.equals(oldVal)) {
+ if (val != null && !val.equals(oldVal)) {
hasChanges= true;
actualOptions.put(key, val);
}
}
setOptions(actualOptions);
if (doBuild) {
- doFullBuild();
+ boolean res= doFullBuild();
+ if (!res) {
+ return false;
+ }
}
}
return true;
protected abstract String[] getFullBuildDialogStrings(boolean workspaceSettings);
- protected void doFullBuild() {
- ProgressMonitorDialog dialog= new ProgressMonitorDialog(getShell());
- try {
- dialog.run(true, true, new IRunnableWithProgress() {
- public void run(IProgressMonitor monitor) throws InvocationTargetException {
- monitor.beginTask("", 2); //$NON-NLS-1$
- try {
- if (fProject != null) {
- monitor.setTaskName(PreferencesMessages.getFormattedString("OptionsConfigurationBlock.buildproject.taskname", fProject.getElementName())); //$NON-NLS-1$
- fProject.getProject().build(IncrementalProjectBuilder.FULL_BUILD, new SubProgressMonitor(monitor,1));
- PHPeclipsePlugin.getWorkspace().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new SubProgressMonitor(monitor,1));
- } else {
- monitor.setTaskName(PreferencesMessages.getString("OptionsConfigurationBlock.buildall.taskname")); //$NON-NLS-1$
- PHPeclipsePlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, new SubProgressMonitor(monitor, 2));
- }
- } catch (CoreException e) {
- throw new InvocationTargetException(e);
- } finally {
- monitor.done();
+ protected boolean doFullBuild() {
+
+ Job buildJob = new Job(PreferencesMessages.getString("OptionsConfigurationBlock.job.title")){ //$NON-NLS-1$
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ if (fProject != null) {
+ monitor.setTaskName(PreferencesMessages.getFormattedString("OptionsConfigurationBlock.buildproject.taskname", fProject.getElementName())); //$NON-NLS-1$
+ fProject.getProject().build(IncrementalProjectBuilder.FULL_BUILD, new SubProgressMonitor(monitor,1));
+ PHPeclipsePlugin.getWorkspace().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new SubProgressMonitor(monitor,1));
+ } else {
+ monitor.setTaskName(PreferencesMessages.getString("OptionsConfigurationBlock.buildall.taskname")); //$NON-NLS-1$
+ PHPeclipsePlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, new SubProgressMonitor(monitor, 2));
}
+ } catch (CoreException e) {
+ return e.getStatus();
+ } catch (OperationCanceledException e) {
+ return Status.CANCEL_STATUS;
}
- });
- } catch (InterruptedException e) {
- // cancelled by user
- } catch (InvocationTargetException e) {
- String title= PreferencesMessages.getString("OptionsConfigurationBlock.builderror.title"); //$NON-NLS-1$
- String message= PreferencesMessages.getString("OptionsConfigurationBlock.builderror.message"); //$NON-NLS-1$
- ExceptionHandler.handle(e, getShell(), title, message);
- }
+ finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+ public boolean belongsTo(Object family) {
+ return ResourcesPlugin.FAMILY_MANUAL_BUILD == family;
+ }
+ };
+
+ buildJob.setRule(ResourcesPlugin.getWorkspace().getRuleFactory().buildRule());
+ buildJob.setUser(true);
+ buildJob.schedule();
+ return true;
}
public void performDefaults() {
protected void updateControls() {
// update the UI
for (int i= fCheckBoxes.size() - 1; i >= 0; i--) {
- Button curr= (Button) fCheckBoxes.get(i);
- ControlData data= (ControlData) curr.getData();
-
- String currValue= (String) fWorkingValues.get(data.getKey());
- curr.setSelection(data.getSelection(currValue) == 0);
+ updateCheckBox((Button) fCheckBoxes.get(i));
}
for (int i= fComboBoxes.size() - 1; i >= 0; i--) {
- Combo curr= (Combo) fComboBoxes.get(i);
- ControlData data= (ControlData) curr.getData();
-
- String currValue= (String) fWorkingValues.get(data.getKey());
- curr.select(data.getSelection(currValue));
+ updateCombo((Combo) fComboBoxes.get(i));
}
for (int i= fTextBoxes.size() - 1; i >= 0; i--) {
- Text curr= (Text) fTextBoxes.get(i);
- String key= (String) curr.getData();
-
- String currValue= (String) fWorkingValues.get(key);
+ updateText((Text) fTextBoxes.get(i));
+ }
+ }
+
+ protected void updateCombo(Combo curr) {
+ ControlData data= (ControlData) curr.getData();
+
+ String currValue= (String) fWorkingValues.get(data.getKey());
+ curr.select(data.getSelection(currValue));
+ }
+
+ protected void updateCheckBox(Button curr) {
+ ControlData data= (ControlData) curr.getData();
+
+ String currValue= (String) fWorkingValues.get(data.getKey());
+ curr.setSelection(data.getSelection(currValue) == 0);
+ }
+
+ protected void updateText(Text curr) {
+ String key= (String) curr.getData();
+
+ String currValue= (String) fWorkingValues.get(key);
+ if (currValue != null) {
curr.setText(currValue);
}
}