void ColumnListView::MouseDown(BPoint point) { int prevColumn = _selectedColumn; int32 numberOfColumns = fColumnDisplayList.CountItems(); float xleft = point.x; for(int32 Counter = 0; Counter < numberOfColumns; Counter++) { CLVColumn* Column = (CLVColumn*)fColumnDisplayList.ItemAt(Counter); if(Column->IsShown()) { if (xleft > 0) { xleft -= Column->Width(); if (xleft <= 0) { SetSelectedColumnIndex(GetActualIndexOf(Counter)); break; } } } } int32 ItemIndex = IndexOf(point); if(ItemIndex >= 0) { CLVListItem* ClickedItem = (CLVListItem*)BListView::ItemAt(ItemIndex); if(ClickedItem->fSuperItem) if(ClickedItem->fExpanderButtonRect.Contains(point)) { if(ClickedItem->IsExpanded()) Collapse(ClickedItem); else Expand(ClickedItem); return; } } // If it's a right-click, hoist up the popup-menu const char * selectedText = NULL; CLVColumn * col = ColumnAt(_selectedColumn); if (col) { BPopUpMenu * popup = col->GetPopup(); if (popup) { BMessage * msg = Window()->CurrentMessage(); int32 buttons; if ((msg->FindInt32("buttons", &buttons) == B_NO_ERROR)&&(buttons == B_SECONDARY_MOUSE_BUTTON)) { BPoint where(point); Select(IndexOf(where)); ConvertToScreen(&where); BMenuItem * result = popup->Go(where, false); if (result) selectedText = result->Label(); } } } int prevRow = CurrentSelection(); BListView::MouseDown(point); int curRow = CurrentSelection(); if ((_editMessage != NULL)&&((selectedText)||((_selectedColumn == prevColumn)&&(curRow == prevRow)))) { // Send mouse message... BMessage temp(*_editMessage); temp.AddInt32("column", _selectedColumn); temp.AddInt32("row", CurrentSelection()); if (selectedText) temp.AddString("text", selectedText); else temp.AddInt32("mouseClick", 0); _editTarget.SendMessage(&temp); } }