diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src')
12 files changed, 1217 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPlugin.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPlugin.java new file mode 100644 index 000000000..d4a64d008 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPlugin.java @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer; + +import com.android.ddmlib.AndroidDebugBridge; +import com.android.ddmlib.AndroidDebugBridge.IDebugBridgeChangeListener; +import com.android.ddmlib.Log; +import com.android.ddmlib.Log.ILogOutput; +import com.android.ddmlib.Log.LogLevel; +import com.android.hierarchyviewerlib.HierarchyViewerDirector; + +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.console.ConsolePlugin; +import org.eclipse.ui.console.IConsole; +import org.eclipse.ui.console.MessageConsole; +import org.eclipse.ui.console.MessageConsoleStream; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +import java.util.Calendar; + +/** + * The activator class controls the plug-in life cycle + */ +public class HierarchyViewerPlugin extends AbstractUIPlugin { + + public static final String PLUGIN_ID = "com.android.ide.eclipse.hierarchyviewer"; //$NON-NLS-1$ + + public static final String ADB_LOCATION = PLUGIN_ID + ".adb"; //$NON-NLS-1$ + + // The shared instance + private static HierarchyViewerPlugin sPlugin; + + private Color mRedColor; + + /** + * The constructor + */ + public HierarchyViewerPlugin() { + } + + @Override + public void start(BundleContext context) throws Exception { + super.start(context); + sPlugin = this; + + + // set the consoles. + final MessageConsole messageConsole = new MessageConsole("Hierarchy Viewer", null); //$NON-NLS-1$ + ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { + messageConsole + }); + + final MessageConsoleStream consoleStream = messageConsole.newMessageStream(); + final MessageConsoleStream errorConsoleStream = messageConsole.newMessageStream(); + mRedColor = new Color(Display.getDefault(), 0xFF, 0x00, 0x00); + + // because this can be run, in some cases, by a non UI thread, and + // because + // changing the console properties update the UI, we need to make this + // change + // in the UI thread. + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + errorConsoleStream.setColor(mRedColor); + } + }); + + // set up the ddms log to use the ddms console. + Log.setLogOutput(new ILogOutput() { + @Override + public void printLog(LogLevel logLevel, String tag, String message) { + if (logLevel.getPriority() >= LogLevel.ERROR.getPriority()) { + printToStream(errorConsoleStream, tag, message); + ConsolePlugin.getDefault().getConsoleManager().showConsoleView(messageConsole); + } else { + printToStream(consoleStream, tag, message); + } + } + + @Override + public void printAndPromptLog(final LogLevel logLevel, final String tag, + final String message) { + printLog(logLevel, tag, message); + // dialog box only run in UI thread.. + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + Shell shell = Display.getDefault().getActiveShell(); + if (logLevel == LogLevel.ERROR) { + MessageDialog.openError(shell, tag, message); + } else { + MessageDialog.openWarning(shell, tag, message); + } + } + }); + } + + }); + + final HierarchyViewerDirector director = HierarchyViewerPluginDirector.createDirector(); + director.startListenForDevices(); + + // make the director receive change in ADB. + AndroidDebugBridge.addDebugBridgeChangeListener(new IDebugBridgeChangeListener() { + @Override + public void bridgeChanged(AndroidDebugBridge bridge) { + director.acquireBridge(bridge); + } + }); + + // get the current ADB if any + director.acquireBridge(AndroidDebugBridge.getBridge()); + + // populate the UI with current devices (if any) in a thread + new Thread() { + @Override + public void run() { + director.populateDeviceSelectionModel(); + } + }.start(); + } + + /* + * (non-Javadoc) + * @see + * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext + * ) + */ + @Override + public void stop(BundleContext context) throws Exception { + sPlugin = null; + super.stop(context); + + mRedColor.dispose(); + + HierarchyViewerDirector director = HierarchyViewerDirector.getDirector(); + director.stopListenForDevices(); + director.stopDebugBridge(); + director.terminate(); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static HierarchyViewerPlugin getPlugin() { + return sPlugin; + } + + /** + * Prints a message, associated with a project to the specified stream + * + * @param stream The stream to write to + * @param tag The tag associated to the message. Can be null + * @param message The message to print. + */ + private static synchronized void printToStream(MessageConsoleStream stream, String tag, + String message) { + String dateTag = getMessageTag(tag); + + stream.print(dateTag); + stream.println(message); + } + + /** + * Creates a string containing the current date/time, and the tag + * + * @param tag The tag associated to the message. Can be null + * @return The dateTag + */ + private static String getMessageTag(String tag) { + Calendar c = Calendar.getInstance(); + + if (tag == null) { + return String.format("[%1$tF %1$tT]", c); //$NON-NLS-1$ + } + + return String.format("[%1$tF %1$tT - %2$s]", c, tag); //$NON-NLS-1$ + } +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPluginDirector.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPluginDirector.java new file mode 100644 index 000000000..597f7a489 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/HierarchyViewerPluginDirector.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer; + +import com.android.hierarchyviewerlib.HierarchyViewerDirector; +import com.android.hierarchyviewerlib.device.IHvDevice; +import com.android.hierarchyviewerlib.models.Window; +import com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectTreeView; +import com.android.ide.eclipse.hierarchyviewer.views.PropertyView; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; + +public class HierarchyViewerPluginDirector extends HierarchyViewerDirector { + + public static HierarchyViewerDirector createDirector() { + return sDirector = new HierarchyViewerPluginDirector(); + } + + @Override + public void executeInBackground(final String taskName, final Runnable task) { + Job job = new Job(taskName) { + @Override + protected IStatus run(IProgressMonitor monitor) { + task.run(); + return Status.OK_STATUS; + } + }; + job.setPriority(Job.SHORT); + job.setRule(mSchedulingRule); + job.schedule(); + } + + private ISchedulingRule mSchedulingRule = new ISchedulingRule() { + @Override + public boolean contains(ISchedulingRule rule) { + return rule == this; + } + + @Override + public boolean isConflicting(ISchedulingRule rule) { + return rule == this; + } + + }; + + @Override + public String getAdbLocation() { + return HierarchyViewerPlugin.getPlugin().getPreferenceStore().getString( + HierarchyViewerPlugin.ADB_LOCATION); + } + + @Override + public void loadViewTreeData(Window window) { + super.loadViewTreeData(window); + + // The windows tab hides the property tab, so let's bring the property + // tab + // forward. + + IWorkbenchWindow[] windows = + HierarchyViewerPlugin.getPlugin().getWorkbench().getWorkbenchWindows(); + for (IWorkbenchWindow currentWindow : windows) { + IWorkbenchPage page = currentWindow.getActivePage(); + if (page.getPerspective().getId().equals(TreeViewPerspective.ID)) { + try { + IWorkbenchPart part = page.findView(PropertyView.ID); + if (part != null) { + page.showView(PropertyView.ID); + } + } catch (PartInitException e) { + + } + } + } + } + + @Override + public void loadPixelPerfectData(IHvDevice device) { + super.loadPixelPerfectData(device); + + // The windows tab hides the tree tab, so let's bring the tree tab + // forward. + + IWorkbenchWindow[] windows = + HierarchyViewerPlugin.getPlugin().getWorkbench().getWorkbenchWindows(); + for (IWorkbenchWindow window : windows) { + IWorkbenchPage page = window.getActivePage(); + if (page.getPerspective().getId().equals(PixelPerfectPespective.ID)) { + try { + IWorkbenchPart part = page.findView(PixelPerfectTreeView.ID); + if (part != null) { + page.showView(PixelPerfectTreeView.ID); + } + } catch (PartInitException e) { + + } + } + } + } +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/PixelPerfectPespective.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/PixelPerfectPespective.java new file mode 100644 index 000000000..973b30e8e --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/PixelPerfectPespective.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer; + +import com.android.ide.eclipse.ddms.Perspective; +import com.android.ide.eclipse.hierarchyviewer.views.DeviceSelectorView; +import com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectLoupeView; +import com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectTreeView; +import com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectView; + +import org.eclipse.ui.IFolderLayout; +import org.eclipse.ui.IPageLayout; +import org.eclipse.ui.IPerspectiveFactory; + +public class PixelPerfectPespective implements IPerspectiveFactory { + + public static final String ID = + "com.android.ide.eclipse.hierarchyviewer.PixelPerfectPespective"; //$NON-NLS-1$ + + @Override + public void createInitialLayout(IPageLayout layout) { + layout.setEditorAreaVisible(false); + + String editorArea = layout.getEditorArea(); + IFolderLayout folder; + + folder = layout.createFolder("tree", IPageLayout.LEFT, 0.25f, editorArea); //$NON-NLS-1$ + folder.addView(DeviceSelectorView.ID); + folder.addView(PixelPerfectTreeView.ID); + + folder = layout.createFolder("overview", IPageLayout.RIGHT, 0.4f, editorArea); //$NON-NLS-1$ + folder.addView(PixelPerfectView.ID); + + folder = layout.createFolder("main", IPageLayout.RIGHT, 0.35f, editorArea); //$NON-NLS-1$ + folder.addView(PixelPerfectLoupeView.ID); + + + layout.addShowViewShortcut(DeviceSelectorView.ID); + layout.addShowViewShortcut(PixelPerfectTreeView.ID); + layout.addShowViewShortcut(PixelPerfectLoupeView.ID); + layout.addShowViewShortcut(PixelPerfectView.ID); + + layout.addPerspectiveShortcut("org.eclipse.jdt.ui.JavaPerspective"); //$NON-NLS-1$ + layout.addPerspectiveShortcut(TreeViewPerspective.ID); + layout.addPerspectiveShortcut(Perspective.ID); + } + +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/TreeViewPerspective.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/TreeViewPerspective.java new file mode 100644 index 000000000..b6198d8f8 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/TreeViewPerspective.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer; + +import com.android.ide.eclipse.ddms.Perspective; +import com.android.ide.eclipse.hierarchyviewer.views.DeviceSelectorView; +import com.android.ide.eclipse.hierarchyviewer.views.LayoutView; +import com.android.ide.eclipse.hierarchyviewer.views.PropertyView; +import com.android.ide.eclipse.hierarchyviewer.views.TreeOverviewView; +import com.android.ide.eclipse.hierarchyviewer.views.TreeViewView; + +import org.eclipse.ui.IFolderLayout; +import org.eclipse.ui.IPageLayout; +import org.eclipse.ui.IPerspectiveFactory; + +public class TreeViewPerspective implements IPerspectiveFactory { + + public static final String ID = "com.android.ide.eclipse.hierarchyviewer.TreeViewPerspective"; //$NON-NLS-1$ + + @Override + public void createInitialLayout(IPageLayout layout) { + layout.setEditorAreaVisible(false); + + String editorArea = layout.getEditorArea(); + IFolderLayout folder; + + folder = layout.createFolder("properties", IPageLayout.LEFT, 0.10f, editorArea); //$NON-NLS-1$ + folder.addView(DeviceSelectorView.ID); + folder.addView(PropertyView.ID); + + folder = layout.createFolder("main", IPageLayout.RIGHT, 0.24f, "properties"); //$NON-NLS-1$ //$NON-NLS-2$ + folder.addView(TreeViewView.ID); + + folder = layout.createFolder("panel-top", IPageLayout.RIGHT, 0.7f, "main"); //$NON-NLS-1$ //$NON-NLS-2$ + folder.addView(TreeOverviewView.ID); + + + folder = layout.createFolder("panel-bottom", IPageLayout.BOTTOM, 0.5f, "panel-top"); //$NON-NLS-1$ //$NON-NLS-2$ + folder.addView(LayoutView.ID); + + layout.addShowViewShortcut(DeviceSelectorView.ID); + layout.addShowViewShortcut(PropertyView.ID); + layout.addShowViewShortcut(TreeOverviewView.ID); + layout.addShowViewShortcut(LayoutView.ID); + layout.addShowViewShortcut(TreeViewView.ID); + + layout.addPerspectiveShortcut("org.eclipse.jdt.ui.JavaPerspective"); //$NON-NLS-1$ + layout.addPerspectiveShortcut(PixelPerfectPespective.ID); + layout.addPerspectiveShortcut(Perspective.ID); + } + +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/DeviceSelectorView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/DeviceSelectorView.java new file mode 100644 index 000000000..1905cde1a --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/DeviceSelectorView.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer.views; + +import com.android.hierarchyviewerlib.actions.InspectScreenshotAction; +import com.android.hierarchyviewerlib.actions.LoadViewHierarchyAction; +import com.android.hierarchyviewerlib.actions.RefreshWindowsAction; +import com.android.hierarchyviewerlib.ui.DeviceSelector; +import com.android.ide.eclipse.hierarchyviewer.PixelPerfectPespective; +import com.android.ide.eclipse.hierarchyviewer.TreeViewPerspective; + +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.IPerspectiveDescriptor; +import org.eclipse.ui.IPerspectiveListener; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.part.ViewPart; + +public class DeviceSelectorView extends ViewPart implements IPerspectiveListener { + + public static final String ID = + "com.android.ide.eclipse.hierarchyviewer.views.DeviceSelectorView"; //$NON-NLS-1$ + + private DeviceSelector mDeviceSelector; + + @Override + public void createPartControl(Composite parent) { + parent.setLayout(new FillLayout()); + + + IPerspectiveDescriptor perspective = getViewSite().getPage().getPerspective(); + boolean doTreeViewStuff = true; + boolean doPixelPerfectStuff = true; + if (perspective.getId().equals(PixelPerfectPespective.ID)) { + doTreeViewStuff = false; + } else if (perspective.getId().equals(TreeViewPerspective.ID)) { + doPixelPerfectStuff = false; + } + mDeviceSelector = new DeviceSelector(parent, doTreeViewStuff, doPixelPerfectStuff); + + placeActions(doTreeViewStuff, doPixelPerfectStuff); + + getViewSite().getWorkbenchWindow().addPerspectiveListener(this); + } + + @Override + public void dispose() { + super.dispose(); + getViewSite().getWorkbenchWindow().removePerspectiveListener(this); + } + + private void placeActions(boolean doTreeViewStuff, boolean doPixelPerfectStuff) { + IActionBars actionBars = getViewSite().getActionBars(); + + IMenuManager mm = actionBars.getMenuManager(); + mm.removeAll(); + mm.add(RefreshWindowsAction.getAction()); + + IToolBarManager tm = actionBars.getToolBarManager(); + tm.removeAll(); + tm.add(RefreshWindowsAction.getAction()); + + if (doTreeViewStuff) { + mm.add(LoadViewHierarchyAction.getAction()); + tm.add(LoadViewHierarchyAction.getAction()); + } + if (doPixelPerfectStuff) { + mm.add(InspectScreenshotAction.getAction()); + tm.add(InspectScreenshotAction.getAction()); + } + + mm.updateAll(true); + tm.update(true); + actionBars.updateActionBars(); + } + + @Override + public void setFocus() { + mDeviceSelector.setFocus(); + } + + @Override + public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) { + if (perspective.getId().equals(PixelPerfectPespective.ID)) { + mDeviceSelector.setMode(false, true); + placeActions(false, true); + } else if (perspective.getId().equals(TreeViewPerspective.ID)) { + mDeviceSelector.setMode(true, false); + placeActions(true, false); + } else { + mDeviceSelector.setMode(true, true); + placeActions(true, true); + } + } + + @Override + public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, + String changeId) { + // pass + } + +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/LayoutView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/LayoutView.java new file mode 100644 index 000000000..83cf38b57 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/LayoutView.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer.views; + +import com.android.ddmuilib.ImageLoader; +import com.android.hierarchyviewerlib.HierarchyViewerDirector; +import com.android.hierarchyviewerlib.models.TreeViewModel; +import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener; +import com.android.hierarchyviewerlib.ui.LayoutViewer; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.part.ViewPart; + +public class LayoutView extends ViewPart implements ITreeChangeListener { + + public static final String ID = "com.android.ide.eclipse.hierarchyviewer.views.LayoutView"; //$NON-NLS-1$ + + private LayoutViewer mLayoutViewer; + + private Image mOnBlack; + + private Image mOnWhite; + + private Action mShowExtrasAction = new Action("Show &Extras", Action.AS_CHECK_BOX) { + @Override + public void run() { + mLayoutViewer.setShowExtras(isChecked()); + } + }; + + private Action mLoadAllViewsAction = new Action("Load All &Views") { + @Override + public void run() { + HierarchyViewerDirector.getDirector().loadAllViews(); + mShowExtrasAction.setChecked(true); + mLayoutViewer.setShowExtras(true); + } + }; + + private Action mOnBlackWhiteAction = new Action("Change Background &Color") { + @Override + public void run() { + boolean newValue = !mLayoutViewer.getOnBlack(); + mLayoutViewer.setOnBlack(newValue); + if (newValue) { + setImageDescriptor(ImageDescriptor.createFromImage(mOnWhite)); + } else { + setImageDescriptor(ImageDescriptor.createFromImage(mOnBlack)); + } + } + }; + + @Override + public void createPartControl(Composite parent) { + mShowExtrasAction.setAccelerator(SWT.MOD1 + 'E'); + ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); + Image image = imageLoader.loadImage("show-extras.png", Display.getDefault()); //$NON-NLS-1$ + mShowExtrasAction.setImageDescriptor(ImageDescriptor.createFromImage(image)); + mShowExtrasAction.setToolTipText("Show images"); + mShowExtrasAction.setEnabled(TreeViewModel.getModel().getTree() != null); + + mOnWhite = imageLoader.loadImage("on-white.png", Display.getDefault()); //$NON-NLS-1$ + mOnBlack = imageLoader.loadImage("on-black.png", Display.getDefault()); //$NON-NLS-1$ + + mOnBlackWhiteAction.setAccelerator(SWT.MOD1 + 'C'); + mOnBlackWhiteAction.setImageDescriptor(ImageDescriptor.createFromImage(mOnWhite)); + mOnBlackWhiteAction.setToolTipText("Change layout viewer background color"); + + mLoadAllViewsAction.setAccelerator(SWT.MOD1 + 'V'); + image = imageLoader.loadImage("load-all-views.png", Display.getDefault()); //$NON-NLS-1$ + mLoadAllViewsAction.setImageDescriptor(ImageDescriptor.createFromImage(image)); + mLoadAllViewsAction.setToolTipText("Load all view images"); + mLoadAllViewsAction.setEnabled(TreeViewModel.getModel().getTree() != null); + + parent.setLayout(new FillLayout()); + + mLayoutViewer = new LayoutViewer(parent); + + placeActions(); + + TreeViewModel.getModel().addTreeChangeListener(this); + } + + public void placeActions() { + IActionBars actionBars = getViewSite().getActionBars(); + + IMenuManager mm = actionBars.getMenuManager(); + mm.removeAll(); + mm.add(mOnBlackWhiteAction); + mm.add(mShowExtrasAction); + mm.add(mLoadAllViewsAction); + + IToolBarManager tm = actionBars.getToolBarManager(); + tm.removeAll(); + tm.add(mOnBlackWhiteAction); + tm.add(mShowExtrasAction); + tm.add(mLoadAllViewsAction); + } + + @Override + public void dispose() { + super.dispose(); + TreeViewModel.getModel().removeTreeChangeListener(this); + } + + @Override + public void setFocus() { + mLayoutViewer.setFocus(); + } + + @Override + public void selectionChanged() { + // pass + } + + @Override + public void treeChanged() { + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + mLoadAllViewsAction.setEnabled(TreeViewModel.getModel().getTree() != null); + mShowExtrasAction.setEnabled(TreeViewModel.getModel().getTree() != null); + } + }); + } + + @Override + public void viewportChanged() { + // pass + } + + @Override + public void zoomChanged() { + // pass + } + +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectLoupeView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectLoupeView.java new file mode 100644 index 000000000..93ad5986a --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectLoupeView.java @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer.views; + +import com.android.ddmuilib.ImageLoader; +import com.android.hierarchyviewerlib.HierarchyViewerDirector; +import com.android.hierarchyviewerlib.actions.PixelPerfectAutoRefreshAction; +import com.android.hierarchyviewerlib.models.PixelPerfectModel; +import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; +import com.android.hierarchyviewerlib.ui.PixelPerfectControls; +import com.android.hierarchyviewerlib.ui.PixelPerfectLoupe; +import com.android.hierarchyviewerlib.ui.PixelPerfectPixelPanel; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.part.ViewPart; + +public class PixelPerfectLoupeView extends ViewPart implements IImageChangeListener { + + public static final String ID = + "com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectLoupeView"; //$NON-NLS-1$ + + private PixelPerfectLoupe mPixelPerfectLoupe; + + private Action mShowInLoupeAction = new Action("&Show Overlay", Action.AS_CHECK_BOX) { + @Override + public void run() { + mPixelPerfectLoupe.setShowOverlay(isChecked()); + } + }; + @Override + public void createPartControl(Composite parent) { + mShowInLoupeAction.setAccelerator(SWT.MOD1 + 'S'); + ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); + Image image = imageLoader.loadImage("show-overlay.png", Display.getDefault()); //$NON-NLS-1$ + mShowInLoupeAction.setImageDescriptor(ImageDescriptor.createFromImage(image)); + mShowInLoupeAction.setToolTipText("Show the overlay in the loupe view"); + mShowInLoupeAction.setEnabled(PixelPerfectModel.getModel().getOverlayImage() != null); + PixelPerfectModel.getModel().addImageChangeListener(this); + + GridLayout loupeLayout = new GridLayout(); + loupeLayout.marginWidth = loupeLayout.marginHeight = 0; + loupeLayout.horizontalSpacing = loupeLayout.verticalSpacing = 0; + parent.setLayout(loupeLayout); + + Composite pixelPerfectLoupeBorder = new Composite(parent, SWT.BORDER); + pixelPerfectLoupeBorder.setLayoutData(new GridData(GridData.FILL_BOTH)); + GridLayout pixelPerfectLoupeBorderGridLayout = new GridLayout(); + pixelPerfectLoupeBorderGridLayout.marginWidth = + pixelPerfectLoupeBorderGridLayout.marginHeight = 0; + pixelPerfectLoupeBorderGridLayout.horizontalSpacing = + pixelPerfectLoupeBorderGridLayout.verticalSpacing = 0; + pixelPerfectLoupeBorder.setLayout(pixelPerfectLoupeBorderGridLayout); + + mPixelPerfectLoupe = new PixelPerfectLoupe(pixelPerfectLoupeBorder); + mPixelPerfectLoupe.setLayoutData(new GridData(GridData.FILL_BOTH)); + + PixelPerfectPixelPanel pixelPerfectPixelPanel = + new PixelPerfectPixelPanel(pixelPerfectLoupeBorder); + pixelPerfectPixelPanel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + // https://code.google.com/p/android/issues/detail?id=69199 + // Disabled until accessibility issues are fixed + // PixelPerfectControls pixelPerfectControls = + // new PixelPerfectControls(parent); + // pixelPerfectControls.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + placeActions(); + } + + private void placeActions() { + IActionBars actionBars = getViewSite().getActionBars(); + + IMenuManager mm = actionBars.getMenuManager(); + mm.removeAll(); + mm.add(PixelPerfectAutoRefreshAction.getAction()); + mm.add(mShowInLoupeAction); + + IToolBarManager tm = actionBars.getToolBarManager(); + tm.removeAll(); + tm.add(PixelPerfectAutoRefreshAction.getAction()); + tm.add(mShowInLoupeAction); + } + + @Override + public void dispose() { + super.dispose(); + PixelPerfectModel.getModel().removeImageChangeListener(this); + } + + @Override + public void setFocus() { + mPixelPerfectLoupe.setFocus(); + } + + @Override + public void crosshairMoved() { + // pass + } + + @Override + public void treeChanged() { + // pass + } + + @Override + public void imageChanged() { + // pass + } + + @Override + public void imageLoaded() { + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + Image overlayImage = PixelPerfectModel.getModel().getOverlayImage(); + mShowInLoupeAction.setEnabled(overlayImage != null); + } + }); + } + + @Override + public void overlayChanged() { + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + mShowInLoupeAction + .setEnabled(PixelPerfectModel.getModel().getOverlayImage() != null); + } + }); + } + + @Override + public void overlayTransparencyChanged() { + // pass + } + + @Override + public void selectionChanged() { + // pass + } + + @Override + public void zoomChanged() { + // pass + } + +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectTreeView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectTreeView.java new file mode 100644 index 000000000..f3591f7d4 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectTreeView.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer.views; + +import com.android.hierarchyviewerlib.actions.RefreshPixelPerfectTreeAction; +import com.android.hierarchyviewerlib.ui.PixelPerfectTree; + +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.part.ViewPart; + +public class PixelPerfectTreeView extends ViewPart { + + public static final String ID = + "com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectTreeView"; //$NON-NLS-1$ + + private PixelPerfectTree mPixelPerfectTree; + + @Override + public void createPartControl(Composite parent) { + parent.setLayout(new FillLayout()); + mPixelPerfectTree = new PixelPerfectTree(parent); + + placeActions(); + } + + private void placeActions() { + IActionBars actionBars = getViewSite().getActionBars(); + + IMenuManager mm = actionBars.getMenuManager(); + mm.removeAll(); + mm.add(RefreshPixelPerfectTreeAction.getAction()); + + IToolBarManager tm = actionBars.getToolBarManager(); + tm.removeAll(); + tm.add(RefreshPixelPerfectTreeAction.getAction()); + } + + @Override + public void setFocus() { + mPixelPerfectTree.setFocus(); + } + +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectView.java new file mode 100644 index 000000000..943a6c8af --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PixelPerfectView.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer.views; + +import com.android.hierarchyviewerlib.actions.LoadOverlayAction; +import com.android.hierarchyviewerlib.actions.RefreshPixelPerfectAction; +import com.android.hierarchyviewerlib.actions.SavePixelPerfectAction; +import com.android.hierarchyviewerlib.ui.PixelPerfect; + +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.part.ViewPart; + +public class PixelPerfectView extends ViewPart { + + public static final String ID = + "com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectView"; //$NON-NLS-1$ + + private PixelPerfect mPixelPerfect; + + @Override + public void createPartControl(Composite parent) { + parent.setLayout(new FillLayout()); + mPixelPerfect = new PixelPerfect(parent); + + placeActions(); + } + + private void placeActions() { + IActionBars actionBars = getViewSite().getActionBars(); + + IMenuManager mm = actionBars.getMenuManager(); + mm.removeAll(); + mm.add(SavePixelPerfectAction.getAction(getSite().getShell())); + mm.add(RefreshPixelPerfectAction.getAction()); + mm.add(LoadOverlayAction.getAction(getSite().getShell())); + + IToolBarManager tm = actionBars.getToolBarManager(); + tm.removeAll(); + tm.add(SavePixelPerfectAction.getAction(getSite().getShell())); + tm.add(RefreshPixelPerfectAction.getAction()); + tm.add(LoadOverlayAction.getAction(getSite().getShell())); + } + + @Override + public void setFocus() { + mPixelPerfect.setFocus(); + } + +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PropertyView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PropertyView.java new file mode 100644 index 000000000..74f50fdb2 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/PropertyView.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer.views; + +import com.android.hierarchyviewerlib.ui.PropertyViewer; + +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.part.ViewPart; + +public class PropertyView extends ViewPart { + + public static final String ID = "com.android.ide.eclipse.hierarchyviewer.views.PropertyView"; //$NON-NLS-1$ + + private PropertyViewer mPropertyViewer; + + @Override + public void createPartControl(Composite parent) { + parent.setLayout(new FillLayout()); + + mPropertyViewer = new PropertyViewer(parent); + } + + @Override + public void setFocus() { + mPropertyViewer.setFocus(); + } + +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeOverviewView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeOverviewView.java new file mode 100644 index 000000000..e18771b79 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeOverviewView.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer.views; + +import com.android.hierarchyviewerlib.ui.TreeViewOverview; + +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.part.ViewPart; + +public class TreeOverviewView extends ViewPart { + + public static final String ID = + "com.android.ide.eclipse.hierarchyviewer.views.TreeOverviewView"; //$NON-NLS-1$ + + private TreeViewOverview mTreeViewOverview; + @Override + public void createPartControl(Composite parent) { + parent.setLayout(new FillLayout()); + + mTreeViewOverview = new TreeViewOverview(parent); + } + + @Override + public void setFocus() { + mTreeViewOverview.setFocus(); + } + +} diff --git a/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeViewView.java b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeViewView.java new file mode 100644 index 000000000..98bd909d7 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.hierarchyviewer/src/com/android/ide/eclipse/hierarchyviewer/views/TreeViewView.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.hierarchyviewer.views; + +import com.android.hierarchyviewerlib.actions.CapturePSDAction; +import com.android.hierarchyviewerlib.actions.DisplayViewAction; +import com.android.hierarchyviewerlib.actions.DumpDisplayListAction; +import com.android.hierarchyviewerlib.actions.InvalidateAction; +import com.android.hierarchyviewerlib.actions.ProfileNodesAction; +import com.android.hierarchyviewerlib.actions.RefreshViewAction; +import com.android.hierarchyviewerlib.actions.RequestLayoutAction; +import com.android.hierarchyviewerlib.actions.SaveTreeViewAction; +import com.android.hierarchyviewerlib.ui.TreeView; +import com.android.hierarchyviewerlib.ui.TreeViewControls; + +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.part.ViewPart; + +// Awesome name. +public class TreeViewView extends ViewPart { + + public static final String ID = "com.android.ide.eclipse.hierarchyviewer.views.TreeViewView"; //$NON-NLS-1$ + + private TreeView mTreeView; + + @Override + public void createPartControl(Composite parent) { + GridLayout layout = new GridLayout(); + layout.marginWidth = layout.marginHeight = 0; + layout.horizontalSpacing = layout.verticalSpacing = 0; + parent.setLayout(layout); + + Composite treeViewContainer = new Composite(parent, SWT.BORDER); + treeViewContainer.setLayoutData(new GridData(GridData.FILL_BOTH)); + treeViewContainer.setLayout(new FillLayout()); + + mTreeView = new TreeView(treeViewContainer); + + TreeViewControls treeViewControls = new TreeViewControls(parent); + treeViewControls.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + placeActions(); + } + + public void placeActions() { + IActionBars actionBars = getViewSite().getActionBars(); + + IMenuManager mm = actionBars.getMenuManager(); + mm.removeAll(); + mm.add(SaveTreeViewAction.getAction(getSite().getShell())); + mm.add(CapturePSDAction.getAction(getSite().getShell())); + mm.add(new Separator()); + mm.add(RefreshViewAction.getAction()); + mm.add(DisplayViewAction.getAction(getSite().getShell())); + mm.add(new Separator()); + mm.add(InvalidateAction.getAction()); + mm.add(RequestLayoutAction.getAction()); + mm.add(DumpDisplayListAction.getAction()); + mm.add(ProfileNodesAction.getAction()); + + IToolBarManager tm = actionBars.getToolBarManager(); + tm.removeAll(); + tm.add(SaveTreeViewAction.getAction(getSite().getShell())); + tm.add(CapturePSDAction.getAction(getSite().getShell())); + tm.add(new Separator()); + tm.add(RefreshViewAction.getAction()); + tm.add(DisplayViewAction.getAction(getSite().getShell())); + tm.add(new Separator()); + tm.add(InvalidateAction.getAction()); + tm.add(RequestLayoutAction.getAction()); + tm.add(DumpDisplayListAction.getAction()); + tm.add(ProfileNodesAction.getAction()); + } + + + @Override + public void setFocus() { + mTreeView.setFocus(); + } + +} |