Added support library for TreeViewList. Previously this code was subsumed in the...
[debian/openrocket] / android / src / pl / polidea / treeview / TreeViewList.java
1 package pl.polidea.treeview;
2
3 import net.sf.openrocket.R;
4 import android.content.Context;
5 import android.content.res.TypedArray;
6 import android.graphics.drawable.Drawable;
7 import android.util.AttributeSet;
8 import android.view.Gravity;
9 import android.view.View;
10 import android.widget.AdapterView;
11 import android.widget.ListAdapter;
12 import android.widget.ListView;
13
14 /**
15  * Tree view, expandable multi-level.
16  * 
17  * <pre>
18  * attr ref pl.polidea.treeview.R.styleable#TreeViewList_collapsible
19  * attr ref pl.polidea.treeview.R.styleable#TreeViewList_src_expanded
20  * attr ref pl.polidea.treeview.R.styleable#TreeViewList_src_collapsed
21  * attr ref pl.polidea.treeview.R.styleable#TreeViewList_indent_width
22  * attr ref pl.polidea.treeview.R.styleable#TreeViewList_handle_trackball_press
23  * attr ref pl.polidea.treeview.R.styleable#TreeViewList_indicator_gravity
24  * attr ref pl.polidea.treeview.R.styleable#TreeViewList_indicator_background
25  * attr ref pl.polidea.treeview.R.styleable#TreeViewList_row_background
26  * </pre>
27  */
28 public class TreeViewList extends ListView {
29     private static final int DEFAULT_COLLAPSED_RESOURCE = R.drawable.collapsed;
30     private static final int DEFAULT_EXPANDED_RESOURCE = R.drawable.expanded;
31     private static final int DEFAULT_INDENT = 0;
32     private static final int DEFAULT_GRAVITY = Gravity.LEFT
33             | Gravity.CENTER_VERTICAL;
34     private Drawable expandedDrawable;
35     private Drawable collapsedDrawable;
36     private Drawable rowBackgroundDrawable;
37     private Drawable indicatorBackgroundDrawable;
38     private int indentWidth = 0;
39     private int indicatorGravity = 0;
40     private AbstractTreeViewAdapter< ? > treeAdapter;
41     private boolean collapsible;
42     private boolean handleTrackballPress;
43
44     public TreeViewList(final Context context, final AttributeSet attrs) {
45         this(context, attrs, R.style.treeViewListStyle);
46     }
47
48         public TreeViewList(final Context context) {
49         this(context, null);
50     }
51
52     public TreeViewList(final Context context, final AttributeSet attrs,
53             final int defStyle) {
54         super(context, attrs, defStyle);
55         parseAttributes(context, attrs);
56     }
57
58     private void parseAttributes(final Context context, final AttributeSet attrs) {
59         final TypedArray a = context.obtainStyledAttributes(attrs,
60                 R.styleable.TreeViewList);
61         expandedDrawable = a.getDrawable(R.styleable.TreeViewList_src_expanded);
62         if (expandedDrawable == null) {
63             expandedDrawable = context.getResources().getDrawable(
64                     DEFAULT_EXPANDED_RESOURCE);
65         }
66         collapsedDrawable = a
67                 .getDrawable(R.styleable.TreeViewList_src_collapsed);
68         if (collapsedDrawable == null) {
69             collapsedDrawable = context.getResources().getDrawable(
70                     DEFAULT_COLLAPSED_RESOURCE);
71         }
72         indentWidth = a.getDimensionPixelSize(
73                 R.styleable.TreeViewList_indent_width, DEFAULT_INDENT);
74         indicatorGravity = a.getInteger(
75                 R.styleable.TreeViewList_indicator_gravity, DEFAULT_GRAVITY);
76         indicatorBackgroundDrawable = a
77                 .getDrawable(R.styleable.TreeViewList_indicator_background);
78         rowBackgroundDrawable = a
79                 .getDrawable(R.styleable.TreeViewList_row_background);
80         collapsible = a.getBoolean(R.styleable.TreeViewList_collapsible, true);
81         handleTrackballPress = a.getBoolean(
82                 R.styleable.TreeViewList_handle_trackball_press, true);
83     }
84
85     @Override
86     public void setAdapter(final ListAdapter adapter) {
87         if (!(adapter instanceof AbstractTreeViewAdapter)) {
88             throw new TreeConfigurationException(
89                     "The adapter is not of TreeViewAdapter type");
90         }
91         treeAdapter = (AbstractTreeViewAdapter< ? >) adapter;
92         syncAdapter();
93         super.setAdapter(treeAdapter);
94     }
95
96     private void syncAdapter() {
97         treeAdapter.setCollapsedDrawable(collapsedDrawable);
98         treeAdapter.setExpandedDrawable(expandedDrawable);
99         treeAdapter.setIndicatorGravity(indicatorGravity);
100         treeAdapter.setIndentWidth(indentWidth);
101         treeAdapter.setIndicatorBackgroundDrawable(indicatorBackgroundDrawable);
102         treeAdapter.setRowBackgroundDrawable(rowBackgroundDrawable);
103         treeAdapter.setCollapsible(collapsible);
104         if (handleTrackballPress) {
105             setOnItemClickListener(new OnItemClickListener() {
106                 @Override
107                 public void onItemClick(final AdapterView< ? > parent,
108                         final View view, final int position, final long id) {
109                     treeAdapter.handleItemClick(view, view.getTag());
110                 }
111             });
112         } else {
113             setOnClickListener(null);
114         }
115
116     }
117
118     public void setExpandedDrawable(final Drawable expandedDrawable) {
119         this.expandedDrawable = expandedDrawable;
120         syncAdapter();
121         treeAdapter.refresh();
122     }
123
124     public void setCollapsedDrawable(final Drawable collapsedDrawable) {
125         this.collapsedDrawable = collapsedDrawable;
126         syncAdapter();
127         treeAdapter.refresh();
128     }
129
130     public void setRowBackgroundDrawable(final Drawable rowBackgroundDrawable) {
131         this.rowBackgroundDrawable = rowBackgroundDrawable;
132         syncAdapter();
133         treeAdapter.refresh();
134     }
135
136     public void setIndicatorBackgroundDrawable(
137             final Drawable indicatorBackgroundDrawable) {
138         this.indicatorBackgroundDrawable = indicatorBackgroundDrawable;
139         syncAdapter();
140         treeAdapter.refresh();
141     }
142
143     public void setIndentWidth(final int indentWidth) {
144         this.indentWidth = indentWidth;
145         syncAdapter();
146         treeAdapter.refresh();
147     }
148
149     public void setIndicatorGravity(final int indicatorGravity) {
150         this.indicatorGravity = indicatorGravity;
151         syncAdapter();
152         treeAdapter.refresh();
153     }
154
155     public void setCollapsible(final boolean collapsible) {
156         this.collapsible = collapsible;
157         syncAdapter();
158         treeAdapter.refresh();
159     }
160
161     public void setHandleTrackballPress(final boolean handleTrackballPress) {
162         this.handleTrackballPress = handleTrackballPress;
163         syncAdapter();
164         treeAdapter.refresh();
165     }
166
167     public Drawable getExpandedDrawable() {
168         return expandedDrawable;
169     }
170
171     public Drawable getCollapsedDrawable() {
172         return collapsedDrawable;
173     }
174
175     public Drawable getRowBackgroundDrawable() {
176         return rowBackgroundDrawable;
177     }
178
179     public Drawable getIndicatorBackgroundDrawable() {
180         return indicatorBackgroundDrawable;
181     }
182
183     public int getIndentWidth() {
184         return indentWidth;
185     }
186
187     public int getIndicatorGravity() {
188         return indicatorGravity;
189     }
190
191     public boolean isCollapsible() {
192         return collapsible;
193     }
194
195     public boolean isHandleTrackballPress() {
196         return handleTrackballPress;
197     }
198
199 }