Organized imports
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / ui / viewsupport / ProblemTreeViewer.java
1 /*******************************************************************************
2  * Copyright (c) 2000, 2004 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials 
4  * are made available under the terms of the Common Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/cpl-v10.html
7  * 
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11
12 package net.sourceforge.phpdt.internal.ui.viewsupport;
13
14 import java.util.ArrayList;
15
16 import net.sourceforge.phpdt.core.IMember;
17 import net.sourceforge.phpdt.ui.IWorkingCopyProvider;
18 import net.sourceforge.phpdt.ui.ProblemsLabelDecorator.ProblemsLabelChangedEvent;
19
20 import org.eclipse.core.resources.IResource;
21 import org.eclipse.jface.viewers.IBaseLabelProvider;
22 import org.eclipse.jface.viewers.LabelProviderChangedEvent;
23 import org.eclipse.jface.viewers.TreeViewer;
24 import org.eclipse.swt.widgets.Composite;
25 import org.eclipse.swt.widgets.Item;
26 import org.eclipse.swt.widgets.Tree;
27 import org.eclipse.swt.widgets.Widget;
28
29 /**
30  * Extends a  TreeViewer to allow more performance when showing error ticks.
31  * A <code>ProblemItemMapper</code> is contained that maps all items in
32  * the tree to underlying resource
33  */
34 public class ProblemTreeViewer extends TreeViewer {
35
36         protected ResourceToItemsMapper fResourceToItemsMapper;
37
38         /*
39          * @see TreeViewer#TreeViewer(Composite)
40          */
41         public ProblemTreeViewer(Composite parent) {
42                 super(parent);
43                 initMapper();
44         }
45
46         /*
47          * @see TreeViewer#TreeViewer(Composite, int)
48          */
49         public ProblemTreeViewer(Composite parent, int style) {
50                 super(parent, style);
51                 initMapper();
52         }
53
54         /*
55          * @see TreeViewer#TreeViewer(Tree)
56          */
57         public ProblemTreeViewer(Tree tree) {
58                 super(tree);
59                 initMapper();
60         }
61         
62         private void initMapper() {
63                 fResourceToItemsMapper= new ResourceToItemsMapper(this);
64         }
65         
66         
67         /*
68          * @see StructuredViewer#mapElement(Object, Widget)
69          */
70         protected void mapElement(Object element, Widget item) {
71                 super.mapElement(element, item);
72                 if (item instanceof Item) {
73                         fResourceToItemsMapper.addToMap(element, (Item) item);
74                 }
75         }
76
77         /*
78          * @see StructuredViewer#unmapElement(Object, Widget)
79          */
80         protected void unmapElement(Object element, Widget item) {
81                 if (item instanceof Item) {
82                         fResourceToItemsMapper.removeFromMap(element, (Item) item);
83                 }               
84                 super.unmapElement(element, item);
85         }
86
87         /*
88          * @see StructuredViewer#unmapAllElements()
89          */
90         protected void unmapAllElements() {
91                 fResourceToItemsMapper.clearMap();
92                 super.unmapAllElements();
93         }
94
95         /*
96          * @see ContentViewer#handleLabelProviderChanged(LabelProviderChangedEvent)
97          */
98         protected void handleLabelProviderChanged(LabelProviderChangedEvent event) {
99                 if (event instanceof ProblemsLabelChangedEvent) {
100                         ProblemsLabelChangedEvent e= (ProblemsLabelChangedEvent) event;
101                         if (!e.isMarkerChange() && canIgnoreChangesFromAnnotionModel()) {
102                                 return;
103                         }
104                 }               
105                 
106                 Object[] changed= event.getElements();
107                 if (changed != null && !fResourceToItemsMapper.isEmpty()) {
108                         ArrayList others= new ArrayList();
109                         for (int i= 0; i < changed.length; i++) {
110                                 Object curr= changed[i];
111                                 if (curr instanceof IResource) {
112                                         fResourceToItemsMapper.resourceChanged((IResource) curr);
113                                 } else {
114                                         others.add(curr);
115                                 }
116                         }
117                         if (others.isEmpty()) {
118                                 return;
119                         }
120                         event= new LabelProviderChangedEvent((IBaseLabelProvider) event.getSource(), others.toArray());
121                 }
122                 super.handleLabelProviderChanged(event);
123         }
124         
125         /**
126          * Answers whether this viewer can ignore label provider changes resulting from
127          * marker changes in annotation models
128          */
129         private boolean canIgnoreChangesFromAnnotionModel() {
130                 Object contentProvider= getContentProvider();
131                 return contentProvider instanceof IWorkingCopyProvider && !((IWorkingCopyProvider)contentProvider).providesWorkingCopies();
132         }
133         
134         /* (non-Javadoc)
135          * @see org.eclipse.jface.viewers.AbstractTreeViewer#isExpandable(java.lang.Object)
136          */
137         public boolean isExpandable(Object element) {
138                 // workaround for 65762
139                 if (hasFilters() && element instanceof IMember) {
140                         return getFilteredChildren(element).length > 0;
141                 }
142                 return super.isExpandable(element);
143         }
144 }
145