1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-30 20:35:38 +02:00

Fixed preferences of type List

This commit is contained in:
Alena Laskavaia 2010-05-23 02:18:18 +00:00
parent 6debae007d
commit 644fefb8c5
11 changed files with 367 additions and 92 deletions

View file

@ -10,6 +10,8 @@
*******************************************************************************/
package org.eclipse.cdt.codan.core.param;
import java.util.Arrays;
import junit.framework.TestCase;
import org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor.PreferenceType;
@ -37,7 +39,7 @@ public class ListProblemPreferenceTest extends TestCase {
protected BasicProblemPreference addPar(String key, Object parval) {
BasicProblemPreference str = makePar(key, parval);
list.addChildDescriptor(str);
return str;
return (BasicProblemPreference) list.getChildDescriptor(key);
}
/**
@ -100,4 +102,31 @@ public class ListProblemPreferenceTest extends TestCase {
assertEquals("a=b", list.getChildValue(PAR1)); //$NON-NLS-1$
assertEquals(p2.getValue(), list.getChildValue(PAR2));
}
public void testGetValue() {
list.setChildDescriptor(new BasicProblemPreference("#", "Value")); //$NON-NLS-1$//$NON-NLS-2$
String x[] = { "a", "b" }; //$NON-NLS-1$ //$NON-NLS-2$
list.addChildValue(x[0]);
list.addChildValue(x[1]);
Object[] values = list.getValues();
assertTrue(Arrays.deepEquals(x, values));
}
public void testSetValue() {
list.setChildDescriptor(new BasicProblemPreference("#", "Value")); //$NON-NLS-1$//$NON-NLS-2$
String x[] = { "a", "b" }; //$NON-NLS-1$ //$NON-NLS-2$
list.setValue(x);
Object[] values = list.getValues();
assertTrue(Arrays.deepEquals(x, values));
}
public void testSetValueImport() {
list.setChildDescriptor(new BasicProblemPreference("#", "Value")); //$NON-NLS-1$//$NON-NLS-2$
String x[] = { "a", "b" }; //$NON-NLS-1$ //$NON-NLS-2$
list.setValue(x);
list.importValue("(x)"); //$NON-NLS-1$
Object[] values = list.getValues();
assertEquals(1, values.length);
assertEquals("x", values[0]); //$NON-NLS-1$
}
}

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.codan.core.model;
import org.eclipse.cdt.codan.core.param.BasicProblemPreference;
import org.eclipse.cdt.codan.core.param.IProblemPreference;
import org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor.PreferenceType;
import org.eclipse.cdt.codan.core.param.ListProblemPreference;
import org.eclipse.cdt.codan.core.param.MapProblemPreference;
/**
@ -53,6 +54,30 @@ public abstract class AbstractCheckerWithProblemPreferences extends
return info;
}
/**
* Add preference of type list with default string type, list is empty by
* default
*
* @param problem
* - problem
* @param key
* - preference key
* @param label
* - preference label
* @return preference instance of of the list, can be used to add default
* values or set different element type
*
*/
public ListProblemPreference addListPreference(IProblemWorkingCopy problem,
String key, String label, String itemLabel) {
MapProblemPreference map = getTopLevelPreferenceMap(problem);
ListProblemPreference list = new ListProblemPreference(key, label);
list.setChildDescriptor(new BasicProblemPreference(
ListProblemPreference.COMMON_DESCRIPTOR_KEY, itemLabel,
PreferenceType.TYPE_STRING));
return (ListProblemPreference) map.addChildDescriptor(list);
}
public IProblemPreference addPreference(IProblemWorkingCopy problem,
IProblemPreference info, Object defaultValue) {
MapProblemPreference map = getTopLevelPreferenceMap(problem);
@ -70,7 +95,7 @@ public abstract class AbstractCheckerWithProblemPreferences extends
String key, Object defaultValue) {
MapProblemPreference map = getTopLevelPreferenceMap(problem);
if (map.getChildValue(key) == null)
map.addChildValue(key, defaultValue);
map.setChildValue(key, defaultValue);
}
/**

View file

@ -62,6 +62,8 @@ public abstract class AbstractProblemPreference implements IProblemPreference {
int n = id.length();
if (n == 0)
return false;
if (id.equals("#")) //$NON-NLS-1$
return true;
for (int i = 0; i < n; i++)
if (!Character.isJavaIdentifierPart(id.charAt(i)))
return false;
@ -144,4 +146,10 @@ public abstract class AbstractProblemPreference implements IProblemPreference {
return getKey();
return parent.getQualifiedKey() + "." + getKey(); //$NON-NLS-1$
}
/**
* @param tokenizer
* @return
*/
public abstract void importValue(StreamTokenizer tokenizer);
}

