mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-24 17:35:35 +02:00
partually support editing multiple problems at the same time
This commit is contained in:
parent
1db363d94c
commit
14199fcfa3
5 changed files with 126 additions and 47 deletions
|
@ -18,7 +18,7 @@ import java.util.Iterator;
|
|||
|
||||
/**
|
||||
* List implementation of IProblemPreference.
|
||||
*
|
||||
*
|
||||
* @noextend This class is not intended to be extended by clients.
|
||||
*/
|
||||
public class ListProblemPreference extends AbstractProblemPreference implements IProblemPreferenceCompositeValue,
|
||||
|
@ -49,7 +49,7 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
|||
/**
|
||||
* Set child descriptor (all elements have the same). Value and key
|
||||
* of it would be ignored and reset.
|
||||
*
|
||||
*
|
||||
* @param desc
|
||||
* @return set child descriptor
|
||||
*/
|
||||
|
@ -66,7 +66,7 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
|||
* 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) {
|
||||
|
@ -78,7 +78,7 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @return descriptor of the child elements
|
||||
*/
|
||||
public IProblemPreference getChildDescriptor() {
|
||||
|
@ -88,7 +88,7 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
|||
/**
|
||||
* Returns cloned descriptor of the i'th child. Modifying return value would
|
||||
* not affect internal state of the list element.
|
||||
*
|
||||
*
|
||||
* @param i - index of the element
|
||||
* @return child preference
|
||||
*/
|
||||
|
@ -103,7 +103,7 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
|||
/**
|
||||
* 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
|
||||
*/
|
||||
|
@ -170,7 +170,7 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
|||
|
||||
/**
|
||||
* Adds value to the list
|
||||
*
|
||||
*
|
||||
* @param value
|
||||
*/
|
||||
public void addChildValue(Object value) {
|
||||
|
@ -211,6 +211,7 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
|||
|
||||
@Override
|
||||
public void importValue(String str) {
|
||||
if (str.length()==0) return;
|
||||
StreamTokenizer tokenizer = getImportTokenizer(str);
|
||||
try {
|
||||
importValue(tokenizer);
|
||||
|
@ -288,7 +289,7 @@ public class ListProblemPreference extends AbstractProblemPreference implements
|
|||
|
||||
/**
|
||||
* Sets list value to values of array given as argument.
|
||||
*
|
||||
*
|
||||
* @param value - must be Object[]
|
||||
*/
|
||||
@Override
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
package org.eclipse.cdt.codan.internal.ui.actions;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.eclipse.cdt.codan.core.model.IProblem;
|
||||
import org.eclipse.cdt.codan.core.model.IProblemProfile;
|
||||
import org.eclipse.cdt.codan.internal.core.model.CodanProblem;
|
||||
import org.eclipse.cdt.codan.internal.core.model.CodanProblemMarker;
|
||||
|
@ -21,17 +25,23 @@ public class OpenProblemPreferences implements IObjectActionDelegate {
|
|||
|
||||
public void run(IAction action) {
|
||||
if (selection instanceof IStructuredSelection) {
|
||||
Object firstElement = ((IStructuredSelection) selection).getFirstElement(); // TODO support multiple
|
||||
if (firstElement instanceof IMarker) {
|
||||
IMarker marker = (IMarker) firstElement;
|
||||
String id = CodanProblemMarker.getProblemId(marker);
|
||||
if (id == null)
|
||||
return;
|
||||
IResource resource = marker.getResource();
|
||||
IProblemProfile profile = CodanProblemMarker.getProfile(resource);
|
||||
CodanProblem problem = ((CodanProblem) profile.findProblem(id));
|
||||
new CustomizeProblemDialog(targetPart.getSite().getShell(), problem, resource).open();
|
||||
IStructuredSelection ss = (IStructuredSelection) selection;
|
||||
ArrayList<IProblem> list = new ArrayList<IProblem>();
|
||||
IResource resource = null;
|
||||
for (Iterator<?> iterator = ss.iterator(); iterator.hasNext();) {
|
||||
Object el = iterator.next();
|
||||
if (el instanceof IMarker) {
|
||||
IMarker marker = (IMarker) el;
|
||||
String id = CodanProblemMarker.getProblemId(marker);
|
||||
if (id == null)
|
||||
return;
|
||||
resource = marker.getResource();
|
||||
IProblemProfile profile = CodanProblemMarker.getProfile(resource);
|
||||
CodanProblem problem = ((CodanProblem) profile.findProblem(id));
|
||||
list.add(problem);
|
||||
}
|
||||
}
|
||||
new CustomizeProblemDialog(targetPart.getSite().getShell(), list.toArray(new IProblem[list.size()]), resource).open();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -12,8 +12,11 @@ package org.eclipse.cdt.codan.internal.ui.dialogs;
|
|||
|
||||
import org.eclipse.cdt.codan.core.model.IProblem;
|
||||
import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy;
|
||||
import org.eclipse.cdt.codan.core.param.RootProblemPreference;
|
||||
import org.eclipse.cdt.codan.internal.core.model.CodanProblem;
|
||||
import org.eclipse.cdt.codan.internal.ui.CodanUIMessages;
|
||||
import org.eclipse.cdt.codan.internal.ui.widgets.CustomizeProblemComposite;
|
||||
import org.eclipse.cdt.codan.internal.ui.widgets.ParametersComposite;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.jface.dialogs.TitleAreaDialog;
|
||||
import org.eclipse.swt.SWT;
|
||||
|
@ -29,6 +32,7 @@ import org.eclipse.swt.widgets.Shell;
|
|||
public class CustomizeProblemDialog extends TitleAreaDialog {
|
||||
private CustomizeProblemComposite comp;
|
||||
private IProblem problem;
|
||||
private IProblem[] problems;
|
||||
private IResource resource;
|
||||
|
||||
/**
|
||||
|
@ -36,13 +40,30 @@ public class CustomizeProblemDialog extends TitleAreaDialog {
|
|||
* @param selectedProblem
|
||||
* @param iResource
|
||||
*/
|
||||
public CustomizeProblemDialog(Shell parentShell, IProblem selectedProblem, IResource resource) {
|
||||
public CustomizeProblemDialog(Shell parentShell, IProblem[] selectedProblems, IResource resource) {
|
||||
super(parentShell);
|
||||
this.problem = selectedProblem;
|
||||
this.problems = selectedProblems;
|
||||
this.problem = buildCombined(selectedProblems);
|
||||
this.resource = resource;
|
||||
setShellStyle(getShellStyle() | SWT.RESIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param selectedProblems
|
||||
* @return
|
||||
*/
|
||||
private IProblem buildCombined(IProblem[] selectedProblems) {
|
||||
if (selectedProblems.length == 1) {
|
||||
return selectedProblems[0];
|
||||
}
|
||||
CodanProblem problem = new CodanProblem("multi", getTitle());
|
||||
problem.setMessagePattern(ParametersComposite.NO_CHANGE);
|
||||
problem.setPreference(new RootProblemPreference());
|
||||
problem.setSeverity(selectedProblems[0].getSeverity());
|
||||
problem.setEnabled(selectedProblems[0].isEnabled());
|
||||
return problem;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores edit values into problem working copy
|
||||
*
|
||||
|
@ -63,7 +84,7 @@ public class CustomizeProblemDialog extends TitleAreaDialog {
|
|||
@Override
|
||||
protected Control createDialogArea(Composite parent) {
|
||||
getShell().setText(CodanUIMessages.CustomizeProblemDialog_Title);
|
||||
setTitle(problem.getName());
|
||||
setTitle(getTitle());
|
||||
setMessage(CodanUIMessages.CustomizeProblemDialog_Message);
|
||||
Composite area = (Composite) super.createDialogArea(parent);
|
||||
comp = new CustomizeProblemComposite(area, problem, resource);
|
||||
|
@ -73,6 +94,22 @@ public class CustomizeProblemDialog extends TitleAreaDialog {
|
|||
return area;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public String getTitle() {
|
||||
if (problems.length == 1)
|
||||
return problem.getName();
|
||||
String b = ""; //$NON-NLS-1$
|
||||
for (int i = 0; i < problems.length; i++) {
|
||||
IProblem p = problems[i];
|
||||
if (i != 0)
|
||||
b += ", "; //$NON-NLS-1$
|
||||
b += p.getName();
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
|
@ -80,7 +117,10 @@ public class CustomizeProblemDialog extends TitleAreaDialog {
|
|||
*/
|
||||
@Override
|
||||
protected void okPressed() {
|
||||
save((IProblemWorkingCopy) problem);
|
||||
for (int i = 0; i < problems.length; i++) {
|
||||
IProblemWorkingCopy wc = (IProblemWorkingCopy) problems[i];
|
||||
save(wc);
|
||||
}
|
||||
super.okPressed();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,9 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.ui.preferences;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.eclipse.cdt.codan.core.CodanCorePlugin;
|
||||
import org.eclipse.cdt.codan.core.CodanRuntime;
|
||||
import org.eclipse.cdt.codan.core.model.ICheckersRegistry;
|
||||
|
@ -53,7 +56,7 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements IWork
|
|||
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
|
||||
private IProblemProfile profile;
|
||||
private ISelectionChangedListener problemSelectionListener;
|
||||
private IProblem selectedProblem;
|
||||
private ArrayList<IProblem> selectedProblems;
|
||||
private Button infoButton;
|
||||
private ProblemsTreeEditor checkedTreeEditor;
|
||||
|
||||
|
@ -66,10 +69,14 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements IWork
|
|||
if (infoButton != null) {
|
||||
if (event.getSelection() instanceof ITreeSelection) {
|
||||
ITreeSelection s = (ITreeSelection) event.getSelection();
|
||||
if (s.getFirstElement() instanceof IProblem)
|
||||
setSelectedProblem((IProblem) s.getFirstElement());
|
||||
else
|
||||
setSelectedProblem(null);
|
||||
ArrayList<IProblem> list = new ArrayList<IProblem>();
|
||||
for (Iterator iterator = s.iterator(); iterator.hasNext();) {
|
||||
Object o = iterator.next();
|
||||
if (o instanceof IProblem) {
|
||||
list.add((IProblem) o);
|
||||
}
|
||||
}
|
||||
setSelectedProblems(list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -124,7 +131,7 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements IWork
|
|||
Composite info = new Composite(comp, SWT.NONE);
|
||||
info.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||
GridLayout layout = new GridLayout(1, false);
|
||||
layout.marginWidth=0;
|
||||
layout.marginWidth = 0;
|
||||
info.setLayout(layout);
|
||||
infoButton = new Button(info, SWT.PUSH);
|
||||
infoButton.setLayoutData(GridDataFactory.swtDefaults().align(SWT.END, SWT.BEGINNING).create());
|
||||
|
@ -141,8 +148,8 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements IWork
|
|||
/**
|
||||
* @param selection
|
||||
*/
|
||||
protected void setSelectedProblem(IProblem problem) {
|
||||
this.selectedProblem = problem;
|
||||
protected void setSelectedProblems(ArrayList<IProblem> list) {
|
||||
this.selectedProblems = list;
|
||||
updateProblemInfo();
|
||||
}
|
||||
|
||||
|
@ -167,8 +174,11 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements IWork
|
|||
}
|
||||
|
||||
private void saveWidgetValues() {
|
||||
CodanUIActivator.getDefault().getDialogSettings()
|
||||
.put(getWidgetId(), selectedProblem == null ? EMPTY_STRING : selectedProblem.getId());
|
||||
CodanUIActivator
|
||||
.getDefault()
|
||||
.getDialogSettings()
|
||||
.put(getWidgetId(),
|
||||
(selectedProblems == null || selectedProblems.size() == 0) ? EMPTY_STRING : selectedProblems.get(0).getId());
|
||||
}
|
||||
|
||||
private void restoreWidgetValues() {
|
||||
|
@ -176,7 +186,7 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements IWork
|
|||
if (id != null && id.length() > 0 && checkedTreeEditor != null) {
|
||||
checkedTreeEditor.getTreeViewer().setSelection(new StructuredSelection(profile.findProblem(id)), true);
|
||||
} else {
|
||||
setSelectedProblem(null);
|
||||
setSelectedProblems(null);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -188,7 +198,7 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements IWork
|
|||
}
|
||||
|
||||
private void updateProblemInfo() {
|
||||
if (selectedProblem == null) {
|
||||
if (selectedProblems == null) {
|
||||
infoButton.setEnabled(false);
|
||||
} else {
|
||||
infoButton.setEnabled(true);
|
||||
|
@ -205,9 +215,11 @@ public class CodanPreferencePage extends FieldEditorOverlayPage implements IWork
|
|||
}
|
||||
|
||||
protected void openCustomizeDialog() {
|
||||
if (selectedProblem == null)
|
||||
if (selectedProblems == null || selectedProblems.size() == 0)
|
||||
return;
|
||||
CustomizeProblemDialog dialog = new CustomizeProblemDialog(getShell(), selectedProblem, (IResource) getElement());
|
||||
CustomizeProblemDialog dialog = new CustomizeProblemDialog(getShell(), selectedProblems.toArray(new IProblem[selectedProblems
|
||||
.size()]), (IResource) getElement());
|
||||
dialog.open();
|
||||
checkedTreeEditor.getTreeViewer().refresh(true);
|
||||
}
|
||||
}
|
|
@ -45,6 +45,7 @@ public class ParametersComposite extends Composite {
|
|||
private static final String PREF_ENABLED = "enabled"; //$NON-NLS-1$
|
||||
private static final String PREF_SEVERITY = "severity"; //$NON-NLS-1$
|
||||
private static final String PREF_MESSAGE = "message"; //$NON-NLS-1$
|
||||
public static final String NO_CHANGE = "<do not change>";
|
||||
private FieldEditorPreferencePage page;
|
||||
private IProblem problem;
|
||||
private PreferenceStore prefStore;
|
||||
|
@ -70,6 +71,7 @@ public class ParametersComposite extends Composite {
|
|||
String[][] entries = { { CodanSeverity.Error.toString(), CodanSeverity.Error.toString() }, //
|
||||
{ CodanSeverity.Warning.toString(), CodanSeverity.Warning.toString() }, //
|
||||
{ CodanSeverity.Info.toString(), CodanSeverity.Info.toString() }, //
|
||||
{ NO_CHANGE, NO_CHANGE }, //
|
||||
};
|
||||
addField(new ComboFieldEditor(PREF_SEVERITY, CodanUIMessages.ParametersComposite_Severity, entries, getFieldEditorParent()));
|
||||
addField(new StringFieldEditor(PREF_MESSAGE, CodanUIMessages.ParametersComposite_MessagePattern, getFieldEditorParent()));
|
||||
|
@ -183,17 +185,25 @@ public class ParametersComposite extends Composite {
|
|||
} else {
|
||||
initPrefStore(info);
|
||||
}
|
||||
prefStore.setValue(PREF_ENABLED, problem.isEnabled());
|
||||
prefStore.setValue(PREF_SEVERITY, problem.getSeverity().toString());
|
||||
prefStore.setValue(PREF_MESSAGE, problem.getMessagePattern());
|
||||
prefStore.setDefault(PREF_ENABLED, problem.isEnabled());
|
||||
if (problem.getMessagePattern() == NO_CHANGE) {
|
||||
prefStore.setDefault(PREF_SEVERITY, NO_CHANGE);
|
||||
} else {
|
||||
prefStore.setDefault(PREF_SEVERITY, problem.getSeverity().toString());
|
||||
}
|
||||
prefStore.setDefault(PREF_MESSAGE, problem.getMessagePattern());
|
||||
}
|
||||
|
||||
public void save(IProblemWorkingCopy problem) {
|
||||
page.performOk();
|
||||
savePrefStore(problem.getPreference());
|
||||
problem.setEnabled(prefStore.getBoolean(PREF_ENABLED));
|
||||
problem.setSeverity(CodanSeverity.valueOf(prefStore.getString(PREF_SEVERITY)));
|
||||
problem.setMessagePattern(prefStore.getString(PREF_MESSAGE));
|
||||
String severity = prefStore.getString(PREF_SEVERITY);
|
||||
if (!severity.equals(NO_CHANGE))
|
||||
problem.setSeverity(CodanSeverity.valueOf(severity));
|
||||
String message = prefStore.getString(PREF_MESSAGE);
|
||||
if (!message.equals(NO_CHANGE))
|
||||
problem.setMessagePattern(message);
|
||||
}
|
||||
|
||||
private void savePrefStore(IProblemPreference desc) {
|
||||
|
@ -237,22 +247,28 @@ public class ParametersComposite extends Composite {
|
|||
String key = desc.getQualifiedKey();
|
||||
switch (desc.getType()) {
|
||||
case TYPE_STRING:
|
||||
prefStore.setValue(key, (String) desc.getValue());
|
||||
prefStore.setDefault(key, (String) desc.getValue());
|
||||
//prefStore.setValue(key, (String) desc.getValue());
|
||||
break;
|
||||
case TYPE_BOOLEAN:
|
||||
prefStore.setValue(key, (Boolean) desc.getValue());
|
||||
prefStore.setDefault(key, (Boolean) desc.getValue());
|
||||
//prefStore.setValue(key, (Boolean) desc.getValue());
|
||||
break;
|
||||
case TYPE_INTEGER:
|
||||
prefStore.setValue(key, (Integer) desc.getValue());
|
||||
prefStore.setDefault(key, (Integer) desc.getValue());
|
||||
//prefStore.setValue(key, (Integer) desc.getValue());
|
||||
break;
|
||||
case TYPE_FILE:
|
||||
prefStore.setValue(key, ((File) desc.getValue()).getPath());
|
||||
prefStore.setDefault(key, ((File) desc.getValue()).getPath());
|
||||
//prefStore.setValue(key, ((File) desc.getValue()).getPath());
|
||||
break;
|
||||
case TYPE_LIST:
|
||||
prefStore.setValue(key, desc.exportValue());
|
||||
prefStore.setDefault(key, desc.exportValue());
|
||||
//prefStore.setValue(key, desc.exportValue());
|
||||
break;
|
||||
case TYPE_CUSTOM:
|
||||
prefStore.setValue(key, desc.exportValue());
|
||||
prefStore.setDefault(key, desc.exportValue());
|
||||
//prefStore.setValue(key, desc.exportValue());
|
||||
break;
|
||||
case TYPE_MAP:
|
||||
IProblemPreference[] childrenDescriptor = ((IProblemPreferenceCompositeDescriptor) desc).getChildDescriptors();
|
||||
|
|
Loading…
Add table
Reference in a new issue