diff options
Diffstat (limited to 'org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/widgets/ParametersComposite.java')
-rw-r--r-- | org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/widgets/ParametersComposite.java | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/widgets/ParametersComposite.java b/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/widgets/ParametersComposite.java new file mode 100644 index 0000000..26e58fc --- /dev/null +++ b/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/widgets/ParametersComposite.java @@ -0,0 +1,261 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 Alena Laskavaia + * 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: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.internal.ui.widgets; + +import java.io.File; + +import org.eclipse.cdt.codan.core.model.IProblem; +import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy; +import org.eclipse.cdt.codan.core.param.FileScopeProblemPreference; +import org.eclipse.cdt.codan.core.param.IProblemPreference; +import org.eclipse.cdt.codan.core.param.IProblemPreferenceCompositeDescriptor; +import org.eclipse.cdt.codan.core.param.ListProblemPreference; +import org.eclipse.cdt.codan.internal.ui.CodanUIMessages; +import org.eclipse.jface.dialogs.InputDialog; +import org.eclipse.jface.preference.BooleanFieldEditor; +import org.eclipse.jface.preference.FieldEditorPreferencePage; +import org.eclipse.jface.preference.FileFieldEditor; +import org.eclipse.jface.preference.ListEditor; +import org.eclipse.jface.preference.PreferenceStore; +import org.eclipse.jface.preference.StringFieldEditor; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +/** + * Composite to show problem preferences + * + */ +public class ParametersComposite extends Composite { + private FieldEditorPreferencePage page; + private IProblem problem; + private PreferenceStore prefStore; + + /** + * @param parent + * @param problem + * @param style + */ + public ParametersComposite(Composite parent, final IProblem problem) { + super(parent, SWT.NONE); + if (problem == null) + throw new NullPointerException(); + this.setLayout(new GridLayout(2, false)); + this.problem = problem; + this.prefStore = new PreferenceStore(); + page = new FieldEditorPreferencePage() { + @Override + protected void createFieldEditors() { + noDefaultAndApplyButton(); + IProblemPreference pref = problem.getPreference(); + createFieldEditorsForParameters(pref); + } + + /** + * @param info + */ + private void createFieldEditorsForParameters( + final IProblemPreference info) { + if (info == null) + return; + if (info.getKey() == FileScopeProblemPreference.KEY) + return; // skip the scope + switch (info.getType()) { + case TYPE_STRING: { + StringFieldEditor fe = new StringFieldEditor( + info.getQualifiedKey(), info.getLabel(), + getFieldEditorParent()); + addField(fe); + break; + } + case TYPE_BOOLEAN: { + BooleanFieldEditor fe = new BooleanFieldEditor( + info.getQualifiedKey(), info.getLabel(), + getFieldEditorParent()); + addField(fe); + break; + } + case TYPE_LIST: + ListEditor le = new ListEditor(info.getQualifiedKey(), + info.getLabel(), getFieldEditorParent()) { + @Override + protected String[] parseString(String stringList) { + ListProblemPreference list = (ListProblemPreference) info; + IProblemPreference[] childDescriptors = list + .getChildDescriptors(); + if (childDescriptors.length == 0) + return new String[0]; + String res[] = new String[childDescriptors.length]; + for (int i = 0; i < childDescriptors.length; i++) { + IProblemPreference item = childDescriptors[i]; + res[i] = String.valueOf(item.getValue()); + } + return res; + } + + @Override + protected String getNewInputObject() { + ListProblemPreference list = (ListProblemPreference) info; + String label = list.getChildDescriptor() + .getLabel(); + InputDialog dialog = new InputDialog( + getShell(), + CodanUIMessages.ParametersComposite_NewValue, + label, "", null); //$NON-NLS-1$ + if (dialog.open() == Window.OK) { + return dialog.getValue(); + } + return null; + } + + @Override + protected String createList(String[] items) { + ListProblemPreference list = (ListProblemPreference) info + .clone(); + list.clear(); + for (int i = 0; i < items.length; i++) { + String val = items[i]; + list.addChildValue(val); + } + return list.exportValue(); + } + }; + addField(le); + break; + case TYPE_MAP: + IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) info) + .getChildDescriptors(); + for (int i = 0; i < childrenDescriptor.length; i++) { + IProblemPreference desc = childrenDescriptor[i]; + createFieldEditorsForParameters(desc); + } + break; + case TYPE_CUSTOM: { + StringFieldEditor fe = new StringFieldEditor( + info.getQualifiedKey(), info.getLabel(), + getFieldEditorParent()); + addField(fe); + break; + } + case TYPE_FILE: { + FileFieldEditor fe = new FileFieldEditor( + info.getQualifiedKey(), info.getLabel(), + getFieldEditorParent()); + addField(fe); + break; + } + default: + throw new UnsupportedOperationException(info.getType() + .toString()); + } + } + }; + IProblemPreference info = problem.getPreference(); + if (info == null) { + Label label = new Label(this, 0); + label.setText(CodanUIMessages.ParametersComposite_None); + } else { + initPrefStore(info); + } + page.setPreferenceStore(prefStore); + page.createControl(parent); + page.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); + } + + public void save(IProblemWorkingCopy problem) { + page.performOk(); + savePrefStore(problem.getPreference()); + } + + private void savePrefStore(IProblemPreference desc) { + if (desc == null) + return; + String key = desc.getQualifiedKey(); + switch (desc.getType()) { + case TYPE_STRING: + desc.setValue(prefStore.getString(key)); + break; + case TYPE_BOOLEAN: + desc.setValue(prefStore.getBoolean(key)); + break; + case TYPE_INTEGER: + desc.setValue(prefStore.getInt(key)); + break; + case TYPE_FILE: + desc.setValue(new File(prefStore.getString(key))); + break; + case TYPE_LIST: + desc.importValue(prefStore.getString(key)); + break; + case TYPE_CUSTOM: + desc.importValue(prefStore.getString(key)); + break; + case TYPE_MAP: + IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) desc) + .getChildDescriptors(); + for (int i = 0; i < childrenDescriptor.length; i++) { + IProblemPreference chi = childrenDescriptor[i]; + savePrefStore(chi); + } + break; + default: + throw new UnsupportedOperationException(desc.getType() + .toString()); + } + } + + private void initPrefStore(IProblemPreference desc) { + if (desc == null) + return; + String key = desc.getQualifiedKey(); + switch (desc.getType()) { + case TYPE_STRING: + prefStore.setValue(key, (String) desc.getValue()); + break; + case TYPE_BOOLEAN: + prefStore.setValue(key, (Boolean) desc.getValue()); + break; + case TYPE_INTEGER: + prefStore.setValue(key, (Integer) desc.getValue()); + break; + case TYPE_FILE: + prefStore.setValue(key, ((File) desc.getValue()).getPath()); + break; + case TYPE_LIST: + prefStore.setValue(key, desc.exportValue()); + break; + case TYPE_CUSTOM: + prefStore.setValue(key, desc.exportValue()); + break; + case TYPE_MAP: + IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) desc) + .getChildDescriptors(); + for (int i = 0; i < childrenDescriptor.length; i++) { + IProblemPreference chi = childrenDescriptor[i]; + initPrefStore(chi); + } + break; + default: + throw new UnsupportedOperationException(desc.getType() + .toString()); + } + } + + /** + * @return the problem + */ + public IProblem getProblem() { + return problem; + } +} |