void DisplayDirector::FindSelection() { //*** be_app->HideCursor(); View* view = WindowView(); BPoint point; BPoint lastPoint(-1000000, -1000000); bool scrolling = false; for (;; lastPoint = point) { // get & check mouse state int buttons = view->GetMouseButtons(); if (buttons == 0) break; point = view->GetMousePoint(); bool autoscrolling = Autoscroll(point); if (point == lastPoint && !autoscrolling && !scrolling) { view->MouseTrackingPause(); continue; } // move the selection StartRefreshCycle(); BPoint docPoint = ViewToDoc(point); FindSelectionContext context(docPoint.x, docPoint.y); Selection* newSelection = docDisplayNode->BlockFindSelection(&context); SetSelection(newSelection); scrolling = DoScrollStep(); FinishRefreshCycle(); ClearDeletedSelections(); } //*** be_app->ShowCursor(); //*** didn't work }
void DisplayDirector::ExtendSelection() { if (selection == NULL) return; View* view = WindowView(); BPoint lastPoint; Selection* rootSelection = selection; bool scrolling = false; while (true) { // get the mouse point and check if moved/finished int buttons = view->GetMouseButtons(); if (buttons == 0) break; BPoint point = view->GetMousePoint(); Autoscroll(point); point = ViewToDoc(point); if (point == lastPoint && !scrolling) { view->MouseTrackingPause(); continue; } // change the selection Selection* newSelection = rootSelection->ExtendTo(point); if (newSelection != selection) { StartRefreshCycle(); RefreshSelection(); if (selection != rootSelection) delete selection; selection = newSelection; scrolling = DoScrollStep(); RefreshSelection(); FinishRefreshCycle(); } lastPoint = point; } // clean up root selection if (selection != rootSelection) delete rootSelection; }
void DisplayDirector::DragSelection(BPoint startPoint) { if (selection == NULL) return; View* view = WindowView(); BPoint lastPoint = ViewToDoc(startPoint); bool scrolling = false; bool wasRightButton = false; bool optionDown = false; while (true) { // get the mouse point and check if moved/finished BPoint point = view->GetMousePoint(); int buttons = view->GetMouseButtons(); if (buttons == 0) break; wasRightButton = ((buttons & (B_SECONDARY_MOUSE_BUTTON | B_TERTIARY_MOUSE_BUTTON)) != 0); optionDown = ((view->CurModifiers() & B_OPTION_KEY) != 0); scrolling |= Autoscroll(point); point = ViewToDoc(point); if (point == lastPoint && !scrolling) { view->MouseTrackingPause(); continue; } // change the destination Destination* newDestination = NULL; if (!selection->ContainsPoint(point)) { FindDestinationContext destContext(selection, point.x, point.y); newDestination = docDisplayNode->BlockFindDestination(&destContext); } if (newDestination != destination) { StartRefreshCycle(); SetDestination(newDestination); scrolling = DoScrollStep(); FinishRefreshCycle(); } else scrolling = DoScrollStep(); lastPoint = point; } // do the move/copy if (destination) { // figure out if it's a move or a copy bool doing = true; bool copying = false; /*** if (wasRightButton) { BPopUpMenu* menu = new BPopUpMenu("Move/Copy"); BMenuItem* moveItem = new BMenuItem("Move", NULL); menu->AddItem(moveItem); BMenuItem* copyItem = new BMenuItem("Copy", NULL); menu->AddItem(copyItem); BMenuItem* chosenItem = menu->Go(ConvertToScreen(DocToView(lastPoint)), false, true); copying = (chosenItem == copyItem); if (chosenItem == NULL) doing = false; delete menu; } else if (optionDown) copying = true; ***/ if (optionDown) copying = true; if (doing) { StartRefreshCycle(); // do the move or copy Action* moveAction = NULL; if (copying) moveAction = destination->GetCopyAction(); else moveAction = destination->GetMoveAction(); if (moveAction) DoAction(moveAction); SetDestination(NULL); FinishRefreshCycle(); } else SetDestination(NULL); } }