xref: /haiku/src/apps/icon-o-matic/gui/IconObjectListView.cpp (revision e1c4049fed1047bdb957b0529e1921e97ef94770)
1 /*
2  * Copyright 2006-2007, Haiku Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus <superstippi@gmx.de>
7  */
8 
9 #include "IconObjectListView.h"
10 
11 #include <new>
12 #include <stdio.h>
13 #include <string.h>
14 
15 #include <Catalog.h>
16 #include <Locale.h>
17 
18 #include "CommandStack.h"
19 #include "CommonPropertyIDs.h"
20 #include "IconObject.h"
21 #include "Property.h"
22 #include "PropertyItemView.h"
23 #include "PropertyObject.h"
24 #include "Selection.h"
25 #include "SetPropertiesCommand.h"
26 
27 
28 #undef B_TRANSLATION_CONTEXT
29 #define B_TRANSLATION_CONTEXT "Icon-O-Matic-PropertiesList"
30 
31 
32 using std::nothrow;
33 
34 // constructor
35 IconObjectListView::IconObjectListView()
36 	: PropertyListView(),
37 
38 	  fSelection(NULL),
39 	  fCommandStack(NULL),
40 	  fObject(NULL),
41 	  fIgnoreObjectChange(false)
42 {
43 }
44 
45 // destructor
46 IconObjectListView::~IconObjectListView()
47 {
48 	SetSelection(NULL);
49 	_SetObject(NULL);
50 }
51 
52 // Draw
53 void
54 IconObjectListView::Draw(BRect updateRect)
55 {
56 	PropertyListView::Draw(updateRect);
57 
58 	if (fObject)
59 		return;
60 
61 	// display helpful messages
62 	const char* message1 = B_TRANSLATE_COMMENT(
63  		"Click on an object in", "Empty property list - 1st line");
64 	const char* message2 = B_TRANSLATE_COMMENT(
65  		"any of the other lists to", "Empty property list - 2nd line");
66 	const char* message3 = B_TRANSLATE_COMMENT(
67 		"edit its properties here.", "Empty property list - 3rd line");
68 
69 	// Dark Themes
70 	rgb_color lowColor = LowColor();
71 	if (lowColor.red + lowColor.green + lowColor.blue > 128 * 3)
72 		SetHighColor(tint_color(LowColor(), B_DARKEN_2_TINT));
73 	else
74 		SetHighColor(tint_color(LowColor(), B_LIGHTEN_2_TINT));
75 
76 	font_height fh;
77 	GetFontHeight(&fh);
78 	BRect b(Bounds());
79 
80 	BPoint middle;
81 	float textHeight = (fh.ascent + fh.descent) * 1.5;
82 	middle.y = (b.top + b.bottom) / 2.0 - textHeight;
83 	middle.x = (b.left + b.right - StringWidth(message1)) / 2.0;
84 	DrawString(message1, middle);
85 
86 	middle.y += textHeight;
87 	middle.x = (b.left + b.right - StringWidth(message2)) / 2.0;
88 	DrawString(message2, middle);
89 
90 	middle.y += textHeight;
91 	middle.x = (b.left + b.right - StringWidth(message3)) / 2.0;
92 	DrawString(message3, middle);
93 }
94 
95 // PropertyChanged
96 void
97 IconObjectListView::PropertyChanged(const Property* previous,
98 									const Property* current)
99 {
100 	if (!fCommandStack || !fObject)
101 		return;
102 
103 	PropertyObject* oldObject = new (nothrow) PropertyObject();
104 	if (oldObject)
105 		oldObject->AddProperty(previous->Clone());
106 
107 	PropertyObject* newObject = new (nothrow) PropertyObject();
108 	if (newObject)
109 		newObject->AddProperty(current->Clone());
110 
111 	IconObject** objects = new (nothrow) IconObject*[1];
112 	if (objects)
113 		objects[0] = fObject;
114 
115 	Command* command = new (nothrow) SetPropertiesCommand(objects, 1,
116 														  oldObject,
117 														  newObject);
118 	fIgnoreObjectChange = true;
119 	fCommandStack->Perform(command);
120 	fIgnoreObjectChange = false;
121 }
122 
123 // PasteProperties
124 void
125 IconObjectListView::PasteProperties(const PropertyObject* object)
126 {
127 	// TODO: command for this
128 	if (fObject)
129 		fObject->SetToPropertyObject(object);
130 
131 	PropertyListView::PasteProperties(object);
132 }
133 
134 // IsEditingMultipleObjects
135 bool
136 IconObjectListView::IsEditingMultipleObjects()
137 {
138 	return false;
139 }
140 
141 // #pragma mark -
142 
143 // ObjectChanged
144 void
145 IconObjectListView::ObjectChanged(const Observable* object)
146 {
147 	if (object == fSelection) {
148 		Selectable* selected = fSelection->SelectableAt(0);
149 		_SetObject(dynamic_cast<IconObject*>(selected));
150 	}
151 
152 	if (object == fObject/* && !fIgnoreObjectChange*/) {
153 //printf("IconObjectListView::ObjectChanged(fObject)\n");
154 		SetTo(fObject->MakePropertyObject());
155 	}
156 }
157 
158 // #pragma mark -
159 
160 // SetSelection
161 void
162 IconObjectListView::SetSelection(Selection* selection)
163 {
164 	if (fSelection == selection)
165 		return;
166 
167 	if (fSelection)
168 		fSelection->RemoveObserver(this);
169 
170 	fSelection = selection;
171 
172 	if (fSelection)
173 		fSelection->AddObserver(this);
174 }
175 
176 // SetCommandStack
177 void
178 IconObjectListView::SetCommandStack(CommandStack* stack)
179 {
180 	fCommandStack = stack;
181 }
182 
183 // FocusNameProperty
184 void
185 IconObjectListView::FocusNameProperty()
186 {
187 	if (fObject == NULL)
188 		return;
189 
190 	int32 count = _CountItems();
191 	for (int32 i = 0; i < count; i++) {
192 		PropertyItemView* item = _ItemAt(i);
193 		Property* property = item->GetProperty();
194 		if (property != NULL && property->Identifier() == PROPERTY_NAME) {
195 			item->MakeFocus(true);
196 			break;
197 		}
198 	}
199 }
200 
201 
202 // #pragma mark -
203 
204 // _SetObject
205 void
206 IconObjectListView::_SetObject(IconObject* object)
207 {
208 	if (fObject == object)
209 		return;
210 
211 	if (fObject) {
212 		fObject->RemoveObserver(this);
213 		fObject->ReleaseReference();
214 	}
215 
216 	fObject = object;
217 	PropertyObject* propertyObject = NULL;
218 
219 	if (fObject) {
220 		fObject->AcquireReference();
221 		fObject->AddObserver(this);
222 		propertyObject = fObject->MakePropertyObject();
223 	}
224 
225 	SetTo(propertyObject);
226 }
227 
228