OSDN Git Service

android-2.1_r1 snapshot
[android-x86/sdk.git] / eclipse / plugins / com.android.ide.eclipse.adt / src / com / android / ide / eclipse / adt / internal / sdk / LayoutDeviceHandler.java
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
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.ide.eclipse.adt.internal.sdk;
18
19 import com.android.ide.eclipse.adt.internal.resources.configurations.CountryCodeQualifier;
20 import com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration;
21 import com.android.ide.eclipse.adt.internal.resources.configurations.KeyboardStateQualifier;
22 import com.android.ide.eclipse.adt.internal.resources.configurations.NavigationMethodQualifier;
23 import com.android.ide.eclipse.adt.internal.resources.configurations.NetworkCodeQualifier;
24 import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier;
25 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenDimensionQualifier;
26 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenOrientationQualifier;
27 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenRatioQualifier;
28 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenSizeQualifier;
29 import com.android.ide.eclipse.adt.internal.resources.configurations.TextInputMethodQualifier;
30 import com.android.ide.eclipse.adt.internal.resources.configurations.TouchScreenQualifier;
31 import com.android.ide.eclipse.adt.internal.resources.configurations.KeyboardStateQualifier.KeyboardState;
32 import com.android.ide.eclipse.adt.internal.resources.configurations.NavigationMethodQualifier.NavigationMethod;
33 import com.android.ide.eclipse.adt.internal.resources.configurations.PixelDensityQualifier.Density;
34 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenOrientationQualifier.ScreenOrientation;
35 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenRatioQualifier.ScreenRatio;
36 import com.android.ide.eclipse.adt.internal.resources.configurations.ScreenSizeQualifier.ScreenSize;
37 import com.android.ide.eclipse.adt.internal.resources.configurations.TextInputMethodQualifier.TextInputMethod;
38 import com.android.ide.eclipse.adt.internal.resources.configurations.TouchScreenQualifier.TouchScreenType;
39
40 import org.xml.sax.Attributes;
41 import org.xml.sax.SAXException;
42 import org.xml.sax.helpers.DefaultHandler;
43
44 import java.util.ArrayList;
45 import java.util.List;
46
47 /**
48  * {@link DefaultHandler} implementation to parse Layout Device XML file.
49  * @see LayoutDevicesXsd
50  * @see Layout-configs.xsd
51  */
52 class LayoutDeviceHandler extends DefaultHandler {
53     /*
54      * The handler does most of the work in startElement and endElement.
55      * In startElement, it'll create DeviceConfiguration on <device>, as well as
56      * FolderConfiguration instances on <default> and <config>.
57      * Those objects are then filled as new nodes are discovered.
58      *
59      * For the qualifier values, the qualifier is created and added to the current config
60      * on the endElement, by using the content found in characters().
61      */
62
63     private List<LayoutDevice> mDevices = new ArrayList<LayoutDevice>();
64
65     private LayoutDevice mCurrentDevice;
66     private FolderConfiguration mDefaultConfig;
67     private FolderConfiguration mCurrentConfig;
68     private final StringBuilder mStringAccumulator = new StringBuilder();
69
70     private String mSize1, mSize2;
71
72     public List<LayoutDevice> getDevices() {
73         return mDevices;
74     }
75
76     @Override
77     public void startElement(String uri, String localName, String name, Attributes attributes)
78             throws SAXException {
79         if (LayoutDevicesXsd.NODE_DEVICE.equals(localName)) {
80             // get the deviceName, will not be null since we validated the XML.
81             String deviceName = attributes.getValue("", LayoutDevicesXsd.ATTR_NAME);
82
83             // create a device and add it to the list
84             mCurrentDevice = new LayoutDevice(deviceName);
85             mDevices.add(mCurrentDevice);
86         } else if (LayoutDevicesXsd.NODE_DEFAULT.equals(localName)) {
87             // create a new default config
88             mDefaultConfig = mCurrentConfig = new FolderConfiguration();
89         } else if (LayoutDevicesXsd.NODE_CONFIG.equals(localName)) {
90             // create a new config
91             mCurrentConfig = new FolderConfiguration();
92
93             // init with default config if applicable
94             if (mDefaultConfig != null) {
95                 mCurrentConfig.set(mDefaultConfig);
96             }
97
98             // get the name of the config
99             String deviceName = attributes.getValue("", LayoutDevicesXsd.ATTR_NAME);
100
101             // give it to the current device.
102             mCurrentDevice.addConfig(deviceName, mCurrentConfig);
103         } else if (LayoutDevicesXsd.NODE_SCREEN_DIMENSION.equals(localName)) {
104             mSize1 = mSize2 = null;
105         }
106
107         mStringAccumulator.setLength(0);
108     }
109
110     @Override
111     public void characters(char[] ch, int start, int length) throws SAXException {
112         mStringAccumulator.append(ch, start, length);
113     }
114
115     @Override
116     public void endElement(String uri, String localName, String name) throws SAXException {
117         if (LayoutDevicesXsd.NODE_DEVICE.equals(localName)) {
118             mCurrentDevice = null;
119             mDefaultConfig = null;
120         } else if (LayoutDevicesXsd.NODE_CONFIG.equals(localName)) {
121             mCurrentConfig = null;
122         } else if (LayoutDevicesXsd.NODE_COUNTRY_CODE.equals(localName)) {
123             CountryCodeQualifier ccq = new CountryCodeQualifier(
124                     Integer.parseInt(mStringAccumulator.toString()));
125             mCurrentConfig.setCountryCodeQualifier(ccq);
126         } else if (LayoutDevicesXsd.NODE_NETWORK_CODE.equals(localName)) {
127             NetworkCodeQualifier ncq = new NetworkCodeQualifier(
128                     Integer.parseInt(mStringAccumulator.toString()));
129             mCurrentConfig.setNetworkCodeQualifier(ncq);
130         } else if (LayoutDevicesXsd.NODE_SCREEN_SIZE.equals(localName)) {
131             ScreenSizeQualifier ssq = new ScreenSizeQualifier(
132                     ScreenSize.getEnum(mStringAccumulator.toString()));
133             mCurrentConfig.setScreenSizeQualifier(ssq);
134         } else if (LayoutDevicesXsd.NODE_SCREEN_RATIO.equals(localName)) {
135             ScreenRatioQualifier srq = new ScreenRatioQualifier(
136                     ScreenRatio.getEnum(mStringAccumulator.toString()));
137             mCurrentConfig.setScreenRatioQualifier(srq);
138         } else if (LayoutDevicesXsd.NODE_SCREEN_ORIENTATION.equals(localName)) {
139             ScreenOrientationQualifier soq = new ScreenOrientationQualifier(
140                     ScreenOrientation.getEnum(mStringAccumulator.toString()));
141             mCurrentConfig.setScreenOrientationQualifier(soq);
142         } else if (LayoutDevicesXsd.NODE_PIXEL_DENSITY.equals(localName)) {
143             PixelDensityQualifier pdq = new PixelDensityQualifier(
144                     Density.getEnum(mStringAccumulator.toString()));
145             mCurrentConfig.setPixelDensityQualifier(pdq);
146         } else if (LayoutDevicesXsd.NODE_TOUCH_TYPE.equals(localName)) {
147             TouchScreenQualifier tsq = new TouchScreenQualifier(
148                     TouchScreenType.getEnum(mStringAccumulator.toString()));
149             mCurrentConfig.setTouchTypeQualifier(tsq);
150         } else if (LayoutDevicesXsd.NODE_KEYBOARD_STATE.equals(localName)) {
151             KeyboardStateQualifier ksq = new KeyboardStateQualifier(
152                     KeyboardState.getEnum(mStringAccumulator.toString()));
153             mCurrentConfig.setKeyboardStateQualifier(ksq);
154         } else if (LayoutDevicesXsd.NODE_TEXT_INPUT_METHOD.equals(localName)) {
155             TextInputMethodQualifier timq = new TextInputMethodQualifier(
156                     TextInputMethod.getEnum(mStringAccumulator.toString()));
157             mCurrentConfig.setTextInputMethodQualifier(timq);
158         } else if (LayoutDevicesXsd.NODE_NAV_METHOD.equals(localName)) {
159             NavigationMethodQualifier nmq = new NavigationMethodQualifier(
160                     NavigationMethod.getEnum(mStringAccumulator.toString()));
161             mCurrentConfig.setNavigationMethodQualifier(nmq);
162         } else if (LayoutDevicesXsd.NODE_SCREEN_DIMENSION.equals(localName)) {
163             ScreenDimensionQualifier qual = ScreenDimensionQualifier.getQualifier(mSize1, mSize2);
164             if (qual != null) {
165                 mCurrentConfig.setScreenDimensionQualifier(qual);
166             }
167         } else if (LayoutDevicesXsd.NODE_XDPI.equals(localName)) {
168             mCurrentDevice.setXDpi(Float.parseFloat(mStringAccumulator.toString()));
169         } else if (LayoutDevicesXsd.NODE_YDPI.equals(localName)) {
170             mCurrentDevice.setYDpi(Float.parseFloat(mStringAccumulator.toString()));
171         } else if (LayoutDevicesXsd.NODE_SIZE.equals(localName)) {
172             if (mSize1 == null) {
173                 mSize1 = mStringAccumulator.toString();
174             } else if (mSize2 == null) {
175                 mSize2 = mStringAccumulator.toString();
176             }
177         }
178     }
179 }