1 11 package org.eclipse.jdt.internal.ui.viewsupport; 12 13 import java.util.HashMap ; 14 import java.util.Iterator ; 15 import java.util.Map ; 16 17 import org.eclipse.swt.events.DisposeEvent; 18 import org.eclipse.swt.events.DisposeListener; 19 import org.eclipse.swt.graphics.Color; 20 import org.eclipse.swt.widgets.Control; 21 import org.eclipse.swt.widgets.Display; 22 import org.eclipse.swt.widgets.Item; 23 import org.eclipse.swt.widgets.Table; 24 import org.eclipse.swt.widgets.Tree; 25 import org.eclipse.swt.widgets.TreeItem; 26 27 import org.eclipse.jface.resource.ColorRegistry; 28 import org.eclipse.jface.resource.JFaceResources; 29 import org.eclipse.jface.util.IPropertyChangeListener; 30 import org.eclipse.jface.util.PropertyChangeEvent; 31 import org.eclipse.jface.viewers.IBaseLabelProvider; 32 import org.eclipse.jface.viewers.StructuredViewer; 33 34 import org.eclipse.jdt.ui.PreferenceConstants; 35 36 import org.eclipse.jdt.internal.ui.preferences.AppearancePreferencePage; 37 38 public class ColoredViewersManager implements IPropertyChangeListener { 39 40 public static final String QUALIFIER_COLOR_NAME= "org.eclipse.jdt.ui.ColoredLabels.qualifier"; public static final String DECORATIONS_COLOR_NAME= "org.eclipse.jdt.ui.ColoredLabels.decorations"; public static final String COUNTER_COLOR_NAME= "org.eclipse.jdt.ui.ColoredLabels.counter"; public static final String INHERITED_COLOR_NAME= "org.eclipse.jdt.ui.ColoredLabels.inherited"; 45 private static ColoredViewersManager fgInstance= new ColoredViewersManager(); 46 47 private Map fManagedViewers; 48 private ColorRegistry fColorRegisty; 49 50 public ColoredViewersManager() { 51 fManagedViewers= new HashMap (); 52 fColorRegisty= JFaceResources.getColorRegistry(); 53 } 54 55 public void installColoredLabels(StructuredViewer viewer) { 56 if (fManagedViewers.containsKey(viewer)) { 57 return; } 59 if (fManagedViewers.isEmpty()) { 60 PreferenceConstants.getPreferenceStore().addPropertyChangeListener(this); 62 fColorRegisty.addListener(this); 63 } 64 fManagedViewers.put(viewer, new ManagedViewer(viewer)); 65 } 66 67 68 public void uninstallColoredLabels(StructuredViewer viewer) { 69 ManagedViewer mv= (ManagedViewer) fManagedViewers.remove(viewer); 70 if (mv == null) 71 return; 73 if (fManagedViewers.isEmpty()) { 74 PreferenceConstants.getPreferenceStore().removePropertyChangeListener(this); 75 fColorRegisty.removeListener(this); 76 } 78 } 79 80 public Color getColorForName(String symbolicName) { 81 return fColorRegisty.get(symbolicName); 82 } 83 84 85 public void propertyChange(PropertyChangeEvent event) { 86 String property= event.getProperty(); 87 if (property.equals(QUALIFIER_COLOR_NAME) || property.equals(COUNTER_COLOR_NAME) || property.equals(DECORATIONS_COLOR_NAME) 88 || property.equals(AppearancePreferencePage.PREF_COLORED_LABELS)) { 89 Display.getDefault().asyncExec(new Runnable () { 90 public void run() { 91 refreshAllViewers(); 92 } 93 }); 94 } 95 } 96 97 protected final void refreshAllViewers() { 98 for (Iterator iterator= fManagedViewers.values().iterator(); iterator.hasNext();) { 99 ManagedViewer viewer= (ManagedViewer) iterator.next(); 100 viewer.refresh(); 101 } 102 } 103 104 private class ManagedViewer implements DisposeListener { 105 106 private static final String COLORED_LABEL_KEY= "coloredlabel"; 108 private StructuredViewer fViewer; 109 private OwnerDrawSupport fOwnerDrawSupport; 110 111 private ManagedViewer(StructuredViewer viewer) { 112 fViewer= viewer; 113 fOwnerDrawSupport= null; 114 fViewer.getControl().addDisposeListener(this); 115 if (showColoredLabels()) { 116 installOwnerDraw(); 117 } 118 } 119 120 123 public void widgetDisposed(DisposeEvent e) { 124 uninstallColoredLabels(fViewer); 125 } 126 127 public final void refresh() { 128 Control control= fViewer.getControl(); 129 if (!control.isDisposed()) { 130 if (showColoredLabels()) { 131 installOwnerDraw(); 132 } else { 133 uninstallOwnerDraw(); 134 } 135 } 136 } 137 138 protected void installOwnerDraw() { 139 if (fOwnerDrawSupport == null) { 140 fOwnerDrawSupport= new OwnerDrawSupport(fViewer.getControl()) { public ColoredString getColoredLabel(Item item) { 143 return getColoredLabelForView(item); 144 } 145 146 public Color getColor(String foregroundColorName, Display display) { 147 return getColorForName(foregroundColorName); 148 } 149 }; 150 } 151 refreshViewer(); 152 } 153 154 protected void uninstallOwnerDraw() { 155 if (fOwnerDrawSupport == null) 156 return; 158 fOwnerDrawSupport.dispose(); fOwnerDrawSupport= null; 160 refreshViewer(); 161 } 162 163 private void refreshViewer() { 164 Control control= fViewer.getControl(); 165 if (!control.isDisposed()) { 166 if (control instanceof Tree) { 167 refresh(((Tree) control).getItems()); 168 } else if (control instanceof Table) { 169 refresh(((Table) control).getItems()); 170 } 171 } 172 } 173 174 private void refresh(Item[] items) { 175 for (int i= 0; i < items.length; i++) { 176 Item item= items[i]; 177 item.setData(COLORED_LABEL_KEY, null); 178 String text= item.getText(); 179 item.setText(""); item.setText(text); 181 if (item instanceof TreeItem) { 182 refresh(((TreeItem) item).getItems()); 183 } 184 } 185 } 186 187 private ColoredString getColoredLabelForView(Item item) { 188 ColoredString oldLabel= (ColoredString) item.getData(COLORED_LABEL_KEY); 189 String itemText= item.getText(); 190 if (oldLabel != null && oldLabel.getString().equals(itemText)) { 191 return oldLabel; 193 } 194 ColoredString newLabel= null; 195 IBaseLabelProvider labelProvider= fViewer.getLabelProvider(); 196 if (labelProvider instanceof IRichLabelProvider) { 197 newLabel= ((IRichLabelProvider) labelProvider).getRichTextLabel(item.getData()); 198 } 199 if (newLabel == null) { 200 newLabel= new ColoredString(itemText); } else if (!newLabel.getString().equals(itemText)) { 202 newLabel= ColoredJavaElementLabels.decorateColoredString(newLabel, itemText, ColoredJavaElementLabels.DECORATIONS_STYLE); 204 } 205 item.setData(COLORED_LABEL_KEY, newLabel); return newLabel; 207 } 208 209 } 210 211 public static boolean showColoredLabels() { 212 String preference= PreferenceConstants.getPreference(AppearancePreferencePage.PREF_COLORED_LABELS, null); 213 return preference != null && Boolean.valueOf(preference).booleanValue(); 214 } 215 216 public static void install(StructuredViewer viewer) { 217 fgInstance.installColoredLabels(viewer); 218 } 219 220 221 } 222 | Popular Tags |