diff options
Diffstat (limited to 'views/controls/table/table_view.cc')
-rw-r--r-- | views/controls/table/table_view.cc | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/views/controls/table/table_view.cc b/views/controls/table/table_view.cc index cd7541a2..84c0538 100644 --- a/views/controls/table/table_view.cc +++ b/views/controls/table/table_view.cc @@ -680,13 +680,10 @@ LRESULT CALLBACK TableView::TableWndProc(HWND window, // Unselect everything. ListView_SetItemState(window, -1, 0, LVIS_SELECTED); select = false; - - // Select from mark to mouse down location. - for (int i = std::min(view_index, mark_view_index), - max_i = std::max(view_index, mark_view_index); i <= max_i; - ++i) { - table_view->SetSelectedState(table_view->ViewToModel(i), - true); + if (!table_view->SelectMultiple(view_index, mark_view_index)) { + // Selection spans group boundary - reset selection to current. + table_view->SetSelectedState(model_index, true); + ListView_SetSelectionMark(window, view_index); } } } @@ -918,6 +915,32 @@ void TableView::SortItemsAndUpdateMapping() { } } +bool TableView::SelectMultiple(int view_index, int mark_view_index) { + int group_id = 0; + if (model_->HasGroups()) { + group_id = model_->GetGroupID(ViewToModel(view_index)); + if (group_id != model_->GetGroupID(ViewToModel(mark_view_index))) { + // User is trying to do a cross-group selection - bail out. + return false; + } + } + + // Select from mark to mouse down location. + for (int i = std::min(view_index, mark_view_index), + max_i = std::max(view_index, mark_view_index); i <= max_i; + ++i) { + // Items between the view_index and mark_view_index are not necessarily in + // the same group, so don't select anything outside the group the user + // just clicked in. + if (model_->HasGroups() && + model_->GetGroupID(ViewToModel(i)) != group_id) { + continue; + } + SetSelectedState(ViewToModel(i), true); + } + return true; +} + // static int CALLBACK TableView::SortFunc(LPARAM model_index_1_p, LPARAM model_index_2_p, |