1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.ide.eclipse.adt.internal.editors.layout;
import com.android.SdkConstants;
import com.android.ide.common.rendering.api.ILayoutPullParser;
import com.android.ide.eclipse.adt.AdtConstants;
import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
import com.android.layoutlib.api.ILayoutResult.ILayoutViewInfo;
import org.xmlpull.v1.XmlPullParserException;
/**
* {@link ILayoutPullParser} implementation to render android widget bitmap.
* <p/>
* The parser emulates a layout that contains just one widget, described by the
* {@link ViewElementDescriptor} passed in the constructor.
* <p/>
* This pull parser generates {@link ILayoutViewInfo}s which key is a {@link ViewElementDescriptor}.
*/
public class WidgetPullParser extends BasePullParser {
private final ViewElementDescriptor mDescriptor;
private String[][] mAttributes = new String[][] {
{ "text", null },
{ "layout_width", "wrap_content" },
{ "layout_height", "wrap_content" },
};
public WidgetPullParser(ViewElementDescriptor descriptor) {
mDescriptor = descriptor;
String[] segments = mDescriptor.getFullClassName().split(AdtConstants.RE_DOT);
mAttributes[0][1] = segments[segments.length-1];
}
@Override
public Object getViewCookie() {
// we need a viewKey or the ILayoutResult will not contain any ILayoutViewInfo
return mDescriptor;
}
/**
* Legacy method required by {@link com.android.layoutlib.api.IXmlPullParser}
*/
@Override
public Object getViewKey() {
return getViewCookie();
}
@Override
public ILayoutPullParser getParser(String layoutName) {
// there's no embedded layout for a single widget.
return null;
}
@Override
public int getAttributeCount() {
return mAttributes.length; // text attribute
}
@Override
public String getAttributeName(int index) {
if (index < mAttributes.length) {
return mAttributes[index][0];
}
return null;
}
@Override
public String getAttributeNamespace(int index) {
return SdkConstants.NS_RESOURCES;
}
@Override
public String getAttributePrefix(int index) {
// pass
return null;
}
@Override
public String getAttributeValue(int index) {
if (index < mAttributes.length) {
return mAttributes[index][1];
}
return null;
}
@Override
public String getAttributeValue(String ns, String name) {
if (SdkConstants.NS_RESOURCES.equals(ns)) {
for (String[] attribute : mAttributes) {
if (name.equals(attribute[0])) {
return attribute[1];
}
}
}
return null;
}
@Override
public int getDepth() {
// pass
return 0;
}
@Override
public String getName() {
return mDescriptor.getXmlLocalName();
}
@Override
public String getNamespace() {
// pass
return null;
}
@Override
public String getPositionDescription() {
// pass
return null;
}
@Override
public String getPrefix() {
// pass
return null;
}
@Override
public boolean isEmptyElementTag() throws XmlPullParserException {
if (mParsingState == START_TAG) {
return true;
}
throw new XmlPullParserException("Call to isEmptyElementTag while not in START_TAG",
this, null);
}
@Override
public void onNextFromStartDocument() {
// just go to start_tag
mParsingState = START_TAG;
}
@Override
public void onNextFromStartTag() {
// since we have no children, just go to end_tag
mParsingState = END_TAG;
}
@Override
public void onNextFromEndTag() {
// just one tag. we are done.
mParsingState = END_DOCUMENT;
}
}
|