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