BColumnTitle * BTitleView::FindColumnTitle(const BColumn *column) const { int32 count = fTitleList.CountItems(); for (int32 index = 0; index < count; index++) { BColumnTitle *title = fTitleList.ItemAt(index); if (title->Column() == column) return title; } return NULL; }
void BTitleView::RemoveTitle(BColumn *column) { int32 count = fTitleList.CountItems(); for (int32 index = 0; index < count; index++) { BColumnTitle *title = fTitleList.ItemAt(index); if (title->Column() == column) { fTitleList.RemoveItem(title); break; } } Invalidate(); }
// ToDo: // Autoscroll when dragging column left/right // fix dragging back a column before the first column (now adds as last) // make column swaps/adds not invalidate/redraw columns to the left void ColumnDragState::Moved(BPoint where, uint32) { // figure out where we are with the mouse BRect titleBounds(fTitleView->Bounds()); bool overTitleView = titleBounds.Contains(where); BColumnTitle *overTitle = overTitleView ? fTitleView->FindColumnTitle(where) : 0; BRect titleBoundsWithMargin(titleBounds); titleBoundsWithMargin.InsetBy(0, -kRemoveTitleMargin); bool inMarginRect = overTitleView || titleBoundsWithMargin.Contains(where); bool drawOutline = false; bool undrawOutline = false; if (fTrackingRemovedColumn) { if (overTitleView) { // tracked back with a removed title into the title bar, add it // back fTitleView->EndRectTracking(); fColumnArchive.Seek(0, SEEK_SET); BColumn *column = BColumn::InstantiateFromStream(&fColumnArchive); ASSERT(column); const BColumn *after = NULL; if (overTitle) after = overTitle->Column(); fTitleView->PoseView()->AddColumn(column, after); fTrackingRemovedColumn = false; fTitle = fTitleView->FindColumnTitle(column); fInitialMouseTrackOffset += fTitle->Bounds().left; drawOutline = true; } } else { if (!inMarginRect) { // dragged a title out of the hysteresis margin around the // title bar - remove it and start dragging it as a dotted outline BRect rect(fTitle->Bounds()); rect.OffsetBy(where.x - fInitialMouseTrackOffset, where.y - 5); fColumnArchive.Seek(0, SEEK_SET); fTitle->Column()->ArchiveToStream(&fColumnArchive); fInitialMouseTrackOffset -= fTitle->Bounds().left; if (fTitleView->PoseView()->RemoveColumn(fTitle->Column(), false)) { fTitle = 0; fTitleView->BeginRectTracking(rect); fTrackingRemovedColumn = true; undrawOutline = true; } } else if (overTitle && overTitle != fTitle // over a different column && (overTitle->Bounds().left >= fTitle->Bounds().right // over the one to the right || where.x < overTitle->Bounds().left + fTitle->Bounds().Width())){ // over the one to the left, far enough to not snap right back BColumn *column = fTitle->Column(); fInitialMouseTrackOffset -= fTitle->Bounds().left; // swap the columns fTitleView->PoseView()->MoveColumnTo(column, overTitle->Column()); // re-grab the title object looking it up by the column fTitle = fTitleView->FindColumnTitle(column); // recalc initialMouseTrackOffset fInitialMouseTrackOffset += fTitle->Bounds().left; drawOutline = true; } else drawOutline = true; } if (drawOutline) DrawOutline(where.x - fInitialMouseTrackOffset); else if (undrawOutline) UndrawOutline(); }
void BTitleView::MouseDown(BPoint where) { if (!Window()->IsActive()) { // wasn't active, just activate and bail Window()->Activate(); return; } // finish any pending edits fPoseView->CommitActivePose(); BColumnTitle *title = FindColumnTitle(where); BColumnTitle *resizedTitle = InColumnResizeArea(where); uint32 buttons; GetMouse(&where, &buttons); // Check if the user clicked the secondary mouse button. // if so, display the attribute menu: if (buttons & B_SECONDARY_MOUSE_BUTTON) { BContainerWindow *window = dynamic_cast<BContainerWindow *> (Window()); BPopUpMenu *menu = new BPopUpMenu("Attributes", false, false); menu->SetFont(be_plain_font); window->NewAttributeMenu(menu); window->AddMimeTypesToMenu(menu); window->MarkAttributeMenu(menu); menu->SetTargetForItems(window->PoseView()); menu->Go(ConvertToScreen(where), true, false); return; } bigtime_t doubleClickSpeed; get_click_speed(&doubleClickSpeed); if (resizedTitle) { bool force = static_cast<bool>(buttons & B_TERTIARY_MOUSE_BUTTON); if (force || buttons & B_PRIMARY_MOUSE_BUTTON) { if (force || fPreviouslyClickedColumnTitle != 0) { if (force || system_time() - fPreviousLeftClickTime < doubleClickSpeed) { if (fPoseView->ResizeColumnToWidest(resizedTitle->Column())) { Invalidate(); return; } } } fPreviousLeftClickTime = system_time(); fPreviouslyClickedColumnTitle = resizedTitle; } } else if (!title) return; SetMouseEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY | B_LOCK_WINDOW_FOCUS); // track the mouse if (resizedTitle) { fTrackingState = new ColumnResizeState(this, resizedTitle, where, system_time() + doubleClickSpeed); } else { fTrackingState = new ColumnDragState(this, title, where, system_time() + doubleClickSpeed); } }