View file

@ -129,4 +129,20 @@ public class BasicProblemPreference extends AbstractProblemPreference {
String sval = tokenizer.sval;
return sval;
}
@Override
public String toString() {
return "(" + type + ")" + key + ((value == null) ? "" : "=" + value); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
}
@Override
public void importValue(StreamTokenizer tokenizer) {
try {
tokenizer.nextToken();
String val = tokenizer.sval;
importValue(val);
} catch (IOException e) {
new IllegalArgumentException(e);
}
}
}

View file

@ -34,7 +34,7 @@ public interface IProblemPreferenceCompositeDescriptor {
*/
IProblemPreference[] getChildDescriptors();
void addChildDescriptor(IProblemPreference info);
IProblemPreference addChildDescriptor(IProblemPreference info);
void removeChildDescriptor(IProblemPreference info);
}

View file

@ -19,7 +19,7 @@ package org.eclipse.cdt.codan.core.param;
public interface IProblemPreferenceCompositeValue {
Object getChildValue(String key);
void addChildValue(String key, Object value);
void setChildValue(String key, Object value);
void removeChildValue(String key);
}

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.codan.core.param;
import java.io.IOException;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
/**
@ -22,8 +23,9 @@ import java.util.Iterator;
*/
public class ListProblemPreference extends AbstractProblemPreference implements
IProblemPreferenceCompositeValue, IProblemPreferenceCompositeDescriptor {
protected ArrayList<IProblemPreference> list = new ArrayList<IProblemPreference>(
1);
public static final String COMMON_DESCRIPTOR_KEY = "#"; //$NON-NLS-1$
protected ArrayList<Object> list = new ArrayList<Object>();
protected IProblemPreference childDescriptor;
/**
* @param key
@ -45,66 +47,78 @@ public class ListProblemPreference extends AbstractProblemPreference implements
}
/**
* Get parameter into for element equal to key's int value.
* Set child descriptor (all elements have the same)
*
* @param i
* @param info
* @return
*/
public IProblemPreference setChildDescriptor(IProblemPreference info) {
childDescriptor = info;
childDescriptor.setValue(null);
((AbstractProblemPreference) childDescriptor)
.setKey(COMMON_DESCRIPTOR_KEY);
return info;
}
/**
* Sets common descriptor for all elements, if value if not null sets the
* value for its key also. Do not make assumptions of values of desc after
* you pass it to this function.
*
* @return read only preference matching the key
*/
public IProblemPreference addChildDescriptor(IProblemPreference desc) {
Object value = desc.getValue();
String key = desc.getKey();
setChildDescriptor(desc);
setChildValue(key, value);
return getChildDescriptor(key);
}
public IProblemPreference getChildDescriptor() {
return childDescriptor;
}
public IProblemPreference getChildDescriptor(int i) {
Object value = list.get(i);
AbstractProblemPreference desc = (AbstractProblemPreference) childDescriptor
.clone();
desc.setKey(String.valueOf(i));
desc.setValue(value);
return desc;
}
/**
* Get read only problem preference for element equal to key's int value.
* If key is null or # return generic descriptor with null value.
*
* @throws NumberFormatException
* if key is not number
* @throws ArrayIndexOutOfBoundsException
* is index is out of bound
*/
public IProblemPreference getChildDescriptor(String key)
throws NumberFormatException {
if (key == null) {
// special case if all element are the same return first, if key is
// null
return (IProblemPreference) getChildDescriptor(0).clone();
if (key == null || key.equals(COMMON_DESCRIPTOR_KEY)) {
// return common descriptor
return getChildDescriptor();
}
Integer iv = Integer.valueOf(key);
if (iv.intValue() >= list.size()) {
// special case if all element are the same return first clone
IProblemPreference childInfo = (IProblemPreference) getChildDescriptor(
0).clone();
return childInfo;
// create one
AbstractProblemPreference clone = (AbstractProblemPreference) childDescriptor
.clone();
clone.setKey(key);
return clone;
}
return getChildDescriptor(iv.intValue());
}
/**
* Set i'th element of parameter info, if all are the same i is 0
*
* @param i
* @param info
*/
public void setChildDescriptor(int i, IProblemPreference info) {
if (info != null) {
while (i >= list.size()) {
list.add(null);
}
list.set(i, info);
} else {
while (i == list.size() - 1) {
list.remove(i);
}
}
}
/**
* If all list elements have same info it is enough to set only first one
* (index 0). When value is set for the other it will be replicated.
*/
public void addChildDescriptor(IProblemPreference info) {
Integer iv = Integer.valueOf(info.getKey());
IProblemPreference desc = (IProblemPreference) info.clone();
desc.setParent(this);
setChildDescriptor(iv, desc);
}
public IProblemPreference getChildDescriptor(int i) {
return list.get(i);
}
public IProblemPreference[] getChildDescriptors() {
return list.toArray(new IProblemPreference[list.size()]);
IProblemPreference[] res = new IProblemPreference[list.size()];
for (int i = 0; i < res.length; i++) {
res[i] = getChildDescriptor(i);
}
return res;
}
public Object getChildValue(String key) {
@ -112,11 +126,30 @@ public class ListProblemPreference extends AbstractProblemPreference implements
return childInfo.getValue();
}
public void addChildValue(String key, Object value) {
IProblemPreference pref = getChildDescriptor(key);
pref.setValue(value);
// because descriptor can be phantom we have to set preference forcefully
setChildDescriptor(Integer.parseInt(key), pref);
public void setChildValue(String key, Object value) {
int i = Integer.valueOf(key).intValue();
setChildValue(i, value);
}
/**
* @param i
* @param value
*/
protected void setChildValue(int i, Object value) {
if (value != null) {
while (i >= list.size()) {
list.add(null);
}
list.set(i, value);
} else {
while (i == list.size() - 1) {
list.remove(i);
}
}
}
public void addChildValue(Object value) {
list.add(value);
}
public void removeChildValue(String key) {
@ -128,15 +161,15 @@ public class ListProblemPreference extends AbstractProblemPreference implements
@Override
public Object clone() {
ListProblemPreference list1 = (ListProblemPreference) super.clone();
list1.list = (ArrayList<IProblemPreference>) list.clone();
list1.list = (ArrayList<Object>) list.clone();
return list1;
}
public String exportValue() {
StringBuffer buf = new StringBuffer("("); //$NON-NLS-1$
for (Iterator<IProblemPreference> iterator = list.iterator(); iterator
.hasNext();) {
IProblemPreference d = iterator.next();
for (Iterator<Object> iterator = list.iterator(); iterator.hasNext();) {
IProblemPreference d = (IProblemPreference) childDescriptor.clone();
d.setValue(iterator.next());
buf.append(d.exportValue());
if (iterator.hasNext())
buf.append(","); //$NON-NLS-1$
@ -146,34 +179,86 @@ public class ListProblemPreference extends AbstractProblemPreference implements
public void importValue(String str) {
StreamTokenizer tokenizer = getImportTokenizer(str);
try {
importValue(tokenizer);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException(str, e);
}
}
/**
* @param tokenizer
*/
@Override
public void importValue(StreamTokenizer tokenizer) {
clear();
int token;
int index = 0;
try {
token = tokenizer.nextToken();
String chara = String.valueOf((char) token);
if (token != '(')
throw new IllegalArgumentException(str);
throw new IllegalArgumentException(chara);
token = tokenizer.nextToken();
if (token != ')')
tokenizer.pushBack();
else
return;
while (true) {
token = tokenizer.nextToken();
String val = tokenizer.sval;
String ik = String.valueOf(index);
IProblemPreference desc = getChildDescriptor(ik);
if (desc != null) {
desc.importValue(val);
addChildValue(ik, desc.getValue());
if (desc != null && desc instanceof AbstractProblemPreference) {
((AbstractProblemPreference) desc).importValue(tokenizer);
setChildValue(ik, desc.getValue());
}
token = tokenizer.nextToken();
if (token == ')')
break;
if (token != ',')
throw new IllegalArgumentException(str);
throw new IllegalArgumentException(chara);
index++;
}
} catch (IOException e) {
throw new IllegalArgumentException(str);
throw new IllegalArgumentException(e);
}
}
public void removeChildDescriptor(IProblemPreference info) {
list.remove(info);
throw new UnsupportedOperationException();
}
public int size() {
return list.size();
}
public void clear() {
list.clear();
}
@Override
public Object getValue() {
return getValues();
}
@Override
public void setValue(Object value) {
Object[] values = (Object[]) value;
if (Arrays.deepEquals(getValues(), values)) {
return;
}
list.clear();
for (int i = 0; i < values.length; i++) {
Object object = values[i];
list.add(object);
}
}
@Override
public String toString() {
return childDescriptor + ":" + list.toString(); //$NON-NLS-1$
}
public Object[] getValues() {
return list.toArray(new Object[list.size()]);
}
}

View file

@ -14,6 +14,7 @@ import java.io.IOException;
import java.io.StreamTokenizer;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.cdt.codan.core.model.AbstractCheckerWithProblemPreferences;
@ -73,10 +74,10 @@ public class MapProblemPreference extends AbstractProblemPreference implements
* @param i
* @param info
*/
public void addChildDescriptor(IProblemPreference info) {
IProblemPreference desc = (IProblemPreference) info.clone();
public IProblemPreference addChildDescriptor(IProblemPreference desc) {
desc.setParent(this);
hash.put(info.getKey(), desc);
hash.put(desc.getKey(), desc);
return desc;
}
public IProblemPreference[] getChildDescriptors() {
@ -89,7 +90,7 @@ public class MapProblemPreference extends AbstractProblemPreference implements
return childInfo.getValue();
}
public void addChildValue(String key, Object value) {
public void setChildValue(String key, Object value) {
getChildDescriptor(key).setValue(value);
}
@ -120,40 +121,96 @@ public class MapProblemPreference extends AbstractProblemPreference implements
public void importValue(String str) {
StreamTokenizer tokenizer = getImportTokenizer(str);
try {
importValue(tokenizer);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException(str + ":" + e.toString(), e); //$NON-NLS-1$
}
}
/**
* @param tokenizer
*/
@Override
public void importValue(StreamTokenizer tokenizer) {
int token;
try {
token = tokenizer.nextToken();
if (token != '{')
throw new IllegalArgumentException(str);
String chara = String.valueOf((char) token);
if (token != '{') {
throw new IllegalArgumentException(chara);
}
while (true) {
token = tokenizer.nextToken();
String key = tokenizer.sval;
token = tokenizer.nextToken();
if (token != '=')
throw new IllegalArgumentException(str);
throw new IllegalArgumentException(chara);
token = tokenizer.nextToken();
if (token != '>')
throw new IllegalArgumentException(str);
token = tokenizer.nextToken();
String val = tokenizer.sval;
throw new IllegalArgumentException(chara);
IProblemPreference desc = getChildDescriptor(key);
if (desc != null) {
desc.importValue(val);
} else {
//putChildValue(key, val);
if (desc != null && desc instanceof AbstractProblemPreference) {
((AbstractProblemPreference) desc).importValue(tokenizer);
setChildValue(key, desc.getValue());
}
token = tokenizer.nextToken();
if (token == '}')
break;
if (token != ',')
throw new IllegalArgumentException(str);
throw new IllegalArgumentException(chara);
}
} catch (IOException e) {
throw new IllegalArgumentException(str);
throw new IllegalArgumentException(e);
}
}
public void removeChildDescriptor(IProblemPreference info) {
hash.remove(info);
}
public int size() {
return hash.size();
}
public void clear() {
hash.clear();
}
@Override
public String toString() {
return hash.values().toString();
}
@Override
public Object getValue() {
LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
for (Iterator<IProblemPreference> iterator = hash.values().iterator(); iterator
.hasNext();) {
IProblemPreference pref = iterator.next();
map.put(pref.getKey(), pref.getValue());
}
return map;
}
@SuppressWarnings("unchecked")
@Override
public void setValue(Object value) {
Map<String, Object> map = (Map<String, Object>) value;
LinkedHashMap<String, IProblemPreference> hash2 = (LinkedHashMap<String, IProblemPreference>) hash
.clone();
hash.clear();
for (Iterator<String> iterator = map.keySet().iterator(); iterator
.hasNext();) {
String key = iterator.next();
Object value2 = map.get(key);
if (value2 instanceof IProblemPreference) {
hash.put(key, (IProblemPreference) value2);
} else {
IProblemPreference pref = hash2.get(key);
pref.setValue(value2);
hash.put(key, pref);
}
}
}
}

View file

@ -39,6 +39,7 @@ public class CodanUIMessages extends NLS {
public static String CustomizeProblemDialog_Message;
public static String CustomizeProblemDialog_Title;
public static String Job_TitleRunningAnalysis;
public static String ParametersComposite_NewValue;
public static String ParametersComposite_None;
static {
// initialize resource bundle

View file

@ -16,11 +16,15 @@ import org.eclipse.cdt.codan.core.model.IProblem;
import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy;
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.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;
@ -59,7 +63,8 @@ public class ParametersComposite extends Composite {
/**
* @param info
*/
private void createFieldEditorsForParameters(IProblemPreference info) {
private void createFieldEditorsForParameters(
final IProblemPreference info) {
if (info == null)
return;
switch (info.getType()) {
@ -77,7 +82,53 @@ public class ParametersComposite extends Composite {
addField(fe);
break;
}
case TYPE_MAP: {
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++) {
@ -85,7 +136,6 @@ public class ParametersComposite extends Composite {
createFieldEditorsForParameters(desc);
}
break;
}
default:
throw new UnsupportedOperationException(info.getType()
.toString());
@ -126,8 +176,10 @@ public class ParametersComposite extends Composite {
case TYPE_FILE:
desc.setValue(new File(prefStore.getString(key)));
break;
case TYPE_MAP:
case TYPE_LIST:
desc.importValue(prefStore.getString(key));
break;
case TYPE_MAP:
IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) desc)
.getChildDescriptors();
for (int i = 0; i < childrenDescriptor.length; i++) {
@ -158,8 +210,10 @@ public class ParametersComposite extends Composite {
case TYPE_FILE:
prefStore.setValue(key, ((File) desc.getValue()).getPath());
break;
case TYPE_LIST:
prefStore.setValue(key, desc.exportValue());
break;
case TYPE_MAP:
case TYPE_LIST: {
IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) desc)
.getChildDescriptors();
for (int i = 0; i < childrenDescriptor.length; i++) {
@ -167,7 +221,6 @@ public class ParametersComposite extends Composite {
initPrefStore(chi);
}
break;
}
default:
throw new UnsupportedOperationException(desc.getType()
.toString());

View file

@ -13,6 +13,7 @@ CustomizeProblemComposite_TabScope=Scope
CustomizeProblemDialog_Message=Edit problem preferences, scope and launch options
CustomizeProblemDialog_Title=Customize Problem...
Job_TitleRunningAnalysis=Running Code Analysis
ParametersComposite_NewValue=New Value
ParametersComposite_None=No extra preferences
ProblemsTreeEditor_NameColumn=Name
ProblemsTreeEditor_Problems=Problems