--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package net.sourceforge.phpdt.internal.ui.viewsupport;
+
+import java.util.ArrayList;
+
+import net.sourceforge.phpdt.ui.IWorkingCopyProvider;
+import net.sourceforge.phpdt.ui.ProblemsLabelDecorator.ProblemsLabelChangedEvent;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.LabelProviderChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+//import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * Extends a TableViewer to allow more performance when showing error ticks. A
+ * <code>ProblemItemMapper</code> is contained that maps all items in the tree
+ * to underlying resource
+ */
+public class ProblemTableViewer extends TableViewer {
+
+ protected ResourceToItemsMapper fResourceToItemsMapper;
+
+ /**
+ * Constructor for ProblemTableViewer.
+ *
+ * @param parent
+ */
+// public ProblemTableViewer(Composite parent) {
+// super(parent);
+// initMapper();
+// }
+
+ /**
+ * Constructor for ProblemTableViewer.
+ *
+ * @param parent
+ * @param style
+ */
+// public ProblemTableViewer(Composite parent, int style) {
+// super(parent, style);
+// initMapper();
+// }
+
+ /**
+ * Constructor for ProblemTableViewer.
+ *
+ * @param table
+ */
+ public ProblemTableViewer(Table table) {
+ super(table);
+ initMapper();
+ }
+
+ private void initMapper() {
+ fResourceToItemsMapper = new ResourceToItemsMapper(this);
+ }
+
+ /*
+ * @see StructuredViewer#mapElement(Object, Widget)
+ */
+ protected void mapElement(Object element, Widget item) {
+ super.mapElement(element, item);
+ if (item instanceof Item) {
+ fResourceToItemsMapper.addToMap(element, (Item) item);
+ }
+ }
+
+ /*
+ * @see StructuredViewer#unmapElement(Object, Widget)
+ */
+ protected void unmapElement(Object element, Widget item) {
+ if (item instanceof Item) {
+ fResourceToItemsMapper.removeFromMap(element, (Item) item);
+ }
+ super.unmapElement(element, item);
+ }
+
+ /*
+ * @see StructuredViewer#unmapAllElements()
+ */
+ protected void unmapAllElements() {
+ fResourceToItemsMapper.clearMap();
+ super.unmapAllElements();
+ }
+
+ /*
+ * @see ContentViewer#handleLabelProviderChanged(LabelProviderChangedEvent)
+ */
+ protected void handleLabelProviderChanged(LabelProviderChangedEvent event) {
+ if (event instanceof ProblemsLabelChangedEvent) {
+ ProblemsLabelChangedEvent e = (ProblemsLabelChangedEvent) event;
+ if (!e.isMarkerChange() && canIgnoreChangesFromAnnotionModel()) {
+ return;
+ }
+ }
+
+ Object[] changed = event.getElements();
+ if (changed != null && !fResourceToItemsMapper.isEmpty()) {
+ ArrayList others = new ArrayList(changed.length);
+ for (int i = 0; i < changed.length; i++) {
+ Object curr = changed[i];
+ if (curr instanceof IResource) {
+ fResourceToItemsMapper.resourceChanged((IResource) curr);
+ } else {
+ others.add(curr);
+ }
+ }
+ if (others.isEmpty()) {
+ return;
+ }
+ event = new LabelProviderChangedEvent((IBaseLabelProvider) event
+ .getSource(), others.toArray());
+ }
+ super.handleLabelProviderChanged(event);
+ }
+
+ /**
+ * Answers whether this viewer can ignore label provider changes resulting
+ * from marker changes in annotation models
+ */
+ private boolean canIgnoreChangesFromAnnotionModel() {
+ Object contentProvider = getContentProvider();
+ return contentProvider instanceof IWorkingCopyProvider
+ && !((IWorkingCopyProvider) contentProvider)
+ .providesWorkingCopies();
+ }
+}