1128277c9SStephan Aßmus /* 2128277c9SStephan Aßmus * Copyright 2006, Haiku. 3128277c9SStephan Aßmus * Distributed under the terms of the MIT License. 4128277c9SStephan Aßmus * 5128277c9SStephan Aßmus * Authors: 6128277c9SStephan Aßmus * Stephan Aßmus <superstippi@gmx.de> 7128277c9SStephan Aßmus */ 8128277c9SStephan Aßmus 9128277c9SStephan Aßmus #include "Selection.h" 10128277c9SStephan Aßmus 11128277c9SStephan Aßmus #include <stdio.h> 12128277c9SStephan Aßmus 13128277c9SStephan Aßmus #include <debugger.h> 14128277c9SStephan Aßmus 15128277c9SStephan Aßmus #include "Selectable.h" 16128277c9SStephan Aßmus 17128277c9SStephan Aßmus // constructor Selection()18128277c9SStephan AßmusSelection::Selection() 19128277c9SStephan Aßmus : fSelected(20) 20128277c9SStephan Aßmus { 21128277c9SStephan Aßmus } 22128277c9SStephan Aßmus 23128277c9SStephan Aßmus // destructor ~Selection()24128277c9SStephan AßmusSelection::~Selection() 25128277c9SStephan Aßmus { 26128277c9SStephan Aßmus } 27128277c9SStephan Aßmus 28128277c9SStephan Aßmus // Select 29128277c9SStephan Aßmus bool Select(Selectable * object,bool extend)30128277c9SStephan AßmusSelection::Select(Selectable* object, bool extend) 31128277c9SStephan Aßmus { 32128277c9SStephan Aßmus AutoNotificationSuspender _(this); 33128277c9SStephan Aßmus 34128277c9SStephan Aßmus if (!extend) 35128277c9SStephan Aßmus _DeselectAllExcept(object); 36128277c9SStephan Aßmus 37128277c9SStephan Aßmus bool success = false; 38128277c9SStephan Aßmus 39128277c9SStephan Aßmus if (!object->IsSelected()) { 40128277c9SStephan Aßmus 41128277c9SStephan Aßmus #if DEBUG 42128277c9SStephan Aßmus if (fSelected.HasItem((void*)object)) 43128277c9SStephan Aßmus debugger("Selection::Select() - " 44128277c9SStephan Aßmus "unselected object in list!"); 45128277c9SStephan Aßmus #endif 46128277c9SStephan Aßmus 47128277c9SStephan Aßmus if (fSelected.AddItem((void*)object)) { 48*2ce8d31dSStephan Aßmus object->_SetSelected(true); 49128277c9SStephan Aßmus success = true; 50128277c9SStephan Aßmus 51128277c9SStephan Aßmus Notify(); 52128277c9SStephan Aßmus } else { 53128277c9SStephan Aßmus fprintf(stderr, "Selection::Select() - out of memory\n"); 54128277c9SStephan Aßmus } 55128277c9SStephan Aßmus } else { 56128277c9SStephan Aßmus 57128277c9SStephan Aßmus #if DEBUG 58128277c9SStephan Aßmus if (!fSelected.HasItem((void*)object)) 59128277c9SStephan Aßmus debugger("Selection::Select() - " 60128277c9SStephan Aßmus "already selected object not in list!"); 61128277c9SStephan Aßmus #endif 62128277c9SStephan Aßmus 63128277c9SStephan Aßmus success = true; 64128277c9SStephan Aßmus // object already in list 65128277c9SStephan Aßmus } 66128277c9SStephan Aßmus 67128277c9SStephan Aßmus return success; 68128277c9SStephan Aßmus } 69128277c9SStephan Aßmus 70128277c9SStephan Aßmus // Deselect 71128277c9SStephan Aßmus void Deselect(Selectable * object)72128277c9SStephan AßmusSelection::Deselect(Selectable* object) 73128277c9SStephan Aßmus { 74128277c9SStephan Aßmus if (object->IsSelected()) { 75128277c9SStephan Aßmus if (!fSelected.RemoveItem((void*)object)) 76128277c9SStephan Aßmus debugger("Selection::Deselect() - " 77128277c9SStephan Aßmus "selected object not within list!"); 78*2ce8d31dSStephan Aßmus object->_SetSelected(false); 79128277c9SStephan Aßmus 80128277c9SStephan Aßmus Notify(); 81128277c9SStephan Aßmus } 82128277c9SStephan Aßmus } 83128277c9SStephan Aßmus 84128277c9SStephan Aßmus // DeselectAll 85128277c9SStephan Aßmus void DeselectAll()86128277c9SStephan AßmusSelection::DeselectAll() 87128277c9SStephan Aßmus { 88128277c9SStephan Aßmus _DeselectAllExcept(NULL); 89128277c9SStephan Aßmus } 90128277c9SStephan Aßmus 91128277c9SStephan Aßmus // #pragma mark - 92128277c9SStephan Aßmus 93128277c9SStephan Aßmus // SelectableAt 94128277c9SStephan Aßmus Selectable* SelectableAt(int32 index) const95128277c9SStephan AßmusSelection::SelectableAt(int32 index) const 96128277c9SStephan Aßmus { 97128277c9SStephan Aßmus return (Selectable*)fSelected.ItemAt(index); 98128277c9SStephan Aßmus } 99128277c9SStephan Aßmus 100128277c9SStephan Aßmus // SelectableAtFast 101128277c9SStephan Aßmus Selectable* SelectableAtFast(int32 index) const102128277c9SStephan AßmusSelection::SelectableAtFast(int32 index) const 103128277c9SStephan Aßmus { 104128277c9SStephan Aßmus return (Selectable*)fSelected.ItemAtFast(index); 105128277c9SStephan Aßmus } 106128277c9SStephan Aßmus 107128277c9SStephan Aßmus // CountSelected 108128277c9SStephan Aßmus int32 CountSelected() const109128277c9SStephan AßmusSelection::CountSelected() const 110128277c9SStephan Aßmus { 111128277c9SStephan Aßmus return fSelected.CountItems(); 112128277c9SStephan Aßmus } 113128277c9SStephan Aßmus 114128277c9SStephan Aßmus // #pragma mark - 115128277c9SStephan Aßmus 116128277c9SStephan Aßmus // _DeselectAllExcept 117128277c9SStephan Aßmus void _DeselectAllExcept(Selectable * except)118128277c9SStephan AßmusSelection::_DeselectAllExcept(Selectable* except) 119128277c9SStephan Aßmus { 120128277c9SStephan Aßmus bool notify = false; 121128277c9SStephan Aßmus bool containedExcept = false; 122128277c9SStephan Aßmus 123128277c9SStephan Aßmus int32 count = fSelected.CountItems(); 124128277c9SStephan Aßmus for (int32 i = 0; i < count; i++) { 125128277c9SStephan Aßmus Selectable* object = (Selectable*)fSelected.ItemAtFast(i); 126128277c9SStephan Aßmus if (object != except) { 127*2ce8d31dSStephan Aßmus object->_SetSelected(false); 128128277c9SStephan Aßmus notify = true; 129128277c9SStephan Aßmus } else { 130128277c9SStephan Aßmus containedExcept = true; 131128277c9SStephan Aßmus } 132128277c9SStephan Aßmus } 133128277c9SStephan Aßmus 134128277c9SStephan Aßmus fSelected.MakeEmpty(); 135128277c9SStephan Aßmus 136128277c9SStephan Aßmus // if the "except" object was previously 137128277c9SStephan Aßmus // in the selection, add it again after 138128277c9SStephan Aßmus // making the selection list empty 139128277c9SStephan Aßmus if (containedExcept) 140128277c9SStephan Aßmus fSelected.AddItem(except); 141128277c9SStephan Aßmus 142128277c9SStephan Aßmus if (notify) 143128277c9SStephan Aßmus Notify(); 144128277c9SStephan Aßmus } 145128277c9SStephan Aßmus 146