1 /*
2  * Copyright (C) 2012 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.editors.layout.properties;
18 
19 import static com.android.SdkConstants.VALUE_FALSE;
20 import static com.android.SdkConstants.VALUE_TRUE;
21 
22 import org.eclipse.swt.graphics.GC;
23 import org.eclipse.swt.graphics.Image;
24 import org.eclipse.swt.graphics.Point;
25 import org.eclipse.wb.internal.core.DesignerPlugin;
26 import org.eclipse.wb.internal.core.model.property.Property;
27 import org.eclipse.wb.internal.core.model.property.table.PropertyTable;
28 import org.eclipse.wb.internal.core.utils.ui.DrawUtils;
29 
30 /**
31  * Handle an XML property which represents booleans.
32  *
33  * Similar to the WindowBuilder PropertyEditor, but operates on Strings rather
34  * than Booleans (which means it is a tri-state boolean: true, false, not set)
35  */
36 public class BooleanXmlPropertyEditor extends XmlPropertyEditor {
37     public static final BooleanXmlPropertyEditor INSTANCE = new BooleanXmlPropertyEditor();
38 
39     private static final Image mTrueImage = DesignerPlugin.getImage("properties/true.png");
40     private static final Image mFalseImage = DesignerPlugin.getImage("properties/false.png");
41     private static final Image mNullImage =
42             DesignerPlugin.getImage("properties/BooleanNull.png");
43     private static final Image mUnknownImage =
44             DesignerPlugin.getImage("properties/BooleanUnknown.png");
45 
BooleanXmlPropertyEditor()46     private BooleanXmlPropertyEditor() {
47     }
48 
49     @Override
paint(Property property, GC gc, int x, int y, int width, int height)50     public void paint(Property property, GC gc, int x, int y, int width, int height)
51             throws Exception {
52         Object value = property.getValue();
53         assert value == null || value instanceof String;
54         if (value == null || value instanceof String) {
55             String text = (String) value;
56             Image image;
57             if (VALUE_TRUE.equals(text)) {
58                 image = mTrueImage;
59             } else if (VALUE_FALSE.equals(text)) {
60                 image = mFalseImage;
61             } else if (text == null) {
62                 image = mNullImage;
63             } else {
64                 // Probably something like a reference, e.g. @boolean/foo
65                 image = mUnknownImage;
66             }
67 
68             // draw image
69             DrawUtils.drawImageCV(gc, image, x, y, height);
70 
71             // prepare new position/width
72             int imageWidth = image.getBounds().width + 2;
73             width -= imageWidth;
74 
75             // draw text
76             if (text != null) {
77                 x += imageWidth;
78                 DrawUtils.drawStringCV(gc, text, x, y, width, height);
79             }
80         }
81     }
82 
83     @Override
activate(PropertyTable propertyTable, Property property, Point location)84     public boolean activate(PropertyTable propertyTable, Property property, Point location)
85             throws Exception {
86         // check that user clicked on image
87         if (location == null || location.x < mTrueImage.getBounds().width + 2) {
88             cycleValue(property);
89         }
90         // don't activate
91         return false;
92     }
93 
94     @Override
doubleClick(Property property, Point location)95     public void doubleClick(Property property, Point location) throws Exception {
96         cycleValue(property);
97     }
98 
99     /**
100      * Cycles through the values
101      */
cycleValue(Property property)102     private void cycleValue(Property property) throws Exception {
103         Object value = property.getValue();
104         if (value == null || value instanceof String) {
105             // Cycle null => true => false => null
106             String text = (String) value;
107             if (VALUE_TRUE.equals(text)) {
108                 property.setValue(VALUE_FALSE);
109             } else if (VALUE_FALSE.equals(text)) {
110                 property.setValue(null);
111             } else {
112                 property.setValue(VALUE_TRUE);
113             }
114         } else {
115             assert false;
116         }
117     }
118 }
119