Home | History | Annotate | Download | only in scene
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.hierarchyviewer.scene;
     18 
     19 import java.awt.Image;
     20 import java.util.ArrayList;
     21 import java.util.HashMap;
     22 import java.util.List;
     23 import java.util.Map;
     24 import java.util.regex.Pattern;
     25 
     26 public class ViewNode {
     27     public String id;
     28     public String name;
     29 
     30     public List<Property> properties = new ArrayList<Property>();
     31     public Map<String, Property> namedProperties = new HashMap<String, Property>();
     32 
     33     public ViewNode parent;
     34     public List<ViewNode> children = new ArrayList<ViewNode>();
     35 
     36     public Image image;
     37 
     38     public int left;
     39     public int top;
     40     public int width;
     41     public int height;
     42     public int scrollX;
     43     public int scrollY;
     44     public int paddingLeft;
     45     public int paddingRight;
     46     public int paddingTop;
     47     public int paddingBottom;
     48     public int marginLeft;
     49     public int marginRight;
     50     public int marginTop;
     51     public int marginBottom;
     52     public int baseline;
     53     public boolean willNotDraw;
     54     public boolean hasMargins;
     55 
     56     boolean hasFocus;
     57     int index;
     58 
     59     public boolean decoded;
     60     public boolean filtered;
     61 
     62     private String shortName;
     63     private StateListener listener;
     64 
     65     void decode() {
     66         id = namedProperties.get("mID").value;
     67 
     68         left = getInt("mLeft", 0);
     69         top = getInt("mTop", 0);
     70         width = getInt("getWidth()", 0);
     71         height = getInt("getHeight()", 0);
     72         scrollX = getInt("mScrollX", 0);
     73         scrollY = getInt("mScrollY", 0);
     74         paddingLeft = getInt("mPaddingLeft", 0);
     75         paddingRight = getInt("mPaddingRight", 0);
     76         paddingTop = getInt("mPaddingTop", 0);
     77         paddingBottom = getInt("mPaddingBottom", 0);
     78         marginLeft = getInt("layout_leftMargin", Integer.MIN_VALUE);
     79         marginRight = getInt("layout_rightMargin", Integer.MIN_VALUE);
     80         marginTop = getInt("layout_topMargin", Integer.MIN_VALUE);
     81         marginBottom = getInt("layout_bottomMargin", Integer.MIN_VALUE);
     82         baseline = getInt("getBaseline()", 0);
     83         willNotDraw = getBoolean("willNotDraw()", false);
     84         hasFocus = getBoolean("hasFocus()", false);
     85 
     86         hasMargins = marginLeft != Integer.MIN_VALUE &&
     87                 marginRight != Integer.MIN_VALUE &&
     88                 marginTop != Integer.MIN_VALUE &&
     89                 marginBottom != Integer.MIN_VALUE;
     90 
     91         decoded = true;
     92     }
     93 
     94     private boolean getBoolean(String name, boolean defaultValue) {
     95         Property p = namedProperties.get(name);
     96         if (p != null) {
     97             try {
     98                 return Boolean.parseBoolean(p.value);
     99             } catch (NumberFormatException e) {
    100                 return defaultValue;
    101             }
    102         }
    103         return defaultValue;
    104     }
    105 
    106     private int getInt(String name, int defaultValue) {
    107         Property p = namedProperties.get(name);
    108         if (p != null) {
    109             try {
    110                 return Integer.parseInt(p.value);
    111             } catch (NumberFormatException e) {
    112                 return defaultValue;
    113             }
    114         }
    115         return defaultValue;
    116     }
    117 
    118     public void filter(Pattern pattern) {
    119         if (pattern == null || pattern.pattern().length() == 0) {
    120             filtered = false;
    121         } else {
    122             filtered = pattern.matcher(shortName).find() || pattern.matcher(id).find();
    123         }
    124         listener.nodeStateChanged(this);
    125     }
    126 
    127     void computeIndex() {
    128         index = parent == null ? 0 : parent.children.indexOf(this);
    129         listener.nodeIndexChanged(this);
    130     }
    131 
    132     void setShortName(String shortName) {
    133         this.shortName = shortName;
    134     }
    135 
    136     void setStateListener(StateListener listener) {
    137         this.listener = listener;
    138     }
    139 
    140     @SuppressWarnings({"StringEquality"})
    141     @Override
    142     public boolean equals(Object obj) {
    143         if (obj == null) {
    144             return false;
    145         }
    146         if (getClass() != obj.getClass()) {
    147             return false;
    148         }
    149         final ViewNode other = (ViewNode) obj;
    150         return !(this.name != other.name && (this.name == null || !this.name.equals(other.name)));
    151     }
    152 
    153     @Override
    154     public String toString() {
    155         return name;
    156     }
    157 
    158     @Override
    159     public int hashCode() {
    160         int hash = 5;
    161         hash = 67 * hash + (this.name != null ? this.name.hashCode() : 0);
    162         return hash;
    163     }
    164 
    165     public static class Property {
    166         public String name;
    167         public String value;
    168 
    169         @Override
    170         public String toString() {
    171             return name + '=' + value;
    172         }
    173 
    174         @SuppressWarnings({"StringEquality"})
    175         @Override
    176         public boolean equals(Object obj) {
    177             if (obj == null) {
    178                 return false;
    179             }
    180             if (getClass() != obj.getClass()) {
    181                 return false;
    182             }
    183             final Property other = (Property) obj;
    184             if (this.name != other.name && (this.name == null || !this.name.equals(other.name))) {
    185                 return false;
    186             }
    187             return !(this.value != other.value && (this.value == null || !this.value.equals(other.value)));
    188         }
    189 
    190         @Override
    191         public int hashCode() {
    192             int hash = 5;
    193             hash = 61 * hash + (this.name != null ? this.name.hashCode() : 0);
    194             hash = 61 * hash + (this.value != null ? this.value.hashCode() : 0);
    195             return hash;
    196         }
    197     }
    198 
    199     interface StateListener {
    200         void nodeStateChanged(ViewNode node);
    201         void nodeIndexChanged(ViewNode node);
    202     }
    203 }
    204