blob: 64c0703530548f9ac56772d5bee5218229ddd630 [file] [log] [blame]
/*
* 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.Image;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
public class ViewNode {
public String id;
public String name;
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 Image image;
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;
boolean hasFocus;
int index;
public boolean decoded;
public boolean filtered;
private String shortName;
private StateListener listener;
void decode() {
id = namedProperties.get("mID").value;
left = getInt("mLeft", 0);
top = getInt("mTop", 0);
width = getInt("getWidth()", 0);
height = getInt("getHeight()", 0);
scrollX = getInt("mScrollX", 0);
scrollY = getInt("mScrollY", 0);
paddingLeft = getInt("mPaddingLeft", 0);
paddingRight = getInt("mPaddingRight", 0);
paddingTop = getInt("mPaddingTop", 0);
paddingBottom = getInt("mPaddingBottom", 0);
marginLeft = getInt("layout_leftMargin", Integer.MIN_VALUE);
marginRight = getInt("layout_rightMargin", Integer.MIN_VALUE);
marginTop = getInt("layout_topMargin", Integer.MIN_VALUE);
marginBottom = getInt("layout_bottomMargin", Integer.MIN_VALUE);
baseline = getInt("getBaseline()", 0);
willNotDraw = getBoolean("willNotDraw()", false);
hasFocus = getBoolean("hasFocus()", false);
hasMargins = marginLeft != Integer.MIN_VALUE &&
marginRight != Integer.MIN_VALUE &&
marginTop != Integer.MIN_VALUE &&
marginBottom != Integer.MIN_VALUE;
decoded = true;
}
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;
}
public void filter(Pattern pattern) {
if (pattern == null || pattern.pattern().length() == 0) {
filtered = false;
} else {
filtered = pattern.matcher(shortName).find() || pattern.matcher(id).find();
}
listener.nodeStateChanged(this);
}
void computeIndex() {
index = parent == null ? 0 : parent.children.indexOf(this);
listener.nodeIndexChanged(this);
}
void setShortName(String shortName) {
this.shortName = shortName;
}
void setStateListener(StateListener listener) {
this.listener = listener;
}
@SuppressWarnings({"StringEquality"})
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final ViewNode other = (ViewNode) obj;
return !(this.name != other.name && (this.name == null || !this.name.equals(other.name)));
}
@Override
public String toString() {
return name;
}
@Override
public int hashCode() {
int hash = 5;
hash = 67 * hash + (this.name != null ? this.name.hashCode() : 0);
return hash;
}
public static class Property {
public String name;
public String value;
@Override
public String toString() {
return name + '=' + value;
}
@SuppressWarnings({"StringEquality"})
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Property other = (Property) obj;
if (this.name != other.name && (this.name == null || !this.name.equals(other.name))) {
return false;
}
return !(this.value != other.value && (this.value == null || !this.value.equals(other.value)));
}
@Override
public int hashCode() {
int hash = 5;
hash = 61 * hash + (this.name != null ? this.name.hashCode() : 0);
hash = 61 * hash + (this.value != null ? this.value.hashCode() : 0);
return hash;
}
}
interface StateListener {
void nodeStateChanged(ViewNode node);
void nodeIndexChanged(ViewNode node);
}
}