blob: 9560d10281a37281ef7e91751061df1e399c54a2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.views.markers.internal;
import java.text.CollationKey;
import java.text.Collator;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
/**
* This is a concrete class that stores the same type of information as the IMarkers
* used by the IDE. This class exists as an optimization. The various get* methods
* on IMarker are extremely slow, which makes it very slow to sort markers (for example,
* in the problems view). This marker class stores the fields in the most efficient form
* for sorting and display, but necessarily removes some generality from IMarker.
*/
public class ConcreteMarker extends MarkerNode{
private String description;
private String resourceName;
private String inFolder;
private CollationKey descriptionKey;
private CollationKey resourceNameKey;
private int line;
private String locationString;
private long creationTime;
private String type;
private IMarker marker;
/**
* Cache for the marker ID.
*/
private long id = -1L;
private MarkerNode markerCategory;
private String shortFolder;
private String group;
public ConcreteMarker(IMarker toCopy) {
marker = toCopy;
refresh();
}
/**
* Clears any cached information. This frees up some memory, but will slow down
* the next comparison operation. It is a good idea to call this on a set of markers
* after sorting them, in order to reduce their memory cost.
*/
public void clearCache() {
resourceNameKey = null;
descriptionKey = null;
}
/**
* Refresh the properties of this marker from the underlying IMarker instance
*/
public void refresh() {
clearCache();
description = Util.getProperty(IMarker.MESSAGE, marker);
resourceName = Util.getResourceName(marker);
inFolder = Util.getContainerName(marker);
shortFolder = null;
line = marker.getAttribute(IMarker.LINE_NUMBER, -1);
locationString = marker.getAttribute(IMarker.LOCATION,
Util.EMPTY_STRING);
try {
creationTime = marker.getCreationTime();
} catch (CoreException e) {
creationTime = 0;
}
try {
type = marker.getType();
} catch (CoreException e1) {
type = Util.EMPTY_STRING;
}
// store the marker ID locally
id = marker.getId();
}
public IResource getResource() {
return marker.getResource();
}
public String getType() {
return type;
}
/* (non-Javadoc)
* @see org.eclipse.ui.views.markers.internal.MarkerNode#getDescription()
*/
public String getDescription() {
return description;
}
public CollationKey getDescriptionKey() {
if (descriptionKey == null) {
descriptionKey = Collator.getInstance()
.getCollationKey(description);
}
return descriptionKey;
}
public String getResourceName() {
return resourceName;
}
public CollationKey getResourceNameKey() {
if (resourceNameKey == null) {
resourceNameKey = Collator.getInstance().getCollationKey(
resourceName);
}
return resourceNameKey;
}
public int getLine() {
return line;
}
public String getFolder() {
return inFolder;
}
public long getCreationTime() {
return creationTime;
}
/**
* The underlying marker ID value.
* @return the marker's ID.
*/
public long getId() {
return id;
}
public IMarker getMarker() {
return marker;
}
public boolean equals(Object object) {
if (!(object instanceof ConcreteMarker)) {
return false;
}
ConcreteMarker other = (ConcreteMarker) object;
return other.getMarker().equals(getMarker());
}
public int hashCode() {
return getMarker().hashCode();
}
/**
* Set the category the receiver is in.
* @param category
*/
public void setCategory(MarkerNode category) {
markerCategory = category;
}
/* (non-Javadoc)
* @see org.eclipse.ui.views.markers.internal.MarkerNode#getChildren()
*/
public MarkerNode[] getChildren() {
return Util.EMPTY_MARKER_ARRAY;
}
/* (non-Javadoc)
* @see org.eclipse.ui.views.markers.internal.MarkerNode#getParent()
*/
public MarkerNode getParent() {
return markerCategory;
}
/* (non-Javadoc)
* @see org.eclipse.ui.views.markers.internal.MarkerNode#isConcrete()
*/
public boolean isConcrete() {
return true;
}
/**
* Return the short name for the folder.
* @return String
*/
public String getShortFolder() {
if(shortFolder == null)
shortFolder = Util.getShortContainerName(marker);
return shortFolder;
}
/**
* Get the location string. If the {@link IMarker#LOCATION }
* attribute was not set then return an empty String.
* @return String
*/
public String getLocationString() {
return locationString;
}
/**
* Get the group for the reciever.
* @return Returns the group.
*/
public String getGroup() {
return group;
}
/**
* Set the group name.
* @param group the group name
*/
public void setGroup(String group) {
this.group = group;
}
}