1#include <Application.h>
2#include <Resources.h>
3#include <Window.h>
4#include <Region.h>
5#include <Alert.h>
6#include "Mime.h"
7
8#include "string.h"
9
10#include "ColumnListView.h"
11#include "CLVColumn.h"
12#include "CLVListItem.h"
13#include "CLVEasyItem.h"
14#include "NewStrings.h"
15
16#include "TreeControl.h"
17
18//static rgb_color active = { 155, 155, 255, 255 };
19//static rgb_color inactive = { 220, 220, 220, 255 };
20
21
22SmartTreeListView::SmartTreeListView(BRect Frame, CLVContainerView** ContainerView,
23	const char *Name, uint32 ResizingMode, uint32 flags, list_view_type Type,
24	bool hierarchical, bool horizontal, bool vertical, bool scroll_view_corner,
25	border_style border, const BFont* LabelFont) :
26	  ColumnListView(Frame, ContainerView, Name, ResizingMode, flags, Type, hierarchical,
27		horizontal, vertical, scroll_view_corner, border, LabelFont)
28{
29	container = *ContainerView;
30//	SetItemSelectColor(true, active);
31//	SetItemSelectColor(false, inactive);
32}
33
34SmartTreeListView::~SmartTreeListView()
35{
36}
37
38void SmartTreeListView::MouseUp(BPoint point)
39{
40	int curSelection = CurrentSelection();
41	ColumnListView::MouseUp(point);
42	if (curSelection >= 0 && curSelection != lastSelection)
43	{
44		TreeItem *item = (TreeItem *) ItemAt(curSelection);
45		item->ItemSelected();
46		lastSelection = curSelection;
47	}
48}
49
50void SmartTreeListView::Expand(TreeItem *item)
51{
52	ColumnListView::Expand((CLVEasyItem *) item);
53	item->ItemExpanding();
54}
55
56
57
58TreeItem::TreeItem(uint32 level, bool superitem, bool expanded, int32 resourceID, BView *headerView, ColumnListView *listView, char *text) :
59  CLVListItem(level, superitem, expanded, 16.0)
60{
61	SetAssociatedHeader(headerView);
62	SetAssociatedList(listView);
63
64	setIcon(resourceID);
65	fText = new char[strlen(text) + 1];
66	strcpy(fText, text);
67}
68
69TreeItem::~TreeItem()
70{
71	delete [] fText;
72}
73
74void TreeItem::setIcon(int32 resourceID)
75{
76	BMessage archive;
77	size_t size;
78	char *bits = (char *) be_app->AppResources()->LoadResource(type_code('BBMP'), resourceID, &size);
79	if (bits)
80		if (archive.Unflatten(bits) == B_OK)
81			fIcon = new BBitmap(&archive);
82}
83
84void TreeItem::DrawItemColumn(BView* owner, BRect item_column_rect, int32 column_index, bool complete)
85{
86	rgb_color color;
87	bool selected = IsSelected();
88
89	if (selected)
90		color = BeListSelectGrey;
91	else
92		color = White;
93
94	owner->SetLowColor(color);
95	owner->SetDrawingMode(B_OP_COPY);
96
97	if (selected || complete)
98	{
99		owner->SetHighColor(color);
100		owner->FillRect(item_column_rect);
101	}
102
103	BRegion Region;
104	Region.Include(item_column_rect);
105	owner->ConstrainClippingRegion(&Region);
106	owner->SetHighColor(Black);
107
108	if (column_index == 1)
109	{
110		item_column_rect.left += 2.0;
111		item_column_rect.right = item_column_rect.left + 15.0;
112		item_column_rect.top += 2.0;
113		if (Height() > 20.0)
114			item_column_rect.top += ceil((Height() - 20.0) / 2.0);
115		item_column_rect.bottom = item_column_rect.top + 15.0;
116		owner->SetDrawingMode(B_OP_OVER);
117		owner->DrawBitmap(fIcon, BRect(0.0, 0.0, 15.0, 15.0), item_column_rect);
118		owner->SetDrawingMode(B_OP_COPY);
119	}
120	else if(column_index == 2)
121		owner->DrawString(fText,
122			BPoint(item_column_rect.left + 2.0, item_column_rect.top + fTextOffset));
123
124	owner->ConstrainClippingRegion(NULL);
125}
126
127void TreeItem::Update(BView *owner, const BFont *font)
128{
129	CLVListItem::Update(owner, font);
130	font_height FontAttributes;
131	be_plain_font->GetHeight(&FontAttributes);
132	float FontHeight = ceil(FontAttributes.ascent) + ceil(FontAttributes.descent);
133	fTextOffset = ceil(FontAttributes.ascent) + (Height() - FontHeight) / 2.0;
134}
135
136int TreeItem::MyCompare(const CLVListItem* a_Item1, const CLVListItem* a_Item2, int32 KeyColumn)
137{
138	char *text1 = ((TreeItem*)a_Item1)->fText;
139	char *text2 = ((TreeItem*)a_Item2)->fText;
140	return strcasecmp(text1, text2);
141}
142
143void TreeItem::ItemSelected()
144{
145	PurgeRows();
146	PurgeColumns();
147	PurgeHeader();
148}
149
150void TreeItem::ItemExpanding()
151{
152}
153
154void TreeItem::ListItemSelected()
155{
156}
157
158void TreeItem::ListItemDeselected()
159{
160}
161
162void TreeItem::ListItemUpdated(int index, CLVListItem *item)
163{
164}
165
166void TreeItem::PurgeHeader()
167{
168	if (assocHeaderView)
169	{
170		int children = assocHeaderView->CountChildren();
171		assocHeaderView->LockLooper();
172
173		for (int i = children - 1; i >= 0; i--)
174		{
175			BView *child = assocHeaderView->ChildAt(i);
176			assocHeaderView->RemoveChild(child);
177			delete child;
178		}
179
180		assocHeaderView->UnlockLooper();
181	}
182}
183
184void TreeItem::PurgeColumns()
185{
186	if (assocListView)
187	{
188		int columns = assocListView->CountColumns();
189		if (columns > 0)
190			assocListView->RemoveColumns(assocListView->ColumnAt(0), columns);
191	}
192}
193
194void TreeItem::PurgeRows()
195{
196	if (assocListView)
197	{
198		int rows = assocListView->CountItems();
199		if (rows > 0)
200			assocListView->RemoveItems(0, rows);
201	}
202}
203
204bool TreeItem::HeaderMessageReceived(BMessage *msg)
205{
206	return false;
207}
208