1bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev/*
2bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev * Copyright (C) 2010 The Android Open Source Project
3bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev *
4bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev * Licensed under the Apache License, Version 2.0 (the "License");
5bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev * you may not use this file except in compliance with the License.
6bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev * You may obtain a copy of the License at
7bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev *
8bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev *      http://www.apache.org/licenses/LICENSE-2.0
9bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev *
10bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev * Unless required by applicable law or agreed to in writing, software
11bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev * distributed under the License is distributed on an "AS IS" BASIS,
12bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev * See the License for the specific language governing permissions and
14bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev * limitations under the License.
15bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev */
16bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
1770a830d8ab396328ab984c75f923400af6a52e55Konstantin Lopyrevpackage com.android.hierarchyviewerlib.ui;
18bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
19bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport com.android.ddmuilib.ImageLoader;
20bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport com.android.hierarchyviewerlib.device.ViewNode;
21bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport com.android.hierarchyviewerlib.models.PixelPerfectModel;
22901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrevimport com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener;
23bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
24bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.jface.viewers.ILabelProvider;
25bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.jface.viewers.ILabelProviderListener;
26bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.jface.viewers.ITreeContentProvider;
27c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrevimport org.eclipse.jface.viewers.TreeSelection;
28bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.jface.viewers.TreeViewer;
29bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.jface.viewers.Viewer;
30bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.swt.SWT;
31e361a961cbe1ead74659b4a761453b312d026e55Konstantin Lopyrevimport org.eclipse.swt.events.DisposeEvent;
32e361a961cbe1ead74659b4a761453b312d026e55Konstantin Lopyrevimport org.eclipse.swt.events.DisposeListener;
33bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.swt.events.SelectionEvent;
34bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.swt.events.SelectionListener;
35bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.swt.graphics.Image;
36c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrevimport org.eclipse.swt.layout.FillLayout;
37bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.swt.widgets.Composite;
38bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.swt.widgets.Display;
39bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport org.eclipse.swt.widgets.Tree;
40bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
41bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrevimport java.util.List;
42bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
43901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrevpublic class PixelPerfectTree extends Composite implements IImageChangeListener, SelectionListener {
44bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
45901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev    private TreeViewer mTreeViewer;
46bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
47901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev    private Tree mTree;
48bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
49901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev    private PixelPerfectModel mModel;
50bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
51901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev    private Image mFolderImage;
52bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
53901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev    private Image mFileImage;
54bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
55bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    private class ContentProvider implements ITreeContentProvider, ILabelProvider {
56f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
57bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public Object[] getChildren(Object element) {
58bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            if (element instanceof ViewNode) {
59bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                List<ViewNode> children = ((ViewNode) element).children;
60bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                return children.toArray(new ViewNode[children.size()]);
61bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            }
62bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            return null;
63bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
64bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
65f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
66bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public Object getParent(Object element) {
67bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            if (element instanceof ViewNode) {
68bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                return ((ViewNode) element).parent;
69bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            }
70bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            return null;
71bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
72bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
73f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
74bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public boolean hasChildren(Object element) {
75bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            if (element instanceof ViewNode) {
76bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                return ((ViewNode) element).children.size() != 0;
77bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            }
78bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            return false;
79bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
80bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
81f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
82bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public Object[] getElements(Object element) {
83bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            if (element instanceof PixelPerfectModel) {
84bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                ViewNode viewNode = ((PixelPerfectModel) element).getViewNode();
85bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                if (viewNode == null) {
86bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                    return new Object[0];
87bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                }
88bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                return new Object[] {
89bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                    viewNode
90bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                };
91bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            }
92bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            return new Object[0];
93bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
94bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
95f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
96bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public void dispose() {
97bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            // pass
98bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
99bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
100f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
101bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
102bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            // pass
103bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
104bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
105f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
106bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public Image getImage(Object element) {
107bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            if (element instanceof ViewNode) {
108bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                if (hasChildren(element)) {
109901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev                    return mFolderImage;
110bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                }
111901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev                return mFileImage;
112bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            }
113bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            return null;
114bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
115bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
116f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
117bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public String getText(Object element) {
118bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            if (element instanceof ViewNode) {
119bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev                return ((ViewNode) element).name;
120bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            }
121bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            return null;
122bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
123bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
124f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
125bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public void addListener(ILabelProviderListener listener) {
126bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            // pass
127bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
128bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
129f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
130bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public boolean isLabelProperty(Object element, String property) {
131bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            // pass
132bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            return false;
133bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
134bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
135f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
136bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        public void removeListener(ILabelProviderListener listener) {
137bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            // pass
138bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        }
139bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
140bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
141bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    public PixelPerfectTree(Composite parent) {
142c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev        super(parent, SWT.NONE);
143c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev        setLayout(new FillLayout());
144901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mTreeViewer = new TreeViewer(this, SWT.SINGLE);
145901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mTreeViewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
146bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
147901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mTree = mTreeViewer.getTree();
148901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mTree.addSelectionListener(this);
149bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
150bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        loadResources();
151bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
152901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        addDisposeListener(mDisposeListener);
153e361a961cbe1ead74659b4a761453b312d026e55Konstantin Lopyrev
154901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mModel = PixelPerfectModel.getModel();
155bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        ContentProvider contentProvider = new ContentProvider();
156901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mTreeViewer.setContentProvider(contentProvider);
157901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mTreeViewer.setLabelProvider(contentProvider);
158901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mTreeViewer.setInput(mModel);
159901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mModel.addImageChangeListener(this);
160bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
161bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
162bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
16397b0639645d9c387cdd9884272e053c467a240daKonstantin Lopyrev    private void loadResources() {
164bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        ImageLoader loader = ImageLoader.getDdmUiLibLoader();
165901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mFileImage = loader.loadImage("file.png", Display.getDefault());
166901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        mFolderImage = loader.loadImage("folder.png", Display.getDefault());
167bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
168bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
169901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev    private DisposeListener mDisposeListener = new DisposeListener() {
170f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet        @Override
171e361a961cbe1ead74659b4a761453b312d026e55Konstantin Lopyrev        public void widgetDisposed(DisposeEvent e) {
172901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev            mModel.removeImageChangeListener(PixelPerfectTree.this);
173e361a961cbe1ead74659b4a761453b312d026e55Konstantin Lopyrev        }
174e361a961cbe1ead74659b4a761453b312d026e55Konstantin Lopyrev    };
175bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
176c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev    @Override
177c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev    public boolean setFocus() {
178901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        return mTree.setFocus();
179bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
180bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
181f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet    @Override
182bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    public void imageLoaded() {
18399bd6912e7b5b97fc6d4bb787e76b2d9dfffd7aeKonstantin Lopyrev        Display.getDefault().syncExec(new Runnable() {
184f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet            @Override
185bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            public void run() {
186901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev                mTreeViewer.refresh();
187901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev                mTreeViewer.expandAll();
188bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev            }
189bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        });
190bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
191bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
192f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet    @Override
193bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    public void imageChanged() {
194bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        // pass
195bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
196bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
197f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet    @Override
198bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    public void crosshairMoved() {
199bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        // pass
200bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
201bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
202f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet    @Override
203bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    public void selectionChanged() {
204bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        // pass
205bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
206bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
207f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet    @Override
20897b0639645d9c387cdd9884272e053c467a240daKonstantin Lopyrev    public void treeChanged() {
209bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        imageLoaded();
210bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
211bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
212f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet    @Override
213bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    public void widgetDefaultSelected(SelectionEvent e) {
214bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev        // pass
215bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
216bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
217f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet    @Override
218bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    public void widgetSelected(SelectionEvent e) {
219c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev        // To combat phantom selection...
220901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev        if (((TreeSelection) mTreeViewer.getSelection()).isEmpty()) {
221901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev            mModel.setSelected(null);
222c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev        } else {
223901803a3b2aaeafb4074974ec5bf9b08cc39d1c8Konstantin Lopyrev            mModel.setSelected((ViewNode) e.item.getData());
224c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev        }
225c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev    }
226c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev
227f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet    @Override
228c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev    public void zoomChanged() {
229c1db1ab270b953da579e657de11d4486a49e1c1eKonstantin Lopyrev        // pass
230bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev    }
231bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev
232f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet    @Override
23370a830d8ab396328ab984c75f923400af6a52e55Konstantin Lopyrev    public void overlayChanged() {
23470a830d8ab396328ab984c75f923400af6a52e55Konstantin Lopyrev        // pass
23570a830d8ab396328ab984c75f923400af6a52e55Konstantin Lopyrev    }
23670a830d8ab396328ab984c75f923400af6a52e55Konstantin Lopyrev
237f526dc3bb658b07c5a96d0372b17ffa2fbbe6079Xavier Ducrohet    @Override
23870a830d8ab396328ab984c75f923400af6a52e55Konstantin Lopyrev    public void overlayTransparencyChanged() {
23970a830d8ab396328ab984c75f923400af6a52e55Konstantin Lopyrev        // pass
24070a830d8ab396328ab984c75f923400af6a52e55Konstantin Lopyrev    }
241bc494ce06410728bef8a6fa25f3da361cb66df79Konstantin Lopyrev}
242