diff options
Diffstat (limited to 'hierarchyviewer2/libs/hierarchyviewerlib')
84 files changed, 0 insertions, 9769 deletions
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/.classpath b/hierarchyviewer2/libs/hierarchyviewerlib/.classpath deleted file mode 100644 index 105d22e..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/.classpath +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="src" path="src"/> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> - <classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/> - <classpathentry combineaccessrules="false" kind="src" path="/ddmuilib"/> - <classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/linux-x86/swt/swt.jar"/> - <classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/eclipse/org.eclipse.core.commands_3.6.0.I20100512-1500.jar"/> - <classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/eclipse/org.eclipse.equinox.common_3.6.0.v20100503.jar"/> - <classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/eclipse/org.eclipse.jface_3.6.2.M20110210-1200.jar"/> - <classpathentry kind="output" path="bin"/> -</classpath> diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/.gitignore b/hierarchyviewer2/libs/hierarchyviewerlib/.gitignore deleted file mode 100644 index e660fd9..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bin/ diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/.project b/hierarchyviewer2/libs/hierarchyviewerlib/.project deleted file mode 100644 index b3c994a..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/.project +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>hierarchyviewerlib</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.jdt.core.javanature</nature> - </natures> -</projectDescription> diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/.settings/README.txt b/hierarchyviewer2/libs/hierarchyviewerlib/.settings/README.txt deleted file mode 100644 index 9120b20..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/.settings/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -Copy this in eclipse project as a .settings folder at the root. -This ensure proper compilation compliance and warning/error levels.
\ No newline at end of file diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/.settings/org.eclipse.jdt.core.prefs b/hierarchyviewer2/libs/hierarchyviewerlib/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index d11c211..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,98 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=com.android.annotations.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=com.android.annotations.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled -org.eclipse.jdt.core.compiler.annotation.nullable=com.android.annotations.Nullable -org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=warning -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore -org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=error -org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=ignore -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=error -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/Android.mk b/hierarchyviewer2/libs/hierarchyviewerlib/Android.mk deleted file mode 100644 index b76c127..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -# 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. - -HIERARCHYVIEWERLIB_LOCAL_DIR := $(call my-dir) -include $(HIERARCHYVIEWERLIB_LOCAL_DIR)/src/Android.mk diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/NOTICE b/hierarchyviewer2/libs/hierarchyviewerlib/NOTICE deleted file mode 100644 index c5b1efa..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/NOTICE +++ /dev/null @@ -1,190 +0,0 @@ - - Copyright (c) 2005-2008, 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. - - 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. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt b/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt deleted file mode 100644 index 3805b59..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt +++ /dev/null @@ -1 +0,0 @@ -Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar org.eclipse.jface_3.6.2.M20110210-1200.jar org.eclipse.core.commands_3.6.0.I20100512-1500.jar org.eclipse.equinox.common_3.6.0.v20100503.jar diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk b/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk deleted file mode 100644 index 1afbc92..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk +++ /dev/null @@ -1,32 +0,0 @@ -# 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. - -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-subdir-java-files) -LOCAL_JAVA_RESOURCE_DIRS := ../src - -LOCAL_JAR_MANIFEST := ../manifest.txt - -LOCAL_JAVA_LIBRARIES := ddmlib \ - ddmuilib \ - swt \ - org.eclipse.jface_3.6.2.M20110210-1200 \ - org.eclipse.core.commands_3.6.0.I20100512-1500 - -LOCAL_MODULE := hierarchyviewerlib - -include $(BUILD_HOST_JAVA_LIBRARY) - diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java deleted file mode 100644 index 2e03f11..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/HierarchyViewerDirector.java +++ /dev/null @@ -1,716 +0,0 @@ -/* - * 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.hierarchyviewerlib; - -import com.android.ddmlib.AdbCommandRejectedException; -import com.android.ddmlib.AndroidDebugBridge; -import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener; -import com.android.ddmlib.IDevice; -import com.android.ddmlib.Log; -import com.android.ddmlib.RawImage; -import com.android.ddmlib.TimeoutException; -import com.android.hierarchyviewerlib.device.DeviceBridge; -import com.android.hierarchyviewerlib.device.DeviceBridge.ViewServerInfo; -import com.android.hierarchyviewerlib.device.ViewNode; -import com.android.hierarchyviewerlib.device.Window; -import com.android.hierarchyviewerlib.device.WindowUpdater; -import com.android.hierarchyviewerlib.device.WindowUpdater.IWindowChangeListener; -import com.android.hierarchyviewerlib.models.DeviceSelectionModel; -import com.android.hierarchyviewerlib.models.PixelPerfectModel; -import com.android.hierarchyviewerlib.models.TreeViewModel; -import com.android.hierarchyviewerlib.ui.CaptureDisplay; -import com.android.hierarchyviewerlib.ui.TreeView; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode; -import com.android.hierarchyviewerlib.ui.util.PsdFile; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.ImageLoader; -import org.eclipse.swt.graphics.PaletteData; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Shell; - -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.HashSet; -import java.util.Timer; -import java.util.TimerTask; - -/** - * This is the class where most of the logic resides. - */ -public abstract class HierarchyViewerDirector implements IDeviceChangeListener, - IWindowChangeListener { - - protected static HierarchyViewerDirector sDirector; - - public static final String TAG = "hierarchyviewer"; - - private int mPixelPerfectRefreshesInProgress = 0; - - private Timer mPixelPerfectRefreshTimer = new Timer(); - - private boolean mAutoRefresh = false; - - public static final int DEFAULT_PIXEL_PERFECT_AUTOREFRESH_INTERVAL = 5; - - private int mPixelPerfectAutoRefreshInterval = DEFAULT_PIXEL_PERFECT_AUTOREFRESH_INTERVAL; - - private PixelPerfectAutoRefreshTask mCurrentAutoRefreshTask; - - private String mFilterText = ""; //$NON-NLS-1$ - - public void terminate() { - WindowUpdater.terminate(); - mPixelPerfectRefreshTimer.cancel(); - } - - public abstract String getAdbLocation(); - - public static HierarchyViewerDirector getDirector() { - return sDirector; - } - - /** - * Init the DeviceBridge with an existing {@link AndroidDebugBridge}. - * @param bridge the bridge object to use - */ - public void acquireBridge(AndroidDebugBridge bridge) { - DeviceBridge.acquireBridge(bridge); - } - - /** - * Creates an {@link AndroidDebugBridge} connected to adb at the given location. - * - * If a bridge is already running, this disconnects it and creates a new one. - * - * @param adbLocation the location to adb. - */ - public void initDebugBridge() { - DeviceBridge.initDebugBridge(getAdbLocation()); - } - - public void stopDebugBridge() { - DeviceBridge.terminate(); - } - - public void populateDeviceSelectionModel() { - IDevice[] devices = DeviceBridge.getDevices(); - for (IDevice device : devices) { - deviceConnected(device); - } - } - - public void startListenForDevices() { - DeviceBridge.startListenForDevices(this); - } - - public void stopListenForDevices() { - DeviceBridge.stopListenForDevices(this); - } - - public abstract void executeInBackground(String taskName, Runnable task); - - @Override - public void deviceConnected(final IDevice device) { - executeInBackground("Connecting device", new Runnable() { - @Override - public void run() { - if (DeviceSelectionModel.getModel().containsDevice(device)) { - windowsChanged(device); - } else if (device.isOnline()) { - DeviceBridge.setupDeviceForward(device); - if (!DeviceBridge.isViewServerRunning(device)) { - if (!DeviceBridge.startViewServer(device)) { - // Let's do something interesting here... Try again - // in 2 seconds. - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - } - if (!DeviceBridge.startViewServer(device)) { - Log.e(TAG, "Unable to debug device " + device); - DeviceBridge.removeDeviceForward(device); - } else { - loadViewServerInfoAndWindows(device); - } - return; - } - } - loadViewServerInfoAndWindows(device); - } - } - }); - } - - private void loadViewServerInfoAndWindows(final IDevice device) { - - ViewServerInfo viewServerInfo = DeviceBridge.loadViewServerInfo(device); - if (viewServerInfo == null) { - return; - } - Window[] windows = DeviceBridge.loadWindows(device); - DeviceSelectionModel.getModel().addDevice(device, windows, viewServerInfo); - if (viewServerInfo.protocolVersion >= 3) { - WindowUpdater.startListenForWindowChanges(HierarchyViewerDirector.this, device); - focusChanged(device); - } - - } - - @Override - public void deviceDisconnected(final IDevice device) { - executeInBackground("Disconnecting device", new Runnable() { - @Override - public void run() { - ViewServerInfo viewServerInfo = DeviceBridge.getViewServerInfo(device); - if (viewServerInfo != null && viewServerInfo.protocolVersion >= 3) { - WindowUpdater.stopListenForWindowChanges(HierarchyViewerDirector.this, device); - } - DeviceBridge.removeDeviceForward(device); - DeviceBridge.removeViewServerInfo(device); - DeviceSelectionModel.getModel().removeDevice(device); - if (PixelPerfectModel.getModel().getDevice() == device) { - PixelPerfectModel.getModel().setData(null, null, null); - } - Window treeViewWindow = TreeViewModel.getModel().getWindow(); - if (treeViewWindow != null && treeViewWindow.getDevice() == device) { - TreeViewModel.getModel().setData(null, null); - mFilterText = ""; //$NON-NLS-1$ - } - } - }); - } - - @Override - public void deviceChanged(IDevice device, int changeMask) { - if ((changeMask & IDevice.CHANGE_STATE) != 0 && device.isOnline()) { - deviceConnected(device); - } - } - - @Override - public void windowsChanged(final IDevice device) { - executeInBackground("Refreshing windows", new Runnable() { - @Override - public void run() { - if (!DeviceBridge.isViewServerRunning(device)) { - if (!DeviceBridge.startViewServer(device)) { - Log.e(TAG, "Unable to debug device " + device); - return; - } - } - Window[] windows = DeviceBridge.loadWindows(device); - DeviceSelectionModel.getModel().updateDevice(device, windows); - } - }); - } - - @Override - public void focusChanged(final IDevice device) { - executeInBackground("Updating focus", new Runnable() { - @Override - public void run() { - int focusedWindow = DeviceBridge.getFocusedWindow(device); - DeviceSelectionModel.getModel().updateFocusedWindow(device, focusedWindow); - } - }); - } - - public void refreshPixelPerfect() { - final IDevice device = PixelPerfectModel.getModel().getDevice(); - if (device != null) { - // Some interesting logic here. We don't want to refresh the pixel - // perfect view 1000 times in a row if the focus keeps changing. We - // just - // want it to refresh following the last focus change. - boolean proceed = false; - synchronized (this) { - if (mPixelPerfectRefreshesInProgress <= 1) { - proceed = true; - mPixelPerfectRefreshesInProgress++; - } - } - if (proceed) { - executeInBackground("Refreshing pixel perfect screenshot", new Runnable() { - @Override - public void run() { - Image screenshotImage = getScreenshotImage(device); - if (screenshotImage != null) { - PixelPerfectModel.getModel().setImage(screenshotImage); - } - synchronized (HierarchyViewerDirector.this) { - mPixelPerfectRefreshesInProgress--; - } - } - - }); - } - } - } - - public void refreshPixelPerfectTree() { - final IDevice device = PixelPerfectModel.getModel().getDevice(); - if (device != null) { - executeInBackground("Refreshing pixel perfect tree", new Runnable() { - @Override - public void run() { - ViewNode viewNode = - DeviceBridge.loadWindowData(Window.getFocusedWindow(device)); - if (viewNode != null) { - PixelPerfectModel.getModel().setTree(viewNode); - } - } - - }); - } - } - - public void loadPixelPerfectData(final IDevice device) { - executeInBackground("Loading pixel perfect data", new Runnable() { - @Override - public void run() { - Image screenshotImage = getScreenshotImage(device); - if (screenshotImage != null) { - ViewNode viewNode = - DeviceBridge.loadWindowData(Window.getFocusedWindow(device)); - if (viewNode != null) { - PixelPerfectModel.getModel().setData(device, screenshotImage, viewNode); - } - } - } - }); - } - - private Image getScreenshotImage(IDevice device) { - try { - final RawImage screenshot = device.getScreenshot(); - if (screenshot == null) { - return null; - } - class ImageContainer { - public Image image; - } - final ImageContainer imageContainer = new ImageContainer(); - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - ImageData imageData = - new ImageData(screenshot.width, screenshot.height, screenshot.bpp, - new PaletteData(screenshot.getRedMask(), screenshot - .getGreenMask(), screenshot.getBlueMask()), 1, - screenshot.data); - imageContainer.image = new Image(Display.getDefault(), imageData); - } - }); - return imageContainer.image; - } catch (IOException e) { - Log.e(TAG, "Unable to load screenshot from device " + device); - } catch (TimeoutException e) { - Log.e(TAG, "Timeout loading screenshot from device " + device); - } catch (AdbCommandRejectedException e) { - Log.e(TAG, "Adb rejected command to load screenshot from device " + device); - } - return null; - } - - public void loadViewTreeData(final Window window) { - executeInBackground("Loading view hierarchy", new Runnable() { - @Override - public void run() { - - mFilterText = ""; //$NON-NLS-1$ - - ViewNode viewNode = DeviceBridge.loadWindowData(window); - if (viewNode != null) { - DeviceBridge.loadProfileData(window, viewNode); - viewNode.setViewCount(); - TreeViewModel.getModel().setData(window, viewNode); - } - } - }); - } - - public void loadOverlay(final Shell shell) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - FileDialog fileDialog = new FileDialog(shell, SWT.OPEN); - fileDialog.setFilterExtensions(new String[] { - "*.jpg;*.jpeg;*.png;*.gif;*.bmp" //$NON-NLS-1$ - }); - fileDialog.setFilterNames(new String[] { - "Image (*.jpg, *.jpeg, *.png, *.gif, *.bmp)" - }); - fileDialog.setText("Choose an overlay image"); - String fileName = fileDialog.open(); - if (fileName != null) { - try { - Image image = new Image(Display.getDefault(), fileName); - PixelPerfectModel.getModel().setOverlayImage(image); - } catch (SWTException e) { - Log.e(TAG, "Unable to load image from " + fileName); - } - } - } - }); - } - - public void showCapture(final Shell shell, final ViewNode viewNode) { - executeInBackground("Capturing node", new Runnable() { - @Override - public void run() { - final Image image = loadCapture(viewNode); - if (image != null) { - - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - CaptureDisplay.show(shell, viewNode, image); - } - }); - } - } - }); - } - - public Image loadCapture(ViewNode viewNode) { - final Image image = DeviceBridge.loadCapture(viewNode.window, viewNode); - if (image != null) { - viewNode.image = image; - - // Force the layout viewer to redraw. - TreeViewModel.getModel().notifySelectionChanged(); - } - return image; - } - - public void loadCaptureInBackground(final ViewNode viewNode) { - executeInBackground("Capturing node", new Runnable() { - @Override - public void run() { - loadCapture(viewNode); - } - }); - } - - public void showCapture(Shell shell) { - DrawableViewNode viewNode = TreeViewModel.getModel().getSelection(); - if (viewNode != null) { - showCapture(shell, viewNode.viewNode); - } - } - - public void refreshWindows() { - executeInBackground("Refreshing windows", new Runnable() { - @Override - public void run() { - IDevice[] devicesA = DeviceSelectionModel.getModel().getDevices(); - IDevice[] devicesB = DeviceBridge.getDevices(); - HashSet<IDevice> deviceSet = new HashSet<IDevice>(); - for (int i = 0; i < devicesB.length; i++) { - deviceSet.add(devicesB[i]); - } - for (int i = 0; i < devicesA.length; i++) { - if (deviceSet.contains(devicesA[i])) { - windowsChanged(devicesA[i]); - deviceSet.remove(devicesA[i]); - } else { - deviceDisconnected(devicesA[i]); - } - } - for (IDevice device : deviceSet) { - deviceConnected(device); - } - } - }); - } - - public void loadViewHierarchy() { - Window window = DeviceSelectionModel.getModel().getSelectedWindow(); - if (window != null) { - loadViewTreeData(window); - } - } - - public void inspectScreenshot() { - IDevice device = DeviceSelectionModel.getModel().getSelectedDevice(); - if (device != null) { - loadPixelPerfectData(device); - } - } - - public void saveTreeView(final Shell shell) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - final DrawableViewNode viewNode = TreeViewModel.getModel().getTree(); - if (viewNode != null) { - FileDialog fileDialog = new FileDialog(shell, SWT.SAVE); - fileDialog.setFilterExtensions(new String[] { - "*.png" //$NON-NLS-1$ - }); - fileDialog.setFilterNames(new String[] { - "Portable Network Graphics File (*.png)" - }); - fileDialog.setText("Choose where to save the tree image"); - final String fileName = fileDialog.open(); - if (fileName != null) { - executeInBackground("Saving tree view", new Runnable() { - @Override - public void run() { - Image image = TreeView.paintToImage(viewNode); - ImageLoader imageLoader = new ImageLoader(); - imageLoader.data = new ImageData[] { - image.getImageData() - }; - String extensionedFileName = fileName; - if (!extensionedFileName.toLowerCase().endsWith(".png")) { //$NON-NLS-1$ - extensionedFileName += ".png"; //$NON-NLS-1$ - } - try { - imageLoader.save(extensionedFileName, SWT.IMAGE_PNG); - } catch (SWTException e) { - Log.e(TAG, "Unable to save tree view as a PNG image at " - + fileName); - } - image.dispose(); - } - }); - } - } - } - }); - } - - public void savePixelPerfect(final Shell shell) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - Image untouchableImage = PixelPerfectModel.getModel().getImage(); - if (untouchableImage != null) { - final ImageData imageData = untouchableImage.getImageData(); - FileDialog fileDialog = new FileDialog(shell, SWT.SAVE); - fileDialog.setFilterExtensions(new String[] { - "*.png" //$NON-NLS-1$ - }); - fileDialog.setFilterNames(new String[] { - "Portable Network Graphics File (*.png)" - }); - fileDialog.setText("Choose where to save the screenshot"); - final String fileName = fileDialog.open(); - if (fileName != null) { - executeInBackground("Saving pixel perfect", new Runnable() { - @Override - public void run() { - ImageLoader imageLoader = new ImageLoader(); - imageLoader.data = new ImageData[] { - imageData - }; - String extensionedFileName = fileName; - if (!extensionedFileName.toLowerCase().endsWith(".png")) { //$NON-NLS-1$ - extensionedFileName += ".png"; //$NON-NLS-1$ - } - try { - imageLoader.save(extensionedFileName, SWT.IMAGE_PNG); - } catch (SWTException e) { - Log.e(TAG, "Unable to save tree view as a PNG image at " - + fileName); - } - } - }); - } - } - } - }); - } - - public void capturePSD(final Shell shell) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - final Window window = TreeViewModel.getModel().getWindow(); - if (window != null) { - FileDialog fileDialog = new FileDialog(shell, SWT.SAVE); - fileDialog.setFilterExtensions(new String[] { - "*.psd" //$NON-NLS-1$ - }); - fileDialog.setFilterNames(new String[] { - "Photoshop Document (*.psd)" - }); - fileDialog.setText("Choose where to save the window layers"); - final String fileName = fileDialog.open(); - if (fileName != null) { - executeInBackground("Saving window layers", new Runnable() { - @Override - public void run() { - PsdFile psdFile = DeviceBridge.captureLayers(window); - if (psdFile != null) { - String extensionedFileName = fileName; - if (!extensionedFileName.toLowerCase().endsWith(".psd")) { //$NON-NLS-1$ - extensionedFileName += ".psd"; //$NON-NLS-1$ - } - try { - psdFile.write(new FileOutputStream(extensionedFileName)); - } catch (FileNotFoundException e) { - Log.e(TAG, "Unable to write to file " + fileName); - } - } - } - }); - } - } - } - }); - } - - public void reloadViewHierarchy() { - Window window = TreeViewModel.getModel().getWindow(); - if (window != null) { - loadViewTreeData(window); - } - } - - public void invalidateCurrentNode() { - final DrawableViewNode selectedNode = TreeViewModel.getModel().getSelection(); - if (selectedNode != null) { - executeInBackground("Invalidating view", new Runnable() { - @Override - public void run() { - DeviceBridge.invalidateView(selectedNode.viewNode); - } - }); - } - } - - public void relayoutCurrentNode() { - final DrawableViewNode selectedNode = TreeViewModel.getModel().getSelection(); - if (selectedNode != null) { - executeInBackground("Request layout", new Runnable() { - @Override - public void run() { - DeviceBridge.requestLayout(selectedNode.viewNode); - } - }); - } - } - - public void dumpDisplayListForCurrentNode() { - final DrawableViewNode selectedNode = TreeViewModel.getModel().getSelection(); - if (selectedNode != null) { - executeInBackground("Dump displaylist", new Runnable() { - @Override - public void run() { - DeviceBridge.outputDisplayList(selectedNode.viewNode); - } - }); - } - } - - public void loadAllViews() { - executeInBackground("Loading all views", new Runnable() { - @Override - public void run() { - DrawableViewNode tree = TreeViewModel.getModel().getTree(); - if (tree != null) { - loadViewRecursive(tree.viewNode); - // Force the layout viewer to redraw. - TreeViewModel.getModel().notifySelectionChanged(); - } - } - }); - } - - private void loadViewRecursive(ViewNode viewNode) { - Image image = DeviceBridge.loadCapture(viewNode.window, viewNode); - if (image == null) { - return; - } - viewNode.image = image; - final int N = viewNode.children.size(); - for (int i = 0; i < N; i++) { - loadViewRecursive(viewNode.children.get(i)); - } - } - - public void filterNodes(String filterText) { - this.mFilterText = filterText; - DrawableViewNode tree = TreeViewModel.getModel().getTree(); - if (tree != null) { - tree.viewNode.filter(filterText); - // Force redraw - TreeViewModel.getModel().notifySelectionChanged(); - } - } - - public String getFilterText() { - return mFilterText; - } - - private static class PixelPerfectAutoRefreshTask extends TimerTask { - @Override - public void run() { - HierarchyViewerDirector.getDirector().refreshPixelPerfect(); - } - }; - - public void setPixelPerfectAutoRefresh(boolean value) { - synchronized (mPixelPerfectRefreshTimer) { - if (value == mAutoRefresh) { - return; - } - mAutoRefresh = value; - if (mAutoRefresh) { - mCurrentAutoRefreshTask = new PixelPerfectAutoRefreshTask(); - mPixelPerfectRefreshTimer.schedule(mCurrentAutoRefreshTask, - mPixelPerfectAutoRefreshInterval * 1000, - mPixelPerfectAutoRefreshInterval * 1000); - } else { - mCurrentAutoRefreshTask.cancel(); - mCurrentAutoRefreshTask = null; - } - } - } - - public void setPixelPerfectAutoRefreshInterval(int value) { - synchronized (mPixelPerfectRefreshTimer) { - if (mPixelPerfectAutoRefreshInterval == value) { - return; - } - mPixelPerfectAutoRefreshInterval = value; - if (mAutoRefresh) { - mCurrentAutoRefreshTask.cancel(); - long timeLeft = - Math.max(0, mPixelPerfectAutoRefreshInterval - * 1000 - - (System.currentTimeMillis() - mCurrentAutoRefreshTask - .scheduledExecutionTime())); - mCurrentAutoRefreshTask = new PixelPerfectAutoRefreshTask(); - mPixelPerfectRefreshTimer.schedule(mCurrentAutoRefreshTask, timeLeft, - mPixelPerfectAutoRefreshInterval * 1000); - } - } - } - - public int getPixelPerfectAutoRefreshInverval() { - return mPixelPerfectAutoRefreshInterval; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/CapturePSDAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/CapturePSDAction.java deleted file mode 100644 index f1f7ad6..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/CapturePSDAction.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -public class CapturePSDAction extends TreeViewEnabledAction implements ImageAction { - - private static CapturePSDAction sAction; - - private Image mImage; - - private Shell mShell; - - private CapturePSDAction(Shell shell) { - super("&Capture Layers"); - this.mShell = shell; - setAccelerator(SWT.MOD1 + 'C'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("capture-psd.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Capture the window layers as a photoshop document"); - } - - public static CapturePSDAction getAction(Shell shell) { - if (sAction == null) { - sAction = new CapturePSDAction(shell); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().capturePSD(mShell); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/DisplayViewAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/DisplayViewAction.java deleted file mode 100644 index 7da02d7..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/DisplayViewAction.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -public class DisplayViewAction extends SelectedNodeEnabledAction implements ImageAction { - - private static DisplayViewAction sAction; - - private Image mImage; - - private Shell mShell; - - private DisplayViewAction(Shell shell) { - super("&Display View"); - this.mShell = shell; - setAccelerator(SWT.MOD1 + 'D'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("display.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Display the selected view image in a separate window"); - } - - public static DisplayViewAction getAction(Shell shell) { - if (sAction == null) { - sAction = new DisplayViewAction(shell); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().showCapture(mShell); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/DumpDisplayListAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/DumpDisplayListAction.java deleted file mode 100644 index fdbc7ef..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/DumpDisplayListAction.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2011 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -public class DumpDisplayListAction extends SelectedNodeEnabledAction implements ImageAction { - - private static DumpDisplayListAction sAction; - - private Image mImage; - - private DumpDisplayListAction() { - super("Dump DisplayList"); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("load-view-hierarchy.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Request the view to output its displaylist to logcat"); - } - - public static DumpDisplayListAction getAction() { - if (sAction == null) { - sAction = new DumpDisplayListAction(); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().dumpDisplayListForCurrentNode(); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/ImageAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/ImageAction.java deleted file mode 100644 index 08320fd..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/ImageAction.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import org.eclipse.swt.graphics.Image; - -public interface ImageAction { - public Image getImage(); - - public String getText(); - - public String getToolTipText(); -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/InspectScreenshotAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/InspectScreenshotAction.java deleted file mode 100644 index 708c7b1..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/InspectScreenshotAction.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmlib.IDevice; -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; -import com.android.hierarchyviewerlib.device.Window; -import com.android.hierarchyviewerlib.models.DeviceSelectionModel; -import com.android.hierarchyviewerlib.models.DeviceSelectionModel.IWindowChangeListener; - -import org.eclipse.jface.action.Action; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -public class InspectScreenshotAction extends Action implements ImageAction, IWindowChangeListener { - - private static InspectScreenshotAction sAction; - - private Image mImage; - - private InspectScreenshotAction() { - super("Inspect &Screenshot"); - setAccelerator(SWT.MOD1 + 'S'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("inspect-screenshot.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Inspect a screenshot in the pixel perfect view"); - setEnabled( - DeviceSelectionModel.getModel().getSelectedDevice() != null); - DeviceSelectionModel.getModel().addWindowChangeListener(this); - } - - public static InspectScreenshotAction getAction() { - if (sAction == null) { - sAction = new InspectScreenshotAction(); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().inspectScreenshot(); - } - - @Override - public Image getImage() { - return mImage; - } - - @Override - public void deviceChanged(IDevice device) { - // pass - } - - @Override - public void deviceConnected(IDevice device) { - // pass - } - - @Override - public void deviceDisconnected(IDevice device) { - // pass - } - - @Override - public void focusChanged(IDevice device) { - // pass - } - - @Override - public void selectionChanged(final IDevice device, final Window window) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - InspectScreenshotAction.getAction().setEnabled(device != null); - } - }); - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/InvalidateAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/InvalidateAction.java deleted file mode 100644 index b884220..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/InvalidateAction.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -public class InvalidateAction extends SelectedNodeEnabledAction implements ImageAction { - - private static InvalidateAction sAction; - - private Image mImage; - - private InvalidateAction() { - super("&Invalidate Layout"); - setAccelerator(SWT.MOD1 + 'I'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("invalidate.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Invalidate the layout for the current window"); - } - - public static InvalidateAction getAction() { - if (sAction == null) { - sAction = new InvalidateAction(); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().invalidateCurrentNode(); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/LoadOverlayAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/LoadOverlayAction.java deleted file mode 100644 index 1876358..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/LoadOverlayAction.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -public class LoadOverlayAction extends PixelPerfectEnabledAction implements ImageAction { - - private static LoadOverlayAction sAction; - - private Image mImage; - - private Shell mShell; - - private LoadOverlayAction(Shell shell) { - super("Load &Overlay"); - this.mShell = shell; - setAccelerator(SWT.MOD1 + 'O'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("load-overlay.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Load an image to overlay the screenshot"); - } - - public static LoadOverlayAction getAction(Shell shell) { - if (sAction == null) { - sAction = new LoadOverlayAction(shell); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().loadOverlay(mShell); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/LoadViewHierarchyAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/LoadViewHierarchyAction.java deleted file mode 100644 index f2dbaee..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/LoadViewHierarchyAction.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmlib.IDevice; -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; -import com.android.hierarchyviewerlib.device.Window; -import com.android.hierarchyviewerlib.models.DeviceSelectionModel; -import com.android.hierarchyviewerlib.models.DeviceSelectionModel.IWindowChangeListener; - -import org.eclipse.jface.action.Action; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -public class LoadViewHierarchyAction extends Action implements ImageAction, IWindowChangeListener { - - private static LoadViewHierarchyAction sAction; - - private Image mImage; - - private LoadViewHierarchyAction() { - super("Load View &Hierarchy"); - setAccelerator(SWT.MOD1 + 'H'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("load-view-hierarchy.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Load the view hierarchy into the tree view"); - setEnabled( - DeviceSelectionModel.getModel().getSelectedWindow() != null); - DeviceSelectionModel.getModel().addWindowChangeListener(this); - } - - public static LoadViewHierarchyAction getAction() { - if (sAction == null) { - sAction = new LoadViewHierarchyAction(); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().loadViewHierarchy(); - } - - @Override - public Image getImage() { - return mImage; - } - - @Override - public void deviceChanged(IDevice device) { - // pass - } - - @Override - public void deviceConnected(IDevice device) { - // pass - } - - @Override - public void deviceDisconnected(IDevice device) { - // pass - } - - @Override - public void focusChanged(IDevice device) { - // pass - } - - @Override - public void selectionChanged(final IDevice device, final Window window) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - LoadViewHierarchyAction.getAction().setEnabled(window != null); - } - }); - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/PixelPerfectAutoRefreshAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/PixelPerfectAutoRefreshAction.java deleted file mode 100644 index a47c143..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/PixelPerfectAutoRefreshAction.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.action.Action; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -public class PixelPerfectAutoRefreshAction extends PixelPerfectEnabledAction implements ImageAction { - - private static PixelPerfectAutoRefreshAction sAction; - - private Image mImage; - - private PixelPerfectAutoRefreshAction() { - super("Auto &Refresh", Action.AS_CHECK_BOX); - setAccelerator(SWT.MOD1 + 'R'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("auto-refresh.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Automatically refresh the screenshot"); - } - - public static PixelPerfectAutoRefreshAction getAction() { - if (sAction == null) { - sAction = new PixelPerfectAutoRefreshAction(); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().setPixelPerfectAutoRefresh(sAction.isChecked()); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/PixelPerfectEnabledAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/PixelPerfectEnabledAction.java deleted file mode 100644 index 33cb343..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/PixelPerfectEnabledAction.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.hierarchyviewerlib.models.PixelPerfectModel; -import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; - -import org.eclipse.jface.action.Action; -import org.eclipse.swt.widgets.Display; - -public class PixelPerfectEnabledAction extends Action implements IImageChangeListener { - public PixelPerfectEnabledAction(String name) { - super(name); - setEnabled(PixelPerfectModel.getModel().getImage() != null); - PixelPerfectModel.getModel().addImageChangeListener(this); - } - - public PixelPerfectEnabledAction(String name, int type) { - super(name, type); - setEnabled(PixelPerfectModel.getModel().getImage() != null); - PixelPerfectModel.getModel().addImageChangeListener(this); - } - - @Override - public void crosshairMoved() { - // pass - } - - @Override - public void imageChanged() { - // - } - - @Override - public void imageLoaded() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - setEnabled(PixelPerfectModel.getModel().getImage() != null); - } - }); - } - - @Override - public void overlayChanged() { - // pass - } - - @Override - public void overlayTransparencyChanged() { - // pass - } - - @Override - public void selectionChanged() { - // pass - } - - @Override - public void treeChanged() { - // pass - } - - @Override - public void zoomChanged() { - // pass - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshPixelPerfectAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshPixelPerfectAction.java deleted file mode 100644 index 54f53c8..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshPixelPerfectAction.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -public class RefreshPixelPerfectAction extends PixelPerfectEnabledAction implements ImageAction { - - private static RefreshPixelPerfectAction sAction; - - private Image mImage; - - private RefreshPixelPerfectAction() { - super("&Refresh Screenshot"); - setAccelerator(SWT.F5); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("refresh-windows.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Refresh the screenshot"); - } - - public static RefreshPixelPerfectAction getAction() { - if (sAction == null) { - sAction = new RefreshPixelPerfectAction(); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().refreshPixelPerfect(); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshPixelPerfectTreeAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshPixelPerfectTreeAction.java deleted file mode 100644 index e9d1c56..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshPixelPerfectTreeAction.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -public class RefreshPixelPerfectTreeAction extends PixelPerfectEnabledAction implements ImageAction { - - private static RefreshPixelPerfectTreeAction sAction; - - private Image mImage; - - private RefreshPixelPerfectTreeAction() { - super("Refresh &Tree"); - setAccelerator(SWT.MOD1 + 'T'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("load-view-hierarchy.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Refresh the tree"); - } - - public static RefreshPixelPerfectTreeAction getAction() { - if (sAction == null) { - sAction = new RefreshPixelPerfectTreeAction(); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().refreshPixelPerfectTree(); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshViewAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshViewAction.java deleted file mode 100644 index 01c2527..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshViewAction.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -public class RefreshViewAction extends TreeViewEnabledAction implements ImageAction { - - private static RefreshViewAction sAction; - - private Image mImage; - - private RefreshViewAction() { - super("Load View &Hierarchy"); - setAccelerator(SWT.MOD1 + 'H'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("load-view-hierarchy.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Reload the view hierarchy"); - } - - public static RefreshViewAction getAction() { - if (sAction == null) { - sAction = new RefreshViewAction(); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().reloadViewHierarchy(); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshWindowsAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshWindowsAction.java deleted file mode 100644 index 561f4ea..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RefreshWindowsAction.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.action.Action; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -public class RefreshWindowsAction extends Action implements ImageAction { - - private static RefreshWindowsAction sAction; - - private Image mImage; - - private RefreshWindowsAction() { - super("&Refresh"); - setAccelerator(SWT.F5); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("refresh-windows.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Refresh the list of devices"); - } - - public static RefreshWindowsAction getAction() { - if (sAction == null) { - sAction = new RefreshWindowsAction(); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().refreshWindows(); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RequestLayoutAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RequestLayoutAction.java deleted file mode 100644 index 6fc7867..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/RequestLayoutAction.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -public class RequestLayoutAction extends SelectedNodeEnabledAction implements ImageAction { - - private static RequestLayoutAction sAction; - - private Image mImage; - - private RequestLayoutAction() { - super("Request &Layout"); - setAccelerator(SWT.MOD1 + 'L'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("request-layout.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Request the view to lay out"); - } - - public static RequestLayoutAction getAction() { - if (sAction == null) { - sAction = new RequestLayoutAction(); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().relayoutCurrentNode(); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/SavePixelPerfectAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/SavePixelPerfectAction.java deleted file mode 100644 index 57e0094..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/SavePixelPerfectAction.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -public class SavePixelPerfectAction extends PixelPerfectEnabledAction implements ImageAction { - - private static SavePixelPerfectAction sAction; - - private Image mImage; - - private Shell mShell; - - private SavePixelPerfectAction(Shell shell) { - super("&Save as PNG"); - this.mShell = shell; - setAccelerator(SWT.MOD1 + 'S'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("save.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Save the screenshot as a PNG image"); - } - - public static SavePixelPerfectAction getAction(Shell shell) { - if (sAction == null) { - sAction = new SavePixelPerfectAction(shell); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().savePixelPerfect(mShell); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/SaveTreeViewAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/SaveTreeViewAction.java deleted file mode 100644 index 9e11919..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/SaveTreeViewAction.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -public class SaveTreeViewAction extends TreeViewEnabledAction implements ImageAction { - - private static SaveTreeViewAction sAction; - - private Image mImage; - - private Shell mShell; - - private SaveTreeViewAction(Shell shell) { - super("&Save as PNG"); - this.mShell = shell; - setAccelerator(SWT.MOD1 + 'S'); - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - mImage = imageLoader.loadImage("save.png", Display.getDefault()); //$NON-NLS-1$ - setImageDescriptor(ImageDescriptor.createFromImage(mImage)); - setToolTipText("Save the tree view as a PNG image"); - } - - public static SaveTreeViewAction getAction(Shell shell) { - if (sAction == null) { - sAction = new SaveTreeViewAction(shell); - } - return sAction; - } - - @Override - public void run() { - HierarchyViewerDirector.getDirector().saveTreeView(mShell); - } - - @Override - public Image getImage() { - return mImage; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/SelectedNodeEnabledAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/SelectedNodeEnabledAction.java deleted file mode 100644 index eee28b9..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/SelectedNodeEnabledAction.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.hierarchyviewerlib.models.TreeViewModel; -import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener; - -import org.eclipse.jface.action.Action; -import org.eclipse.swt.widgets.Display; - -public class SelectedNodeEnabledAction extends Action implements ITreeChangeListener { - public SelectedNodeEnabledAction(String name) { - super(name); - setEnabled(TreeViewModel.getModel().getTree() != null - && TreeViewModel.getModel().getSelection() != null); - TreeViewModel.getModel().addTreeChangeListener(this); - } - - @Override - public void selectionChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - setEnabled(TreeViewModel.getModel().getTree() != null - && TreeViewModel.getModel().getSelection() != null); - } - }); - } - - @Override - public void treeChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - setEnabled(TreeViewModel.getModel().getTree() != null - && TreeViewModel.getModel().getSelection() != null); - } - }); - } - - @Override - public void viewportChanged() { - } - - @Override - public void zoomChanged() { - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/TreeViewEnabledAction.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/TreeViewEnabledAction.java deleted file mode 100644 index 4b9c02c..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/actions/TreeViewEnabledAction.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.hierarchyviewerlib.actions; - -import com.android.hierarchyviewerlib.models.TreeViewModel; -import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener; - -import org.eclipse.jface.action.Action; -import org.eclipse.swt.widgets.Display; - -public class TreeViewEnabledAction extends Action implements ITreeChangeListener { - public TreeViewEnabledAction(String name) { - super(name); - setEnabled(TreeViewModel.getModel().getTree() != null); - TreeViewModel.getModel().addTreeChangeListener(this); - } - - @Override - public void selectionChanged() { - // pass - } - - @Override - public void treeChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - setEnabled(TreeViewModel.getModel().getTree() != null); - } - }); - } - - @Override - public void viewportChanged() { - } - - @Override - public void zoomChanged() { - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DeviceBridge.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DeviceBridge.java deleted file mode 100644 index 10308a3..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DeviceBridge.java +++ /dev/null @@ -1,668 +0,0 @@ -/* - * 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.hierarchyviewerlib.device; - -import com.android.ddmlib.AdbCommandRejectedException; -import com.android.ddmlib.AndroidDebugBridge; -import com.android.ddmlib.IDevice; -import com.android.ddmlib.Log; -import com.android.ddmlib.MultiLineReceiver; -import com.android.ddmlib.ShellCommandUnresponsiveException; -import com.android.ddmlib.TimeoutException; -import com.android.hierarchyviewerlib.ui.util.PsdFile; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; - -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.imageio.ImageIO; - -/** - * A bridge to the device. - */ -public class DeviceBridge { - - public static final String TAG = "hierarchyviewer"; - - private static final int DEFAULT_SERVER_PORT = 4939; - - // These codes must match the auto-generated codes in IWindowManager.java - // See IWindowManager.aidl as well - private static final int SERVICE_CODE_START_SERVER = 1; - - private static final int SERVICE_CODE_STOP_SERVER = 2; - - private static final int SERVICE_CODE_IS_SERVER_RUNNING = 3; - - private static AndroidDebugBridge sBridge; - - private static final HashMap<IDevice, Integer> sDevicePortMap = new HashMap<IDevice, Integer>(); - - private static final HashMap<IDevice, ViewServerInfo> sViewServerInfo = - new HashMap<IDevice, ViewServerInfo>(); - - private static int sNextLocalPort = DEFAULT_SERVER_PORT; - - public static class ViewServerInfo { - public final int protocolVersion; - - public final int serverVersion; - - ViewServerInfo(int serverVersion, int protocolVersion) { - this.protocolVersion = protocolVersion; - this.serverVersion = serverVersion; - } - } - - /** - * Init the DeviceBridge with an existing {@link AndroidDebugBridge}. - * @param bridge the bridge object to use - */ - public static void acquireBridge(AndroidDebugBridge bridge) { - sBridge = bridge; - } - - /** - * Creates an {@link AndroidDebugBridge} connected to adb at the given location. - * - * If a bridge is already running, this disconnects it and creates a new one. - * - * @param adbLocation the location to adb. - */ - public static void initDebugBridge(String adbLocation) { - if (sBridge == null) { - AndroidDebugBridge.init(false /* debugger support */); - } - if (sBridge == null || !sBridge.isConnected()) { - sBridge = AndroidDebugBridge.createBridge(adbLocation, true); - } - } - - /** Disconnects the current {@link AndroidDebugBridge}. */ - public static void terminate() { - AndroidDebugBridge.terminate(); - } - - public static IDevice[] getDevices() { - if (sBridge == null) { - return new IDevice[0]; - } - return sBridge.getDevices(); - } - - /* - * This adds a listener to the debug bridge. The listener is notified of - * connecting/disconnecting devices, devices coming online, etc. - */ - public static void startListenForDevices(AndroidDebugBridge.IDeviceChangeListener listener) { - AndroidDebugBridge.addDeviceChangeListener(listener); - } - - public static void stopListenForDevices(AndroidDebugBridge.IDeviceChangeListener listener) { - AndroidDebugBridge.removeDeviceChangeListener(listener); - } - - /** - * Sets up a just-connected device to work with the view server. - * <p/> - * This starts a port forwarding between a local port and a port on the - * device. - * - * @param device - */ - public static void setupDeviceForward(IDevice device) { - synchronized (sDevicePortMap) { - if (device.getState() == IDevice.DeviceState.ONLINE) { - int localPort = sNextLocalPort++; - try { - device.createForward(localPort, DEFAULT_SERVER_PORT); - sDevicePortMap.put(device, localPort); - } catch (TimeoutException e) { - Log.e(TAG, "Timeout setting up port forwarding for " + device); - } catch (AdbCommandRejectedException e) { - Log.e(TAG, String.format("Adb rejected forward command for device %1$s: %2$s", - device, e.getMessage())); - } catch (IOException e) { - Log.e(TAG, String.format("Failed to create forward for device %1$s: %2$s", - device, e.getMessage())); - } - } - } - } - - public static void removeDeviceForward(IDevice device) { - synchronized (sDevicePortMap) { - final Integer localPort = sDevicePortMap.get(device); - if (localPort != null) { - try { - device.removeForward(localPort, DEFAULT_SERVER_PORT); - sDevicePortMap.remove(device); - } catch (TimeoutException e) { - Log.e(TAG, "Timeout removing port forwarding for " + device); - } catch (AdbCommandRejectedException e) { - // In this case, we want to fail silently. - } catch (IOException e) { - Log.e(TAG, String.format("Failed to remove forward for device %1$s: %2$s", - device, e.getMessage())); - } - } - } - } - - public static int getDeviceLocalPort(IDevice device) { - synchronized (sDevicePortMap) { - Integer port = sDevicePortMap.get(device); - if (port != null) { - return port; - } - - Log.e(TAG, "Missing forwarded port for " + device.getSerialNumber()); - return -1; - } - - } - - public static boolean isViewServerRunning(IDevice device) { - final boolean[] result = new boolean[1]; - try { - if (device.isOnline()) { - device.executeShellCommand(buildIsServerRunningShellCommand(), - new BooleanResultReader(result)); - if (!result[0]) { - ViewServerInfo serverInfo = loadViewServerInfo(device); - if (serverInfo != null && serverInfo.protocolVersion > 2) { - result[0] = true; - } - } - } - } catch (TimeoutException e) { - Log.e(TAG, "Timeout checking status of view server on device " + device); - } catch (IOException e) { - Log.e(TAG, "Unable to check status of view server on device " + device); - } catch (AdbCommandRejectedException e) { - Log.e(TAG, "Adb rejected command to check status of view server on device " + device); - } catch (ShellCommandUnresponsiveException e) { - Log.e(TAG, "Unable to execute command to check status of view server on device " - + device); - } - return result[0]; - } - - public static boolean startViewServer(IDevice device) { - return startViewServer(device, DEFAULT_SERVER_PORT); - } - - public static boolean startViewServer(IDevice device, int port) { - final boolean[] result = new boolean[1]; - try { - if (device.isOnline()) { - device.executeShellCommand(buildStartServerShellCommand(port), - new BooleanResultReader(result)); - } - } catch (TimeoutException e) { - Log.e(TAG, "Timeout starting view server on device " + device); - } catch (IOException e) { - Log.e(TAG, "Unable to start view server on device " + device); - } catch (AdbCommandRejectedException e) { - Log.e(TAG, "Adb rejected command to start view server on device " + device); - } catch (ShellCommandUnresponsiveException e) { - Log.e(TAG, "Unable to execute command to start view server on device " + device); - } - return result[0]; - } - - public static boolean stopViewServer(IDevice device) { - final boolean[] result = new boolean[1]; - try { - if (device.isOnline()) { - device.executeShellCommand(buildStopServerShellCommand(), new BooleanResultReader( - result)); - } - } catch (TimeoutException e) { - Log.e(TAG, "Timeout stopping view server on device " + device); - } catch (IOException e) { - Log.e(TAG, "Unable to stop view server on device " + device); - } catch (AdbCommandRejectedException e) { - Log.e(TAG, "Adb rejected command to stop view server on device " + device); - } catch (ShellCommandUnresponsiveException e) { - Log.e(TAG, "Unable to execute command to stop view server on device " + device); - } - return result[0]; - } - - private static String buildStartServerShellCommand(int port) { - return String.format("service call window %d i32 %d", SERVICE_CODE_START_SERVER, port); //$NON-NLS-1$ - } - - private static String buildStopServerShellCommand() { - return String.format("service call window %d", SERVICE_CODE_STOP_SERVER); //$NON-NLS-1$ - } - - private static String buildIsServerRunningShellCommand() { - return String.format("service call window %d", SERVICE_CODE_IS_SERVER_RUNNING); //$NON-NLS-1$ - } - - private static class BooleanResultReader extends MultiLineReceiver { - private final boolean[] mResult; - - public BooleanResultReader(boolean[] result) { - mResult = result; - } - - @Override - public void processNewLines(String[] strings) { - if (strings.length > 0) { - Pattern pattern = Pattern.compile(".*?\\([0-9]{8} ([0-9]{8}).*"); //$NON-NLS-1$ - Matcher matcher = pattern.matcher(strings[0]); - if (matcher.matches()) { - if (Integer.parseInt(matcher.group(1)) == 1) { - mResult[0] = true; - } - } - } - } - - @Override - public boolean isCancelled() { - return false; - } - } - - public static ViewServerInfo loadViewServerInfo(IDevice device) { - int server = -1; - int protocol = -1; - DeviceConnection connection = null; - try { - connection = new DeviceConnection(device); - connection.sendCommand("SERVER"); //$NON-NLS-1$ - String line = connection.getInputStream().readLine(); - if (line != null) { - server = Integer.parseInt(line); - } - } catch (Exception e) { - Log.e(TAG, "Unable to get view server version from device " + device); - } finally { - if (connection != null) { - connection.close(); - } - } - connection = null; - try { - connection = new DeviceConnection(device); - connection.sendCommand("PROTOCOL"); //$NON-NLS-1$ - String line = connection.getInputStream().readLine(); - if (line != null) { - protocol = Integer.parseInt(line); - } - } catch (Exception e) { - Log.e(TAG, "Unable to get view server protocol version from device " + device); - } finally { - if (connection != null) { - connection.close(); - } - } - if (server == -1 || protocol == -1) { - return null; - } - ViewServerInfo returnValue = new ViewServerInfo(server, protocol); - synchronized (sViewServerInfo) { - sViewServerInfo.put(device, returnValue); - } - return returnValue; - } - - public static ViewServerInfo getViewServerInfo(IDevice device) { - synchronized (sViewServerInfo) { - return sViewServerInfo.get(device); - } - } - - public static void removeViewServerInfo(IDevice device) { - synchronized (sViewServerInfo) { - sViewServerInfo.remove(device); - } - } - - /* - * This loads the list of windows from the specified device. The format is: - * hashCode1 title1 hashCode2 title2 ... hashCodeN titleN DONE. - */ - public static Window[] loadWindows(IDevice device) { - ArrayList<Window> windows = new ArrayList<Window>(); - DeviceConnection connection = null; - ViewServerInfo serverInfo = getViewServerInfo(device); - try { - connection = new DeviceConnection(device); - connection.sendCommand("LIST"); //$NON-NLS-1$ - BufferedReader in = connection.getInputStream(); - String line; - while ((line = in.readLine()) != null) { - if ("DONE.".equalsIgnoreCase(line)) { //$NON-NLS-1$ - break; - } - - int index = line.indexOf(' '); - if (index != -1) { - String windowId = line.substring(0, index); - - int id; - if (serverInfo.serverVersion > 2) { - id = (int) Long.parseLong(windowId, 16); - } else { - id = Integer.parseInt(windowId, 16); - } - - Window w = new Window(device, line.substring(index + 1), id); - windows.add(w); - } - } - // Automatic refreshing of windows was added in protocol version 3. - // Before, the user needed to specify explicitly that he wants to - // get the focused window, which was done using a special type of - // window with hash code -1. - if (serverInfo.protocolVersion < 3) { - windows.add(Window.getFocusedWindow(device)); - } - } catch (Exception e) { - Log.e(TAG, "Unable to load the window list from device " + device); - } finally { - if (connection != null) { - connection.close(); - } - } - // The server returns the list of windows from the window at the bottom - // to the top. We want the reverse order to put the top window on top of - // the list. - Window[] returnValue = new Window[windows.size()]; - for (int i = windows.size() - 1; i >= 0; i--) { - returnValue[returnValue.length - i - 1] = windows.get(i); - } - return returnValue; - } - - /* - * This gets the hash code of the window that has focus. Only works with - * protocol version 3 and above. - */ - public static int getFocusedWindow(IDevice device) { - DeviceConnection connection = null; - try { - connection = new DeviceConnection(device); - connection.sendCommand("GET_FOCUS"); //$NON-NLS-1$ - String line = connection.getInputStream().readLine(); - if (line == null || line.length() == 0) { - return -1; - } - return (int) Long.parseLong(line.substring(0, line.indexOf(' ')), 16); - } catch (Exception e) { - Log.e(TAG, "Unable to get the focused window from device " + device); - } finally { - if (connection != null) { - connection.close(); - } - } - return -1; - } - - public static ViewNode loadWindowData(Window window) { - DeviceConnection connection = null; - try { - connection = new DeviceConnection(window.getDevice()); - connection.sendCommand("DUMP " + window.encode()); //$NON-NLS-1$ - BufferedReader in = connection.getInputStream(); - ViewNode currentNode = null; - int currentDepth = -1; - String line; - while ((line = in.readLine()) != null) { - if ("DONE.".equalsIgnoreCase(line)) { - break; - } - int depth = 0; - while (line.charAt(depth) == ' ') { - depth++; - } - while (depth <= currentDepth) { - currentNode = currentNode.parent; - currentDepth--; - } - currentNode = new ViewNode(window, currentNode, line.substring(depth)); - currentDepth = depth; - } - if (currentNode == null) { - return null; - } - while (currentNode.parent != null) { - currentNode = currentNode.parent; - } - ViewServerInfo serverInfo = getViewServerInfo(window.getDevice()); - if (serverInfo != null) { - currentNode.protocolVersion = serverInfo.protocolVersion; - } - return currentNode; - } catch (Exception e) { - Log.e(TAG, "Unable to load window data for window " + window.getTitle() + " on device " - + window.getDevice()); - Log.e(TAG, e.getMessage()); - } finally { - if (connection != null) { - connection.close(); - } - } - return null; - } - - public static boolean loadProfileData(Window window, ViewNode viewNode) { - DeviceConnection connection = null; - try { - connection = new DeviceConnection(window.getDevice()); - connection.sendCommand("PROFILE " + window.encode() + " " + viewNode.toString()); //$NON-NLS-1$ - BufferedReader in = connection.getInputStream(); - int protocol; - synchronized (sViewServerInfo) { - protocol = sViewServerInfo.get(window.getDevice()).protocolVersion; - } - if (protocol < 3) { - return loadProfileData(viewNode, in); - } else { - boolean ret = loadProfileDataRecursive(viewNode, in); - if (ret) { - viewNode.setProfileRatings(); - } - return ret; - } - } catch (Exception e) { - Log.e(TAG, "Unable to load profiling data for window " + window.getTitle() - + " on device " + window.getDevice()); - } finally { - if (connection != null) { - connection.close(); - } - } - return false; - } - - private static boolean loadProfileData(ViewNode node, BufferedReader in) throws IOException { - String line; - if ((line = in.readLine()) == null || line.equalsIgnoreCase("-1 -1 -1") //$NON-NLS-1$ - || line.equalsIgnoreCase("DONE.")) { //$NON-NLS-1$ - return false; - } - String[] data = line.split(" "); - node.measureTime = (Long.parseLong(data[0]) / 1000.0) / 1000.0; - node.layoutTime = (Long.parseLong(data[1]) / 1000.0) / 1000.0; - node.drawTime = (Long.parseLong(data[2]) / 1000.0) / 1000.0; - return true; - } - - private static boolean loadProfileDataRecursive(ViewNode node, BufferedReader in) - throws IOException { - if (!loadProfileData(node, in)) { - return false; - } - for (int i = 0; i < node.children.size(); i++) { - if (!loadProfileDataRecursive(node.children.get(i), in)) { - return false; - } - } - return true; - } - - public static Image loadCapture(Window window, ViewNode viewNode) { - DeviceConnection connection = null; - try { - connection = new DeviceConnection(window.getDevice()); - connection.getSocket().setSoTimeout(5000); - connection.sendCommand("CAPTURE " + window.encode() + " " + viewNode.toString()); //$NON-NLS-1$ - return new Image(Display.getDefault(), connection.getSocket().getInputStream()); - } catch (Exception e) { - Log.e(TAG, "Unable to capture data for node " + viewNode + " in window " - + window.getTitle() + " on device " + window.getDevice()); - } finally { - if (connection != null) { - connection.close(); - } - } - return null; - } - - public static PsdFile captureLayers(Window window) { - DeviceConnection connection = null; - DataInputStream in = null; - - try { - connection = new DeviceConnection(window.getDevice()); - - connection.sendCommand("CAPTURE_LAYERS " + window.encode()); //$NON-NLS-1$ - - in = - new DataInputStream(new BufferedInputStream(connection.getSocket() - .getInputStream())); - - int width = in.readInt(); - int height = in.readInt(); - - PsdFile psd = new PsdFile(width, height); - - while (readLayer(in, psd)) { - } - - return psd; - } catch (Exception e) { - Log.e(TAG, "Unable to capture layers for window " + window.getTitle() + " on device " - + window.getDevice()); - } finally { - if (in != null) { - try { - in.close(); - } catch (Exception ex) { - } - } - connection.close(); - } - - return null; - } - - private static boolean readLayer(DataInputStream in, PsdFile psd) { - try { - if (in.read() == 2) { - return false; - } - String name = in.readUTF(); - boolean visible = in.read() == 1; - int x = in.readInt(); - int y = in.readInt(); - int dataSize = in.readInt(); - - byte[] data = new byte[dataSize]; - int read = 0; - while (read < dataSize) { - read += in.read(data, read, dataSize - read); - } - - ByteArrayInputStream arrayIn = new ByteArrayInputStream(data); - BufferedImage chunk = ImageIO.read(arrayIn); - - // Ensure the image is in the right format - BufferedImage image = - new BufferedImage(chunk.getWidth(), chunk.getHeight(), - BufferedImage.TYPE_INT_ARGB); - Graphics2D g = image.createGraphics(); - g.drawImage(chunk, null, 0, 0); - g.dispose(); - - psd.addLayer(name, image, new Point(x, y), visible); - - return true; - } catch (Exception e) { - return false; - } - } - - public static void invalidateView(ViewNode viewNode) { - DeviceConnection connection = null; - try { - connection = new DeviceConnection(viewNode.window.getDevice()); - connection.sendCommand("INVALIDATE " + viewNode.window.encode() + " " + viewNode); //$NON-NLS-1$ - } catch (Exception e) { - Log.e(TAG, "Unable to invalidate view " + viewNode + " in window " + viewNode.window - + " on device " + viewNode.window.getDevice()); - } finally { - connection.close(); - } - } - - public static void requestLayout(ViewNode viewNode) { - DeviceConnection connection = null; - try { - connection = new DeviceConnection(viewNode.window.getDevice()); - connection.sendCommand("REQUEST_LAYOUT " + viewNode.window.encode() + " " + viewNode); //$NON-NLS-1$ - } catch (Exception e) { - Log.e(TAG, "Unable to request layout for node " + viewNode + " in window " - + viewNode.window + " on device " + viewNode.window.getDevice()); - } finally { - connection.close(); - } - } - - public static void outputDisplayList(ViewNode viewNode) { - DeviceConnection connection = null; - try { - connection = new DeviceConnection(viewNode.window.getDevice()); - connection.sendCommand("OUTPUT_DISPLAYLIST " + - viewNode.window.encode() + " " + viewNode); //$NON-NLS-1$ - } catch (Exception e) { - Log.e(TAG, "Unable to dump displaylist for node " + viewNode + " in window " - + viewNode.window + " on device " + viewNode.window.getDevice()); - } finally { - connection.close(); - } - } - -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DeviceConnection.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DeviceConnection.java deleted file mode 100644 index f750d5c..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/DeviceConnection.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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.hierarchyviewerlib.device; - -import com.android.ddmlib.IDevice; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.nio.channels.SocketChannel; - -/** - * This class is used for connecting to a device in debug mode running the view - * server. - */ -public class DeviceConnection { - - // Now a socket channel, since socket channels are friendly with interrupts. - private SocketChannel mSocketChannel; - - private BufferedReader mIn; - - private BufferedWriter mOut; - - public DeviceConnection(IDevice device) throws IOException { - mSocketChannel = SocketChannel.open(); - int port = DeviceBridge.getDeviceLocalPort(device); - - if (port == -1) { - throw new IOException(); - } - - mSocketChannel.connect(new InetSocketAddress("127.0.0.1", port)); //$NON-NLS-1$ - mSocketChannel.socket().setSoTimeout(40000); - } - - public BufferedReader getInputStream() throws IOException { - if (mIn == null) { - mIn = new BufferedReader(new InputStreamReader(mSocketChannel.socket().getInputStream())); - } - return mIn; - } - - public BufferedWriter getOutputStream() throws IOException { - if (mOut == null) { - mOut = - new BufferedWriter(new OutputStreamWriter(mSocketChannel.socket() - .getOutputStream())); - } - return mOut; - } - - public Socket getSocket() { - return mSocketChannel.socket(); - } - - public void sendCommand(String command) throws IOException { - BufferedWriter out = getOutputStream(); - out.write(command); - out.newLine(); - out.flush(); - } - - public void close() { - try { - if (mIn != null) { - mIn.close(); - } - } catch (IOException e) { - } - try { - if (mOut != null) { - mOut.close(); - } - } catch (IOException e) { - } - try { - mSocketChannel.close(); - } catch (IOException e) { - } - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/ViewNode.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/ViewNode.java deleted file mode 100644 index 4ab4fc6..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/ViewNode.java +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Copyright (C) 2008 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.hierarchyviewerlib.device; - -import org.eclipse.swt.graphics.Image; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - -public class ViewNode { - - public static enum ProfileRating { - RED, YELLOW, GREEN, NONE - }; - - private static final double RED_THRESHOLD = 0.8; - - private static final double YELLOW_THRESHOLD = 0.5; - - public static final String MISCELLANIOUS = "miscellaneous"; - - public String id; - - public String name; - - public String hashCode; - - public List<Property> properties = new ArrayList<Property>(); - - public Map<String, Property> namedProperties = new HashMap<String, Property>(); - - public ViewNode parent; - - public List<ViewNode> children = new ArrayList<ViewNode>(); - - public int left; - - public int top; - - public int width; - - public int height; - - public int scrollX; - - public int scrollY; - - public int paddingLeft; - - public int paddingRight; - - public int paddingTop; - - public int paddingBottom; - - public int marginLeft; - - public int marginRight; - - public int marginTop; - - public int marginBottom; - - public int baseline; - - public boolean willNotDraw; - - public boolean hasMargins; - - public boolean hasFocus; - - public int index; - - public double measureTime; - - public double layoutTime; - - public double drawTime; - - public ProfileRating measureRating = ProfileRating.NONE; - - public ProfileRating layoutRating = ProfileRating.NONE; - - public ProfileRating drawRating = ProfileRating.NONE; - - public Set<String> categories = new TreeSet<String>(); - - public Window window; - - public Image image; - - public int imageReferences = 1; - - public int viewCount; - - public boolean filtered; - - public int protocolVersion; - - public ViewNode(Window window, ViewNode parent, String data) { - this.window = window; - this.parent = parent; - index = this.parent == null ? 0 : this.parent.children.size(); - if (this.parent != null) { - this.parent.children.add(this); - } - int delimIndex = data.indexOf('@'); - if (delimIndex < 0) { - throw new IllegalArgumentException("Invalid format for ViewNode, missing @: " + data); - } - name = data.substring(0, delimIndex); - data = data.substring(delimIndex + 1); - delimIndex = data.indexOf(' '); - hashCode = data.substring(0, delimIndex); - loadProperties(data.substring(delimIndex + 1).trim()); - - measureTime = -1; - layoutTime = -1; - drawTime = -1; - } - - public void dispose() { - final int N = children.size(); - for (int i = 0; i < N; i++) { - children.get(i).dispose(); - } - dereferenceImage(); - } - - public void referenceImage() { - imageReferences++; - } - - public void dereferenceImage() { - imageReferences--; - if (image != null && imageReferences == 0) { - image.dispose(); - } - } - - private void loadProperties(String data) { - int start = 0; - boolean stop; - do { - int index = data.indexOf('=', start); - ViewNode.Property property = new ViewNode.Property(); - property.name = data.substring(start, index); - - int index2 = data.indexOf(',', index + 1); - int length = Integer.parseInt(data.substring(index + 1, index2)); - start = index2 + 1 + length; - property.value = data.substring(index2 + 1, index2 + 1 + length); - - properties.add(property); - namedProperties.put(property.name, property); - - stop = start >= data.length(); - if (!stop) { - start += 1; - } - } while (!stop); - - Collections.sort(properties, new Comparator<ViewNode.Property>() { - @Override - public int compare(ViewNode.Property source, ViewNode.Property destination) { - return source.name.compareTo(destination.name); - } - }); - - id = namedProperties.get("mID").value; //$NON-NLS-1$ - - left = - namedProperties.containsKey("mLeft") ? getInt("mLeft", 0) : getInt("layout:mLeft", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - 0); - top = namedProperties.containsKey("mTop") ? getInt("mTop", 0) : getInt("layout:mTop", 0); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - width = - namedProperties.containsKey("getWidth()") ? getInt("getWidth()", 0) : getInt( //$NON-NLS-1$ //$NON-NLS-2$ - "layout:getWidth()", 0); //$NON-NLS-1$ - height = - namedProperties.containsKey("getHeight()") ? getInt("getHeight()", 0) : getInt( //$NON-NLS-1$ //$NON-NLS-2$ - "layout:getHeight()", 0); //$NON-NLS-1$ - scrollX = - namedProperties.containsKey("mScrollX") ? getInt("mScrollX", 0) : getInt( //$NON-NLS-1$ //$NON-NLS-2$ - "scrolling:mScrollX", 0); //$NON-NLS-1$ - scrollY = - namedProperties.containsKey("mScrollY") ? getInt("mScrollY", 0) : getInt( //$NON-NLS-1$ //$NON-NLS-2$ - "scrolling:mScrollY", 0); //$NON-NLS-1$ - paddingLeft = - namedProperties.containsKey("mPaddingLeft") ? getInt("mPaddingLeft", 0) : getInt( //$NON-NLS-1$ //$NON-NLS-2$ - "padding:mPaddingLeft", 0); //$NON-NLS-1$ - paddingRight = - namedProperties.containsKey("mPaddingRight") ? getInt("mPaddingRight", 0) : getInt( //$NON-NLS-1$ //$NON-NLS-2$ - "padding:mPaddingRight", 0); //$NON-NLS-1$ - paddingTop = - namedProperties.containsKey("mPaddingTop") ? getInt("mPaddingTop", 0) : getInt( //$NON-NLS-1$ //$NON-NLS-2$ - "padding:mPaddingTop", 0); //$NON-NLS-1$ - paddingBottom = - namedProperties.containsKey("mPaddingBottom") ? getInt("mPaddingBottom", 0) //$NON-NLS-1$ //$NON-NLS-2$ - : getInt("padding:mPaddingBottom", 0); //$NON-NLS-1$ - marginLeft = - namedProperties.containsKey("layout_leftMargin") ? getInt("layout_leftMargin", //$NON-NLS-1$ //$NON-NLS-2$ - Integer.MIN_VALUE) : getInt("layout:layout_leftMargin", Integer.MIN_VALUE); //$NON-NLS-1$ - marginRight = - namedProperties.containsKey("layout_rightMargin") ? getInt("layout_rightMargin", //$NON-NLS-1$ //$NON-NLS-2$ - Integer.MIN_VALUE) : getInt("layout:layout_rightMargin", Integer.MIN_VALUE); //$NON-NLS-1$ - marginTop = - namedProperties.containsKey("layout_topMargin") ? getInt("layout_topMargin", //$NON-NLS-1$ //$NON-NLS-2$ - Integer.MIN_VALUE) : getInt("layout:layout_topMargin", Integer.MIN_VALUE); //$NON-NLS-1$ - marginBottom = - namedProperties.containsKey("layout_bottomMargin") ? getInt("layout_bottomMargin", //$NON-NLS-1$ //$NON-NLS-2$ - Integer.MIN_VALUE) - : getInt("layout:layout_bottomMargin", Integer.MIN_VALUE); //$NON-NLS-1$ - baseline = - namedProperties.containsKey("getBaseline()") ? getInt("getBaseline()", 0) : getInt( //$NON-NLS-1$ //$NON-NLS-2$ - "layout:getBaseline()", 0); //$NON-NLS-1$ - willNotDraw = - namedProperties.containsKey("willNotDraw()") ? getBoolean("willNotDraw()", false) //$NON-NLS-1$ //$NON-NLS-2$ - : getBoolean("drawing:willNotDraw()", false); //$NON-NLS-1$ - hasFocus = - namedProperties.containsKey("hasFocus()") ? getBoolean("hasFocus()", false) //$NON-NLS-1$ //$NON-NLS-2$ - : getBoolean("focus:hasFocus()", false); //$NON-NLS-1$ - - hasMargins = - marginLeft != Integer.MIN_VALUE && marginRight != Integer.MIN_VALUE - && marginTop != Integer.MIN_VALUE && marginBottom != Integer.MIN_VALUE; - - for (String name : namedProperties.keySet()) { - int index = name.indexOf(':'); - if (index != -1) { - categories.add(name.substring(0, index)); - } - } - if (categories.size() != 0) { - categories.add(MISCELLANIOUS); - } - } - - public void setProfileRatings() { - final int N = children.size(); - if (N > 1) { - double totalMeasure = 0; - double totalLayout = 0; - double totalDraw = 0; - for (int i = 0; i < N; i++) { - ViewNode child = children.get(i); - totalMeasure += child.measureTime; - totalLayout += child.layoutTime; - totalDraw += child.drawTime; - } - for (int i = 0; i < N; i++) { - ViewNode child = children.get(i); - if (child.measureTime / totalMeasure >= RED_THRESHOLD) { - child.measureRating = ProfileRating.RED; - } else if (child.measureTime / totalMeasure >= YELLOW_THRESHOLD) { - child.measureRating = ProfileRating.YELLOW; - } else { - child.measureRating = ProfileRating.GREEN; - } - if (child.layoutTime / totalLayout >= RED_THRESHOLD) { - child.layoutRating = ProfileRating.RED; - } else if (child.layoutTime / totalLayout >= YELLOW_THRESHOLD) { - child.layoutRating = ProfileRating.YELLOW; - } else { - child.layoutRating = ProfileRating.GREEN; - } - if (child.drawTime / totalDraw >= RED_THRESHOLD) { - child.drawRating = ProfileRating.RED; - } else if (child.drawTime / totalDraw >= YELLOW_THRESHOLD) { - child.drawRating = ProfileRating.YELLOW; - } else { - child.drawRating = ProfileRating.GREEN; - } - } - } - for (int i = 0; i < N; i++) { - children.get(i).setProfileRatings(); - } - } - - public void setViewCount() { - viewCount = 1; - final int N = children.size(); - for (int i = 0; i < N; i++) { - ViewNode child = children.get(i); - child.setViewCount(); - viewCount += child.viewCount; - } - } - - public void filter(String text) { - int dotIndex = name.lastIndexOf('.'); - String shortName = (dotIndex == -1) ? name : name.substring(dotIndex + 1); - filtered = - !text.equals("") //$NON-NLS-1$ - && (shortName.toLowerCase().contains(text.toLowerCase()) || (!id - .equals("NO_ID") && id.toLowerCase().contains(text.toLowerCase()))); //$NON-NLS-1$ - final int N = children.size(); - for (int i = 0; i < N; i++) { - children.get(i).filter(text); - } - } - - private boolean getBoolean(String name, boolean defaultValue) { - Property p = namedProperties.get(name); - if (p != null) { - try { - return Boolean.parseBoolean(p.value); - } catch (NumberFormatException e) { - return defaultValue; - } - } - return defaultValue; - } - - private int getInt(String name, int defaultValue) { - Property p = namedProperties.get(name); - if (p != null) { - try { - return Integer.parseInt(p.value); - } catch (NumberFormatException e) { - return defaultValue; - } - } - return defaultValue; - } - - @Override - public String toString() { - return name + "@" + hashCode; //$NON-NLS-1$ - } - - public static class Property { - public String name; - - public String value; - - @Override - public String toString() { - return name + '=' + value; - } - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/Window.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/Window.java deleted file mode 100644 index af79081..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/Window.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2008 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.hierarchyviewerlib.device; - -import com.android.ddmlib.IDevice; - -/** - * Used for storing a window from the window manager service on the device. - * These are the windows that the device selector shows. - */ -public class Window { - - private String mTitle; - - private int mHashCode; - - private IDevice mDevice; - - public Window(IDevice device, String title, int hashCode) { - this.mDevice = device; - this.mTitle = title; - this.mHashCode = hashCode; - } - - public String getTitle() { - return mTitle; - } - - public int getHashCode() { - return mHashCode; - } - - public String encode() { - return Integer.toHexString(mHashCode); - } - - @Override - public String toString() { - return mTitle; - } - - public IDevice getDevice() { - return mDevice; - } - - public static Window getFocusedWindow(IDevice device) { - return new Window(device, "<Focused Window>", -1); - } - - /* - * After each refresh of the windows in the device selector, the windows are - * different instances and automatically reselecting the same window doesn't - * work in the device selector unless the equals method is defined here. - */ - @Override - public boolean equals(Object other) { - if (other instanceof Window) { - return mHashCode == ((Window) other).mHashCode - && mDevice.getSerialNumber().equals(((Window) other).mDevice.getSerialNumber()); - } - return false; - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/WindowUpdater.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/WindowUpdater.java deleted file mode 100644 index 9dbb989..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/device/WindowUpdater.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * 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.hierarchyviewerlib.device; - -import com.android.ddmlib.IDevice; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; - -/** - * This class handles automatic updating of the list of windows in the device - * selector for device with protocol version 3 or above of the view server. It - * connects to the devices, keeps the connection open and listens for messages. - * It notifies all it's listeners of changes. - */ -public class WindowUpdater { - private static HashMap<IDevice, ArrayList<IWindowChangeListener>> sWindowChangeListeners = - new HashMap<IDevice, ArrayList<IWindowChangeListener>>(); - - private static HashMap<IDevice, Thread> sListeningThreads = new HashMap<IDevice, Thread>(); - - public static interface IWindowChangeListener { - public void windowsChanged(IDevice device); - - public void focusChanged(IDevice device); - } - - public static void terminate() { - synchronized (sListeningThreads) { - for (IDevice device : sListeningThreads.keySet()) { - sListeningThreads.get(device).interrupt(); - - } - } - } - - public static void startListenForWindowChanges(IWindowChangeListener listener, IDevice device) { - synchronized (sWindowChangeListeners) { - // In this case, a listening thread already exists, so we don't need - // to create another one. - if (sWindowChangeListeners.containsKey(device)) { - sWindowChangeListeners.get(device).add(listener); - return; - } - ArrayList<IWindowChangeListener> listeners = new ArrayList<IWindowChangeListener>(); - listeners.add(listener); - sWindowChangeListeners.put(device, listeners); - } - // Start listening - Thread listeningThread = new Thread(new WindowChangeMonitor(device)); - synchronized (sListeningThreads) { - sListeningThreads.put(device, listeningThread); - } - listeningThread.start(); - } - - public static void stopListenForWindowChanges(IWindowChangeListener listener, IDevice device) { - synchronized (sWindowChangeListeners) { - ArrayList<IWindowChangeListener> listeners = sWindowChangeListeners.get(device); - listeners.remove(listener); - // There are more listeners, so don't stop the listening thread. - if (listeners.size() != 0) { - return; - } - sWindowChangeListeners.remove(device); - } - // Everybody left, so the party's over! - Thread listeningThread; - synchronized (sListeningThreads) { - listeningThread = sListeningThreads.get(device); - sListeningThreads.remove(device); - } - listeningThread.interrupt(); - } - - private static IWindowChangeListener[] getWindowChangeListenersAsArray(IDevice device) { - IWindowChangeListener[] listeners; - synchronized (sWindowChangeListeners) { - ArrayList<IWindowChangeListener> windowChangeListenerList = - sWindowChangeListeners.get(device); - if (windowChangeListenerList == null) { - return null; - } - listeners = - windowChangeListenerList - .toArray(new IWindowChangeListener[windowChangeListenerList.size()]); - } - return listeners; - } - - public static void notifyWindowsChanged(IDevice device) { - IWindowChangeListener[] listeners = getWindowChangeListenersAsArray(device); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].windowsChanged(device); - } - } - } - - public static void notifyFocusChanged(IDevice device) { - IWindowChangeListener[] listeners = getWindowChangeListenersAsArray(device); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].focusChanged(device); - } - } - } - - private static class WindowChangeMonitor implements Runnable { - private IDevice device; - - public WindowChangeMonitor(IDevice device) { - this.device = device; - } - - @Override - public void run() { - while (!Thread.currentThread().isInterrupted()) { - DeviceConnection connection = null; - try { - connection = new DeviceConnection(device); - connection.sendCommand("AUTOLIST"); - String line; - while (!Thread.currentThread().isInterrupted() - && (line = connection.getInputStream().readLine()) != null) { - if (line.equalsIgnoreCase("LIST UPDATE")) { - notifyWindowsChanged(device); - } else if (line.equalsIgnoreCase("FOCUS UPDATE")) { - notifyFocusChanged(device); - } - } - - } catch (IOException e) { - } finally { - if (connection != null) { - connection.close(); - } - } - } - } - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/models/DeviceSelectionModel.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/models/DeviceSelectionModel.java deleted file mode 100644 index b00a1dc..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/models/DeviceSelectionModel.java +++ /dev/null @@ -1,285 +0,0 @@ -/* - * 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.hierarchyviewerlib.models; - -import com.android.ddmlib.IDevice; -import com.android.hierarchyviewerlib.device.DeviceBridge.ViewServerInfo; -import com.android.hierarchyviewerlib.device.Window; - -import java.util.ArrayList; -import java.util.HashMap; - -/** - * This class stores the list of windows for each connected device. It notifies - * listeners of any changes as well as knows which window is currently selected - * in the device selector. - */ -public class DeviceSelectionModel { - - private final HashMap<IDevice, DeviceInfo> mDeviceMap = new HashMap<IDevice, DeviceInfo>(); - - private final HashMap<IDevice, Integer> mFocusedWindowHashes = new HashMap<IDevice, Integer>(); - - private final ArrayList<IDevice> mDeviceList = new ArrayList<IDevice>(); - - private final ArrayList<IWindowChangeListener> mWindowChangeListeners = - new ArrayList<IWindowChangeListener>(); - - private IDevice mSelectedDevice; - - private Window mSelectedWindow; - - private static DeviceSelectionModel sModel; - - private static class DeviceInfo { - Window[] windows; - ViewServerInfo viewServerInfo; - - private DeviceInfo(Window[] windows, ViewServerInfo viewServerInfo) { - this.windows = windows; - this.viewServerInfo = viewServerInfo; - } - } - public static DeviceSelectionModel getModel() { - if (sModel == null) { - sModel = new DeviceSelectionModel(); - } - return sModel; - } - - public boolean containsDevice(IDevice device) { - synchronized (mDeviceMap) { - return mDeviceMap.containsKey(device); - } - } - - public void addDevice(IDevice device, Window[] windows, ViewServerInfo info) { - synchronized (mDeviceMap) { - mDeviceMap.put(device, new DeviceInfo(windows, info)); - mDeviceList.add(device); - } - notifyDeviceConnected(device); - } - - public void removeDevice(IDevice device) { - boolean selectionChanged = false; - synchronized (mDeviceMap) { - mDeviceList.remove(device); - if (!mDeviceList.contains(device)) { - mDeviceMap.remove(device); - mFocusedWindowHashes.remove(device); - if (mSelectedDevice == device) { - mSelectedDevice = null; - mSelectedWindow = null; - selectionChanged = true; - } - } - } - notifyDeviceDisconnected(device); - if (selectionChanged) { - notifySelectionChanged(mSelectedDevice, mSelectedWindow); - } - } - - public void updateDevice(IDevice device, Window[] windows) { - boolean selectionChanged = false; - synchronized (mDeviceMap) { - DeviceInfo oldDeviceInfo = mDeviceMap.get(device); - ViewServerInfo oldViewServerInfo = null; - if (oldDeviceInfo != null) { - oldViewServerInfo = oldDeviceInfo.viewServerInfo; - } - mDeviceMap.put(device, new DeviceInfo(windows, oldViewServerInfo)); - // If the selected window no longer exists, we clear the selection. - if (mSelectedDevice == device && mSelectedWindow != null) { - boolean windowStillExists = false; - for (int i = 0; i < windows.length && !windowStillExists; i++) { - if (windows[i].equals(mSelectedWindow)) { - windowStillExists = true; - } - } - if (!windowStillExists) { - mSelectedDevice = null; - mSelectedWindow = null; - selectionChanged = true; - } - } - } - notifyDeviceChanged(device); - if (selectionChanged) { - notifySelectionChanged(mSelectedDevice, mSelectedWindow); - } - } - - /* - * Change which window has focus and notify the listeners. - */ - public void updateFocusedWindow(IDevice device, int focusedWindow) { - Integer oldValue = null; - synchronized (mDeviceMap) { - oldValue = mFocusedWindowHashes.put(device, new Integer(focusedWindow)); - } - // Only notify if the values are different. It would be cool if Java - // containers accepted basic types like int. - if (oldValue == null || (oldValue != null && oldValue.intValue() != focusedWindow)) { - notifyFocusChanged(device); - } - } - - public static interface IWindowChangeListener { - public void deviceConnected(IDevice device); - - public void deviceChanged(IDevice device); - - public void deviceDisconnected(IDevice device); - - public void focusChanged(IDevice device); - - public void selectionChanged(IDevice device, Window window); - } - - private IWindowChangeListener[] getWindowChangeListenerList() { - IWindowChangeListener[] listeners = null; - synchronized (mWindowChangeListeners) { - if (mWindowChangeListeners.size() == 0) { - return null; - } - listeners = - mWindowChangeListeners.toArray(new IWindowChangeListener[mWindowChangeListeners - .size()]); - } - return listeners; - } - - private void notifyDeviceConnected(IDevice device) { - IWindowChangeListener[] listeners = getWindowChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].deviceConnected(device); - } - } - } - - private void notifyDeviceChanged(IDevice device) { - IWindowChangeListener[] listeners = getWindowChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].deviceChanged(device); - } - } - } - - private void notifyDeviceDisconnected(IDevice device) { - IWindowChangeListener[] listeners = getWindowChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].deviceDisconnected(device); - } - } - } - - private void notifyFocusChanged(IDevice device) { - IWindowChangeListener[] listeners = getWindowChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].focusChanged(device); - } - } - } - - private void notifySelectionChanged(IDevice device, Window window) { - IWindowChangeListener[] listeners = getWindowChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].selectionChanged(device, window); - } - } - } - - public void addWindowChangeListener(IWindowChangeListener listener) { - synchronized (mWindowChangeListeners) { - mWindowChangeListeners.add(listener); - } - } - - public void removeWindowChangeListener(IWindowChangeListener listener) { - synchronized (mWindowChangeListeners) { - mWindowChangeListeners.remove(listener); - } - } - - public IDevice[] getDevices() { - synchronized (mDeviceMap) { - return mDeviceList.toArray(new IDevice[mDeviceList.size()]); - } - } - - public Window[] getWindows(IDevice device) { - Window[] windows = null; - synchronized (mDeviceMap) { - DeviceInfo info = mDeviceMap.get(device); - if (info != null) { - windows = mDeviceMap.get(device).windows; - } - } - return windows; - } - - // Returns the window that currently has focus or -1. Note that this means - // that a window with hashcode -1 gets highlighted. If you remember, this is - // the infamous <Focused Window> - public int getFocusedWindow(IDevice device) { - synchronized (mDeviceMap) { - Integer focusedWindow = mFocusedWindowHashes.get(device); - if (focusedWindow == null) { - return -1; - } - return focusedWindow.intValue(); - } - } - - public void setSelection(IDevice device, Window window) { - synchronized (mDeviceMap) { - mSelectedDevice = device; - mSelectedWindow = window; - } - notifySelectionChanged(device, window); - } - - public IDevice getSelectedDevice() { - synchronized (mDeviceMap) { - return mSelectedDevice; - } - } - - public Window getSelectedWindow() { - synchronized (mDeviceMap) { - return mSelectedWindow; - } - } - - public ViewServerInfo getSelectedDeviceInfo() { - synchronized (mDeviceMap) { - ViewServerInfo viewServerInfo = null; - if (mSelectedDevice != null) { - return mDeviceMap.get(mSelectedDevice).viewServerInfo; - } - return null; - } - } - -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/models/PixelPerfectModel.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/models/PixelPerfectModel.java deleted file mode 100644 index 81331ed..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/models/PixelPerfectModel.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * 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.hierarchyviewerlib.models; - -import com.android.ddmlib.IDevice; -import com.android.hierarchyviewerlib.device.ViewNode; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Display; - -import java.util.ArrayList; - -public class PixelPerfectModel { - - public static final int MIN_ZOOM = 2; - - public static final int MAX_ZOOM = 24; - - public static final int DEFAULT_ZOOM = 8; - - public static final int DEFAULT_OVERLAY_TRANSPARENCY_PERCENTAGE = 50; - - private IDevice mDevice; - - private Image mImage; - - private Point mCrosshairLocation; - - private ViewNode mViewNode; - - private ViewNode mSelectedNode; - - private int mZoom; - - private final ArrayList<IImageChangeListener> mImageChangeListeners = - new ArrayList<IImageChangeListener>(); - - private Image mOverlayImage; - - private double mOverlayTransparency = DEFAULT_OVERLAY_TRANSPARENCY_PERCENTAGE / 100.0; - - private static PixelPerfectModel sModel; - - public static PixelPerfectModel getModel() { - if (sModel == null) { - sModel = new PixelPerfectModel(); - } - return sModel; - } - - public void setData(final IDevice device, final Image image, final ViewNode viewNode) { - final Image toDispose = this.mImage; - final Image toDispose2 = this.mOverlayImage; - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (PixelPerfectModel.this) { - PixelPerfectModel.this.mDevice = device; - PixelPerfectModel.this.mImage = image; - PixelPerfectModel.this.mViewNode = viewNode; - if (image != null) { - PixelPerfectModel.this.mCrosshairLocation = - new Point(image.getBounds().width / 2, image.getBounds().height / 2); - } else { - PixelPerfectModel.this.mCrosshairLocation = null; - } - mOverlayImage = null; - PixelPerfectModel.this.mSelectedNode = null; - mZoom = DEFAULT_ZOOM; - } - } - }); - notifyImageLoaded(); - if (toDispose != null) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - toDispose.dispose(); - } - }); - } - if (toDispose2 != null) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - toDispose2.dispose(); - } - }); - } - - } - - public void setCrosshairLocation(int x, int y) { - synchronized (this) { - mCrosshairLocation = new Point(x, y); - } - notifyCrosshairMoved(); - } - - public void setSelected(ViewNode selected) { - synchronized (this) { - this.mSelectedNode = selected; - } - notifySelectionChanged(); - } - - public void setTree(final ViewNode viewNode) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (PixelPerfectModel.this) { - PixelPerfectModel.this.mViewNode = viewNode; - PixelPerfectModel.this.mSelectedNode = null; - } - } - }); - notifyTreeChanged(); - } - - public void setImage(final Image image) { - final Image toDispose = this.mImage; - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (PixelPerfectModel.this) { - PixelPerfectModel.this.mImage = image; - } - } - }); - notifyImageChanged(); - if (toDispose != null) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - toDispose.dispose(); - } - }); - } - } - - public void setZoom(int newZoom) { - synchronized (this) { - if (newZoom < MIN_ZOOM) { - newZoom = MIN_ZOOM; - } - if (newZoom > MAX_ZOOM) { - newZoom = MAX_ZOOM; - } - mZoom = newZoom; - } - notifyZoomChanged(); - } - - public void setOverlayImage(final Image overlayImage) { - final Image toDispose = this.mOverlayImage; - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (PixelPerfectModel.this) { - PixelPerfectModel.this.mOverlayImage = overlayImage; - } - } - }); - notifyOverlayChanged(); - if (toDispose != null) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - toDispose.dispose(); - } - }); - } - } - - public void setOverlayTransparency(double value) { - synchronized (this) { - value = Math.max(value, 0); - value = Math.min(value, 1); - mOverlayTransparency = value; - } - notifyOverlayTransparencyChanged(); - } - - public ViewNode getViewNode() { - synchronized (this) { - return mViewNode; - } - } - - public Point getCrosshairLocation() { - synchronized (this) { - return mCrosshairLocation; - } - } - - public Image getImage() { - synchronized (this) { - return mImage; - } - } - - public ViewNode getSelected() { - synchronized (this) { - return mSelectedNode; - } - } - - public IDevice getDevice() { - synchronized (this) { - return mDevice; - } - } - - public int getZoom() { - synchronized (this) { - return mZoom; - } - } - - public Image getOverlayImage() { - synchronized (this) { - return mOverlayImage; - } - } - - public double getOverlayTransparency() { - synchronized (this) { - return mOverlayTransparency; - } - } - - public static interface IImageChangeListener { - public void imageLoaded(); - - public void imageChanged(); - - public void crosshairMoved(); - - public void selectionChanged(); - - public void treeChanged(); - - public void zoomChanged(); - - public void overlayChanged(); - - public void overlayTransparencyChanged(); - } - - private IImageChangeListener[] getImageChangeListenerList() { - IImageChangeListener[] listeners = null; - synchronized (mImageChangeListeners) { - if (mImageChangeListeners.size() == 0) { - return null; - } - listeners = - mImageChangeListeners.toArray(new IImageChangeListener[mImageChangeListeners - .size()]); - } - return listeners; - } - - public void notifyImageLoaded() { - IImageChangeListener[] listeners = getImageChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].imageLoaded(); - } - } - } - - public void notifyImageChanged() { - IImageChangeListener[] listeners = getImageChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].imageChanged(); - } - } - } - - public void notifyCrosshairMoved() { - IImageChangeListener[] listeners = getImageChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].crosshairMoved(); - } - } - } - - public void notifySelectionChanged() { - IImageChangeListener[] listeners = getImageChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].selectionChanged(); - } - } - } - - public void notifyTreeChanged() { - IImageChangeListener[] listeners = getImageChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].treeChanged(); - } - } - } - - public void notifyZoomChanged() { - IImageChangeListener[] listeners = getImageChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].zoomChanged(); - } - } - } - - public void notifyOverlayChanged() { - IImageChangeListener[] listeners = getImageChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].overlayChanged(); - } - } - } - - public void notifyOverlayTransparencyChanged() { - IImageChangeListener[] listeners = getImageChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].overlayTransparencyChanged(); - } - } - } - - public void addImageChangeListener(IImageChangeListener listener) { - synchronized (mImageChangeListeners) { - mImageChangeListeners.add(listener); - } - } - - public void removeImageChangeListener(IImageChangeListener listener) { - synchronized (mImageChangeListeners) { - mImageChangeListeners.remove(listener); - } - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/models/TreeViewModel.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/models/TreeViewModel.java deleted file mode 100644 index 279b5fd..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/models/TreeViewModel.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * 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.hierarchyviewerlib.models; - -import com.android.hierarchyviewerlib.device.ViewNode; -import com.android.hierarchyviewerlib.device.Window; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode.Point; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode.Rectangle; - -import java.util.ArrayList; - -public class TreeViewModel { - public static final double MAX_ZOOM = 2; - - public static final double MIN_ZOOM = 0.2; - - private Window mWindow; - - private DrawableViewNode mTree; - - private DrawableViewNode mSelectedNode; - - private Rectangle mViewport; - - private double mZoom; - - private final ArrayList<ITreeChangeListener> mTreeChangeListeners = - new ArrayList<ITreeChangeListener>(); - - private static TreeViewModel sModel; - - public static TreeViewModel getModel() { - if (sModel == null) { - sModel = new TreeViewModel(); - } - return sModel; - } - - public void setData(Window window, ViewNode viewNode) { - synchronized (this) { - if (mTree != null) { - mTree.viewNode.dispose(); - } - this.mWindow = window; - if (viewNode == null) { - mTree = null; - } else { - mTree = new DrawableViewNode(viewNode); - mTree.setLeft(); - mTree.placeRoot(); - } - mViewport = null; - mZoom = 1; - mSelectedNode = null; - } - notifyTreeChanged(); - } - - public void setSelection(DrawableViewNode selectedNode) { - synchronized (this) { - this.mSelectedNode = selectedNode; - } - notifySelectionChanged(); - } - - public void setViewport(Rectangle viewport) { - synchronized (this) { - this.mViewport = viewport; - } - notifyViewportChanged(); - } - - public void setZoom(double newZoom) { - Point zoomPoint = null; - synchronized (this) { - if (mTree != null && mViewport != null) { - zoomPoint = - new Point(mViewport.x + mViewport.width / 2, mViewport.y + mViewport.height / 2); - } - } - zoomOnPoint(newZoom, zoomPoint); - } - - public void zoomOnPoint(double newZoom, Point zoomPoint) { - synchronized (this) { - if (mTree != null && this.mViewport != null) { - if (newZoom < MIN_ZOOM) { - newZoom = MIN_ZOOM; - } - if (newZoom > MAX_ZOOM) { - newZoom = MAX_ZOOM; - } - mViewport.x = zoomPoint.x - (zoomPoint.x - mViewport.x) * mZoom / newZoom; - mViewport.y = zoomPoint.y - (zoomPoint.y - mViewport.y) * mZoom / newZoom; - mViewport.width = mViewport.width * mZoom / newZoom; - mViewport.height = mViewport.height * mZoom / newZoom; - mZoom = newZoom; - } - } - notifyZoomChanged(); - } - - public DrawableViewNode getTree() { - synchronized (this) { - return mTree; - } - } - - public Window getWindow() { - synchronized (this) { - return mWindow; - } - } - - public Rectangle getViewport() { - synchronized (this) { - return mViewport; - } - } - - public double getZoom() { - synchronized (this) { - return mZoom; - } - } - - public DrawableViewNode getSelection() { - synchronized (this) { - return mSelectedNode; - } - } - - public static interface ITreeChangeListener { - public void treeChanged(); - - public void selectionChanged(); - - public void viewportChanged(); - - public void zoomChanged(); - } - - private ITreeChangeListener[] getTreeChangeListenerList() { - ITreeChangeListener[] listeners = null; - synchronized (mTreeChangeListeners) { - if (mTreeChangeListeners.size() == 0) { - return null; - } - listeners = - mTreeChangeListeners.toArray(new ITreeChangeListener[mTreeChangeListeners.size()]); - } - return listeners; - } - - public void notifyTreeChanged() { - ITreeChangeListener[] listeners = getTreeChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].treeChanged(); - } - } - } - - public void notifySelectionChanged() { - ITreeChangeListener[] listeners = getTreeChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].selectionChanged(); - } - } - } - - public void notifyViewportChanged() { - ITreeChangeListener[] listeners = getTreeChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].viewportChanged(); - } - } - } - - public void notifyZoomChanged() { - ITreeChangeListener[] listeners = getTreeChangeListenerList(); - if (listeners != null) { - for (int i = 0; i < listeners.length; i++) { - listeners[i].zoomChanged(); - } - } - } - - public void addTreeChangeListener(ITreeChangeListener listener) { - synchronized (mTreeChangeListeners) { - mTreeChangeListeners.add(listener); - } - } - - public void removeTreeChangeListener(ITreeChangeListener listener) { - synchronized (mTreeChangeListeners) { - mTreeChangeListeners.remove(listener); - } - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/CaptureDisplay.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/CaptureDisplay.java deleted file mode 100644 index fb277e8..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/CaptureDisplay.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2008 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.hierarchyviewerlib.ui; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; -import com.android.hierarchyviewerlib.device.ViewNode; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.events.ShellAdapter; -import org.eclipse.swt.events.ShellEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.layout.RowLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -public class CaptureDisplay { - private static Shell sShell; - - private static Canvas sCanvas; - - private static Image sImage; - - private static ViewNode sViewNode; - - private static Composite sButtonBar; - - private static Button sOnWhite; - - private static Button sOnBlack; - - private static Button sShowExtras; - - public static void show(Shell parentShell, ViewNode viewNode, Image image) { - if (sShell == null) { - createShell(); - } - if (sShell.isVisible() && CaptureDisplay.sViewNode != null) { - CaptureDisplay.sViewNode.dereferenceImage(); - } - CaptureDisplay.sImage = image; - CaptureDisplay.sViewNode = viewNode; - viewNode.referenceImage(); - sShell.setText(viewNode.name); - - boolean shellVisible = sShell.isVisible(); - if (!shellVisible) { - sShell.setSize(0, 0); - } - Rectangle bounds = - sShell.computeTrim(0, 0, Math.max(sButtonBar.getBounds().width, - image.getBounds().width), sButtonBar.getBounds().height - + image.getBounds().height + 5); - sShell.setSize(bounds.width, bounds.height); - if (!shellVisible) { - sShell.setLocation(parentShell.getBounds().x - + (parentShell.getBounds().width - bounds.width) / 2, parentShell.getBounds().y - + (parentShell.getBounds().height - bounds.height) / 2); - } - sShell.open(); - if (shellVisible) { - sCanvas.redraw(); - } - } - - private static void createShell() { - sShell = new Shell(Display.getDefault(), SWT.CLOSE | SWT.TITLE); - GridLayout gridLayout = new GridLayout(); - gridLayout.marginWidth = 0; - gridLayout.marginHeight = 0; - sShell.setLayout(gridLayout); - - sButtonBar = new Composite(sShell, SWT.NONE); - RowLayout rowLayout = new RowLayout(SWT.HORIZONTAL); - rowLayout.pack = true; - rowLayout.center = true; - sButtonBar.setLayout(rowLayout); - Composite buttons = new Composite(sButtonBar, SWT.NONE); - buttons.setLayout(new FillLayout()); - - sOnWhite = new Button(buttons, SWT.TOGGLE); - sOnWhite.setText("On White"); - sOnBlack = new Button(buttons, SWT.TOGGLE); - sOnBlack.setText("On Black"); - sOnBlack.setSelection(true); - sOnWhite.addSelectionListener(sWhiteSelectionListener); - sOnBlack.addSelectionListener(sBlackSelectionListener); - - sShowExtras = new Button(sButtonBar, SWT.CHECK); - sShowExtras.setText("Show Extras"); - sShowExtras.addSelectionListener(sExtrasSelectionListener); - - sCanvas = new Canvas(sShell, SWT.NONE); - sCanvas.setLayoutData(new GridData(GridData.FILL_BOTH)); - sCanvas.addPaintListener(sPaintListener); - - sShell.addShellListener(sShellListener); - - ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); - Image image = imageLoader.loadImage("display.png", Display.getDefault()); //$NON-NLS-1$ - sShell.setImage(image); - } - - private static PaintListener sPaintListener = new PaintListener() { - - @Override - public void paintControl(PaintEvent e) { - if (sOnWhite.getSelection()) { - e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); - } else { - e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); - } - e.gc.fillRectangle(0, 0, sCanvas.getBounds().width, sCanvas.getBounds().height); - if (sImage != null) { - int width = sImage.getBounds().width; - int height = sImage.getBounds().height; - int x = (sCanvas.getBounds().width - width) / 2; - int y = (sCanvas.getBounds().height - height) / 2; - e.gc.drawImage(sImage, x, y); - if (sShowExtras.getSelection()) { - if ((sViewNode.paddingLeft | sViewNode.paddingRight | sViewNode.paddingTop | sViewNode.paddingBottom) != 0) { - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE)); - e.gc.drawRectangle(x + sViewNode.paddingLeft, y + sViewNode.paddingTop, width - - sViewNode.paddingLeft - sViewNode.paddingRight - 1, height - - sViewNode.paddingTop - sViewNode.paddingBottom - 1); - } - if (sViewNode.hasMargins) { - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_GREEN)); - e.gc.drawRectangle(x - sViewNode.marginLeft, y - sViewNode.marginTop, width - + sViewNode.marginLeft + sViewNode.marginRight - 1, height - + sViewNode.marginTop + sViewNode.marginBottom - 1); - } - if (sViewNode.baseline != -1) { - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED)); - e.gc.drawLine(x, y + sViewNode.baseline, x + width - 1, sViewNode.baseline); - } - } - } - } - }; - - private static ShellAdapter sShellListener = new ShellAdapter() { - @Override - public void shellClosed(ShellEvent e) { - e.doit = false; - sShell.setVisible(false); - if (sViewNode != null) { - sViewNode.dereferenceImage(); - } - } - - }; - - private static SelectionListener sWhiteSelectionListener = new SelectionListener() { - @Override - public void widgetDefaultSelected(SelectionEvent e) { - // pass - } - - @Override - public void widgetSelected(SelectionEvent e) { - sOnWhite.setSelection(true); - sOnBlack.setSelection(false); - sCanvas.redraw(); - } - }; - - private static SelectionListener sBlackSelectionListener = new SelectionListener() { - @Override - public void widgetDefaultSelected(SelectionEvent e) { - // pass - } - - @Override - public void widgetSelected(SelectionEvent e) { - sOnBlack.setSelection(true); - sOnWhite.setSelection(false); - sCanvas.redraw(); - } - }; - - private static SelectionListener sExtrasSelectionListener = new SelectionListener() { - @Override - public void widgetDefaultSelected(SelectionEvent e) { - // pass - } - - @Override - public void widgetSelected(SelectionEvent e) { - sCanvas.redraw(); - } - }; -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/DeviceSelector.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/DeviceSelector.java deleted file mode 100644 index 84841ef..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/DeviceSelector.java +++ /dev/null @@ -1,340 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.ddmlib.IDevice; -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; -import com.android.hierarchyviewerlib.device.Window; -import com.android.hierarchyviewerlib.models.DeviceSelectionModel; -import com.android.hierarchyviewerlib.models.DeviceSelectionModel.IWindowChangeListener; - -import org.eclipse.jface.viewers.IFontProvider; -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jface.viewers.ILabelProviderListener; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.TreeSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ControlAdapter; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.ControlListener; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -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.swt.widgets.Tree; -import org.eclipse.swt.widgets.TreeItem; - -public class DeviceSelector extends Composite implements IWindowChangeListener, SelectionListener { - private TreeViewer mTreeViewer; - - private Tree mTree; - - private DeviceSelectionModel mModel; - - private Font mBoldFont; - - private Image mDeviceImage; - - private Image mEmulatorImage; - - private final static int ICON_WIDTH = 16; - - private boolean mDoTreeViewStuff; - - private boolean mDoPixelPerfectStuff; - - private class ContentProvider implements ITreeContentProvider, ILabelProvider, IFontProvider { - @Override - public Object[] getChildren(Object parentElement) { - if (parentElement instanceof IDevice && mDoTreeViewStuff) { - Window[] list = mModel.getWindows((IDevice) parentElement); - if (list != null) { - return list; - } - } - return new Object[0]; - } - - @Override - public Object getParent(Object element) { - if (element instanceof Window) { - return ((Window) element).getDevice(); - } - return null; - } - - @Override - public boolean hasChildren(Object element) { - if (element instanceof IDevice && mDoTreeViewStuff) { - Window[] list = mModel.getWindows((IDevice) element); - if (list != null) { - return list.length != 0; - } - } - return false; - } - - @Override - public Object[] getElements(Object inputElement) { - if (inputElement instanceof DeviceSelectionModel) { - return mModel.getDevices(); - } - return new Object[0]; - } - - @Override - public void dispose() { - // pass - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - // pass - } - - @Override - public Image getImage(Object element) { - if (element instanceof IDevice) { - if (((IDevice) element).isEmulator()) { - return mEmulatorImage; - } - return mDeviceImage; - } - return null; - } - - @Override - public String getText(Object element) { - if (element instanceof IDevice) { - return ((IDevice) element).toString(); - } else if (element instanceof Window) { - return ((Window) element).getTitle(); - } - return null; - } - - @Override - public Font getFont(Object element) { - if (element instanceof Window) { - int focusedWindow = mModel.getFocusedWindow(((Window) element).getDevice()); - if (focusedWindow == ((Window) element).getHashCode()) { - return mBoldFont; - } - } - return null; - } - - @Override - public void addListener(ILabelProviderListener listener) { - // pass - } - - @Override - public boolean isLabelProperty(Object element, String property) { - // pass - return false; - } - - @Override - public void removeListener(ILabelProviderListener listener) { - // pass - } - } - - public DeviceSelector(Composite parent, boolean doTreeViewStuff, boolean doPixelPerfectStuff) { - super(parent, SWT.NONE); - this.mDoTreeViewStuff = doTreeViewStuff; - this.mDoPixelPerfectStuff = doPixelPerfectStuff; - setLayout(new FillLayout()); - mTreeViewer = new TreeViewer(this, SWT.SINGLE); - mTreeViewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS); - - mTree = mTreeViewer.getTree(); - mTree.setLinesVisible(true); - mTree.addSelectionListener(this); - - addDisposeListener(mDisposeListener); - - loadResources(); - - mModel = DeviceSelectionModel.getModel(); - ContentProvider contentProvider = new ContentProvider(); - mTreeViewer.setContentProvider(contentProvider); - mTreeViewer.setLabelProvider(contentProvider); - mModel.addWindowChangeListener(this); - mTreeViewer.setInput(mModel); - - addControlListener(mControlListener); - } - - public void loadResources() { - Display display = Display.getDefault(); - Font systemFont = display.getSystemFont(); - FontData[] fontData = systemFont.getFontData(); - FontData[] newFontData = new FontData[fontData.length]; - for (int i = 0; i < fontData.length; i++) { - newFontData[i] = - new FontData(fontData[i].getName(), fontData[i].getHeight(), fontData[i] - .getStyle() - | SWT.BOLD); - } - mBoldFont = new Font(Display.getDefault(), newFontData); - - ImageLoader loader = ImageLoader.getDdmUiLibLoader(); - mDeviceImage = - loader.loadImage(display, "device.png", ICON_WIDTH, ICON_WIDTH, display //$NON-NLS-1$ - .getSystemColor(SWT.COLOR_RED)); - - mEmulatorImage = - loader.loadImage(display, "emulator.png", ICON_WIDTH, ICON_WIDTH, display //$NON-NLS-1$ - .getSystemColor(SWT.COLOR_BLUE)); - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - mModel.removeWindowChangeListener(DeviceSelector.this); - mBoldFont.dispose(); - } - }; - - // If the window gets too small, hide the data, otherwise SWT throws an - // ERROR. - - private ControlListener mControlListener = new ControlAdapter() { - private boolean noInput = false; - - @Override - public void controlResized(ControlEvent e) { - if (getBounds().height <= 38) { - mTreeViewer.setInput(null); - noInput = true; - } else if (noInput) { - mTreeViewer.setInput(mModel); - noInput = false; - } - } - }; - - @Override - public boolean setFocus() { - return mTree.setFocus(); - } - - public void setMode(boolean doTreeViewStuff, boolean doPixelPerfectStuff) { - if (this.mDoTreeViewStuff != doTreeViewStuff - || this.mDoPixelPerfectStuff != doPixelPerfectStuff) { - final boolean expandAll = !this.mDoTreeViewStuff && doTreeViewStuff; - this.mDoTreeViewStuff = doTreeViewStuff; - this.mDoPixelPerfectStuff = doPixelPerfectStuff; - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - mTreeViewer.refresh(); - if (expandAll) { - mTreeViewer.expandAll(); - } - } - }); - } - } - - @Override - public void deviceConnected(final IDevice device) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - mTreeViewer.refresh(); - mTreeViewer.setExpandedState(device, true); - } - }); - } - - @Override - public void deviceChanged(final IDevice device) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - TreeSelection selection = (TreeSelection) mTreeViewer.getSelection(); - mTreeViewer.refresh(device); - if (selection.getFirstElement() instanceof Window - && ((Window) selection.getFirstElement()).getDevice() == device) { - mTreeViewer.setSelection(selection, true); - } - } - }); - } - - @Override - public void deviceDisconnected(final IDevice device) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - mTreeViewer.refresh(); - } - }); - } - - @Override - public void focusChanged(final IDevice device) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - TreeSelection selection = (TreeSelection) mTreeViewer.getSelection(); - mTreeViewer.refresh(device); - if (selection.getFirstElement() instanceof Window - && ((Window) selection.getFirstElement()).getDevice() == device) { - mTreeViewer.setSelection(selection, true); - } - } - }); - } - - @Override - public void selectionChanged(IDevice device, Window window) { - // pass - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - Object selection = ((TreeItem) e.item).getData(); - if (selection instanceof IDevice && mDoPixelPerfectStuff) { - HierarchyViewerDirector.getDirector().loadPixelPerfectData((IDevice) selection); - } else if (selection instanceof Window && mDoTreeViewStuff) { - HierarchyViewerDirector.getDirector().loadViewTreeData((Window) selection); - } - } - - @Override - public void widgetSelected(SelectionEvent e) { - Object selection = ((TreeItem) e.item).getData(); - if (selection instanceof IDevice) { - mModel.setSelection((IDevice) selection, null); - } else if (selection instanceof Window) { - mModel.setSelection(((Window) selection).getDevice(), (Window) selection); - } - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/LayoutViewer.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/LayoutViewer.java deleted file mode 100644 index 95c7a29..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/LayoutViewer.java +++ /dev/null @@ -1,372 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.hierarchyviewerlib.HierarchyViewerDirector; -import com.android.hierarchyviewerlib.models.TreeViewModel; -import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode.Point; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.graphics.Transform; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; - -import java.util.ArrayList; - -public class LayoutViewer extends Canvas implements ITreeChangeListener { - - private TreeViewModel mModel; - - private DrawableViewNode mTree; - - private DrawableViewNode mSelectedNode; - - private Transform mTransform; - - private Transform mInverse; - - private double mScale; - - private boolean mShowExtras = false; - - private boolean mOnBlack = true; - - public LayoutViewer(Composite parent) { - super(parent, SWT.NONE); - mModel = TreeViewModel.getModel(); - mModel.addTreeChangeListener(this); - - addDisposeListener(mDisposeListener); - addPaintListener(mPaintListener); - addListener(SWT.Resize, mResizeListener); - addMouseListener(mMouseListener); - - mTransform = new Transform(Display.getDefault()); - mInverse = new Transform(Display.getDefault()); - - treeChanged(); - } - - public void setShowExtras(boolean show) { - mShowExtras = show; - doRedraw(); - } - - public void setOnBlack(boolean value) { - mOnBlack = value; - doRedraw(); - } - - public boolean getOnBlack() { - return mOnBlack; - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - mModel.removeTreeChangeListener(LayoutViewer.this); - mTransform.dispose(); - mInverse.dispose(); - if (mSelectedNode != null) { - mSelectedNode.viewNode.dereferenceImage(); - } - } - }; - - private Listener mResizeListener = new Listener() { - @Override - public void handleEvent(Event e) { - synchronized (this) { - setTransform(); - } - } - }; - - private MouseListener mMouseListener = new MouseListener() { - - @Override - public void mouseDoubleClick(MouseEvent e) { - if (mSelectedNode != null) { - HierarchyViewerDirector.getDirector() - .showCapture(getShell(), mSelectedNode.viewNode); - } - } - - @Override - public void mouseDown(MouseEvent e) { - boolean selectionChanged = false; - DrawableViewNode newSelection = null; - synchronized (LayoutViewer.this) { - if (mTree != null) { - float[] pt = { - e.x, e.y - }; - mInverse.transform(pt); - newSelection = - updateSelection(mTree, pt[0], pt[1], 0, 0, 0, 0, mTree.viewNode.width, - mTree.viewNode.height); - if (mSelectedNode != newSelection) { - selectionChanged = true; - } - } - } - if (selectionChanged) { - mModel.setSelection(newSelection); - } - } - - @Override - public void mouseUp(MouseEvent e) { - // pass - } - }; - - private DrawableViewNode updateSelection(DrawableViewNode node, float x, float y, int left, - int top, int clipX, int clipY, int clipWidth, int clipHeight) { - if (!node.treeDrawn) { - return null; - } - // Update the clip - int x1 = Math.max(left, clipX); - int x2 = Math.min(left + node.viewNode.width, clipX + clipWidth); - int y1 = Math.max(top, clipY); - int y2 = Math.min(top + node.viewNode.height, clipY + clipHeight); - clipX = x1; - clipY = y1; - clipWidth = x2 - x1; - clipHeight = y2 - y1; - if (x < clipX || x > clipX + clipWidth || y < clipY || y > clipY + clipHeight) { - return null; - } - final int N = node.children.size(); - for (int i = N - 1; i >= 0; i--) { - DrawableViewNode child = node.children.get(i); - DrawableViewNode ret = - updateSelection(child, x, y, - left + child.viewNode.left - node.viewNode.scrollX, top - + child.viewNode.top - node.viewNode.scrollY, clipX, clipY, - clipWidth, clipHeight); - if (ret != null) { - return ret; - } - } - return node; - } - - private PaintListener mPaintListener = new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - synchronized (LayoutViewer.this) { - if (mOnBlack) { - e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); - } else { - e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); - } - e.gc.fillRectangle(0, 0, getBounds().width, getBounds().height); - if (mTree != null) { - e.gc.setLineWidth((int) Math.ceil(0.3 / mScale)); - e.gc.setTransform(mTransform); - if (mOnBlack) { - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); - } else { - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); - } - Rectangle parentClipping = e.gc.getClipping(); - e.gc.setClipping(0, 0, mTree.viewNode.width + (int) Math.ceil(0.3 / mScale), - mTree.viewNode.height + (int) Math.ceil(0.3 / mScale)); - paintRecursive(e.gc, mTree, 0, 0, true); - - if (mSelectedNode != null) { - e.gc.setClipping(parentClipping); - - // w00t, let's be nice and display the whole path in - // light red and the selected node in dark red. - ArrayList<Point> rightLeftDistances = new ArrayList<Point>(); - int left = 0; - int top = 0; - DrawableViewNode currentNode = mSelectedNode; - while (currentNode != mTree) { - left += currentNode.viewNode.left; - top += currentNode.viewNode.top; - currentNode = currentNode.parent; - left -= currentNode.viewNode.scrollX; - top -= currentNode.viewNode.scrollY; - rightLeftDistances.add(new Point(left, top)); - } - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_RED)); - currentNode = mSelectedNode.parent; - final int N = rightLeftDistances.size(); - for (int i = 0; i < N; i++) { - e.gc.drawRectangle((int) (left - rightLeftDistances.get(i).x), - (int) (top - rightLeftDistances.get(i).y), - currentNode.viewNode.width, currentNode.viewNode.height); - currentNode = currentNode.parent; - } - - if (mShowExtras && mSelectedNode.viewNode.image != null) { - e.gc.drawImage(mSelectedNode.viewNode.image, left, top); - if (mOnBlack) { - e.gc.setForeground(Display.getDefault().getSystemColor( - SWT.COLOR_WHITE)); - } else { - e.gc.setForeground(Display.getDefault().getSystemColor( - SWT.COLOR_BLACK)); - } - paintRecursive(e.gc, mSelectedNode, left, top, true); - - } - - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED)); - e.gc.setLineWidth((int) Math.ceil(2 / mScale)); - e.gc.drawRectangle(left, top, mSelectedNode.viewNode.width, - mSelectedNode.viewNode.height); - } - } - } - } - }; - - private void paintRecursive(GC gc, DrawableViewNode node, int left, int top, boolean root) { - if (!node.treeDrawn) { - return; - } - // Don't shift the root - if (!root) { - left += node.viewNode.left; - top += node.viewNode.top; - } - Rectangle parentClipping = gc.getClipping(); - int x1 = Math.max(parentClipping.x, left); - int x2 = - Math.min(parentClipping.x + parentClipping.width, left + node.viewNode.width - + (int) Math.ceil(0.3 / mScale)); - int y1 = Math.max(parentClipping.y, top); - int y2 = - Math.min(parentClipping.y + parentClipping.height, top + node.viewNode.height - + (int) Math.ceil(0.3 / mScale)); - - // Clipping is weird... You set it to -5 and it comes out 17 or - // something. - if (x2 <= x1 || y2 <= y1) { - return; - } - gc.setClipping(x1, y1, x2 - x1, y2 - y1); - final int N = node.children.size(); - for (int i = 0; i < N; i++) { - paintRecursive(gc, node.children.get(i), left - node.viewNode.scrollX, top - - node.viewNode.scrollY, false); - } - gc.setClipping(parentClipping); - if (!node.viewNode.willNotDraw) { - gc.drawRectangle(left, top, node.viewNode.width, node.viewNode.height); - } - - } - - private void doRedraw() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - redraw(); - } - }); - } - - private void setTransform() { - if (mTree != null) { - Rectangle bounds = getBounds(); - int leftRightPadding = bounds.width <= 30 ? 0 : 5; - int topBottomPadding = bounds.height <= 30 ? 0 : 5; - mScale = - Math.min(1.0 * (bounds.width - leftRightPadding * 2) / mTree.viewNode.width, 1.0 - * (bounds.height - topBottomPadding * 2) / mTree.viewNode.height); - int scaledWidth = (int) Math.ceil(mTree.viewNode.width * mScale); - int scaledHeight = (int) Math.ceil(mTree.viewNode.height * mScale); - - mTransform.identity(); - mInverse.identity(); - mTransform.translate((bounds.width - scaledWidth) / 2.0f, - (bounds.height - scaledHeight) / 2.0f); - mInverse.translate((bounds.width - scaledWidth) / 2.0f, - (bounds.height - scaledHeight) / 2.0f); - mTransform.scale((float) mScale, (float) mScale); - mInverse.scale((float) mScale, (float) mScale); - if (bounds.width != 0 && bounds.height != 0) { - mInverse.invert(); - } - } - } - - @Override - public void selectionChanged() { - synchronized (this) { - if (mSelectedNode != null) { - mSelectedNode.viewNode.dereferenceImage(); - } - mSelectedNode = mModel.getSelection(); - if (mSelectedNode != null) { - mSelectedNode.viewNode.referenceImage(); - } - } - doRedraw(); - } - - // Note the syncExec and then synchronized... It avoids deadlock - @Override - public void treeChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - if (mSelectedNode != null) { - mSelectedNode.viewNode.dereferenceImage(); - } - mTree = mModel.getTree(); - mSelectedNode = mModel.getSelection(); - if (mSelectedNode != null) { - mSelectedNode.viewNode.referenceImage(); - } - setTransform(); - } - } - }); - doRedraw(); - } - - @Override - public void viewportChanged() { - // pass - } - - @Override - public void zoomChanged() { - // pass - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfect.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfect.java deleted file mode 100644 index 533b840..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfect.java +++ /dev/null @@ -1,392 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.hierarchyviewerlib.device.ViewNode; -import com.android.hierarchyviewerlib.models.PixelPerfectModel; -import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.MouseMoveListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; - -public class PixelPerfect extends ScrolledComposite implements IImageChangeListener { - private Canvas mCanvas; - - private PixelPerfectModel mModel; - - private Image mImage; - - private Color mCrosshairColor; - - private Color mMarginColor; - - private Color mBorderColor; - - private Color mPaddingColor; - - private int mWidth; - - private int mHeight; - - private Point mCrosshairLocation; - - private ViewNode mSelectedNode; - - private Image mOverlayImage; - - private double mOverlayTransparency; - - public PixelPerfect(Composite parent) { - super(parent, SWT.H_SCROLL | SWT.V_SCROLL); - mCanvas = new Canvas(this, SWT.NONE); - setContent(mCanvas); - setExpandHorizontal(true); - setExpandVertical(true); - mModel = PixelPerfectModel.getModel(); - mModel.addImageChangeListener(this); - - mCanvas.addPaintListener(mPaintListener); - mCanvas.addMouseListener(mMouseListener); - mCanvas.addMouseMoveListener(mMouseMoveListener); - mCanvas.addKeyListener(mKeyListener); - - addDisposeListener(mDisposeListener); - - mCrosshairColor = new Color(Display.getDefault(), new RGB(0, 255, 255)); - mBorderColor = new Color(Display.getDefault(), new RGB(255, 0, 0)); - mMarginColor = new Color(Display.getDefault(), new RGB(0, 255, 0)); - mPaddingColor = new Color(Display.getDefault(), new RGB(0, 0, 255)); - - imageLoaded(); - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - mModel.removeImageChangeListener(PixelPerfect.this); - mCrosshairColor.dispose(); - mBorderColor.dispose(); - mPaddingColor.dispose(); - } - }; - - @Override - public boolean setFocus() { - return mCanvas.setFocus(); - } - - private MouseListener mMouseListener = new MouseListener() { - - @Override - public void mouseDoubleClick(MouseEvent e) { - // pass - } - - @Override - public void mouseDown(MouseEvent e) { - handleMouseEvent(e); - } - - @Override - public void mouseUp(MouseEvent e) { - handleMouseEvent(e); - } - - }; - - private MouseMoveListener mMouseMoveListener = new MouseMoveListener() { - @Override - public void mouseMove(MouseEvent e) { - if (e.stateMask != 0) { - handleMouseEvent(e); - } - } - }; - - private void handleMouseEvent(MouseEvent e) { - synchronized (PixelPerfect.this) { - if (mImage == null) { - return; - } - int leftOffset = mCanvas.getSize().x / 2 - mWidth / 2; - int topOffset = mCanvas.getSize().y / 2 - mHeight / 2; - e.x -= leftOffset; - e.y -= topOffset; - e.x = Math.max(e.x, 0); - e.x = Math.min(e.x, mWidth - 1); - e.y = Math.max(e.y, 0); - e.y = Math.min(e.y, mHeight - 1); - } - mModel.setCrosshairLocation(e.x, e.y); - } - - private KeyListener mKeyListener = new KeyListener() { - - @Override - public void keyPressed(KeyEvent e) { - boolean crosshairMoved = false; - synchronized (PixelPerfect.this) { - if (mImage != null) { - switch (e.keyCode) { - case SWT.ARROW_UP: - if (mCrosshairLocation.y != 0) { - mCrosshairLocation.y--; - crosshairMoved = true; - } - break; - case SWT.ARROW_DOWN: - if (mCrosshairLocation.y != mHeight - 1) { - mCrosshairLocation.y++; - crosshairMoved = true; - } - break; - case SWT.ARROW_LEFT: - if (mCrosshairLocation.x != 0) { - mCrosshairLocation.x--; - crosshairMoved = true; - } - break; - case SWT.ARROW_RIGHT: - if (mCrosshairLocation.x != mWidth - 1) { - mCrosshairLocation.x++; - crosshairMoved = true; - } - break; - } - } - } - if (crosshairMoved) { - mModel.setCrosshairLocation(mCrosshairLocation.x, mCrosshairLocation.y); - } - } - - @Override - public void keyReleased(KeyEvent e) { - // pass - } - - }; - - private PaintListener mPaintListener = new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - synchronized (PixelPerfect.this) { - e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); - e.gc.fillRectangle(0, 0, mCanvas.getSize().x, mCanvas.getSize().y); - if (mImage != null) { - // Let's be cool and put it in the center... - int leftOffset = mCanvas.getSize().x / 2 - mWidth / 2; - int topOffset = mCanvas.getSize().y / 2 - mHeight / 2; - e.gc.drawImage(mImage, leftOffset, topOffset); - if (mOverlayImage != null) { - e.gc.setAlpha((int) (mOverlayTransparency * 255)); - int overlayTopOffset = - mCanvas.getSize().y / 2 + mHeight / 2 - - mOverlayImage.getBounds().height; - e.gc.drawImage(mOverlayImage, leftOffset, overlayTopOffset); - e.gc.setAlpha(255); - } - - if (mSelectedNode != null) { - // If the screen is in landscape mode, the - // coordinates are backwards. - int leftShift = 0; - int topShift = 0; - int nodeLeft = mSelectedNode.left; - int nodeTop = mSelectedNode.top; - int nodeWidth = mSelectedNode.width; - int nodeHeight = mSelectedNode.height; - int nodeMarginLeft = mSelectedNode.marginLeft; - int nodeMarginTop = mSelectedNode.marginTop; - int nodeMarginRight = mSelectedNode.marginRight; - int nodeMarginBottom = mSelectedNode.marginBottom; - int nodePadLeft = mSelectedNode.paddingLeft; - int nodePadTop = mSelectedNode.paddingTop; - int nodePadRight = mSelectedNode.paddingRight; - int nodePadBottom = mSelectedNode.paddingBottom; - ViewNode cur = mSelectedNode; - while (cur.parent != null) { - leftShift += cur.parent.left - cur.parent.scrollX; - topShift += cur.parent.top - cur.parent.scrollY; - cur = cur.parent; - } - - // Everything is sideways. - if (cur.width > cur.height) { - e.gc.setForeground(mPaddingColor); - e.gc.drawRectangle(leftOffset + mWidth - nodeTop - topShift - nodeHeight - + nodePadBottom, - topOffset + leftShift + nodeLeft + nodePadLeft, nodeHeight - - nodePadBottom - nodePadTop, nodeWidth - nodePadRight - - nodePadLeft); - e.gc.setForeground(mMarginColor); - e.gc.drawRectangle(leftOffset + mWidth - nodeTop - topShift - nodeHeight - - nodeMarginBottom, topOffset + leftShift + nodeLeft - - nodeMarginLeft, - nodeHeight + nodeMarginBottom + nodeMarginTop, nodeWidth - + nodeMarginRight + nodeMarginLeft); - e.gc.setForeground(mBorderColor); - e.gc.drawRectangle( - leftOffset + mWidth - nodeTop - topShift - nodeHeight, topOffset - + leftShift + nodeLeft, nodeHeight, nodeWidth); - } else { - e.gc.setForeground(mPaddingColor); - e.gc.drawRectangle(leftOffset + leftShift + nodeLeft + nodePadLeft, - topOffset + topShift + nodeTop + nodePadTop, nodeWidth - - nodePadRight - nodePadLeft, nodeHeight - - nodePadBottom - nodePadTop); - e.gc.setForeground(mMarginColor); - e.gc.drawRectangle(leftOffset + leftShift + nodeLeft - nodeMarginLeft, - topOffset + topShift + nodeTop - nodeMarginTop, nodeWidth - + nodeMarginRight + nodeMarginLeft, nodeHeight - + nodeMarginBottom + nodeMarginTop); - e.gc.setForeground(mBorderColor); - e.gc.drawRectangle(leftOffset + leftShift + nodeLeft, topOffset - + topShift + nodeTop, nodeWidth, nodeHeight); - } - } - if (mCrosshairLocation != null) { - e.gc.setForeground(mCrosshairColor); - e.gc.drawLine(leftOffset, topOffset + mCrosshairLocation.y, leftOffset - + mWidth - 1, topOffset + mCrosshairLocation.y); - e.gc.drawLine(leftOffset + mCrosshairLocation.x, topOffset, leftOffset - + mCrosshairLocation.x, topOffset + mHeight - 1); - } - } - } - } - }; - - private void doRedraw() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - mCanvas.redraw(); - } - }); - } - - private void loadImage() { - mImage = mModel.getImage(); - if (mImage != null) { - mWidth = mImage.getBounds().width; - mHeight = mImage.getBounds().height; - } else { - mWidth = 0; - mHeight = 0; - } - setMinSize(mWidth, mHeight); - } - - @Override - public void imageLoaded() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - loadImage(); - mCrosshairLocation = mModel.getCrosshairLocation(); - mSelectedNode = mModel.getSelected(); - mOverlayImage = mModel.getOverlayImage(); - mOverlayTransparency = mModel.getOverlayTransparency(); - } - } - }); - doRedraw(); - } - - @Override - public void imageChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - loadImage(); - } - } - }); - doRedraw(); - } - - @Override - public void crosshairMoved() { - synchronized (this) { - mCrosshairLocation = mModel.getCrosshairLocation(); - } - doRedraw(); - } - - @Override - public void selectionChanged() { - synchronized (this) { - mSelectedNode = mModel.getSelected(); - } - doRedraw(); - } - - // Note the syncExec and then synchronized... It avoids deadlock - @Override - public void treeChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - mSelectedNode = mModel.getSelected(); - } - } - }); - doRedraw(); - } - - @Override - public void zoomChanged() { - // pass - } - - @Override - public void overlayChanged() { - synchronized (this) { - mOverlayImage = mModel.getOverlayImage(); - mOverlayTransparency = mModel.getOverlayTransparency(); - } - doRedraw(); - } - - @Override - public void overlayTransparencyChanged() { - synchronized (this) { - mOverlayTransparency = mModel.getOverlayTransparency(); - } - doRedraw(); - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectControls.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectControls.java deleted file mode 100644 index 6054088..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectControls.java +++ /dev/null @@ -1,296 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.hierarchyviewerlib.HierarchyViewerDirector; -import com.android.hierarchyviewerlib.models.PixelPerfectModel; -import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Slider; - -public class PixelPerfectControls extends Composite implements IImageChangeListener { - - private Slider mOverlaySlider; - - private Slider mZoomSlider; - - private Slider mAutoRefreshSlider; - - public PixelPerfectControls(Composite parent) { - super(parent, SWT.NONE); - setLayout(new FormLayout()); - - Label overlayTransparencyRight = new Label(this, SWT.NONE); - overlayTransparencyRight.setText("100%"); - FormData overlayTransparencyRightData = new FormData(); - overlayTransparencyRightData.right = new FormAttachment(100, -2); - overlayTransparencyRightData.top = new FormAttachment(0, 2); - overlayTransparencyRight.setLayoutData(overlayTransparencyRightData); - - Label refreshRight = new Label(this, SWT.NONE); - refreshRight.setText("40s"); - FormData refreshRightData = new FormData(); - refreshRightData.right = new FormAttachment(100, -2); - refreshRightData.top = new FormAttachment(overlayTransparencyRight, 2); - refreshRightData.left = new FormAttachment(overlayTransparencyRight, 0, SWT.LEFT); - refreshRight.setLayoutData(refreshRightData); - - Label zoomRight = new Label(this, SWT.NONE); - zoomRight.setText("24x"); - FormData zoomRightData = new FormData(); - zoomRightData.right = new FormAttachment(100, -2); - zoomRightData.top = new FormAttachment(refreshRight, 2); - zoomRightData.left = new FormAttachment(overlayTransparencyRight, 0, SWT.LEFT); - zoomRight.setLayoutData(zoomRightData); - - Label overlayTransparency = new Label(this, SWT.NONE); - Label refresh = new Label(this, SWT.NONE); - - overlayTransparency.setText("Overlay:"); - FormData overlayTransparencyData = new FormData(); - overlayTransparencyData.left = new FormAttachment(0, 2); - overlayTransparencyData.top = new FormAttachment(0, 2); - overlayTransparencyData.right = new FormAttachment(refresh, 0, SWT.RIGHT); - overlayTransparency.setLayoutData(overlayTransparencyData); - - refresh.setText("Refresh Rate:"); - FormData refreshData = new FormData(); - refreshData.top = new FormAttachment(overlayTransparency, 2); - refreshData.left = new FormAttachment(0, 2); - refresh.setLayoutData(refreshData); - - Label zoom = new Label(this, SWT.NONE); - zoom.setText("Zoom:"); - FormData zoomData = new FormData(); - zoomData.right = new FormAttachment(refresh, 0, SWT.RIGHT); - zoomData.top = new FormAttachment(refresh, 2); - zoomData.left = new FormAttachment(0, 2); - zoom.setLayoutData(zoomData); - - Label overlayTransparencyLeft = new Label(this, SWT.RIGHT); - overlayTransparencyLeft.setText("0%"); - FormData overlayTransparencyLeftData = new FormData(); - overlayTransparencyLeftData.top = new FormAttachment(0, 2); - overlayTransparencyLeftData.left = new FormAttachment(overlayTransparency, 2); - overlayTransparencyLeft.setLayoutData(overlayTransparencyLeftData); - - Label refreshLeft = new Label(this, SWT.RIGHT); - refreshLeft.setText("1s"); - FormData refreshLeftData = new FormData(); - refreshLeftData.top = new FormAttachment(overlayTransparencyLeft, 2); - refreshLeftData.left = new FormAttachment(refresh, 2); - refreshLeft.setLayoutData(refreshLeftData); - - Label zoomLeft = new Label(this, SWT.RIGHT); - zoomLeft.setText("2x"); - FormData zoomLeftData = new FormData(); - zoomLeftData.top = new FormAttachment(refreshLeft, 2); - zoomLeftData.left = new FormAttachment(zoom, 2); - zoomLeft.setLayoutData(zoomLeftData); - - mOverlaySlider = new Slider(this, SWT.HORIZONTAL); - mOverlaySlider.setMinimum(0); - mOverlaySlider.setMaximum(101); - mOverlaySlider.setThumb(1); - mOverlaySlider.setSelection((int) Math.round(PixelPerfectModel.getModel() - .getOverlayTransparency() * 100)); - - Image overlayImage = PixelPerfectModel.getModel().getOverlayImage(); - mOverlaySlider.setEnabled(overlayImage != null); - FormData overlaySliderData = new FormData(); - overlaySliderData.right = new FormAttachment(overlayTransparencyRight, -4); - overlaySliderData.top = new FormAttachment(0, 2); - overlaySliderData.left = new FormAttachment(overlayTransparencyLeft, 4); - mOverlaySlider.setLayoutData(overlaySliderData); - - mOverlaySlider.addSelectionListener(overlaySliderSelectionListener); - - mAutoRefreshSlider = new Slider(this, SWT.HORIZONTAL); - mAutoRefreshSlider.setMinimum(1); - mAutoRefreshSlider.setMaximum(41); - mAutoRefreshSlider.setThumb(1); - mAutoRefreshSlider.setSelection(HierarchyViewerDirector.getDirector() - .getPixelPerfectAutoRefreshInverval()); - FormData refreshSliderData = new FormData(); - refreshSliderData.right = new FormAttachment(overlayTransparencyRight, -4); - refreshSliderData.top = new FormAttachment(overlayTransparencyRight, 2); - refreshSliderData.left = new FormAttachment(mOverlaySlider, 0, SWT.LEFT); - mAutoRefreshSlider.setLayoutData(refreshSliderData); - - mAutoRefreshSlider.addSelectionListener(mRefreshSliderSelectionListener); - - mZoomSlider = new Slider(this, SWT.HORIZONTAL); - mZoomSlider.setMinimum(2); - mZoomSlider.setMaximum(25); - mZoomSlider.setThumb(1); - mZoomSlider.setSelection(PixelPerfectModel.getModel().getZoom()); - FormData zoomSliderData = new FormData(); - zoomSliderData.right = new FormAttachment(overlayTransparencyRight, -4); - zoomSliderData.top = new FormAttachment(refreshRight, 2); - zoomSliderData.left = new FormAttachment(mOverlaySlider, 0, SWT.LEFT); - mZoomSlider.setLayoutData(zoomSliderData); - - mZoomSlider.addSelectionListener(mZoomSliderSelectionListener); - - addDisposeListener(mDisposeListener); - - PixelPerfectModel.getModel().addImageChangeListener(this); - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - PixelPerfectModel.getModel().removeImageChangeListener(PixelPerfectControls.this); - } - }; - - private SelectionListener overlaySliderSelectionListener = new SelectionListener() { - private int oldValue; - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - // pass - } - - @Override - public void widgetSelected(SelectionEvent e) { - int newValue = mOverlaySlider.getSelection(); - if (oldValue != newValue) { - PixelPerfectModel.getModel().removeImageChangeListener(PixelPerfectControls.this); - PixelPerfectModel.getModel().setOverlayTransparency(newValue / 100.0); - PixelPerfectModel.getModel().addImageChangeListener(PixelPerfectControls.this); - oldValue = newValue; - } - } - }; - - private SelectionListener mRefreshSliderSelectionListener = new SelectionListener() { - private int oldValue; - - @Override - public void widgetDefaultSelected(final SelectionEvent e) { - // pass - } - - @Override - public void widgetSelected(SelectionEvent e) { - int newValue = mAutoRefreshSlider.getSelection(); - if (oldValue != newValue) { - HierarchyViewerDirector.getDirector().setPixelPerfectAutoRefreshInterval(newValue); - } - } - }; - - private SelectionListener mZoomSliderSelectionListener = new SelectionListener() { - private int oldValue; - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - // pass - } - - @Override - public void widgetSelected(SelectionEvent e) { - int newValue = mZoomSlider.getSelection(); - if (oldValue != newValue) { - PixelPerfectModel.getModel().removeImageChangeListener(PixelPerfectControls.this); - PixelPerfectModel.getModel().setZoom(newValue); - PixelPerfectModel.getModel().addImageChangeListener(PixelPerfectControls.this); - oldValue = newValue; - } - } - }; - - @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(); - mOverlaySlider.setEnabled(overlayImage != null); - if (PixelPerfectModel.getModel().getImage() == null) { - } else { - mZoomSlider.setSelection(PixelPerfectModel.getModel().getZoom()); - } - } - }); - } - - @Override - public void overlayChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - Image overlayImage = PixelPerfectModel.getModel().getOverlayImage(); - mOverlaySlider.setEnabled(overlayImage != null); - } - }); - } - - @Override - public void overlayTransparencyChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - mOverlaySlider.setSelection((int) (PixelPerfectModel.getModel() - .getOverlayTransparency() * 100)); - } - }); - } - - @Override - public void selectionChanged() { - // pass - } - - @Override - public void zoomChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - mZoomSlider.setSelection(PixelPerfectModel.getModel().getZoom()); - } - }); - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectLoupe.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectLoupe.java deleted file mode 100644 index ac3d66e..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectLoupe.java +++ /dev/null @@ -1,391 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.hierarchyviewerlib.models.PixelPerfectModel; -import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.MouseWheelListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.PaletteData; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.graphics.Transform; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; - -public class PixelPerfectLoupe extends Canvas implements IImageChangeListener { - private PixelPerfectModel mModel; - - private Image mImage; - - private Image mGrid; - - private Color mCrosshairColor; - - private int mWidth; - - private int mHeight; - - private Point mCrosshairLocation; - - private int mZoom; - - private Transform mTransform; - - private int mCanvasWidth; - - private int mCanvasHeight; - - private Image mOverlayImage; - - private double mOverlayTransparency; - - private boolean mShowOverlay = false; - - public PixelPerfectLoupe(Composite parent) { - super(parent, SWT.NONE); - mModel = PixelPerfectModel.getModel(); - mModel.addImageChangeListener(this); - - addPaintListener(mPaintListener); - addMouseListener(mMouseListener); - addMouseWheelListener(mMouseWheelListener); - addDisposeListener(mDisposeListener); - addKeyListener(mKeyListener); - - mCrosshairColor = new Color(Display.getDefault(), new RGB(255, 94, 254)); - - mTransform = new Transform(Display.getDefault()); - - imageLoaded(); - } - - public void setShowOverlay(boolean value) { - synchronized (this) { - mShowOverlay = value; - } - doRedraw(); - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - mModel.removeImageChangeListener(PixelPerfectLoupe.this); - mCrosshairColor.dispose(); - mTransform.dispose(); - if (mGrid != null) { - mGrid.dispose(); - } - } - }; - - private MouseListener mMouseListener = new MouseListener() { - - @Override - public void mouseDoubleClick(MouseEvent e) { - // pass - } - - @Override - public void mouseDown(MouseEvent e) { - handleMouseEvent(e); - } - - @Override - public void mouseUp(MouseEvent e) { - // - } - - }; - - private MouseWheelListener mMouseWheelListener = new MouseWheelListener() { - @Override - public void mouseScrolled(MouseEvent e) { - int newZoom = -1; - synchronized (PixelPerfectLoupe.this) { - if (mImage != null && mCrosshairLocation != null) { - if (e.count > 0) { - newZoom = mZoom + 1; - } else { - newZoom = mZoom - 1; - } - } - } - if (newZoom != -1) { - mModel.setZoom(newZoom); - } - } - }; - - private void handleMouseEvent(MouseEvent e) { - int newX = -1; - int newY = -1; - synchronized (PixelPerfectLoupe.this) { - if (mImage == null) { - return; - } - int zoomedX = -mCrosshairLocation.x * mZoom - mZoom / 2 + getBounds().width / 2; - int zoomedY = -mCrosshairLocation.y * mZoom - mZoom / 2 + getBounds().height / 2; - int x = (e.x - zoomedX) / mZoom; - int y = (e.y - zoomedY) / mZoom; - if (x >= 0 && x < mWidth && y >= 0 && y < mHeight) { - newX = x; - newY = y; - } - } - if (newX != -1) { - mModel.setCrosshairLocation(newX, newY); - } - } - - private KeyListener mKeyListener = new KeyListener() { - - @Override - public void keyPressed(KeyEvent e) { - boolean crosshairMoved = false; - synchronized (PixelPerfectLoupe.this) { - if (mImage != null) { - switch (e.keyCode) { - case SWT.ARROW_UP: - if (mCrosshairLocation.y != 0) { - mCrosshairLocation.y--; - crosshairMoved = true; - } - break; - case SWT.ARROW_DOWN: - if (mCrosshairLocation.y != mHeight - 1) { - mCrosshairLocation.y++; - crosshairMoved = true; - } - break; - case SWT.ARROW_LEFT: - if (mCrosshairLocation.x != 0) { - mCrosshairLocation.x--; - crosshairMoved = true; - } - break; - case SWT.ARROW_RIGHT: - if (mCrosshairLocation.x != mWidth - 1) { - mCrosshairLocation.x++; - crosshairMoved = true; - } - break; - } - } - } - if (crosshairMoved) { - mModel.setCrosshairLocation(mCrosshairLocation.x, mCrosshairLocation.y); - } - } - - @Override - public void keyReleased(KeyEvent e) { - // pass - } - - }; - - private PaintListener mPaintListener = new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - synchronized (PixelPerfectLoupe.this) { - e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); - e.gc.fillRectangle(0, 0, getSize().x, getSize().y); - if (mImage != null && mCrosshairLocation != null) { - int zoomedX = -mCrosshairLocation.x * mZoom - mZoom / 2 + getBounds().width / 2; - int zoomedY = -mCrosshairLocation.y * mZoom - mZoom / 2 + getBounds().height / 2; - mTransform.translate(zoomedX, zoomedY); - mTransform.scale(mZoom, mZoom); - e.gc.setInterpolation(SWT.NONE); - e.gc.setTransform(mTransform); - e.gc.drawImage(mImage, 0, 0); - if (mShowOverlay && mOverlayImage != null) { - e.gc.setAlpha((int) (mOverlayTransparency * 255)); - e.gc.drawImage(mOverlayImage, 0, mHeight - mOverlayImage.getBounds().height); - e.gc.setAlpha(255); - } - - mTransform.identity(); - e.gc.setTransform(mTransform); - - // If the size of the canvas has changed, we need to make - // another grid. - if (mGrid != null - && (mCanvasWidth != getBounds().width || mCanvasHeight != getBounds().height)) { - mGrid.dispose(); - mGrid = null; - } - mCanvasWidth = getBounds().width; - mCanvasHeight = getBounds().height; - if (mGrid == null) { - // Make a transparent image; - ImageData imageData = - new ImageData(mCanvasWidth + mZoom + 1, mCanvasHeight + mZoom + 1, 1, - new PaletteData(new RGB[] { - new RGB(0, 0, 0) - })); - imageData.transparentPixel = 0; - - // Draw the grid. - mGrid = new Image(Display.getDefault(), imageData); - GC gc = new GC(mGrid); - gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); - for (int x = 0; x <= mCanvasWidth + mZoom; x += mZoom) { - gc.drawLine(x, 0, x, mCanvasHeight + mZoom); - } - for (int y = 0; y <= mCanvasHeight + mZoom; y += mZoom) { - gc.drawLine(0, y, mCanvasWidth + mZoom, y); - } - gc.dispose(); - } - - e.gc.setClipping(new Rectangle(zoomedX, zoomedY, mWidth * mZoom + 1, mHeight - * mZoom + 1)); - e.gc.setAlpha(76); - e.gc.drawImage(mGrid, (mCanvasWidth / 2 - mZoom / 2) % mZoom - mZoom, - (mCanvasHeight / 2 - mZoom / 2) % mZoom - mZoom); - e.gc.setAlpha(255); - - e.gc.setForeground(mCrosshairColor); - e.gc.drawLine(0, mCanvasHeight / 2, mCanvasWidth - 1, mCanvasHeight / 2); - e.gc.drawLine(mCanvasWidth / 2, 0, mCanvasWidth / 2, mCanvasHeight - 1); - } - } - } - }; - - private void doRedraw() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - redraw(); - } - }); - } - - private void loadImage() { - mImage = mModel.getImage(); - if (mImage != null) { - mWidth = mImage.getBounds().width; - mHeight = mImage.getBounds().height; - } else { - mWidth = 0; - mHeight = 0; - } - } - - // Note the syncExec and then synchronized... It avoids deadlock - @Override - public void imageLoaded() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - loadImage(); - mCrosshairLocation = mModel.getCrosshairLocation(); - mZoom = mModel.getZoom(); - mOverlayImage = mModel.getOverlayImage(); - mOverlayTransparency = mModel.getOverlayTransparency(); - } - } - }); - doRedraw(); - } - - @Override - public void imageChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - loadImage(); - } - } - }); - doRedraw(); - } - - @Override - public void crosshairMoved() { - synchronized (this) { - mCrosshairLocation = mModel.getCrosshairLocation(); - } - doRedraw(); - } - - @Override - public void selectionChanged() { - // pass - } - - @Override - public void treeChanged() { - // pass - } - - @Override - public void zoomChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - if (mGrid != null) { - // To notify that the zoom level has changed, we get rid - // of the - // grid. - mGrid.dispose(); - mGrid = null; - } - mZoom = mModel.getZoom(); - } - } - }); - doRedraw(); - } - - @Override - public void overlayChanged() { - synchronized (this) { - mOverlayImage = mModel.getOverlayImage(); - mOverlayTransparency = mModel.getOverlayTransparency(); - } - doRedraw(); - } - - @Override - public void overlayTransparencyChanged() { - synchronized (this) { - mOverlayTransparency = mModel.getOverlayTransparency(); - } - doRedraw(); - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectPixelPanel.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectPixelPanel.java deleted file mode 100644 index d1ff6d9..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectPixelPanel.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.hierarchyviewerlib.models.PixelPerfectModel; -import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; - -public class PixelPerfectPixelPanel extends Canvas implements IImageChangeListener { - private PixelPerfectModel mModel; - - private Image mImage; - - private Image mOverlayImage; - - private Point mCrosshairLocation; - - public static final int PREFERRED_WIDTH = 180; - - public static final int PREFERRED_HEIGHT = 52; - - public PixelPerfectPixelPanel(Composite parent) { - super(parent, SWT.NONE); - mModel = PixelPerfectModel.getModel(); - mModel.addImageChangeListener(this); - - addPaintListener(mPaintListener); - addDisposeListener(mDisposeListener); - - imageLoaded(); - } - - @Override - public Point computeSize(int wHint, int hHint, boolean changed) { - int height = PREFERRED_HEIGHT; - int width = (wHint == SWT.DEFAULT) ? PREFERRED_WIDTH : wHint; - return new Point(width, height); - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - mModel.removeImageChangeListener(PixelPerfectPixelPanel.this); - } - }; - - private PaintListener mPaintListener = new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - synchronized (PixelPerfectPixelPanel.this) { - e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); - e.gc.fillRectangle(0, 0, getBounds().width, getBounds().height); - if (mImage != null) { - RGB pixel = - mImage.getImageData().palette.getRGB(mImage.getImageData().getPixel( - mCrosshairLocation.x, mCrosshairLocation.y)); - Color rgbColor = new Color(Display.getDefault(), pixel); - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); - e.gc.setBackground(rgbColor); - e.gc.drawRectangle(4, 4, 60, 30); - e.gc.fillRectangle(5, 5, 59, 29); - rgbColor.dispose(); - e.gc.drawText("#" - + Integer - .toHexString( - (1 << 24) + (pixel.red << 16) + (pixel.green << 8) - + pixel.blue).substring(1), 4, 35, true); - e.gc.drawText("R:", 80, 4, true); - e.gc.drawText("G:", 80, 20, true); - e.gc.drawText("B:", 80, 35, true); - e.gc.drawText(Integer.toString(pixel.red), 97, 4, true); - e.gc.drawText(Integer.toString(pixel.green), 97, 20, true); - e.gc.drawText(Integer.toString(pixel.blue), 97, 35, true); - e.gc.drawText("X:", 132, 4, true); - e.gc.drawText("Y:", 132, 20, true); - e.gc.drawText(Integer.toString(mCrosshairLocation.x) + " px", 149, 4, true); - e.gc.drawText(Integer.toString(mCrosshairLocation.y) + " px", 149, 20, true); - - if (mOverlayImage != null) { - int xInOverlay = mCrosshairLocation.x; - int yInOverlay = - mCrosshairLocation.y - - (mImage.getBounds().height - mOverlayImage.getBounds().height); - if (xInOverlay >= 0 && yInOverlay >= 0 - && xInOverlay < mOverlayImage.getBounds().width - && yInOverlay < mOverlayImage.getBounds().height) { - pixel = - mOverlayImage.getImageData().palette.getRGB(mOverlayImage - .getImageData().getPixel(xInOverlay, yInOverlay)); - rgbColor = new Color(Display.getDefault(), pixel); - e.gc - .setForeground(Display.getDefault().getSystemColor( - SWT.COLOR_WHITE)); - e.gc.setBackground(rgbColor); - e.gc.drawRectangle(204, 4, 60, 30); - e.gc.fillRectangle(205, 5, 59, 29); - rgbColor.dispose(); - e.gc.drawText("#" - + Integer.toHexString( - (1 << 24) + (pixel.red << 16) + (pixel.green << 8) - + pixel.blue).substring(1), 204, 35, true); - e.gc.drawText("R:", 280, 4, true); - e.gc.drawText("G:", 280, 20, true); - e.gc.drawText("B:", 280, 35, true); - e.gc.drawText(Integer.toString(pixel.red), 297, 4, true); - e.gc.drawText(Integer.toString(pixel.green), 297, 20, true); - e.gc.drawText(Integer.toString(pixel.blue), 297, 35, true); - } - } - } - } - } - }; - - private void doRedraw() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - redraw(); - } - }); - } - - @Override - public void crosshairMoved() { - synchronized (this) { - mCrosshairLocation = mModel.getCrosshairLocation(); - } - doRedraw(); - } - - @Override - public void imageChanged() { - synchronized (this) { - mImage = mModel.getImage(); - } - doRedraw(); - } - - @Override - public void imageLoaded() { - synchronized (this) { - mImage = mModel.getImage(); - mCrosshairLocation = mModel.getCrosshairLocation(); - mOverlayImage = mModel.getOverlayImage(); - } - doRedraw(); - } - - @Override - public void overlayChanged() { - synchronized (this) { - mOverlayImage = mModel.getOverlayImage(); - } - doRedraw(); - } - - @Override - public void overlayTransparencyChanged() { - // pass - } - - @Override - public void selectionChanged() { - // pass - } - - @Override - public void treeChanged() { - // pass - } - - @Override - public void zoomChanged() { - // pass - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectTree.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectTree.java deleted file mode 100644 index e9848d8..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PixelPerfectTree.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.device.ViewNode; -import com.android.hierarchyviewerlib.models.PixelPerfectModel; -import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; - -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jface.viewers.ILabelProviderListener; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.TreeSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -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.swt.widgets.Tree; - -import java.util.List; - -public class PixelPerfectTree extends Composite implements IImageChangeListener, SelectionListener { - - private TreeViewer mTreeViewer; - - private Tree mTree; - - private PixelPerfectModel mModel; - - private Image mFolderImage; - - private Image mFileImage; - - private class ContentProvider implements ITreeContentProvider, ILabelProvider { - @Override - public Object[] getChildren(Object element) { - if (element instanceof ViewNode) { - List<ViewNode> children = ((ViewNode) element).children; - return children.toArray(new ViewNode[children.size()]); - } - return null; - } - - @Override - public Object getParent(Object element) { - if (element instanceof ViewNode) { - return ((ViewNode) element).parent; - } - return null; - } - - @Override - public boolean hasChildren(Object element) { - if (element instanceof ViewNode) { - return ((ViewNode) element).children.size() != 0; - } - return false; - } - - @Override - public Object[] getElements(Object element) { - if (element instanceof PixelPerfectModel) { - ViewNode viewNode = ((PixelPerfectModel) element).getViewNode(); - if (viewNode == null) { - return new Object[0]; - } - return new Object[] { - viewNode - }; - } - return new Object[0]; - } - - @Override - public void dispose() { - // pass - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - // pass - } - - @Override - public Image getImage(Object element) { - if (element instanceof ViewNode) { - if (hasChildren(element)) { - return mFolderImage; - } - return mFileImage; - } - return null; - } - - @Override - public String getText(Object element) { - if (element instanceof ViewNode) { - return ((ViewNode) element).name; - } - return null; - } - - @Override - public void addListener(ILabelProviderListener listener) { - // pass - } - - @Override - public boolean isLabelProperty(Object element, String property) { - // pass - return false; - } - - @Override - public void removeListener(ILabelProviderListener listener) { - // pass - } - } - - public PixelPerfectTree(Composite parent) { - super(parent, SWT.NONE); - setLayout(new FillLayout()); - mTreeViewer = new TreeViewer(this, SWT.SINGLE); - mTreeViewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS); - - mTree = mTreeViewer.getTree(); - mTree.addSelectionListener(this); - - loadResources(); - - addDisposeListener(mDisposeListener); - - mModel = PixelPerfectModel.getModel(); - ContentProvider contentProvider = new ContentProvider(); - mTreeViewer.setContentProvider(contentProvider); - mTreeViewer.setLabelProvider(contentProvider); - mTreeViewer.setInput(mModel); - mModel.addImageChangeListener(this); - - } - - private void loadResources() { - ImageLoader loader = ImageLoader.getDdmUiLibLoader(); - mFileImage = loader.loadImage("file.png", Display.getDefault()); - mFolderImage = loader.loadImage("folder.png", Display.getDefault()); - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - mModel.removeImageChangeListener(PixelPerfectTree.this); - } - }; - - @Override - public boolean setFocus() { - return mTree.setFocus(); - } - - @Override - public void imageLoaded() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - mTreeViewer.refresh(); - mTreeViewer.expandAll(); - } - }); - } - - @Override - public void imageChanged() { - // pass - } - - @Override - public void crosshairMoved() { - // pass - } - - @Override - public void selectionChanged() { - // pass - } - - @Override - public void treeChanged() { - imageLoaded(); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - // pass - } - - @Override - public void widgetSelected(SelectionEvent e) { - // To combat phantom selection... - if (((TreeSelection) mTreeViewer.getSelection()).isEmpty()) { - mModel.setSelected(null); - } else { - mModel.setSelected((ViewNode) e.item.getData()); - } - } - - @Override - public void zoomChanged() { - // pass - } - - @Override - public void overlayChanged() { - // pass - } - - @Override - public void overlayTransparencyChanged() { - // pass - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PropertyViewer.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PropertyViewer.java deleted file mode 100644 index 919d178..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/PropertyViewer.java +++ /dev/null @@ -1,289 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.hierarchyviewerlib.device.ViewNode; -import com.android.hierarchyviewerlib.device.ViewNode.Property; -import com.android.hierarchyviewerlib.models.TreeViewModel; -import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode; -import com.android.hierarchyviewerlib.ui.util.TreeColumnResizer; - -import org.eclipse.jface.viewers.ILabelProviderListener; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ControlAdapter; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.ControlListener; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -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.swt.widgets.Tree; -import org.eclipse.swt.widgets.TreeColumn; - -import java.util.ArrayList; - -public class PropertyViewer extends Composite implements ITreeChangeListener { - private TreeViewModel mModel; - - private TreeViewer mTreeViewer; - - private Tree mTree; - - private DrawableViewNode mSelectedNode; - - private class ContentProvider implements ITreeContentProvider, ITableLabelProvider { - - @Override - public Object[] getChildren(Object parentElement) { - synchronized (PropertyViewer.this) { - if (mSelectedNode != null && parentElement instanceof String) { - String category = (String) parentElement; - ArrayList<Property> returnValue = new ArrayList<Property>(); - for (Property property : mSelectedNode.viewNode.properties) { - if (category.equals(ViewNode.MISCELLANIOUS)) { - if (property.name.indexOf(':') == -1) { - returnValue.add(property); - } - } else { - if (property.name.startsWith(((String) parentElement) + ":")) { - returnValue.add(property); - } - } - } - return returnValue.toArray(new Property[returnValue.size()]); - } - return new Object[0]; - } - } - - @Override - public Object getParent(Object element) { - synchronized (PropertyViewer.this) { - if (mSelectedNode != null && element instanceof Property) { - if (mSelectedNode.viewNode.categories.size() == 0) { - return null; - } - String name = ((Property) element).name; - int index = name.indexOf(':'); - if (index == -1) { - return ViewNode.MISCELLANIOUS; - } - return name.substring(0, index); - } - return null; - } - } - - @Override - public boolean hasChildren(Object element) { - synchronized (PropertyViewer.this) { - if (mSelectedNode != null && element instanceof String) { - String category = (String) element; - for (String name : mSelectedNode.viewNode.namedProperties.keySet()) { - if (category.equals(ViewNode.MISCELLANIOUS)) { - if (name.indexOf(':') == -1) { - return true; - } - } else { - if (name.startsWith(((String) element) + ":")) { - return true; - } - } - } - } - return false; - } - } - - @Override - public Object[] getElements(Object inputElement) { - synchronized (PropertyViewer.this) { - if (mSelectedNode != null && inputElement instanceof TreeViewModel) { - if (mSelectedNode.viewNode.categories.size() == 0) { - return mSelectedNode.viewNode.properties - .toArray(new Property[mSelectedNode.viewNode.properties.size()]); - } else { - return mSelectedNode.viewNode.categories - .toArray(new String[mSelectedNode.viewNode.categories.size()]); - } - } - return new Object[0]; - } - } - - @Override - public void dispose() { - // pass - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - // pass - } - - @Override - public Image getColumnImage(Object element, int column) { - return null; - } - - @Override - public String getColumnText(Object element, int column) { - synchronized (PropertyViewer.this) { - if (mSelectedNode != null) { - if (element instanceof String && column == 0) { - String category = (String) element; - return Character.toUpperCase(category.charAt(0)) + category.substring(1); - } else if (element instanceof Property) { - if (column == 0) { - String returnValue = ((Property) element).name; - int index = returnValue.indexOf(':'); - if (index != -1) { - return returnValue.substring(index + 1); - } - return returnValue; - } else if (column == 1) { - return ((Property) element).value; - } - } - } - return ""; - } - } - - @Override - public void addListener(ILabelProviderListener listener) { - // pass - } - - @Override - public boolean isLabelProperty(Object element, String property) { - // pass - return false; - } - - @Override - public void removeListener(ILabelProviderListener listener) { - // pass - } - } - - public PropertyViewer(Composite parent) { - super(parent, SWT.NONE); - setLayout(new FillLayout()); - mTreeViewer = new TreeViewer(this, SWT.NONE); - - mTree = mTreeViewer.getTree(); - mTree.setLinesVisible(true); - mTree.setHeaderVisible(true); - - TreeColumn propertyColumn = new TreeColumn(mTree, SWT.NONE); - propertyColumn.setText("Property"); - TreeColumn valueColumn = new TreeColumn(mTree, SWT.NONE); - valueColumn.setText("Value"); - - mModel = TreeViewModel.getModel(); - ContentProvider contentProvider = new ContentProvider(); - mTreeViewer.setContentProvider(contentProvider); - mTreeViewer.setLabelProvider(contentProvider); - mTreeViewer.setInput(mModel); - mModel.addTreeChangeListener(this); - - addDisposeListener(mDisposeListener); - - new TreeColumnResizer(this, propertyColumn, valueColumn); - - addControlListener(mControlListener); - - treeChanged(); - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - mModel.removeTreeChangeListener(PropertyViewer.this); - } - }; - - // If the window gets too small, hide the data, otherwise SWT throws an - // ERROR. - - private ControlListener mControlListener = new ControlAdapter() { - private boolean noInput = false; - - private boolean noHeader = false; - - @Override - public void controlResized(ControlEvent e) { - if (getBounds().height <= 20) { - mTree.setHeaderVisible(false); - noHeader = true; - } else if (noHeader) { - mTree.setHeaderVisible(true); - noHeader = false; - } - if (getBounds().height <= 38) { - mTreeViewer.setInput(null); - noInput = true; - } else if (noInput) { - mTreeViewer.setInput(mModel); - noInput = false; - } - } - }; - - @Override - public void selectionChanged() { - synchronized (this) { - mSelectedNode = mModel.getSelection(); - } - doRefresh(); - } - - @Override - public void treeChanged() { - synchronized (this) { - mSelectedNode = mModel.getSelection(); - } - doRefresh(); - } - - @Override - public void viewportChanged() { - // pass - } - - @Override - public void zoomChanged() { - // pass - } - - private void doRefresh() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - mTreeViewer.refresh(); - } - }); - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/TreeView.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/TreeView.java deleted file mode 100644 index 9449ccc..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/TreeView.java +++ /dev/null @@ -1,1086 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.HierarchyViewerDirector; -import com.android.hierarchyviewerlib.device.ViewNode.ProfileRating; -import com.android.hierarchyviewerlib.models.TreeViewModel; -import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode.Point; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode.Rectangle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.MouseMoveListener; -import org.eclipse.swt.events.MouseWheelListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Path; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.graphics.Transform; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; - -import java.text.DecimalFormat; - -public class TreeView extends Canvas implements ITreeChangeListener { - - private TreeViewModel mModel; - - private DrawableViewNode mTree; - - private DrawableViewNode mSelectedNode; - - private Rectangle mViewport; - - private Transform mTransform; - - private Transform mInverse; - - private double mZoom; - - private Point mLastPoint; - - private boolean mAlreadySelectedOnMouseDown; - - private boolean mDoubleClicked; - - private boolean mNodeMoved; - - private DrawableViewNode mDraggedNode; - - public static final int LINE_PADDING = 10; - - public static final float BEZIER_FRACTION = 0.35f; - - private static Image sRedImage; - - private static Image sYellowImage; - - private static Image sGreenImage; - - private static Image sNotSelectedImage; - - private static Image sSelectedImage; - - private static Image sFilteredImage; - - private static Image sFilteredSelectedImage; - - private static Font sSystemFont; - - private Color mBoxColor; - - private Color mTextBackgroundColor; - - private Rectangle mSelectedRectangleLocation; - - private Point mButtonCenter; - - private static final int BUTTON_SIZE = 13; - - private Image mScaledSelectedImage; - - private boolean mButtonClicked; - - private DrawableViewNode mLastDrawnSelectedViewNode; - - // The profile-image box needs to be moved to, - // so add some dragging leeway. - private static final int DRAG_LEEWAY = 220; - - // Profile-image box constants - private static final int RECT_WIDTH = 190; - - private static final int RECT_HEIGHT = 224; - - private static final int BUTTON_RIGHT_OFFSET = 5; - - private static final int BUTTON_TOP_OFFSET = 5; - - private static final int IMAGE_WIDTH = 125; - - private static final int IMAGE_HEIGHT = 120; - - private static final int IMAGE_OFFSET = 6; - - private static final int IMAGE_ROUNDING = 8; - - private static final int RECTANGLE_SIZE = 5; - - private static final int TEXT_SIDE_OFFSET = 8; - - private static final int TEXT_TOP_OFFSET = 4; - - private static final int TEXT_SPACING = 2; - - private static final int TEXT_ROUNDING = 20; - - public TreeView(Composite parent) { - super(parent, SWT.NONE); - - mModel = TreeViewModel.getModel(); - mModel.addTreeChangeListener(this); - - addPaintListener(mPaintListener); - addMouseListener(mMouseListener); - addMouseMoveListener(mMouseMoveListener); - addMouseWheelListener(mMouseWheelListener); - addListener(SWT.Resize, mResizeListener); - addDisposeListener(mDisposeListener); - addKeyListener(mKeyListener); - - loadResources(); - - mTransform = new Transform(Display.getDefault()); - mInverse = new Transform(Display.getDefault()); - - loadAllData(); - } - - private void loadResources() { - ImageLoader loader = ImageLoader.getLoader(this.getClass()); - sRedImage = loader.loadImage("red.png", Display.getDefault()); //$NON-NLS-1$ - sYellowImage = loader.loadImage("yellow.png", Display.getDefault()); //$NON-NLS-1$ - sGreenImage = loader.loadImage("green.png", Display.getDefault()); //$NON-NLS-1$ - sNotSelectedImage = loader.loadImage("not-selected.png", Display.getDefault()); //$NON-NLS-1$ - sSelectedImage = loader.loadImage("selected.png", Display.getDefault()); //$NON-NLS-1$ - sFilteredImage = loader.loadImage("filtered.png", Display.getDefault()); //$NON-NLS-1$ - sFilteredSelectedImage = loader.loadImage("selected-filtered.png", Display.getDefault()); //$NON-NLS-1$ - mBoxColor = new Color(Display.getDefault(), new RGB(225, 225, 225)); - mTextBackgroundColor = new Color(Display.getDefault(), new RGB(82, 82, 82)); - if (mScaledSelectedImage != null) { - mScaledSelectedImage.dispose(); - } - sSystemFont = Display.getDefault().getSystemFont(); - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - mModel.removeTreeChangeListener(TreeView.this); - mTransform.dispose(); - mInverse.dispose(); - mBoxColor.dispose(); - mTextBackgroundColor.dispose(); - if (mTree != null) { - mModel.setViewport(null); - } - } - }; - - private Listener mResizeListener = new Listener() { - @Override - public void handleEvent(Event e) { - synchronized (TreeView.this) { - if (mTree != null && mViewport != null) { - - // Keep the center in the same place. - Point viewCenter = - new Point(mViewport.x + mViewport.width / 2, mViewport.y + mViewport.height - / 2); - mViewport.width = getBounds().width / mZoom; - mViewport.height = getBounds().height / mZoom; - mViewport.x = viewCenter.x - mViewport.width / 2; - mViewport.y = viewCenter.y - mViewport.height / 2; - } - } - if (mViewport != null) { - mModel.setViewport(mViewport); - } - } - }; - - private KeyListener mKeyListener = new KeyListener() { - - @Override - public void keyPressed(KeyEvent e) { - boolean selectionChanged = false; - DrawableViewNode clickedNode = null; - synchronized (TreeView.this) { - if (mTree != null && mViewport != null && mSelectedNode != null) { - switch (e.keyCode) { - case SWT.ARROW_LEFT: - if (mSelectedNode.parent != null) { - mSelectedNode = mSelectedNode.parent; - selectionChanged = true; - } - break; - case SWT.ARROW_UP: - - // On up and down, it is cool to go up and down only - // the leaf nodes. - // It goes well with the layout viewer - DrawableViewNode currentNode = mSelectedNode; - while (currentNode.parent != null && currentNode.viewNode.index == 0) { - currentNode = currentNode.parent; - } - if (currentNode.parent != null) { - selectionChanged = true; - currentNode = - currentNode.parent.children - .get(currentNode.viewNode.index - 1); - while (currentNode.children.size() != 0) { - currentNode = - currentNode.children - .get(currentNode.children.size() - 1); - } - } - if (selectionChanged) { - mSelectedNode = currentNode; - } - break; - case SWT.ARROW_DOWN: - currentNode = mSelectedNode; - while (currentNode.parent != null - && currentNode.viewNode.index + 1 == currentNode.parent.children - .size()) { - currentNode = currentNode.parent; - } - if (currentNode.parent != null) { - selectionChanged = true; - currentNode = - currentNode.parent.children - .get(currentNode.viewNode.index + 1); - while (currentNode.children.size() != 0) { - currentNode = currentNode.children.get(0); - } - } - if (selectionChanged) { - mSelectedNode = currentNode; - } - break; - case SWT.ARROW_RIGHT: - DrawableViewNode rightNode = null; - double mostOverlap = 0; - final int N = mSelectedNode.children.size(); - - // We consider all the children and pick the one - // who's tree overlaps the most. - for (int i = 0; i < N; i++) { - DrawableViewNode child = mSelectedNode.children.get(i); - DrawableViewNode topMostChild = child; - while (topMostChild.children.size() != 0) { - topMostChild = topMostChild.children.get(0); - } - double overlap = - Math.min(DrawableViewNode.NODE_HEIGHT, Math.min( - mSelectedNode.top + DrawableViewNode.NODE_HEIGHT - - topMostChild.top, topMostChild.top - + child.treeHeight - mSelectedNode.top)); - if (overlap > mostOverlap) { - mostOverlap = overlap; - rightNode = child; - } - } - if (rightNode != null) { - mSelectedNode = rightNode; - selectionChanged = true; - } - break; - case SWT.CR: - clickedNode = mSelectedNode; - break; - } - } - } - if (selectionChanged) { - mModel.setSelection(mSelectedNode); - } - if (clickedNode != null) { - HierarchyViewerDirector.getDirector().showCapture(getShell(), clickedNode.viewNode); - } - } - - @Override - public void keyReleased(KeyEvent e) { - } - }; - - private MouseListener mMouseListener = new MouseListener() { - - @Override - public void mouseDoubleClick(MouseEvent e) { - DrawableViewNode clickedNode = null; - synchronized (TreeView.this) { - if (mTree != null && mViewport != null) { - Point pt = transformPoint(e.x, e.y); - clickedNode = mTree.getSelected(pt.x, pt.y); - } - } - if (clickedNode != null) { - HierarchyViewerDirector.getDirector().showCapture(getShell(), clickedNode.viewNode); - mDoubleClicked = true; - } - } - - @Override - public void mouseDown(MouseEvent e) { - boolean selectionChanged = false; - synchronized (TreeView.this) { - if (mTree != null && mViewport != null) { - Point pt = transformPoint(e.x, e.y); - - // Ignore profiling rectangle, except for... - if (mSelectedRectangleLocation != null - && pt.x >= mSelectedRectangleLocation.x - && pt.x < mSelectedRectangleLocation.x - + mSelectedRectangleLocation.width - && pt.y >= mSelectedRectangleLocation.y - && pt.y < mSelectedRectangleLocation.y - + mSelectedRectangleLocation.height) { - - // the small button! - if ((pt.x - mButtonCenter.x) * (pt.x - mButtonCenter.x) - + (pt.y - mButtonCenter.y) * (pt.y - mButtonCenter.y) <= (BUTTON_SIZE * BUTTON_SIZE) / 4) { - mButtonClicked = true; - doRedraw(); - } - return; - } - mDraggedNode = mTree.getSelected(pt.x, pt.y); - - // Update the selection. - if (mDraggedNode != null && mDraggedNode != mSelectedNode) { - mSelectedNode = mDraggedNode; - selectionChanged = true; - mAlreadySelectedOnMouseDown = false; - } else if (mDraggedNode != null) { - mAlreadySelectedOnMouseDown = true; - } - - // Can't drag the root. - if (mDraggedNode == mTree) { - mDraggedNode = null; - } - - if (mDraggedNode != null) { - mLastPoint = pt; - } else { - mLastPoint = new Point(e.x, e.y); - } - mNodeMoved = false; - mDoubleClicked = false; - } - } - if (selectionChanged) { - mModel.setSelection(mSelectedNode); - } - } - - @Override - public void mouseUp(MouseEvent e) { - boolean redraw = false; - boolean redrawButton = false; - boolean viewportChanged = false; - boolean selectionChanged = false; - synchronized (TreeView.this) { - if (mTree != null && mViewport != null && mLastPoint != null) { - if (mDraggedNode == null) { - // The viewport moves. - handleMouseDrag(new Point(e.x, e.y)); - viewportChanged = true; - } else { - // The nodes move. - handleMouseDrag(transformPoint(e.x, e.y)); - } - - // Deselect on the second click... - // This is in the mouse up, because mouse up happens after a - // double click event. - // During a double click, we don't want to deselect. - Point pt = transformPoint(e.x, e.y); - DrawableViewNode mouseUpOn = mTree.getSelected(pt.x, pt.y); - if (mouseUpOn != null && mouseUpOn == mSelectedNode - && mAlreadySelectedOnMouseDown && !mNodeMoved && !mDoubleClicked) { - mSelectedNode = null; - selectionChanged = true; - } - mLastPoint = null; - mDraggedNode = null; - redraw = true; - } - - // Just clicked the button here. - if (mButtonClicked) { - HierarchyViewerDirector.getDirector().showCapture(getShell(), - mSelectedNode.viewNode); - mButtonClicked = false; - redrawButton = true; - } - } - - // Complicated. - if (viewportChanged) { - mModel.setViewport(mViewport); - } else if (redraw) { - mModel.removeTreeChangeListener(TreeView.this); - mModel.notifyViewportChanged(); - if (selectionChanged) { - mModel.setSelection(mSelectedNode); - } - mModel.addTreeChangeListener(TreeView.this); - doRedraw(); - } else if (redrawButton) { - doRedraw(); - } - } - - }; - - private MouseMoveListener mMouseMoveListener = new MouseMoveListener() { - @Override - public void mouseMove(MouseEvent e) { - boolean redraw = false; - boolean viewportChanged = false; - synchronized (TreeView.this) { - if (mTree != null && mViewport != null && mLastPoint != null) { - if (mDraggedNode == null) { - handleMouseDrag(new Point(e.x, e.y)); - viewportChanged = true; - } else { - handleMouseDrag(transformPoint(e.x, e.y)); - } - redraw = true; - } - } - if (viewportChanged) { - mModel.setViewport(mViewport); - } else if (redraw) { - mModel.removeTreeChangeListener(TreeView.this); - mModel.notifyViewportChanged(); - mModel.addTreeChangeListener(TreeView.this); - doRedraw(); - } - } - }; - - private void handleMouseDrag(Point pt) { - - // Case 1: a node is dragged. DrawableViewNode knows how to handle this. - if (mDraggedNode != null) { - if (mLastPoint.y - pt.y != 0) { - mNodeMoved = true; - } - mDraggedNode.move(mLastPoint.y - pt.y); - mLastPoint = pt; - return; - } - - // Case 2: the viewport is dragged. We have to make sure we respect the - // bounds - don't let the user drag way out... + some leeway for the - // profiling box. - double xDif = (mLastPoint.x - pt.x) / mZoom; - double yDif = (mLastPoint.y - pt.y) / mZoom; - - double treeX = mTree.bounds.x - DRAG_LEEWAY; - double treeY = mTree.bounds.y - DRAG_LEEWAY; - double treeWidth = mTree.bounds.width + 2 * DRAG_LEEWAY; - double treeHeight = mTree.bounds.height + 2 * DRAG_LEEWAY; - - if (mViewport.width > treeWidth) { - if (xDif < 0 && mViewport.x + mViewport.width > treeX + treeWidth) { - mViewport.x = Math.max(mViewport.x + xDif, treeX + treeWidth - mViewport.width); - } else if (xDif > 0 && mViewport.x < treeX) { - mViewport.x = Math.min(mViewport.x + xDif, treeX); - } - } else { - if (xDif < 0 && mViewport.x > treeX) { - mViewport.x = Math.max(mViewport.x + xDif, treeX); - } else if (xDif > 0 && mViewport.x + mViewport.width < treeX + treeWidth) { - mViewport.x = Math.min(mViewport.x + xDif, treeX + treeWidth - mViewport.width); - } - } - if (mViewport.height > treeHeight) { - if (yDif < 0 && mViewport.y + mViewport.height > treeY + treeHeight) { - mViewport.y = Math.max(mViewport.y + yDif, treeY + treeHeight - mViewport.height); - } else if (yDif > 0 && mViewport.y < treeY) { - mViewport.y = Math.min(mViewport.y + yDif, treeY); - } - } else { - if (yDif < 0 && mViewport.y > treeY) { - mViewport.y = Math.max(mViewport.y + yDif, treeY); - } else if (yDif > 0 && mViewport.y + mViewport.height < treeY + treeHeight) { - mViewport.y = Math.min(mViewport.y + yDif, treeY + treeHeight - mViewport.height); - } - } - mLastPoint = pt; - } - - private Point transformPoint(double x, double y) { - float[] pt = { - (float) x, (float) y - }; - mInverse.transform(pt); - return new Point(pt[0], pt[1]); - } - - private MouseWheelListener mMouseWheelListener = new MouseWheelListener() { - @Override - public void mouseScrolled(MouseEvent e) { - Point zoomPoint = null; - synchronized (TreeView.this) { - if (mTree != null && mViewport != null) { - mZoom += Math.ceil(e.count / 3.0) * 0.1; - zoomPoint = transformPoint(e.x, e.y); - } - } - if (zoomPoint != null) { - mModel.zoomOnPoint(mZoom, zoomPoint); - } - } - }; - - private PaintListener mPaintListener = new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - synchronized (TreeView.this) { - e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); - e.gc.fillRectangle(0, 0, getBounds().width, getBounds().height); - if (mTree != null && mViewport != null) { - - // Easy stuff! - e.gc.setTransform(mTransform); - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); - Path connectionPath = new Path(Display.getDefault()); - paintRecursive(e.gc, mTransform, mTree, mSelectedNode, connectionPath); - e.gc.drawPath(connectionPath); - connectionPath.dispose(); - - // Draw the profiling box. - if (mSelectedNode != null) { - - e.gc.setAlpha(200); - - // Draw the little triangle - int x = mSelectedNode.left + DrawableViewNode.NODE_WIDTH / 2; - int y = (int) mSelectedNode.top + 4; - e.gc.setBackground(mBoxColor); - e.gc.fillPolygon(new int[] { - x, y, x - 11, y - 11, x + 11, y - 11 - }); - - // Draw the rectangle and update the location. - y -= 10 + RECT_HEIGHT; - e.gc.fillRoundRectangle(x - RECT_WIDTH / 2, y, RECT_WIDTH, RECT_HEIGHT, 30, - 30); - mSelectedRectangleLocation = - new Rectangle(x - RECT_WIDTH / 2, y, RECT_WIDTH, RECT_HEIGHT); - - e.gc.setAlpha(255); - - // Draw the button - mButtonCenter = - new Point(x - BUTTON_RIGHT_OFFSET + (RECT_WIDTH - BUTTON_SIZE) / 2, - y + BUTTON_TOP_OFFSET + BUTTON_SIZE / 2); - - if (mButtonClicked) { - e.gc - .setBackground(Display.getDefault().getSystemColor( - SWT.COLOR_BLACK)); - } else { - e.gc.setBackground(mTextBackgroundColor); - - } - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); - - e.gc.fillOval(x + RECT_WIDTH / 2 - BUTTON_RIGHT_OFFSET - BUTTON_SIZE, y - + BUTTON_TOP_OFFSET, BUTTON_SIZE, BUTTON_SIZE); - - e.gc.drawRectangle(x - BUTTON_RIGHT_OFFSET - + (RECT_WIDTH - BUTTON_SIZE - RECTANGLE_SIZE) / 2 - 1, y - + BUTTON_TOP_OFFSET + (BUTTON_SIZE - RECTANGLE_SIZE) / 2, - RECTANGLE_SIZE + 1, RECTANGLE_SIZE); - - y += 15; - - // If there is an image, draw it. - if (mSelectedNode.viewNode.image != null - && mSelectedNode.viewNode.image.getBounds().height != 1 - && mSelectedNode.viewNode.image.getBounds().width != 1) { - - // Scaling the image to the right size takes lots of - // time, so we want to do it only once. - - // If the selection changed, get rid of the old - // image. - if (mLastDrawnSelectedViewNode != mSelectedNode) { - if (mScaledSelectedImage != null) { - mScaledSelectedImage.dispose(); - mScaledSelectedImage = null; - } - mLastDrawnSelectedViewNode = mSelectedNode; - } - - if (mScaledSelectedImage == null) { - double ratio = - 1.0 * mSelectedNode.viewNode.image.getBounds().width - / mSelectedNode.viewNode.image.getBounds().height; - int newWidth, newHeight; - if (ratio > 1.0 * IMAGE_WIDTH / IMAGE_HEIGHT) { - newWidth = - Math.min(IMAGE_WIDTH, mSelectedNode.viewNode.image - .getBounds().width); - newHeight = (int) (newWidth / ratio); - } else { - newHeight = - Math.min(IMAGE_HEIGHT, mSelectedNode.viewNode.image - .getBounds().height); - newWidth = (int) (newHeight * ratio); - } - - // Interesting note... We make the image twice - // the needed size so that there is better - // resolution under zoom. - newWidth = Math.max(newWidth * 2, 1); - newHeight = Math.max(newHeight * 2, 1); - mScaledSelectedImage = - new Image(Display.getDefault(), newWidth, newHeight); - GC gc = new GC(mScaledSelectedImage); - gc.setBackground(mTextBackgroundColor); - gc.fillRectangle(0, 0, newWidth, newHeight); - gc.drawImage(mSelectedNode.viewNode.image, 0, 0, - mSelectedNode.viewNode.image.getBounds().width, - mSelectedNode.viewNode.image.getBounds().height, 0, 0, - newWidth, newHeight); - gc.dispose(); - } - - // Draw the background rectangle - e.gc.setBackground(mTextBackgroundColor); - e.gc.fillRoundRectangle(x - mScaledSelectedImage.getBounds().width / 4 - - IMAGE_OFFSET, y - + (IMAGE_HEIGHT - mScaledSelectedImage.getBounds().height / 2) - / 2 - IMAGE_OFFSET, mScaledSelectedImage.getBounds().width / 2 - + 2 * IMAGE_OFFSET, mScaledSelectedImage.getBounds().height / 2 - + 2 * IMAGE_OFFSET, IMAGE_ROUNDING, IMAGE_ROUNDING); - - // Under max zoom, we want the image to be - // untransformed. So, get back to the identity - // transform. - int imageX = x - mScaledSelectedImage.getBounds().width / 4; - int imageY = - y - + (IMAGE_HEIGHT - mScaledSelectedImage.getBounds().height / 2) - / 2; - - Transform untransformedTransform = new Transform(Display.getDefault()); - e.gc.setTransform(untransformedTransform); - float[] pt = new float[] { - imageX, imageY - }; - mTransform.transform(pt); - e.gc.drawImage(mScaledSelectedImage, 0, 0, mScaledSelectedImage - .getBounds().width, mScaledSelectedImage.getBounds().height, - (int) pt[0], (int) pt[1], (int) (mScaledSelectedImage - .getBounds().width - * mZoom / 2), - (int) (mScaledSelectedImage.getBounds().height * mZoom / 2)); - untransformedTransform.dispose(); - e.gc.setTransform(mTransform); - } - - // Text stuff - - y += IMAGE_HEIGHT; - y += 10; - Font font = getFont(8, false); - e.gc.setFont(font); - - String text = - mSelectedNode.viewNode.viewCount + " view" - + (mSelectedNode.viewNode.viewCount != 1 ? "s" : ""); - DecimalFormat formatter = new DecimalFormat("0.000"); - - String measureText = - "Measure: " - + (mSelectedNode.viewNode.measureTime != -1 ? formatter - .format(mSelectedNode.viewNode.measureTime) - + " ms" : "n/a"); - String layoutText = - "Layout: " - + (mSelectedNode.viewNode.layoutTime != -1 ? formatter - .format(mSelectedNode.viewNode.layoutTime) - + " ms" : "n/a"); - String drawText = - "Draw: " - + (mSelectedNode.viewNode.drawTime != -1 ? formatter - .format(mSelectedNode.viewNode.drawTime) - + " ms" : "n/a"); - - org.eclipse.swt.graphics.Point titleExtent = e.gc.stringExtent(text); - org.eclipse.swt.graphics.Point measureExtent = - e.gc.stringExtent(measureText); - org.eclipse.swt.graphics.Point layoutExtent = e.gc.stringExtent(layoutText); - org.eclipse.swt.graphics.Point drawExtent = e.gc.stringExtent(drawText); - int boxWidth = - Math.max(titleExtent.x, Math.max(measureExtent.x, Math.max( - layoutExtent.x, drawExtent.x))) - + 2 * TEXT_SIDE_OFFSET; - int boxHeight = - titleExtent.y + TEXT_SPACING + measureExtent.y + TEXT_SPACING - + layoutExtent.y + TEXT_SPACING + drawExtent.y + 2 - * TEXT_TOP_OFFSET; - - e.gc.setBackground(mTextBackgroundColor); - e.gc.fillRoundRectangle(x - boxWidth / 2, y, boxWidth, boxHeight, - TEXT_ROUNDING, TEXT_ROUNDING); - - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); - - y += TEXT_TOP_OFFSET; - - e.gc.drawText(text, x - titleExtent.x / 2, y, true); - - x -= boxWidth / 2; - x += TEXT_SIDE_OFFSET; - - y += titleExtent.y + TEXT_SPACING; - - e.gc.drawText(measureText, x, y, true); - - y += measureExtent.y + TEXT_SPACING; - - e.gc.drawText(layoutText, x, y, true); - - y += layoutExtent.y + TEXT_SPACING; - - e.gc.drawText(drawText, x, y, true); - - font.dispose(); - } else { - mSelectedRectangleLocation = null; - mButtonCenter = null; - } - } - } - } - }; - - private static void paintRecursive(GC gc, Transform transform, DrawableViewNode node, - DrawableViewNode selectedNode, Path connectionPath) { - if (selectedNode == node && node.viewNode.filtered) { - gc.drawImage(sFilteredSelectedImage, node.left, (int) Math.round(node.top)); - } else if (selectedNode == node) { - gc.drawImage(sSelectedImage, node.left, (int) Math.round(node.top)); - } else if (node.viewNode.filtered) { - gc.drawImage(sFilteredImage, node.left, (int) Math.round(node.top)); - } else { - gc.drawImage(sNotSelectedImage, node.left, (int) Math.round(node.top)); - } - - int fontHeight = gc.getFontMetrics().getHeight(); - - // Draw the text... - int contentWidth = - DrawableViewNode.NODE_WIDTH - 2 * DrawableViewNode.CONTENT_LEFT_RIGHT_PADDING; - String name = node.viewNode.name; - int dotIndex = name.lastIndexOf('.'); - if (dotIndex != -1) { - name = name.substring(dotIndex + 1); - } - double x = node.left + DrawableViewNode.CONTENT_LEFT_RIGHT_PADDING; - double y = node.top + DrawableViewNode.CONTENT_TOP_BOTTOM_PADDING; - drawTextInArea(gc, transform, name, x, y, contentWidth, fontHeight, 10, true); - - y += fontHeight + DrawableViewNode.CONTENT_INTER_PADDING; - - drawTextInArea(gc, transform, "@" + node.viewNode.hashCode, x, y, contentWidth, fontHeight, - 8, false); - - y += fontHeight + DrawableViewNode.CONTENT_INTER_PADDING; - if (!node.viewNode.id.equals("NO_ID")) { - drawTextInArea(gc, transform, node.viewNode.id, x, y, contentWidth, fontHeight, 8, - false); - } - - if (node.viewNode.measureRating != ProfileRating.NONE) { - y = - node.top + DrawableViewNode.NODE_HEIGHT - - DrawableViewNode.CONTENT_TOP_BOTTOM_PADDING - - sRedImage.getBounds().height; - x += - (contentWidth - (sRedImage.getBounds().width * 3 + 2 * DrawableViewNode.CONTENT_INTER_PADDING)) / 2; - switch (node.viewNode.measureRating) { - case GREEN: - gc.drawImage(sGreenImage, (int) x, (int) y); - break; - case YELLOW: - gc.drawImage(sYellowImage, (int) x, (int) y); - break; - case RED: - gc.drawImage(sRedImage, (int) x, (int) y); - break; - } - - x += sRedImage.getBounds().width + DrawableViewNode.CONTENT_INTER_PADDING; - switch (node.viewNode.layoutRating) { - case GREEN: - gc.drawImage(sGreenImage, (int) x, (int) y); - break; - case YELLOW: - gc.drawImage(sYellowImage, (int) x, (int) y); - break; - case RED: - gc.drawImage(sRedImage, (int) x, (int) y); - break; - } - - x += sRedImage.getBounds().width + DrawableViewNode.CONTENT_INTER_PADDING; - switch (node.viewNode.drawRating) { - case GREEN: - gc.drawImage(sGreenImage, (int) x, (int) y); - break; - case YELLOW: - gc.drawImage(sYellowImage, (int) x, (int) y); - break; - case RED: - gc.drawImage(sRedImage, (int) x, (int) y); - break; - } - } - - org.eclipse.swt.graphics.Point indexExtent = - gc.stringExtent(Integer.toString(node.viewNode.index)); - x = - node.left + DrawableViewNode.NODE_WIDTH - DrawableViewNode.INDEX_PADDING - - indexExtent.x; - y = - node.top + DrawableViewNode.NODE_HEIGHT - DrawableViewNode.INDEX_PADDING - - indexExtent.y; - gc.drawText(Integer.toString(node.viewNode.index), (int) x, (int) y, SWT.DRAW_TRANSPARENT); - - int N = node.children.size(); - if (N == 0) { - return; - } - float childSpacing = (1.0f * (DrawableViewNode.NODE_HEIGHT - 2 * LINE_PADDING)) / N; - for (int i = 0; i < N; i++) { - DrawableViewNode child = node.children.get(i); - paintRecursive(gc, transform, child, selectedNode, connectionPath); - float x1 = node.left + DrawableViewNode.NODE_WIDTH; - float y1 = (float) node.top + LINE_PADDING + childSpacing * i + childSpacing / 2; - float x2 = child.left; - float y2 = (float) child.top + DrawableViewNode.NODE_HEIGHT / 2.0f; - float cx1 = x1 + BEZIER_FRACTION * DrawableViewNode.PARENT_CHILD_SPACING; - float cy1 = y1; - float cx2 = x2 - BEZIER_FRACTION * DrawableViewNode.PARENT_CHILD_SPACING; - float cy2 = y2; - connectionPath.moveTo(x1, y1); - connectionPath.cubicTo(cx1, cy1, cx2, cy2, x2, y2); - } - } - - private static void drawTextInArea(GC gc, Transform transform, String text, double x, double y, - double width, double height, int fontSize, boolean bold) { - - Font oldFont = gc.getFont(); - - Font newFont = getFont(fontSize, bold); - gc.setFont(newFont); - - org.eclipse.swt.graphics.Point extent = gc.stringExtent(text); - - if (extent.x > width) { - // Oh no... we need to scale it. - double scale = width / extent.x; - float[] transformElements = new float[6]; - transform.getElements(transformElements); - transform.scale((float) scale, (float) scale); - gc.setTransform(transform); - - x /= scale; - y /= scale; - y += (extent.y / scale - extent.y) / 2; - - gc.drawText(text, (int) x, (int) y, SWT.DRAW_TRANSPARENT); - - transform.setElements(transformElements[0], transformElements[1], transformElements[2], - transformElements[3], transformElements[4], transformElements[5]); - gc.setTransform(transform); - } else { - gc.drawText(text, (int) (x + (width - extent.x) / 2), - (int) (y + (height - extent.y) / 2), SWT.DRAW_TRANSPARENT); - } - gc.setFont(oldFont); - newFont.dispose(); - - } - - public static Image paintToImage(DrawableViewNode tree) { - Image image = - new Image(Display.getDefault(), (int) Math.ceil(tree.bounds.width), (int) Math - .ceil(tree.bounds.height)); - - Transform transform = new Transform(Display.getDefault()); - transform.identity(); - transform.translate((float) -tree.bounds.x, (float) -tree.bounds.y); - Path connectionPath = new Path(Display.getDefault()); - GC gc = new GC(image); - - // Can't use Display.getDefault().getSystemColor in a non-UI thread. - Color white = new Color(Display.getDefault(), 255, 255, 255); - Color black = new Color(Display.getDefault(), 0, 0, 0); - gc.setForeground(white); - gc.setBackground(black); - gc.fillRectangle(0, 0, image.getBounds().width, image.getBounds().height); - gc.setTransform(transform); - paintRecursive(gc, transform, tree, null, connectionPath); - gc.drawPath(connectionPath); - gc.dispose(); - connectionPath.dispose(); - white.dispose(); - black.dispose(); - return image; - } - - private static Font getFont(int size, boolean bold) { - FontData[] fontData = sSystemFont.getFontData(); - for (int i = 0; i < fontData.length; i++) { - fontData[i].setHeight(size); - if (bold) { - fontData[i].setStyle(SWT.BOLD); - } - } - return new Font(Display.getDefault(), fontData); - } - - private void doRedraw() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - redraw(); - } - }); - } - - public void loadAllData() { - boolean newViewport = mViewport == null; - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - mTree = mModel.getTree(); - mSelectedNode = mModel.getSelection(); - mViewport = mModel.getViewport(); - mZoom = mModel.getZoom(); - if (mTree != null && mViewport == null) { - mViewport = - new Rectangle(0, mTree.top + DrawableViewNode.NODE_HEIGHT / 2 - - getBounds().height / 2, getBounds().width, - getBounds().height); - } else { - setTransform(); - } - } - } - }); - if (newViewport) { - mModel.setViewport(mViewport); - } - } - - // Fickle behaviour... When a new tree is loaded, the model doesn't know - // about the viewport until it passes through here. - @Override - public void treeChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - mTree = mModel.getTree(); - mSelectedNode = mModel.getSelection(); - if (mTree == null) { - mViewport = null; - } else { - mViewport = - new Rectangle(0, mTree.top + DrawableViewNode.NODE_HEIGHT / 2 - - getBounds().height / 2, getBounds().width, - getBounds().height); - } - } - } - }); - if (mViewport != null) { - mModel.setViewport(mViewport); - } else { - doRedraw(); - } - } - - private void setTransform() { - if (mViewport != null && mTree != null) { - // Set the transform. - mTransform.identity(); - mInverse.identity(); - - mTransform.scale((float) mZoom, (float) mZoom); - mInverse.scale((float) mZoom, (float) mZoom); - mTransform.translate((float) -mViewport.x, (float) -mViewport.y); - mInverse.translate((float) -mViewport.x, (float) -mViewport.y); - mInverse.invert(); - } - } - - // Note the syncExec and then synchronized... It avoids deadlock - @Override - public void viewportChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - mViewport = mModel.getViewport(); - mZoom = mModel.getZoom(); - setTransform(); - } - } - }); - doRedraw(); - } - - @Override - public void zoomChanged() { - viewportChanged(); - } - - @Override - public void selectionChanged() { - synchronized (this) { - mSelectedNode = mModel.getSelection(); - if (mSelectedNode != null && mSelectedNode.viewNode.image == null) { - HierarchyViewerDirector.getDirector() - .loadCaptureInBackground(mSelectedNode.viewNode); - } - } - doRedraw(); - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/TreeViewControls.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/TreeViewControls.java deleted file mode 100644 index fc03f13..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/TreeViewControls.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.hierarchyviewerlib.HierarchyViewerDirector; -import com.android.hierarchyviewerlib.models.TreeViewModel; -import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -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.swt.widgets.Label; -import org.eclipse.swt.widgets.Slider; -import org.eclipse.swt.widgets.Text; - -public class TreeViewControls extends Composite implements ITreeChangeListener { - - private Text mFilterText; - - private Slider mZoomSlider; - - public TreeViewControls(Composite parent) { - super(parent, SWT.NONE); - GridLayout layout = new GridLayout(5, false); - layout.marginWidth = layout.marginHeight = 2; - layout.verticalSpacing = layout.horizontalSpacing = 4; - setLayout(layout); - - Label filterLabel = new Label(this, SWT.NONE); - filterLabel.setText("Filter by class or id:"); - filterLabel.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, true)); - - mFilterText = new Text(this, SWT.LEFT | SWT.SINGLE); - mFilterText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - mFilterText.addModifyListener(mFilterTextModifyListener); - mFilterText.setText(HierarchyViewerDirector.getDirector().getFilterText()); - - Label smallZoomLabel = new Label(this, SWT.NONE); - smallZoomLabel.setText(" 20%"); - smallZoomLabel - .setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, true)); - - mZoomSlider = new Slider(this, SWT.HORIZONTAL); - GridData zoomSliderGridData = new GridData(GridData.CENTER, GridData.CENTER, false, false); - zoomSliderGridData.widthHint = 190; - mZoomSlider.setLayoutData(zoomSliderGridData); - mZoomSlider.setMinimum((int) (TreeViewModel.MIN_ZOOM * 10)); - mZoomSlider.setMaximum((int) (TreeViewModel.MAX_ZOOM * 10 + 1)); - mZoomSlider.setThumb(1); - mZoomSlider.setSelection((int) Math.round(TreeViewModel.getModel().getZoom() * 10)); - - mZoomSlider.addSelectionListener(mZoomSliderSelectionListener); - - Label largeZoomLabel = new Label(this, SWT.NONE); - largeZoomLabel - .setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, true)); - largeZoomLabel.setText("200%"); - - addDisposeListener(mDisposeListener); - - TreeViewModel.getModel().addTreeChangeListener(this); - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - TreeViewModel.getModel().removeTreeChangeListener(TreeViewControls.this); - } - }; - - private SelectionListener mZoomSliderSelectionListener = new SelectionListener() { - private int oldValue; - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - // pass - } - - @Override - public void widgetSelected(SelectionEvent e) { - int newValue = mZoomSlider.getSelection(); - if (oldValue != newValue) { - TreeViewModel.getModel().removeTreeChangeListener(TreeViewControls.this); - TreeViewModel.getModel().setZoom(newValue / 10.0); - TreeViewModel.getModel().addTreeChangeListener(TreeViewControls.this); - oldValue = newValue; - } - } - }; - - private ModifyListener mFilterTextModifyListener = new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - HierarchyViewerDirector.getDirector().filterNodes(mFilterText.getText()); - } - }; - - @Override - public void selectionChanged() { - // pass - } - - @Override - public void treeChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - if (TreeViewModel.getModel().getTree() != null) { - mZoomSlider.setSelection((int) Math - .round(TreeViewModel.getModel().getZoom() * 10)); - } - mFilterText.setText(""); //$NON-NLS-1$ - } - }); - } - - @Override - public void viewportChanged() { - // pass - } - - @Override - public void zoomChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - mZoomSlider.setSelection((int) Math.round(TreeViewModel.getModel().getZoom() * 10)); - } - }); - }; -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/TreeViewOverview.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/TreeViewOverview.java deleted file mode 100644 index bbff48c..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/TreeViewOverview.java +++ /dev/null @@ -1,397 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui; - -import com.android.ddmuilib.ImageLoader; -import com.android.hierarchyviewerlib.models.TreeViewModel; -import com.android.hierarchyviewerlib.models.TreeViewModel.ITreeChangeListener; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode.Point; -import com.android.hierarchyviewerlib.ui.util.DrawableViewNode.Rectangle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.MouseMoveListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Path; -import org.eclipse.swt.graphics.Transform; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; - -public class TreeViewOverview extends Canvas implements ITreeChangeListener { - - private TreeViewModel mModel; - - private DrawableViewNode mTree; - - private Rectangle mViewport; - - private Transform mTransform; - - private Transform mInverse; - - private Rectangle mBounds = new Rectangle(); - - private double mScale; - - private boolean mDragging = false; - - private DrawableViewNode mSelectedNode; - - private static Image sNotSelectedImage; - - private static Image sSelectedImage; - - private static Image sFilteredImage; - - private static Image sFilteredSelectedImage; - - public TreeViewOverview(Composite parent) { - super(parent, SWT.NONE); - - mModel = TreeViewModel.getModel(); - mModel.addTreeChangeListener(this); - - loadResources(); - - addPaintListener(mPaintListener); - addMouseListener(mMouseListener); - addMouseMoveListener(mMouseMoveListener); - addListener(SWT.Resize, mResizeListener); - addDisposeListener(mDisposeListener); - - mTransform = new Transform(Display.getDefault()); - mInverse = new Transform(Display.getDefault()); - - loadAllData(); - } - - private void loadResources() { - ImageLoader loader = ImageLoader.getLoader(this.getClass()); - sNotSelectedImage = loader.loadImage("not-selected.png", Display.getDefault()); //$NON-NLS-1$ - sSelectedImage = loader.loadImage("selected-small.png", Display.getDefault()); //$NON-NLS-1$ - sFilteredImage = loader.loadImage("filtered.png", Display.getDefault()); //$NON-NLS-1$ - sFilteredSelectedImage = - loader.loadImage("selected-filtered-small.png", Display.getDefault()); //$NON-NLS-1$ - } - - private DisposeListener mDisposeListener = new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - mModel.removeTreeChangeListener(TreeViewOverview.this); - mTransform.dispose(); - mInverse.dispose(); - } - }; - - private MouseListener mMouseListener = new MouseListener() { - - @Override - public void mouseDoubleClick(MouseEvent e) { - // pass - } - - @Override - public void mouseDown(MouseEvent e) { - boolean redraw = false; - synchronized (TreeViewOverview.this) { - if (mTree != null && mViewport != null) { - mDragging = true; - redraw = true; - handleMouseEvent(transformPoint(e.x, e.y)); - } - } - if (redraw) { - mModel.removeTreeChangeListener(TreeViewOverview.this); - mModel.setViewport(mViewport); - mModel.addTreeChangeListener(TreeViewOverview.this); - doRedraw(); - } - } - - @Override - public void mouseUp(MouseEvent e) { - boolean redraw = false; - synchronized (TreeViewOverview.this) { - if (mTree != null && mViewport != null) { - mDragging = false; - redraw = true; - handleMouseEvent(transformPoint(e.x, e.y)); - - // Update bounds and transform only on mouse up. That way, - // you don't get confusing behaviour during mouse drag and - // it snaps neatly at the end - setBounds(); - setTransform(); - } - } - if (redraw) { - mModel.removeTreeChangeListener(TreeViewOverview.this); - mModel.setViewport(mViewport); - mModel.addTreeChangeListener(TreeViewOverview.this); - doRedraw(); - } - } - - }; - - private MouseMoveListener mMouseMoveListener = new MouseMoveListener() { - @Override - public void mouseMove(MouseEvent e) { - boolean moved = false; - synchronized (TreeViewOverview.this) { - if (mDragging) { - moved = true; - handleMouseEvent(transformPoint(e.x, e.y)); - } - } - if (moved) { - mModel.removeTreeChangeListener(TreeViewOverview.this); - mModel.setViewport(mViewport); - mModel.addTreeChangeListener(TreeViewOverview.this); - doRedraw(); - } - } - }; - - private void handleMouseEvent(Point pt) { - mViewport.x = pt.x - mViewport.width / 2; - mViewport.y = pt.y - mViewport.height / 2; - if (mViewport.x < mBounds.x) { - mViewport.x = mBounds.x; - } - if (mViewport.y < mBounds.y) { - mViewport.y = mBounds.y; - } - if (mViewport.x + mViewport.width > mBounds.x + mBounds.width) { - mViewport.x = mBounds.x + mBounds.width - mViewport.width; - } - if (mViewport.y + mViewport.height > mBounds.y + mBounds.height) { - mViewport.y = mBounds.y + mBounds.height - mViewport.height; - } - } - - private Point transformPoint(double x, double y) { - float[] pt = { - (float) x, (float) y - }; - mInverse.transform(pt); - return new Point(pt[0], pt[1]); - } - - private Listener mResizeListener = new Listener() { - @Override - public void handleEvent(Event arg0) { - synchronized (TreeViewOverview.this) { - setTransform(); - } - doRedraw(); - } - }; - - private PaintListener mPaintListener = new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - synchronized (TreeViewOverview.this) { - if (mTree != null) { - e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK)); - e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); - e.gc.fillRectangle(0, 0, getBounds().width, getBounds().height); - e.gc.setTransform(mTransform); - e.gc.setLineWidth((int) Math.ceil(0.7 / mScale)); - Path connectionPath = new Path(Display.getDefault()); - paintRecursive(e.gc, mTree, connectionPath); - e.gc.drawPath(connectionPath); - connectionPath.dispose(); - - if (mViewport != null) { - e.gc.setAlpha(50); - e.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE)); - e.gc.fillRectangle((int) mViewport.x, (int) mViewport.y, (int) Math - .ceil(mViewport.width), (int) Math.ceil(mViewport.height)); - - e.gc.setAlpha(255); - e.gc - .setForeground(Display.getDefault().getSystemColor( - SWT.COLOR_DARK_GRAY)); - e.gc.setLineWidth((int) Math.ceil(2 / mScale)); - e.gc.drawRectangle((int) mViewport.x, (int) mViewport.y, (int) Math - .ceil(mViewport.width), (int) Math.ceil(mViewport.height)); - } - } - } - } - }; - - private void paintRecursive(GC gc, DrawableViewNode node, Path connectionPath) { - if (mSelectedNode == node && node.viewNode.filtered) { - gc.drawImage(sFilteredSelectedImage, node.left, (int) Math.round(node.top)); - } else if (mSelectedNode == node) { - gc.drawImage(sSelectedImage, node.left, (int) Math.round(node.top)); - } else if (node.viewNode.filtered) { - gc.drawImage(sFilteredImage, node.left, (int) Math.round(node.top)); - } else { - gc.drawImage(sNotSelectedImage, node.left, (int) Math.round(node.top)); - } - int N = node.children.size(); - if (N == 0) { - return; - } - float childSpacing = - (1.0f * (DrawableViewNode.NODE_HEIGHT - 2 * TreeView.LINE_PADDING)) / N; - for (int i = 0; i < N; i++) { - DrawableViewNode child = node.children.get(i); - paintRecursive(gc, child, connectionPath); - float x1 = node.left + DrawableViewNode.NODE_WIDTH; - float y1 = - (float) node.top + TreeView.LINE_PADDING + childSpacing * i + childSpacing / 2; - float x2 = child.left; - float y2 = (float) child.top + DrawableViewNode.NODE_HEIGHT / 2.0f; - float cx1 = x1 + TreeView.BEZIER_FRACTION * DrawableViewNode.PARENT_CHILD_SPACING; - float cy1 = y1; - float cx2 = x2 - TreeView.BEZIER_FRACTION * DrawableViewNode.PARENT_CHILD_SPACING; - float cy2 = y2; - connectionPath.moveTo(x1, y1); - connectionPath.cubicTo(cx1, cy1, cx2, cy2, x2, y2); - } - } - - private void doRedraw() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - redraw(); - } - }); - } - - public void loadAllData() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - mTree = mModel.getTree(); - mSelectedNode = mModel.getSelection(); - mViewport = mModel.getViewport(); - setBounds(); - setTransform(); - } - } - }); - } - - // Note the syncExec and then synchronized... It avoids deadlock - @Override - public void treeChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - mTree = mModel.getTree(); - mSelectedNode = mModel.getSelection(); - mViewport = mModel.getViewport(); - setBounds(); - setTransform(); - } - } - }); - doRedraw(); - } - - private void setBounds() { - if (mViewport != null && mTree != null) { - mBounds.x = Math.min(mViewport.x, mTree.bounds.x); - mBounds.y = Math.min(mViewport.y, mTree.bounds.y); - mBounds.width = - Math.max(mViewport.x + mViewport.width, mTree.bounds.x + mTree.bounds.width) - - mBounds.x; - mBounds.height = - Math.max(mViewport.y + mViewport.height, mTree.bounds.y + mTree.bounds.height) - - mBounds.y; - } else if (mTree != null) { - mBounds.x = mTree.bounds.x; - mBounds.y = mTree.bounds.y; - mBounds.width = mTree.bounds.x + mTree.bounds.width - mBounds.x; - mBounds.height = mTree.bounds.y + mTree.bounds.height - mBounds.y; - } - } - - private void setTransform() { - if (mTree != null) { - - mTransform.identity(); - mInverse.identity(); - final Point size = new Point(); - size.x = getBounds().width; - size.y = getBounds().height; - if (mBounds.width == 0 || mBounds.height == 0 || size.x == 0 || size.y == 0) { - mScale = 1; - } else { - mScale = Math.min(size.x / mBounds.width, size.y / mBounds.height); - } - mTransform.scale((float) mScale, (float) mScale); - mInverse.scale((float) mScale, (float) mScale); - mTransform.translate((float) -mBounds.x, (float) -mBounds.y); - mInverse.translate((float) -mBounds.x, (float) -mBounds.y); - if (size.x / mBounds.width < size.y / mBounds.height) { - mTransform.translate(0, (float) (size.y / mScale - mBounds.height) / 2); - mInverse.translate(0, (float) (size.y / mScale - mBounds.height) / 2); - } else { - mTransform.translate((float) (size.x / mScale - mBounds.width) / 2, 0); - mInverse.translate((float) (size.x / mScale - mBounds.width) / 2, 0); - } - mInverse.invert(); - } - } - - @Override - public void viewportChanged() { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - synchronized (this) { - mViewport = mModel.getViewport(); - setBounds(); - setTransform(); - } - } - }); - doRedraw(); - } - - @Override - public void zoomChanged() { - viewportChanged(); - } - - @Override - public void selectionChanged() { - synchronized (this) { - mSelectedNode = mModel.getSelection(); - } - doRedraw(); - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/util/DrawableViewNode.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/util/DrawableViewNode.java deleted file mode 100644 index b196aaf..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/util/DrawableViewNode.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui.util; - -import com.android.hierarchyviewerlib.device.ViewNode; - -import java.util.ArrayList; - -public class DrawableViewNode { - public ViewNode viewNode; - - public final ArrayList<DrawableViewNode> children = new ArrayList<DrawableViewNode>(); - - public final static int NODE_HEIGHT = 100; - - public final static int NODE_WIDTH = 180; - - public final static int CONTENT_LEFT_RIGHT_PADDING = 9; - - public final static int CONTENT_TOP_BOTTOM_PADDING = 8; - - public final static int CONTENT_INTER_PADDING = 3; - - public final static int INDEX_PADDING = 7; - - public final static int LEAF_NODE_SPACING = 9; - - public final static int NON_LEAF_NODE_SPACING = 15; - - public final static int PARENT_CHILD_SPACING = 50; - - public final static int PADDING = 30; - - public int treeHeight; - - public int treeWidth; - - public boolean leaf; - - public DrawableViewNode parent; - - public int left; - - public double top; - - public int topSpacing; - - public int bottomSpacing; - - public boolean treeDrawn; - - public static class Rectangle { - public double x, y, width, height; - - public Rectangle() { - - } - - public Rectangle(Rectangle other) { - this.x = other.x; - this.y = other.y; - this.width = other.width; - this.height = other.height; - } - - public Rectangle(double x, double y, double width, double height) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } - - @Override - public String toString() { - return "{" + x + ", " + y + ", " + width + ", " + height + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - } - - } - - public static class Point { - public double x, y; - - public Point() { - } - - public Point(double x, double y) { - this.x = x; - this.y = y; - } - - @Override - public String toString() { - return "(" + x + ", " + y + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - - public Rectangle bounds = new Rectangle(); - - public DrawableViewNode(ViewNode viewNode) { - this.viewNode = viewNode; - treeDrawn = !viewNode.willNotDraw; - if (viewNode.children.size() == 0) { - treeHeight = NODE_HEIGHT; - treeWidth = NODE_WIDTH; - leaf = true; - } else { - leaf = false; - int N = viewNode.children.size(); - treeHeight = 0; - treeWidth = 0; - for (int i = 0; i < N; i++) { - DrawableViewNode child = new DrawableViewNode(viewNode.children.get(i)); - children.add(child); - child.parent = this; - treeHeight += child.treeHeight; - treeWidth = Math.max(treeWidth, child.treeWidth); - if (i != 0) { - DrawableViewNode prevChild = children.get(i - 1); - if (prevChild.leaf && child.leaf) { - treeHeight += LEAF_NODE_SPACING; - prevChild.bottomSpacing = LEAF_NODE_SPACING; - child.topSpacing = LEAF_NODE_SPACING; - } else { - treeHeight += NON_LEAF_NODE_SPACING; - prevChild.bottomSpacing = NON_LEAF_NODE_SPACING; - child.topSpacing = NON_LEAF_NODE_SPACING; - } - } - treeDrawn |= child.treeDrawn; - } - treeWidth += NODE_WIDTH + PARENT_CHILD_SPACING; - } - } - - public void setLeft() { - if (parent == null) { - left = PADDING; - bounds.x = 0; - bounds.width = treeWidth + 2 * PADDING; - } else { - left = parent.left + NODE_WIDTH + PARENT_CHILD_SPACING; - } - int N = children.size(); - for (int i = 0; i < N; i++) { - children.get(i).setLeft(); - } - } - - public void placeRoot() { - top = PADDING + (treeHeight - NODE_HEIGHT) / 2.0; - double currentTop = PADDING; - int N = children.size(); - for (int i = 0; i < N; i++) { - DrawableViewNode child = children.get(i); - child.place(currentTop, top - currentTop); - currentTop += child.treeHeight + child.bottomSpacing; - } - bounds.y = 0; - bounds.height = treeHeight + 2 * PADDING; - } - - private void place(double treeTop, double rootDistance) { - if (treeHeight <= rootDistance) { - top = treeTop + treeHeight - NODE_HEIGHT; - } else if (rootDistance <= -NODE_HEIGHT) { - top = treeTop; - } else { - if (children.size() == 0) { - top = treeTop; - } else { - top = - rootDistance + treeTop - NODE_HEIGHT + (2.0 * NODE_HEIGHT) - / (treeHeight + NODE_HEIGHT) * (treeHeight - rootDistance); - } - } - int N = children.size(); - double currentTop = treeTop; - for (int i = 0; i < N; i++) { - DrawableViewNode child = children.get(i); - child.place(currentTop, rootDistance); - currentTop += child.treeHeight + child.bottomSpacing; - rootDistance -= child.treeHeight + child.bottomSpacing; - } - } - - public DrawableViewNode getSelected(double x, double y) { - if (x >= left && x < left + NODE_WIDTH && y >= top && y <= top + NODE_HEIGHT) { - return this; - } - int N = children.size(); - for (int i = 0; i < N; i++) { - DrawableViewNode selected = children.get(i).getSelected(x, y); - if (selected != null) { - return selected; - } - } - return null; - } - - /* - * Moves the node the specified distance up. - */ - public void move(double distance) { - top -= distance; - - // Get the root - DrawableViewNode root = this; - while (root.parent != null) { - root = root.parent; - } - - // Figure out the new tree top. - double treeTop; - if (top + NODE_HEIGHT <= root.top) { - treeTop = top + NODE_HEIGHT - treeHeight; - } else if (top >= root.top + NODE_HEIGHT) { - treeTop = top; - } else { - if (leaf) { - treeTop = top; - } else { - double distanceRatio = 1 - (root.top + NODE_HEIGHT - top) / (2.0 * NODE_HEIGHT); - treeTop = root.top - treeHeight + distanceRatio * (treeHeight + NODE_HEIGHT); - } - } - // Go up the tree and figure out the tree top. - DrawableViewNode node = this; - while (node.parent != null) { - int index = node.viewNode.index; - for (int i = 0; i < index; i++) { - DrawableViewNode sibling = node.parent.children.get(i); - treeTop -= sibling.treeHeight + sibling.bottomSpacing; - } - node = node.parent; - } - - // Update the bounds. - root.bounds.y = Math.min(root.top - PADDING, treeTop - PADDING); - root.bounds.height = - Math.max(treeTop + root.treeHeight + PADDING, root.top + NODE_HEIGHT + PADDING) - - root.bounds.y; - // Place all the children of the root - double currentTop = treeTop; - int N = root.children.size(); - for (int i = 0; i < N; i++) { - DrawableViewNode child = root.children.get(i); - child.place(currentTop, root.top - currentTop); - currentTop += child.treeHeight + child.bottomSpacing; - } - - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/util/PsdFile.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/util/PsdFile.java deleted file mode 100644 index 2c1154b..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/util/PsdFile.java +++ /dev/null @@ -1,508 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui.util; - -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.io.BufferedOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.List; - -/** - * Writes PSD file. Supports only 8 bits, RGB images with 4 channels. - */ -public class PsdFile { - private final Header mHeader; - - private final ColorMode mColorMode; - - private final ImageResources mImageResources; - - private final LayersMasksInfo mLayersMasksInfo; - - private final LayersInfo mLayersInfo; - - private final BufferedImage mMergedImage; - - private final Graphics2D mGraphics; - - public PsdFile(int width, int height) { - mHeader = new Header(width, height); - mColorMode = new ColorMode(); - mImageResources = new ImageResources(); - mLayersMasksInfo = new LayersMasksInfo(); - mLayersInfo = new LayersInfo(); - - mMergedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - mGraphics = mMergedImage.createGraphics(); - } - - public void addLayer(String name, BufferedImage image, Point offset) { - addLayer(name, image, offset, true); - } - - public void addLayer(String name, BufferedImage image, Point offset, boolean visible) { - mLayersInfo.addLayer(name, image, offset, visible); - if (visible) - mGraphics.drawImage(image, null, offset.x, offset.y); - } - - public void write(OutputStream stream) { - mLayersMasksInfo.setLayersInfo(mLayersInfo); - - DataOutputStream out = new DataOutputStream(new BufferedOutputStream(stream)); - try { - mHeader.write(out); - out.flush(); - - mColorMode.write(out); - mImageResources.write(out); - mLayersMasksInfo.write(out); - mLayersInfo.write(out); - out.flush(); - - mLayersInfo.writeImageData(out); - out.flush(); - - writeImage(mMergedImage, out, false); - out.flush(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - out.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - private static void writeImage(BufferedImage image, DataOutputStream out, boolean split) - throws IOException { - - if (!split) - out.writeShort(0); - - int width = image.getWidth(); - int height = image.getHeight(); - - final int length = width * height; - int[] pixels = new int[length]; - - image.getData().getDataElements(0, 0, width, height, pixels); - - byte[] a = new byte[length]; - byte[] r = new byte[length]; - byte[] g = new byte[length]; - byte[] b = new byte[length]; - - for (int i = 0; i < length; i++) { - final int pixel = pixels[i]; - a[i] = (byte) ((pixel >> 24) & 0xFF); - r[i] = (byte) ((pixel >> 16) & 0xFF); - g[i] = (byte) ((pixel >> 8) & 0xFF); - b[i] = (byte) (pixel & 0xFF); - } - - if (split) - out.writeShort(0); - if (split) - out.write(a); - if (split) - out.writeShort(0); - out.write(r); - if (split) - out.writeShort(0); - out.write(g); - if (split) - out.writeShort(0); - out.write(b); - if (!split) - out.write(a); - } - - @SuppressWarnings( { - "UnusedDeclaration" - }) - static class Header { - static final short MODE_BITMAP = 0; - - static final short MODE_GRAYSCALE = 1; - - static final short MODE_INDEXED = 2; - - static final short MODE_RGB = 3; - - static final short MODE_CMYK = 4; - - static final short MODE_MULTI_CHANNEL = 7; - - static final short MODE_DUOTONE = 8; - - static final short MODE_LAB = 9; - - final byte[] mSignature = "8BPS".getBytes(); //$NON-NLS-1$ - - final short mVersion = 1; - - final byte[] mReserved = new byte[6]; - - final short mChannelCount = 4; - - final int mHeight; - - final int mWidth; - - final short mDepth = 8; - - final short mMode = MODE_RGB; - - Header(int width, int height) { - mWidth = width; - mHeight = height; - } - - void write(DataOutputStream out) throws IOException { - out.write(mSignature); - out.writeShort(mVersion); - out.write(mReserved); - out.writeShort(mChannelCount); - out.writeInt(mHeight); - out.writeInt(mWidth); - out.writeShort(mDepth); - out.writeShort(mMode); - } - } - - // Unused at the moment - @SuppressWarnings( { - "UnusedDeclaration" - }) - static class ColorMode { - final int mLength = 0; - - void write(DataOutputStream out) throws IOException { - out.writeInt(mLength); - } - } - - // Unused at the moment - @SuppressWarnings( { - "UnusedDeclaration" - }) - static class ImageResources { - static final short RESOURCE_RESOLUTION_INFO = 0x03ED; - - int mLength = 0; - - final byte[] mSignature = "8BIM".getBytes(); //$NON-NLS-1$ - - final short mResourceId = RESOURCE_RESOLUTION_INFO; - - final short mPad = 0; - - final int mDataLength = 16; - - final short mHorizontalDisplayUnit = 0x48; // 72 dpi - - final int mHorizontalResolution = 1; - - final short mWidthDisplayUnit = 1; - - final short mVerticalDisplayUnit = 0x48; // 72 dpi - - final int mVerticalResolution = 1; - - final short mHeightDisplayUnit = 1; - - ImageResources() { - mLength = mSignature.length; - mLength += 2; - mLength += 2; - mLength += 4; - mLength += 8; - mLength += 8; - } - - void write(DataOutputStream out) throws IOException { - out.writeInt(mLength); - out.write(mSignature); - out.writeShort(mResourceId); - out.writeShort(mPad); - out.writeInt(mDataLength); - out.writeShort(mHorizontalDisplayUnit); - out.writeInt(mHorizontalResolution); - out.writeShort(mWidthDisplayUnit); - out.writeShort(mVerticalDisplayUnit); - out.writeInt(mVerticalResolution); - out.writeShort(mHeightDisplayUnit); - } - } - - @SuppressWarnings( { - "UnusedDeclaration" - }) - static class LayersMasksInfo { - int mMiscLength; - - int mLayerInfoLength; - - void setLayersInfo(LayersInfo layersInfo) { - mLayerInfoLength = layersInfo.getLength(); - // Round to the next multiple of 2 - if ((mLayerInfoLength & 0x1) == 0x1) - mLayerInfoLength++; - mMiscLength = mLayerInfoLength + 8; - } - - void write(DataOutputStream out) throws IOException { - out.writeInt(mMiscLength); - out.writeInt(mLayerInfoLength); - } - } - - @SuppressWarnings( { - "UnusedDeclaration" - }) - static class LayersInfo { - final List<Layer> mLayers = new ArrayList<Layer>(); - - void addLayer(String name, BufferedImage image, Point offset, boolean visible) { - mLayers.add(new Layer(name, image, offset, visible)); - } - - int getLength() { - int length = 2; - for (Layer layer : mLayers) { - length += layer.getLength(); - } - return length; - } - - void write(DataOutputStream out) throws IOException { - out.writeShort((short) -mLayers.size()); - for (Layer layer : mLayers) { - layer.write(out); - } - } - - void writeImageData(DataOutputStream out) throws IOException { - for (Layer layer : mLayers) { - layer.writeImageData(out); - } - // Global layer mask info length - out.writeInt(0); - } - } - - @SuppressWarnings( { - "UnusedDeclaration" - }) - static class Layer { - static final byte OPACITY_TRANSPARENT = 0x0; - - static final byte OPACITY_OPAQUE = (byte) 0xFF; - - static final byte CLIPPING_BASE = 0x0; - - static final byte CLIPPING_NON_BASE = 0x1; - - static final byte FLAG_TRANSPARENCY_PROTECTED = 0x1; - - static final byte FLAG_INVISIBLE = 0x2; - - final int mTop; - - final int mLeft; - - final int mBottom; - - final int mRight; - - final short mChannelCount = 4; - - final Channel[] mChannelInfo = new Channel[mChannelCount]; - - final byte[] mBlendSignature = "8BIM".getBytes(); //$NON-NLS-1$ - - final byte[] mBlendMode = "norm".getBytes(); //$NON-NLS-1$ - - final byte mOpacity = OPACITY_OPAQUE; - - final byte mClipping = CLIPPING_BASE; - - byte mFlags = 0x0; - - final byte mFiller = 0x0; - - int mExtraSize = 4 + 4; - - final int mMaskDataLength = 0; - - final int mBlendRangeDataLength = 0; - - final byte[] mName; - - final byte[] mLayerExtraSignature = "8BIM".getBytes(); //$NON-NLS-1$ - - final byte[] mLayerExtraKey = "luni".getBytes(); //$NON-NLS-1$ - - int mLayerExtraLength; - - final String mOriginalName; - - private BufferedImage mImage; - - Layer(String name, BufferedImage image, Point offset, boolean visible) { - final int height = image.getHeight(); - final int width = image.getWidth(); - final int length = width * height; - - mChannelInfo[0] = new Channel(Channel.ID_ALPHA, length); - mChannelInfo[1] = new Channel(Channel.ID_RED, length); - mChannelInfo[2] = new Channel(Channel.ID_GREEN, length); - mChannelInfo[3] = new Channel(Channel.ID_BLUE, length); - - mTop = offset.y; - mLeft = offset.x; - mBottom = offset.y + height; - mRight = offset.x + width; - - mOriginalName = name; - byte[] data = name.getBytes(); - - try { - mLayerExtraLength = 4 + mOriginalName.getBytes("UTF-16").length; //$NON-NLS-1$ - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - final byte[] nameData = new byte[data.length + 1]; - nameData[0] = (byte) (data.length & 0xFF); - System.arraycopy(data, 0, nameData, 1, data.length); - - // This could be done in the same pass as above - if (nameData.length % 4 != 0) { - data = new byte[nameData.length + 4 - (nameData.length % 4)]; - System.arraycopy(nameData, 0, data, 0, nameData.length); - mName = data; - } else { - mName = nameData; - } - mExtraSize += mName.length; - mExtraSize += - mLayerExtraLength + 4 + mLayerExtraKey.length + mLayerExtraSignature.length; - - mImage = image; - - if (!visible) { - mFlags |= FLAG_INVISIBLE; - } - } - - int getLength() { - int length = 4 * 4 + 2; - - for (Channel channel : mChannelInfo) { - length += channel.getLength(); - } - - length += mBlendSignature.length; - length += mBlendMode.length; - length += 4; - length += 4; - length += mExtraSize; - - return length; - } - - void write(DataOutputStream out) throws IOException { - out.writeInt(mTop); - out.writeInt(mLeft); - out.writeInt(mBottom); - out.writeInt(mRight); - - out.writeShort(mChannelCount); - for (Channel channel : mChannelInfo) { - channel.write(out); - } - - out.write(mBlendSignature); - out.write(mBlendMode); - - out.write(mOpacity); - out.write(mClipping); - out.write(mFlags); - out.write(mFiller); - - out.writeInt(mExtraSize); - out.writeInt(mMaskDataLength); - - out.writeInt(mBlendRangeDataLength); - - out.write(mName); - - out.write(mLayerExtraSignature); - out.write(mLayerExtraKey); - out.writeInt(mLayerExtraLength); - out.writeInt(mOriginalName.length() + 1); - out.write(mOriginalName.getBytes("UTF-16")); //$NON-NLS-1$ - } - - void writeImageData(DataOutputStream out) throws IOException { - writeImage(mImage, out, true); - } - } - - @SuppressWarnings( { - "UnusedDeclaration" - }) - static class Channel { - static final short ID_RED = 0; - - static final short ID_GREEN = 1; - - static final short ID_BLUE = 2; - - static final short ID_ALPHA = -1; - - static final short ID_LAYER_MASK = -2; - - final short mId; - - final int mDataLength; - - Channel(short id, int dataLength) { - mId = id; - mDataLength = dataLength + 2; - } - - int getLength() { - return 2 + 4 + mDataLength; - } - - void write(DataOutputStream out) throws IOException { - out.writeShort(mId); - out.writeInt(mDataLength); - } - } -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/util/TreeColumnResizer.java b/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/util/TreeColumnResizer.java deleted file mode 100644 index 1213620..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/com/android/hierarchyviewerlib/ui/util/TreeColumnResizer.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * 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.hierarchyviewerlib.ui.util; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.TreeColumn; - -public class TreeColumnResizer { - - private TreeColumn mColumn1; - - private TreeColumn mColumn2; - - private Composite mControl; - - private int mColumn1Width; - - private int mColumn2Width; - - private final static int MIN_COLUMN1_WIDTH = 18; - - private final static int MIN_COLUMN2_WIDTH = 3; - - public TreeColumnResizer(Composite control, TreeColumn column1, TreeColumn column2) { - this.mControl = control; - this.mColumn1 = column1; - this.mColumn2 = column2; - control.addListener(SWT.Resize, resizeListener); - column1.addListener(SWT.Resize, column1ResizeListener); - column2.setResizable(false); - } - - private Listener resizeListener = new Listener() { - @Override - public void handleEvent(Event e) { - if (mColumn1Width == 0 && mColumn2Width == 0) { - mColumn1Width = (mControl.getBounds().width - 18) / 2; - mColumn2Width = (mControl.getBounds().width - 18) / 2; - } else { - int dif = mControl.getBounds().width - 18 - (mColumn1Width + mColumn2Width); - int columnDif = Math.abs(mColumn1Width - mColumn2Width); - int mainColumnChange = Math.min(Math.abs(dif), columnDif); - int left = Math.max(0, Math.abs(dif) - columnDif); - if (dif < 0) { - if (mColumn1Width > mColumn2Width) { - mColumn1Width -= mainColumnChange; - } else { - mColumn2Width -= mainColumnChange; - } - mColumn1Width -= left / 2; - mColumn2Width -= left - left / 2; - } else { - if (mColumn1Width > mColumn2Width) { - mColumn2Width += mainColumnChange; - } else { - mColumn1Width += mainColumnChange; - } - mColumn1Width += left / 2; - mColumn2Width += left - left / 2; - } - } - mColumn1.removeListener(SWT.Resize, column1ResizeListener); - mColumn1.setWidth(mColumn1Width); - mColumn2.setWidth(mColumn2Width); - mColumn1.addListener(SWT.Resize, column1ResizeListener); - } - }; - - private Listener column1ResizeListener = new Listener() { - @Override - public void handleEvent(Event e) { - int widthDif = mColumn1Width - mColumn1.getWidth(); - mColumn1Width -= widthDif; - mColumn2Width += widthDif; - boolean column1Changed = false; - - // Strange, but these constants make the columns look the same. - - if (mColumn1Width < MIN_COLUMN1_WIDTH) { - mColumn2Width -= MIN_COLUMN1_WIDTH - mColumn1Width; - mColumn1Width += MIN_COLUMN1_WIDTH - mColumn1Width; - column1Changed = true; - } - if (mColumn2Width < MIN_COLUMN2_WIDTH) { - mColumn1Width += mColumn2Width - MIN_COLUMN2_WIDTH; - mColumn2Width = MIN_COLUMN2_WIDTH; - column1Changed = true; - } - if (column1Changed) { - mColumn1.removeListener(SWT.Resize, this); - mColumn1.setWidth(mColumn1Width); - mColumn1.addListener(SWT.Resize, this); - } - mColumn2.setWidth(mColumn2Width); - } - }; -} diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/auto-refresh.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/auto-refresh.png Binary files differdeleted file mode 100644 index 240862f..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/auto-refresh.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/capture-psd.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/capture-psd.png Binary files differdeleted file mode 100644 index 0f25426..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/capture-psd.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/device-view-selected.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/device-view-selected.png Binary files differdeleted file mode 100644 index fd107ed..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/device-view-selected.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/device-view.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/device-view.png Binary files differdeleted file mode 100644 index 9a7eed4..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/device-view.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/display.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/display.png Binary files differdeleted file mode 100644 index a9de0ec..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/display.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/filtered.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/filtered.png Binary files differdeleted file mode 100644 index 4fcab3f..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/filtered.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/green.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/green.png Binary files differdeleted file mode 100644 index 800000d..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/green.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/inspect-screenshot.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/inspect-screenshot.png Binary files differdeleted file mode 100644 index 6e51701..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/inspect-screenshot.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/invalidate.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/invalidate.png Binary files differdeleted file mode 100644 index ee75f69..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/invalidate.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/load-all-views.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/load-all-views.png Binary files differdeleted file mode 100644 index 3329ec9..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/load-all-views.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/load-overlay.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/load-overlay.png Binary files differdeleted file mode 100644 index 4817252..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/load-overlay.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/load-view-hierarchy.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/load-view-hierarchy.png Binary files differdeleted file mode 100644 index 8f01dda..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/load-view-hierarchy.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/not-selected.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/not-selected.png Binary files differdeleted file mode 100644 index db6f13b..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/not-selected.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/on-black.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/on-black.png Binary files differdeleted file mode 100644 index cd88803..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/on-black.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/on-white.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/on-white.png Binary files differdeleted file mode 100644 index 5f05662..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/on-white.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/pixel-perfect-view-selected.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/pixel-perfect-view-selected.png Binary files differdeleted file mode 100644 index 1e44000..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/pixel-perfect-view-selected.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/pixel-perfect-view.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/pixel-perfect-view.png Binary files differdeleted file mode 100644 index ec51cec..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/pixel-perfect-view.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/red.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/red.png Binary files differdeleted file mode 100644 index a2ab855..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/red.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/refresh-windows.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/refresh-windows.png Binary files differdeleted file mode 100644 index 8fddcae..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/refresh-windows.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/request-layout.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/request-layout.png Binary files differdeleted file mode 100644 index 92a78c8..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/request-layout.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/save.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/save.png Binary files differdeleted file mode 100644 index 2c0bab1..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/save.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/sdk-hierarchyviewer-128.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/sdk-hierarchyviewer-128.png Binary files differdeleted file mode 100644 index 4535f22..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/sdk-hierarchyviewer-128.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/sdk-hierarchyviewer-16.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/sdk-hierarchyviewer-16.png Binary files differdeleted file mode 100755 index 8c3c23d..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/sdk-hierarchyviewer-16.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected-filtered-small.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected-filtered-small.png Binary files differdeleted file mode 100644 index 9ef6b34..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected-filtered-small.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected-filtered.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected-filtered.png Binary files differdeleted file mode 100644 index 1f59685..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected-filtered.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected-small.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected-small.png Binary files differdeleted file mode 100644 index 538e385..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected-small.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected.png Binary files differdeleted file mode 100644 index 5cd5c3f..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/selected.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/show-extras.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/show-extras.png Binary files differdeleted file mode 100644 index ba9c305..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/show-extras.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/show-overlay.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/show-overlay.png Binary files differdeleted file mode 100644 index e39e90a..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/show-overlay.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/tree-view-selected.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/tree-view-selected.png Binary files differdeleted file mode 100644 index 175ad1f..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/tree-view-selected.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/tree-view.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/tree-view.png Binary files differdeleted file mode 100644 index 23aa424..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/tree-view.png +++ /dev/null diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/yellow.png b/hierarchyviewer2/libs/hierarchyviewerlib/src/images/yellow.png Binary files differdeleted file mode 100644 index e9b5781..0000000 --- a/hierarchyviewer2/libs/hierarchyviewerlib/src/images/yellow.png +++ /dev/null |