xref: /haiku/src/apps/icon-o-matic/generic/selection/Selection.cpp (revision f3814567402774e6d92af11d4e40bcbc3b1cb4dd)
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ßmus Selection::Selection()
19128277c9SStephan Aßmus 	: fSelected(20)
20128277c9SStephan Aßmus {
21128277c9SStephan Aßmus }
22128277c9SStephan Aßmus 
23128277c9SStephan Aßmus // destructor
~Selection()24128277c9SStephan Aßmus Selection::~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ßmus Selection::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ßmus Selection::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ßmus Selection::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ßmus Selection::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ßmus Selection::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ßmus Selection::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ßmus Selection::_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