diff options
Diffstat (limited to 'hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyScene.java')
-rw-r--r-- | hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyScene.java | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyScene.java b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyScene.java new file mode 100644 index 000000000..08dc39590 --- /dev/null +++ b/hierarchyviewer/src/com/android/hierarchyviewer/scene/ViewHierarchyScene.java @@ -0,0 +1,262 @@ +/* + * 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.hierarchyviewer.scene; + +import java.awt.Color; +import java.awt.Font; +import java.awt.GradientPaint; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.geom.Point2D; + +import org.netbeans.api.visual.action.ActionFactory; +import org.netbeans.api.visual.action.WidgetAction; +import org.netbeans.api.visual.anchor.AnchorFactory; +import org.netbeans.api.visual.border.BorderFactory; +import org.netbeans.api.visual.graph.GraphScene; +import org.netbeans.api.visual.layout.LayoutFactory; +import org.netbeans.api.visual.model.ObjectState; +import org.netbeans.api.visual.widget.ConnectionWidget; +import org.netbeans.api.visual.widget.LabelWidget; +import org.netbeans.api.visual.widget.LayerWidget; +import org.netbeans.api.visual.widget.Widget; + +public class ViewHierarchyScene extends GraphScene<ViewNode, String> { + private ViewNode root; + private LayerWidget widgetLayer; + private LayerWidget connectionLayer; + + private WidgetAction moveAction = ActionFactory.createMoveAction(); + + public ViewHierarchyScene() { + widgetLayer = new LayerWidget(this); + connectionLayer = new LayerWidget(this); + + addChild(widgetLayer); + addChild(connectionLayer); + } + + public ViewNode getRoot() { + return root; + } + + void setRoot(ViewNode root) { + this.root = root; + } + + @Override + protected Widget attachNodeWidget(ViewNode node) { + Widget widget = createBox(node, node.name, node.id); + widget.getActions().addAction(createSelectAction()); + widget.getActions().addAction(moveAction); + widgetLayer.addChild(widget); + return widget; + } + + private Widget createBox(ViewNode node, String nodeName, String id) { + final String shortName = getShortName(nodeName); + node.setShortName(shortName); + + GradientWidget box = new GradientWidget(this, node); + box.setLayout(LayoutFactory.createVerticalFlowLayout()); + box.setBorder(BorderFactory.createLineBorder(2, Color.BLACK)); + box.setOpaque(true); + + LabelWidget label = new LabelWidget(this); + label.setFont(getDefaultFont().deriveFont(Font.PLAIN, 12.0f)); + label.setLabel(shortName); + label.setBorder(BorderFactory.createEmptyBorder(6, 6, 0, 6)); + label.setAlignment(LabelWidget.Alignment.CENTER); + + box.addChild(label); + + label = new LabelWidget(this); + label.setFont(getDefaultFont().deriveFont(Font.PLAIN, 10.0f)); + label.setLabel(getAddress(nodeName)); + label.setBorder(BorderFactory.createEmptyBorder(3, 6, 0, 6)); + label.setAlignment(LabelWidget.Alignment.CENTER); + + box.addressWidget = label; + + box.addChild(label); + + label = new LabelWidget(this); + label.setFont(getDefaultFont().deriveFont(Font.PLAIN, 10.0f)); + label.setLabel(id); + label.setBorder(BorderFactory.createEmptyBorder(3, 6, 6, 6)); + label.setAlignment(LabelWidget.Alignment.CENTER); + + box.addChild(label); + + return box; + } + + private static String getAddress(String name) { + String[] nameAndHashcode = name.split("@"); + return "@" + nameAndHashcode[1]; + } + + private static String getShortName(String name) { + String[] nameAndHashcode = name.split("@"); + String[] packages = nameAndHashcode[0].split("\\."); + return packages[packages.length - 1]; + } + + @Override + protected Widget attachEdgeWidget(String edge) { + ConnectionWidget connectionWidget = new ConnectionWidget(this); + connectionLayer.addChild(connectionWidget); + return connectionWidget; + } + + @Override + protected void attachEdgeSourceAnchor(String edge, ViewNode oldSourceNode, ViewNode sourceNode) { + final ConnectionWidget connection = (ConnectionWidget) findWidget(edge); + final Widget source = findWidget(sourceNode); + connection.bringToBack(); + source.bringToFront(); + connection.setSourceAnchor(AnchorFactory.createRectangularAnchor(source)); + } + + @Override + protected void attachEdgeTargetAnchor(String edge, ViewNode oldTargetNode, ViewNode targetNode) { + final ConnectionWidget connection = (ConnectionWidget) findWidget(edge); + final Widget target = findWidget(targetNode); + connection.bringToBack(); + target.bringToFront(); + connection.setTargetAnchor(AnchorFactory.createRectangularAnchor(target)); + } + + private static class GradientWidget extends Widget implements ViewNode.StateListener { + public static final GradientPaint BLUE_EXPERIENCE = new GradientPaint( + new Point2D.Double(0, 0), + new Color(168, 204, 241), + new Point2D.Double(0, 1), + new Color(44, 61, 146)); + public static final GradientPaint MAC_OSX_SELECTED = new GradientPaint( + new Point2D.Double(0, 0), + new Color(81, 141, 236), + new Point2D.Double(0, 1), + new Color(36, 96, 192)); + public static final GradientPaint MAC_OSX = new GradientPaint( + new Point2D.Double(0, 0), + new Color(167, 210, 250), + new Point2D.Double(0, 1), + new Color(99, 147, 206)); + public static final GradientPaint AERITH = new GradientPaint( + new Point2D.Double(0, 0), + Color.WHITE, + new Point2D.Double(0, 1), + new Color(64, 110, 161)); + public static final GradientPaint GRAY = new GradientPaint( + new Point2D.Double(0, 0), + new Color(226, 226, 226), + new Point2D.Double(0, 1), + new Color(250, 248, 248)); + public static final GradientPaint RED_XP = new GradientPaint( + new Point2D.Double(0, 0), + new Color(236, 81, 81), + new Point2D.Double(0, 1), + new Color(192, 36, 36)); + public static final GradientPaint NIGHT_GRAY = new GradientPaint( + new Point2D.Double(0, 0), + new Color(102, 111, 127), + new Point2D.Double(0, 1), + new Color(38, 45, 61)); + public static final GradientPaint NIGHT_GRAY_LIGHT = new GradientPaint( + new Point2D.Double(0, 0), + new Color(129, 138, 155), + new Point2D.Double(0, 1), + new Color(58, 66, 82)); + public static final GradientPaint NIGHT_GRAY_VERY_LIGHT = new GradientPaint( + new Point2D.Double(0, 0), + new Color(129, 138, 155, 60), + new Point2D.Double(0, 1), + new Color(58, 66, 82, 60)); + + private static Color UNSELECTED = Color.BLACK; + private static Color SELECTED = Color.WHITE; + + private final ViewNode node; + + private LabelWidget addressWidget; + + private boolean isSelected = false; + private final GradientPaint selectedGradient = MAC_OSX_SELECTED; + private final GradientPaint filteredGradient = RED_XP; + private final GradientPaint focusGradient = NIGHT_GRAY_VERY_LIGHT; + + public GradientWidget(ViewHierarchyScene scene, ViewNode node) { + super(scene); + this.node = node; + node.setStateListener(this); + } + + @Override + protected void notifyStateChanged(ObjectState previous, ObjectState state) { + super.notifyStateChanged(previous, state); + isSelected = state.isSelected() || state.isFocused() || state.isWidgetFocused(); + + pickChildrenColor(); + } + + private void pickChildrenColor() { + for (Widget child : getChildren()) { + child.setForeground(isSelected || node.filtered ? SELECTED : UNSELECTED); + } + + repaint(); + } + + @Override + protected void paintBackground() { + super.paintBackground(); + + Graphics2D g2 = getGraphics(); + Rectangle bounds = getBounds(); + + if (!isSelected) { + if (!node.filtered) { + if (!node.hasFocus) { + g2.setColor(Color.WHITE); + } else { + g2.setPaint(new GradientPaint(bounds.x, bounds.y, + focusGradient.getColor1(), bounds.x, bounds.x + bounds.height, + focusGradient.getColor2())); + } + } else { + g2.setPaint(new GradientPaint(bounds.x, bounds.y, filteredGradient.getColor1(), + bounds.x, bounds.x + bounds.height, filteredGradient.getColor2())); + } + } else { + g2.setPaint(new GradientPaint(bounds.x, bounds.y, selectedGradient.getColor1(), + bounds.x, bounds.x + bounds.height, selectedGradient.getColor2())); + } + g2.fillRect(bounds.x, bounds.y, bounds.width, bounds.height); + } + + public void nodeStateChanged(ViewNode node) { + pickChildrenColor(); + } + + public void nodeIndexChanged(ViewNode node) { + if (addressWidget != null) { + addressWidget.setLabel("#" + node.index + addressWidget.getLabel()); + } + } + } +} |