blob: 0782ac897ae96f581af5a721480b29ffbefb1be1 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2003, 2018 Geoff Longman and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Geoff Longman - Initial API and implementation
* IBM - Tightening integration with existing Platform
**********************************************************************/
package org.eclipse.core.tools.resources.markers;
import org.eclipse.ui.views.properties.PropertyDescriptor;
import java.util.*;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.tools.resources.CoreResourcesToolsPlugin;
import org.eclipse.ui.views.properties.*;
/**
* A read-only IPropertySource for Marker attributes.
*/
public class ReadOnlyMarkerPropertySource implements IPropertySource {
private PropertyDescriptor persistentDescriptor = new PropertyDescriptor("persistent", "persistent");
protected MarkerExtensionModel model;
protected MarkerView view;
protected IMarker marker;
protected MarkerExtensionModel.MarkerInfo info;
public ReadOnlyMarkerPropertySource(MarkerView view, MarkerExtensionModel model) {
super();
this.model = model;
this.view = view;
}
@Override
public Object getEditableValue() {
return null;
}
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
ArrayList<PropertyDescriptor> descriptors = new ArrayList<>();
findPropertyDescriptors(descriptors);
return descriptors.toArray(new IPropertyDescriptor[descriptors.size()]);
}
private void findPropertyDescriptors(ArrayList<PropertyDescriptor> descriptorList) {
try {
Set<String> attributesWithoutDescriptors = new HashSet<>(marker.getAttributes().keySet());
findDeclaredPropertyDescriptorsFor(info, descriptorList, attributesWithoutDescriptors);
if (!attributesWithoutDescriptors.isEmpty()) {
// we have extra, undeclared attributes.
// we will create the correct property descriptor
for (String name : attributesWithoutDescriptors) {
PropertyDescriptor desc = new PropertyDescriptor(name, name);
desc.setCategory("undeclared attributes");
descriptorList.add(desc);
}
}
} catch (CoreException e) {
// ignore
}
}
private void findDeclaredPropertyDescriptorsFor(MarkerExtensionModel.MarkerInfo anInfo, List<PropertyDescriptor> descriptorList, Set<String> actualAttributeSet) {
if (anInfo == null)
return;
try {
if (anInfo.id.equals(marker.getType())) {
persistentDescriptor.setCategory(anInfo.id);
descriptorList.add(persistentDescriptor);
}
} catch (CoreException e) {
// ignore
}
for (String attr : anInfo.declaredAttributes) {
PropertyDescriptor desc = new PropertyDescriptor(attr, attr);
desc.setCategory(anInfo.id);
descriptorList.add(desc);
actualAttributeSet.remove(attr);
}
for (String superId : anInfo.declaredSupers) {
MarkerExtensionModel.MarkerInfo superInfo = model.getInfo(superId);
if (superInfo == null) {
CoreResourcesToolsPlugin.logProblem("internal error. could not find supertype" + superId + "of marker" + info.id, IStatus.ERROR);
continue;
}
findDeclaredPropertyDescriptorsFor(superInfo, descriptorList, actualAttributeSet);
}
}
@Override
public Object getPropertyValue(Object id) {
String name = (String) id;
if ("persistent".equals(name))
return info.persistent ? Boolean.TRUE : Boolean.FALSE;
try {
return marker.getAttribute(name);
} catch (CoreException e) {
CoreResourcesToolsPlugin.logProblem(e);
return "exception occured accessing: " + name;
}
}
@Override
public boolean isPropertySet(Object id) {
String name = (String) id;
if ("persistent".equals(name))
return info != null;
try {
return marker.getAttribute(name) != null;
} catch (CoreException e) {
CoreResourcesToolsPlugin.logProblem(e);
return false;
}
}
@Override
public void resetPropertyValue(Object id) {
// do nothing
}
@Override
public void setPropertyValue(Object id, Object value) {
// do nothing
}
/**
* Sets the Marker this source will act on behalf of.
*/
public void setSourceMarker(IMarker marker) {
this.marker = marker;
this.info = null;
try {
this.info = model.getInfo(marker.getType());
} catch (CoreException e) {
CoreResourcesToolsPlugin.logProblem(e);
}
}
}