blob: 3a78af2870bc7d2b23a5832d3a40227c8fcd8d03 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2007 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
*
*******************************************************************************/
package org.eclipse.dltk.internal.ui.search;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.search.SearchMatch;
import org.eclipse.dltk.internal.corext.util.Messages;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.dltk.ui.ProblemsLabelDecorator;
import org.eclipse.dltk.ui.ScriptElementLabels;
import org.eclipse.dltk.ui.search.IMatchPresentation;
import org.eclipse.dltk.ui.viewsupport.AppearanceAwareLabelProvider;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.search.ui.text.AbstractTextSearchResult;
import org.eclipse.search.ui.text.Match;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
public abstract class SearchLabelProvider extends AppearanceAwareLabelProvider {
public static final String PROPERTY_MATCH_COUNT = "org.eclipse.dltk.search.matchCount"; //$NON-NLS-1$
// copied from SearchPreferencePage
private static final String EMPHASIZE_POTENTIAL_MATCHES = "org.eclipse.search.potentialMatch.emphasize"; //$NON-NLS-1$
private static final String POTENTIAL_MATCH_FG_COLOR = "org.eclipse.search.potentialMatch.fgColor"; //$NON-NLS-1$
protected static final long DEFAULT_SEARCH_TEXTFLAGS = (DEFAULT_TEXTFLAGS | ScriptElementLabels.P_COMPRESSED)
& ~ScriptElementLabels.M_APP_RETURNTYPE;
protected static final int DEFAULT_SEARCH_IMAGEFLAGS = DEFAULT_IMAGEFLAGS;
private Color fPotentialMatchFgColor;
private Map<IMatchPresentation, ILabelProvider> fLabelProviderMap;
protected DLTKSearchResultPage fPage;
private ScopedPreferenceStore fSearchPreferences;
private IPropertyChangeListener fSearchPropertyListener;
public SearchLabelProvider(DLTKSearchResultPage page) {
super(DEFAULT_SEARCH_TEXTFLAGS, DEFAULT_SEARCH_IMAGEFLAGS, DLTKUIPlugin
.getDefault().getPreferenceStore());
if (DLTKCore.DEBUG) {
System.out
.println("TODO: Add language dependent preference store support here..."); //$NON-NLS-1$
}
addLabelDecorator(new ProblemsLabelDecorator());
fPage = page;
fLabelProviderMap = new HashMap<IMatchPresentation, ILabelProvider>(5);
fSearchPreferences = new ScopedPreferenceStore(InstanceScope.INSTANCE,
NewSearchUI.PLUGIN_ID);
fSearchPropertyListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
doSearchPropertyChange(event);
}
};
fSearchPreferences.addPropertyChangeListener(fSearchPropertyListener);
}
final void doSearchPropertyChange(PropertyChangeEvent event) {
if (fPotentialMatchFgColor == null)
return;
if (POTENTIAL_MATCH_FG_COLOR.equals(event.getProperty())
|| EMPHASIZE_POTENTIAL_MATCHES.equals(event.getProperty())) {
fPotentialMatchFgColor.dispose();
fPotentialMatchFgColor = null;
LabelProviderChangedEvent lpEvent = new LabelProviderChangedEvent(
SearchLabelProvider.this, null); // refresh all
fireLabelProviderChanged(lpEvent);
}
}
@Override
public Color getForeground(Object element) {
if (arePotentialMatchesEmphasized()) {
if (getNumberOfPotentialMatches(element) > 0)
return getForegroundColor();
}
return super.getForeground(element);
}
private Color getForegroundColor() {
if (fPotentialMatchFgColor == null) {
fPotentialMatchFgColor = new Color(DLTKUIPlugin
.getActiveWorkbenchShell().getDisplay(),
getPotentialMatchForegroundColor());
}
return fPotentialMatchFgColor;
}
protected final int getNumberOfPotentialMatches(Object element) {
int res = 0;
AbstractTextSearchResult result = fPage.getInput();
if (result != null) {
Match[] matches = result.getMatches(element);
for (int i = 0; i < matches.length; i++) {
if ((matches[i]) instanceof DLTKElementMatch) {
if (((DLTKElementMatch) matches[i]).getAccuracy() == SearchMatch.A_INACCURATE)
res++;
}
}
}
return res;
}
protected final String getLabelWithCounts(Object element, String elementName) {
int matchCount = fPage.getDisplayedMatchCount(element);
int potentialCount = getNumberOfPotentialMatches(element);
if (matchCount < 2) {
if (matchCount == 1 && hasChildren(element)) {
if (potentialCount > 0)
return Messages
.format(
SearchMessages.SearchLabelProvider_potential_singular,
elementName);
return Messages.format(
SearchMessages.SearchLabelProvider_exact_singular,
elementName);
}
if (potentialCount > 0)
return Messages.format(
SearchMessages.SearchLabelProvider_potential_noCount,
elementName);
return Messages.format(
SearchMessages.SearchLabelProvider_exact_noCount,
elementName);
} else {
int exactCount = matchCount - potentialCount;
if (potentialCount > 0 && exactCount > 0) {
String[] args = new String[] { elementName,
String.valueOf(matchCount), String.valueOf(exactCount),
String.valueOf(potentialCount) };
return Messages
.format(
SearchMessages.SearchLabelProvider_exact_and_potential_plural,
args);
} else if (exactCount == 0) {
String[] args = new String[] { elementName,
String.valueOf(matchCount) };
return Messages.format(
SearchMessages.SearchLabelProvider_potential_plural,
args);
}
String[] args = new String[] { elementName,
String.valueOf(matchCount) };
return Messages.format(
SearchMessages.SearchLabelProvider_exact_plural, args);
}
}
protected boolean hasChildren(Object elem) {
return false;
}
@Override
public void dispose() {
if (fPotentialMatchFgColor != null) {
fPotentialMatchFgColor.dispose();
fPotentialMatchFgColor = null;
}
fSearchPreferences
.removePropertyChangeListener(fSearchPropertyListener);
for (ILabelProvider labelProvider : fLabelProviderMap.values()) {
labelProvider.dispose();
}
fSearchPreferences = null;
fSearchPropertyListener = null;
fLabelProviderMap.clear();
super.dispose();
}
@Override
public void addListener(ILabelProviderListener listener) {
super.addListener(listener);
for (ILabelProvider labelProvider : fLabelProviderMap.values()) {
labelProvider.addListener(listener);
}
}
@Override
public boolean isLabelProperty(Object element, String property) {
if (PROPERTY_MATCH_COUNT.equals(property))
return true;
return getLabelProvider(element).isLabelProperty(element, property);
}
@Override
public void removeListener(ILabelProviderListener listener) {
super.removeListener(listener);
for (ILabelProvider labelProvider : fLabelProviderMap.values()) {
labelProvider.removeListener(listener);
}
}
protected String getParticipantText(Object element) {
ILabelProvider labelProvider = getLabelProvider(element);
if (labelProvider != null)
return labelProvider.getText(element);
return ""; //$NON-NLS-1$
}
protected Image getParticipantImage(Object element) {
ILabelProvider lp = getLabelProvider(element);
if (lp == null)
return null;
return lp.getImage(element);
}
private ILabelProvider getLabelProvider(Object element) {
IMatchPresentation participant = ((DLTKSearchResult) fPage.getInput())
.getSearchParticpant(element);
if (participant == null)
return null;
ILabelProvider lp = fLabelProviderMap.get(participant);
if (lp == null) {
lp = participant.createLabelProvider();
fLabelProviderMap.put(participant, lp);
Object[] listeners = fListeners.getListeners();
for (int i = 0; i < listeners.length; i++) {
lp.addListener((ILabelProviderListener) listeners[i]);
}
}
return lp;
}
private boolean arePotentialMatchesEmphasized() {
return fSearchPreferences.getBoolean(EMPHASIZE_POTENTIAL_MATCHES);
}
private RGB getPotentialMatchForegroundColor() {
return PreferenceConverter.getColor(fSearchPreferences,
POTENTIAL_MATCH_FG_COLOR);
}
}