mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-31 12:55:40 +02:00
Fixed preferences of type List
This commit is contained in:
parent
6debae007d
commit
644fefb8c5
11 changed files with 367 additions and 92 deletions
|
@ -10,6 +10,8 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.codan.core.param;
|
package org.eclipse.cdt.codan.core.param;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor.PreferenceType;
|
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) {
|
protected BasicProblemPreference addPar(String key, Object parval) {
|
||||||
BasicProblemPreference str = makePar(key, parval);
|
BasicProblemPreference str = makePar(key, parval);
|
||||||
list.addChildDescriptor(str);
|
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("a=b", list.getChildValue(PAR1)); //$NON-NLS-1$
|
||||||
assertEquals(p2.getValue(), list.getChildValue(PAR2));
|
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$
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.BasicProblemPreference;
|
||||||
import org.eclipse.cdt.codan.core.param.IProblemPreference;
|
import org.eclipse.cdt.codan.core.param.IProblemPreference;
|
||||||
import org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor.PreferenceType;
|
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;
|
import org.eclipse.cdt.codan.core.param.MapProblemPreference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -53,6 +54,30 @@ public abstract class AbstractCheckerWithProblemPreferences extends
|
||||||
return info;
|
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,
|
public IProblemPreference addPreference(IProblemWorkingCopy problem,
|
||||||
IProblemPreference info, Object defaultValue) {
|
IProblemPreference info, Object defaultValue) {
|
||||||
MapProblemPreference map = getTopLevelPreferenceMap(problem);
|
MapProblemPreference map = getTopLevelPreferenceMap(problem);
|
||||||
|
@ -70,7 +95,7 @@ public abstract class AbstractCheckerWithProblemPreferences extends
|
||||||
String key, Object defaultValue) {
|
String key, Object defaultValue) {
|
||||||
MapProblemPreference map = getTopLevelPreferenceMap(problem);
|
MapProblemPreference map = getTopLevelPreferenceMap(problem);
|
||||||
if (map.getChildValue(key) == null)
|
if (map.getChildValue(key) == null)
|
||||||
map.addChildValue(key, defaultValue);
|
map.setChildValue(key, defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -62,6 +62,8 @@ public abstract class AbstractProblemPreference implements IProblemPreference {
|
||||||
int n = id.length();
|
int n = id.length();
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
return false;
|
return false;
|
||||||
|
if (id.equals("#")) //$NON-NLS-1$
|
||||||
|
return true;
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
if (!Character.isJavaIdentifierPart(id.charAt(i)))
|
if (!Character.isJavaIdentifierPart(id.charAt(i)))
|
||||||
return false;
|
return false;
|
||||||
|
@ -144,4 +146,10 @@ public abstract class AbstractProblemPreference implements IProblemPreference {
|
||||||
return getKey();
|
return getKey();
|
||||||
return parent.getQualifiedKey() + "." + getKey(); //$NON-NLS-1$
|
return parent.getQualifiedKey() + "." + getKey(); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param tokenizer
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public abstract void importValue(StreamTokenizer tokenizer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,4 +129,20 @@ public class BasicProblemPreference extends AbstractProblemPreference {
|
||||||
String sval = tokenizer.sval;
|
String sval = tokenizer.sval;
|
||||||
return 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ public interface IProblemPreferenceCompositeDescriptor {
|
||||||
*/
|
*/
|
||||||
IProblemPreference[] getChildDescriptors();
|
IProblemPreference[] getChildDescriptors();
|
||||||
|
|
||||||
void addChildDescriptor(IProblemPreference info);
|
IProblemPreference addChildDescriptor(IProblemPreference info);
|
||||||
|
|
||||||
void removeChildDescriptor(IProblemPreference info);
|
void removeChildDescriptor(IProblemPreference info);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ package org.eclipse.cdt.codan.core.param;
|
||||||
public interface IProblemPreferenceCompositeValue {
|
public interface IProblemPreferenceCompositeValue {
|
||||||
Object getChildValue(String key);
|
Object getChildValue(String key);
|
||||||
|
|
||||||
void addChildValue(String key, Object value);
|
void setChildValue(String key, Object value);
|
||||||
|
|
||||||
void removeChildValue(String key);
|
void removeChildValue(String key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ package org.eclipse.cdt.codan.core.param;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StreamTokenizer;
|
import java.io.StreamTokenizer;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,8 +23,9 @@ import java.util.Iterator;
|
||||||
*/
|
*/
|
||||||
public class ListProblemPreference extends AbstractProblemPreference implements
|
public class ListProblemPreference extends AbstractProblemPreference implements
|
||||||
IProblemPreferenceCompositeValue, IProblemPreferenceCompositeDescriptor {
|
IProblemPreferenceCompositeValue, IProblemPreferenceCompositeDescriptor {
|
||||||
protected ArrayList<IProblemPreference> list = new ArrayList<IProblemPreference>(
|
public static final String COMMON_DESCRIPTOR_KEY = "#"; //$NON-NLS-1$
|
||||||
1);
|
protected ArrayList<Object> list = new ArrayList<Object>();
|
||||||
|
protected IProblemPreference childDescriptor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param key
|
* @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
|
* @throws NumberFormatException
|
||||||
* if key is not number
|
* if key is not number
|
||||||
* @throws ArrayIndexOutOfBoundsException
|
|
||||||
* is index is out of bound
|
|
||||||
*/
|
*/
|
||||||
public IProblemPreference getChildDescriptor(String key)
|
public IProblemPreference getChildDescriptor(String key)
|
||||||
throws NumberFormatException {
|
throws NumberFormatException {
|
||||||
if (key == null) {
|
if (key == null || key.equals(COMMON_DESCRIPTOR_KEY)) {
|
||||||
// special case if all element are the same return first, if key is
|
// return common descriptor
|
||||||
// null
|
return getChildDescriptor();
|
||||||
return (IProblemPreference) getChildDescriptor(0).clone();
|
|
||||||
}
|
}
|
||||||
Integer iv = Integer.valueOf(key);
|
Integer iv = Integer.valueOf(key);
|
||||||
if (iv.intValue() >= list.size()) {
|
if (iv.intValue() >= list.size()) {
|
||||||
// special case if all element are the same return first clone
|
// create one
|
||||||
IProblemPreference childInfo = (IProblemPreference) getChildDescriptor(
|
AbstractProblemPreference clone = (AbstractProblemPreference) childDescriptor
|
||||||
0).clone();
|
.clone();
|
||||||
return childInfo;
|
clone.setKey(key);
|
||||||
|
return clone;
|
||||||
}
|
}
|
||||||
return getChildDescriptor(iv.intValue());
|
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() {
|
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) {
|
public Object getChildValue(String key) {
|
||||||
|
@ -112,11 +126,30 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
||||||
return childInfo.getValue();
|
return childInfo.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addChildValue(String key, Object value) {
|
public void setChildValue(String key, Object value) {
|
||||||
IProblemPreference pref = getChildDescriptor(key);
|
int i = Integer.valueOf(key).intValue();
|
||||||
pref.setValue(value);
|
setChildValue(i, value);
|
||||||
// because descriptor can be phantom we have to set preference forcefully
|
}
|
||||||
setChildDescriptor(Integer.parseInt(key), pref);
|
|
||||||
|
/**
|
||||||
|
* @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) {
|
public void removeChildValue(String key) {
|
||||||
|
@ -128,15 +161,15 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
||||||
@Override
|
@Override
|
||||||
public Object clone() {
|
public Object clone() {
|
||||||
ListProblemPreference list1 = (ListProblemPreference) super.clone();
|
ListProblemPreference list1 = (ListProblemPreference) super.clone();
|
||||||
list1.list = (ArrayList<IProblemPreference>) list.clone();
|
list1.list = (ArrayList<Object>) list.clone();
|
||||||
return list1;
|
return list1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String exportValue() {
|
public String exportValue() {
|
||||||
StringBuffer buf = new StringBuffer("("); //$NON-NLS-1$
|
StringBuffer buf = new StringBuffer("("); //$NON-NLS-1$
|
||||||
for (Iterator<IProblemPreference> iterator = list.iterator(); iterator
|
for (Iterator<Object> iterator = list.iterator(); iterator.hasNext();) {
|
||||||
.hasNext();) {
|
IProblemPreference d = (IProblemPreference) childDescriptor.clone();
|
||||||
IProblemPreference d = iterator.next();
|
d.setValue(iterator.next());
|
||||||
buf.append(d.exportValue());
|
buf.append(d.exportValue());
|
||||||
if (iterator.hasNext())
|
if (iterator.hasNext())
|
||||||
buf.append(","); //$NON-NLS-1$
|
buf.append(","); //$NON-NLS-1$
|
||||||
|
@ -146,34 +179,86 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
||||||
|
|
||||||
public void importValue(String str) {
|
public void importValue(String str) {
|
||||||
StreamTokenizer tokenizer = getImportTokenizer(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 token;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
try {
|
try {
|
||||||
token = tokenizer.nextToken();
|
token = tokenizer.nextToken();
|
||||||
|
String chara = String.valueOf((char) token);
|
||||||
if (token != '(')
|
if (token != '(')
|
||||||
throw new IllegalArgumentException(str);
|
throw new IllegalArgumentException(chara);
|
||||||
|
token = tokenizer.nextToken();
|
||||||
|
if (token != ')')
|
||||||
|
tokenizer.pushBack();
|
||||||
|
else
|
||||||
|
return;
|
||||||
while (true) {
|
while (true) {
|
||||||
token = tokenizer.nextToken();
|
|
||||||
String val = tokenizer.sval;
|
|
||||||
String ik = String.valueOf(index);
|
String ik = String.valueOf(index);
|
||||||
IProblemPreference desc = getChildDescriptor(ik);
|
IProblemPreference desc = getChildDescriptor(ik);
|
||||||
if (desc != null) {
|
if (desc != null && desc instanceof AbstractProblemPreference) {
|
||||||
desc.importValue(val);
|
((AbstractProblemPreference) desc).importValue(tokenizer);
|
||||||
addChildValue(ik, desc.getValue());
|
setChildValue(ik, desc.getValue());
|
||||||
}
|
}
|
||||||
token = tokenizer.nextToken();
|
token = tokenizer.nextToken();
|
||||||
if (token == ')')
|
if (token == ')')
|
||||||
break;
|
break;
|
||||||
if (token != ',')
|
if (token != ',')
|
||||||
throw new IllegalArgumentException(str);
|
throw new IllegalArgumentException(chara);
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new IllegalArgumentException(str);
|
throw new IllegalArgumentException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeChildDescriptor(IProblemPreference info) {
|
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()]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ import java.io.IOException;
|
||||||
import java.io.StreamTokenizer;
|
import java.io.StreamTokenizer;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import org.eclipse.cdt.codan.core.model.AbstractCheckerWithProblemPreferences;
|
import org.eclipse.cdt.codan.core.model.AbstractCheckerWithProblemPreferences;
|
||||||
|
|
||||||
|
@ -73,10 +74,10 @@ public class MapProblemPreference extends AbstractProblemPreference implements
|
||||||
* @param i
|
* @param i
|
||||||
* @param info
|
* @param info
|
||||||
*/
|
*/
|
||||||
public void addChildDescriptor(IProblemPreference info) {
|
public IProblemPreference addChildDescriptor(IProblemPreference desc) {
|
||||||
IProblemPreference desc = (IProblemPreference) info.clone();
|
|
||||||
desc.setParent(this);
|
desc.setParent(this);
|
||||||
hash.put(info.getKey(), desc);
|
hash.put(desc.getKey(), desc);
|
||||||
|
return desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IProblemPreference[] getChildDescriptors() {
|
public IProblemPreference[] getChildDescriptors() {
|
||||||
|
@ -89,7 +90,7 @@ public class MapProblemPreference extends AbstractProblemPreference implements
|
||||||
return childInfo.getValue();
|
return childInfo.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addChildValue(String key, Object value) {
|
public void setChildValue(String key, Object value) {
|
||||||
getChildDescriptor(key).setValue(value);
|
getChildDescriptor(key).setValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,40 +121,96 @@ public class MapProblemPreference extends AbstractProblemPreference implements
|
||||||
|
|
||||||
public void importValue(String str) {
|
public void importValue(String str) {
|
||||||
StreamTokenizer tokenizer = getImportTokenizer(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;
|
int token;
|
||||||
try {
|
try {
|
||||||
token = tokenizer.nextToken();
|
token = tokenizer.nextToken();
|
||||||
if (token != '{')
|
String chara = String.valueOf((char) token);
|
||||||
throw new IllegalArgumentException(str);
|
if (token != '{') {
|
||||||
|
throw new IllegalArgumentException(chara);
|
||||||
|
}
|
||||||
while (true) {
|
while (true) {
|
||||||
token = tokenizer.nextToken();
|
token = tokenizer.nextToken();
|
||||||
String key = tokenizer.sval;
|
String key = tokenizer.sval;
|
||||||
token = tokenizer.nextToken();
|
token = tokenizer.nextToken();
|
||||||
if (token != '=')
|
if (token != '=')
|
||||||
throw new IllegalArgumentException(str);
|
throw new IllegalArgumentException(chara);
|
||||||
token = tokenizer.nextToken();
|
token = tokenizer.nextToken();
|
||||||
if (token != '>')
|
if (token != '>')
|
||||||
throw new IllegalArgumentException(str);
|
throw new IllegalArgumentException(chara);
|
||||||
token = tokenizer.nextToken();
|
|
||||||
String val = tokenizer.sval;
|
|
||||||
IProblemPreference desc = getChildDescriptor(key);
|
IProblemPreference desc = getChildDescriptor(key);
|
||||||
if (desc != null) {
|
if (desc != null && desc instanceof AbstractProblemPreference) {
|
||||||
desc.importValue(val);
|
((AbstractProblemPreference) desc).importValue(tokenizer);
|
||||||
} else {
|
setChildValue(key, desc.getValue());
|
||||||
//putChildValue(key, val);
|
|
||||||
}
|
}
|
||||||
token = tokenizer.nextToken();
|
token = tokenizer.nextToken();
|
||||||
if (token == '}')
|
if (token == '}')
|
||||||
break;
|
break;
|
||||||
if (token != ',')
|
if (token != ',')
|
||||||
throw new IllegalArgumentException(str);
|
throw new IllegalArgumentException(chara);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new IllegalArgumentException(str);
|
throw new IllegalArgumentException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeChildDescriptor(IProblemPreference info) {
|
public void removeChildDescriptor(IProblemPreference info) {
|
||||||
hash.remove(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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ public class CodanUIMessages extends NLS {
|
||||||
public static String CustomizeProblemDialog_Message;
|
public static String CustomizeProblemDialog_Message;
|
||||||
public static String CustomizeProblemDialog_Title;
|
public static String CustomizeProblemDialog_Title;
|
||||||
public static String Job_TitleRunningAnalysis;
|
public static String Job_TitleRunningAnalysis;
|
||||||
|
public static String ParametersComposite_NewValue;
|
||||||
public static String ParametersComposite_None;
|
public static String ParametersComposite_None;
|
||||||
static {
|
static {
|
||||||
// initialize resource bundle
|
// initialize resource bundle
|
||||||
|
|
|
@ -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.model.IProblemWorkingCopy;
|
||||||
import org.eclipse.cdt.codan.core.param.IProblemPreference;
|
import org.eclipse.cdt.codan.core.param.IProblemPreference;
|
||||||
import org.eclipse.cdt.codan.core.param.IProblemPreferenceCompositeDescriptor;
|
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.cdt.codan.internal.ui.CodanUIMessages;
|
||||||
|
import org.eclipse.jface.dialogs.InputDialog;
|
||||||
import org.eclipse.jface.preference.BooleanFieldEditor;
|
import org.eclipse.jface.preference.BooleanFieldEditor;
|
||||||
import org.eclipse.jface.preference.FieldEditorPreferencePage;
|
import org.eclipse.jface.preference.FieldEditorPreferencePage;
|
||||||
|
import org.eclipse.jface.preference.ListEditor;
|
||||||
import org.eclipse.jface.preference.PreferenceStore;
|
import org.eclipse.jface.preference.PreferenceStore;
|
||||||
import org.eclipse.jface.preference.StringFieldEditor;
|
import org.eclipse.jface.preference.StringFieldEditor;
|
||||||
|
import org.eclipse.jface.window.Window;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.layout.GridData;
|
import org.eclipse.swt.layout.GridData;
|
||||||
import org.eclipse.swt.layout.GridLayout;
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
@ -59,7 +63,8 @@ public class ParametersComposite extends Composite {
|
||||||
/**
|
/**
|
||||||
* @param info
|
* @param info
|
||||||
*/
|
*/
|
||||||
private void createFieldEditorsForParameters(IProblemPreference info) {
|
private void createFieldEditorsForParameters(
|
||||||
|
final IProblemPreference info) {
|
||||||
if (info == null)
|
if (info == null)
|
||||||
return;
|
return;
|
||||||
switch (info.getType()) {
|
switch (info.getType()) {
|
||||||
|
@ -77,7 +82,53 @@ public class ParametersComposite extends Composite {
|
||||||
addField(fe);
|
addField(fe);
|
||||||
break;
|
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)
|
IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) info)
|
||||||
.getChildDescriptors();
|
.getChildDescriptors();
|
||||||
for (int i = 0; i < childrenDescriptor.length; i++) {
|
for (int i = 0; i < childrenDescriptor.length; i++) {
|
||||||
|
@ -85,7 +136,6 @@ public class ParametersComposite extends Composite {
|
||||||
createFieldEditorsForParameters(desc);
|
createFieldEditorsForParameters(desc);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedOperationException(info.getType()
|
throw new UnsupportedOperationException(info.getType()
|
||||||
.toString());
|
.toString());
|
||||||
|
@ -126,8 +176,10 @@ public class ParametersComposite extends Composite {
|
||||||
case TYPE_FILE:
|
case TYPE_FILE:
|
||||||
desc.setValue(new File(prefStore.getString(key)));
|
desc.setValue(new File(prefStore.getString(key)));
|
||||||
break;
|
break;
|
||||||
case TYPE_MAP:
|
|
||||||
case TYPE_LIST:
|
case TYPE_LIST:
|
||||||
|
desc.importValue(prefStore.getString(key));
|
||||||
|
break;
|
||||||
|
case TYPE_MAP:
|
||||||
IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) desc)
|
IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) desc)
|
||||||
.getChildDescriptors();
|
.getChildDescriptors();
|
||||||
for (int i = 0; i < childrenDescriptor.length; i++) {
|
for (int i = 0; i < childrenDescriptor.length; i++) {
|
||||||
|
@ -158,8 +210,10 @@ public class ParametersComposite extends Composite {
|
||||||
case TYPE_FILE:
|
case TYPE_FILE:
|
||||||
prefStore.setValue(key, ((File) desc.getValue()).getPath());
|
prefStore.setValue(key, ((File) desc.getValue()).getPath());
|
||||||
break;
|
break;
|
||||||
|
case TYPE_LIST:
|
||||||
|
prefStore.setValue(key, desc.exportValue());
|
||||||
|
break;
|
||||||
case TYPE_MAP:
|
case TYPE_MAP:
|
||||||
case TYPE_LIST: {
|
|
||||||
IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) desc)
|
IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) desc)
|
||||||
.getChildDescriptors();
|
.getChildDescriptors();
|
||||||
for (int i = 0; i < childrenDescriptor.length; i++) {
|
for (int i = 0; i < childrenDescriptor.length; i++) {
|
||||||
|
@ -167,7 +221,6 @@ public class ParametersComposite extends Composite {
|
||||||
initPrefStore(chi);
|
initPrefStore(chi);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedOperationException(desc.getType()
|
throw new UnsupportedOperationException(desc.getType()
|
||||||
.toString());
|
.toString());
|
||||||
|
|
|
@ -13,6 +13,7 @@ CustomizeProblemComposite_TabScope=Scope
|
||||||
CustomizeProblemDialog_Message=Edit problem preferences, scope and launch options
|
CustomizeProblemDialog_Message=Edit problem preferences, scope and launch options
|
||||||
CustomizeProblemDialog_Title=Customize Problem...
|
CustomizeProblemDialog_Title=Customize Problem...
|
||||||
Job_TitleRunningAnalysis=Running Code Analysis
|
Job_TitleRunningAnalysis=Running Code Analysis
|
||||||
|
ParametersComposite_NewValue=New Value
|
||||||
ParametersComposite_None=No extra preferences
|
ParametersComposite_None=No extra preferences
|
||||||
ProblemsTreeEditor_NameColumn=Name
|
ProblemsTreeEditor_NameColumn=Name
|
||||||
ProblemsTreeEditor_Problems=Problems
|
ProblemsTreeEditor_Problems=Problems
|
||||||
|
|
Loading…
Add table
Reference in a new issue