1/*
2 * Copyright 2005-2009, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Axel Dörfler, axeld@pinc-software.de
7 */
8
9
10#include "Workspace.h"
11
12#include <math.h>
13#include <stdio.h>
14#include <stdlib.h>
15
16#include <Debug.h>
17
18#include "Desktop.h"
19#include "WorkspacePrivate.h"
20#include "Window.h"
21
22
23static rgb_color kDefaultColor = (rgb_color){ 51, 102, 152, 255 };
24
25
26Workspace::Private::Private()
27{
28	_SetDefaults();
29}
30
31
32Workspace::Private::~Private()
33{
34}
35
36
37void
38Workspace::Private::SetDisplaysFromDesktop(Desktop* desktop)
39{
40}
41
42
43void
44Workspace::Private::SetColor(const rgb_color& color)
45{
46	fColor = color;
47}
48
49
50void
51Workspace::Private::RestoreConfiguration(const BMessage& settings)
52{
53	rgb_color color;
54	if (settings.FindInt32("color", (int32 *)&color) == B_OK)
55		fColor = color;
56
57	fStoredScreenConfiguration.Restore(settings);
58	fCurrentScreenConfiguration.Restore(settings);
59}
60
61
62/*!	\brief Store the workspace configuration in a message
63*/
64void
65Workspace::Private::StoreConfiguration(BMessage& settings)
66{
67	fStoredScreenConfiguration.Store(settings);
68	settings.AddInt32("color", *(int32 *)&fColor);
69}
70
71
72void
73Workspace::Private::_SetDefaults()
74{
75	fColor = kDefaultColor;
76}
77
78
79//	#pragma mark -
80
81
82Workspace::Workspace(Desktop& desktop, int32 index, bool readOnly)
83	:
84	fWorkspace(desktop.WorkspaceAt(index)),
85	fDesktop(desktop),
86	fCurrentWorkspace(index == desktop.CurrentWorkspace())
87{
88	ASSERT(desktop.WindowLocker().IsWriteLocked()
89		|| ( readOnly && desktop.WindowLocker().IsReadLocked()));
90	RewindWindows();
91}
92
93
94Workspace::~Workspace()
95{
96}
97
98
99const rgb_color&
100Workspace::Color() const
101{
102	return fWorkspace.Color();
103}
104
105
106void
107Workspace::SetColor(const rgb_color& color, bool makeDefault)
108{
109	if (color == Color())
110		return;
111
112	fWorkspace.SetColor(color);
113	fDesktop.RedrawBackground();
114	if (makeDefault)
115		fDesktop.StoreWorkspaceConfiguration(fWorkspace.Index());
116}
117
118
119status_t
120Workspace::GetNextWindow(Window*& _window, BPoint& _leftTop)
121{
122	if (fCurrent == NULL)
123		fCurrent = fWorkspace.Windows().FirstWindow();
124	else
125		fCurrent = fCurrent->NextWindow(fWorkspace.Index());
126
127	if (fCurrent == NULL)
128		return B_ENTRY_NOT_FOUND;
129
130	_window = fCurrent;
131
132	if (fCurrentWorkspace)
133		_leftTop = fCurrent->Frame().LeftTop();
134	else
135		_leftTop = fCurrent->Anchor(fWorkspace.Index()).position;
136
137	return B_OK;
138}
139
140
141status_t
142Workspace::GetPreviousWindow(Window*& _window, BPoint& _leftTop)
143{
144	if (fCurrent == NULL)
145		fCurrent = fWorkspace.Windows().LastWindow();
146	else
147		fCurrent = fCurrent->PreviousWindow(fWorkspace.Index());
148
149	if (fCurrent == NULL)
150		return B_ENTRY_NOT_FOUND;
151
152	_window = fCurrent;
153
154	if (fCurrentWorkspace)
155		_leftTop = fCurrent->Frame().LeftTop();
156	else
157		_leftTop = fCurrent->Anchor(fWorkspace.Index()).position;
158
159	return B_OK;
160}
161
162
163void
164Workspace::RewindWindows()
165{
166	fCurrent = NULL;
167}
168
169