1 package pl.polidea.treeview;
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;
15 * Tree view, expandable multi-level.
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
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;
44 public TreeViewList(final Context context, final AttributeSet attrs) {
45 this(context, attrs, R.style.treeViewListStyle);
48 public TreeViewList(final Context context) {
52 public TreeViewList(final Context context, final AttributeSet attrs,
54 super(context, attrs, defStyle);
55 parseAttributes(context, attrs);
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);
67 .getDrawable(R.styleable.TreeViewList_src_collapsed);
68 if (collapsedDrawable == null) {
69 collapsedDrawable = context.getResources().getDrawable(
70 DEFAULT_COLLAPSED_RESOURCE);
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);
86 public void setAdapter(final ListAdapter adapter) {
87 if (!(adapter instanceof AbstractTreeViewAdapter)) {
88 throw new TreeConfigurationException(
89 "The adapter is not of TreeViewAdapter type");
91 treeAdapter = (AbstractTreeViewAdapter< ? >) adapter;
93 super.setAdapter(treeAdapter);
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() {
107 public void onItemClick(final AdapterView< ? > parent,
108 final View view, final int position, final long id) {
109 treeAdapter.handleItemClick(view, view.getTag());
113 setOnClickListener(null);
118 public void setExpandedDrawable(final Drawable expandedDrawable) {
119 this.expandedDrawable = expandedDrawable;
121 treeAdapter.refresh();
124 public void setCollapsedDrawable(final Drawable collapsedDrawable) {
125 this.collapsedDrawable = collapsedDrawable;
127 treeAdapter.refresh();
130 public void setRowBackgroundDrawable(final Drawable rowBackgroundDrawable) {
131 this.rowBackgroundDrawable = rowBackgroundDrawable;
133 treeAdapter.refresh();
136 public void setIndicatorBackgroundDrawable(
137 final Drawable indicatorBackgroundDrawable) {
138 this.indicatorBackgroundDrawable = indicatorBackgroundDrawable;
140 treeAdapter.refresh();
143 public void setIndentWidth(final int indentWidth) {
144 this.indentWidth = indentWidth;
146 treeAdapter.refresh();
149 public void setIndicatorGravity(final int indicatorGravity) {
150 this.indicatorGravity = indicatorGravity;
152 treeAdapter.refresh();
155 public void setCollapsible(final boolean collapsible) {
156 this.collapsible = collapsible;
158 treeAdapter.refresh();
161 public void setHandleTrackballPress(final boolean handleTrackballPress) {
162 this.handleTrackballPress = handleTrackballPress;
164 treeAdapter.refresh();
167 public Drawable getExpandedDrawable() {
168 return expandedDrawable;
171 public Drawable getCollapsedDrawable() {
172 return collapsedDrawable;
175 public Drawable getRowBackgroundDrawable() {
176 return rowBackgroundDrawable;
179 public Drawable getIndicatorBackgroundDrawable() {
180 return indicatorBackgroundDrawable;
183 public int getIndentWidth() {
187 public int getIndicatorGravity() {
188 return indicatorGravity;
191 public boolean isCollapsible() {
195 public boolean isHandleTrackballPress() {
196 return handleTrackballPress;