1/*
2 * Copyright (c) 1999-2000, Eric Moon.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions, and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions, and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * 3. The name of the author may not be used to endorse or promote products
17 *    derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31
32// DormantNodeWindow.cpp
33// e.moon 2jun99
34
35#include "DormantNodeWindow.h"
36// DormantNodeView
37#include "DormantNodeView.h"
38
39#include "RouteWindow.h"
40
41// Application Kit
42#include <Application.h>
43// Locale Kit
44#undef B_CATALOG
45#define B_CATALOG (&sCatalog)
46#include <Catalog.h>
47// Interface Kit
48#include <Screen.h>
49#include <ScrollBar.h>
50
51#undef B_TRANSLATION_CONTEXT
52#define B_TRANSLATION_CONTEXT "CortexDormantNodeWindow"
53
54__USE_CORTEX_NAMESPACE
55
56#include <Debug.h>
57#define D_ALLOC(x)	//PRINT (x)		// ctor/dtor
58#define D_HOOK(x) //PRINT (x)		// BWindow impl.
59#define D_MESSAGE(x) //PRINT (x)	// MessageReceived()
60#define D_INTERNAL(x) //PRINT (x)	// internal operations
61
62static BCatalog sCatalog("x-vnd.Cortex.DormantNodeView");
63
64// -------------------------------------------------------- //
65// constants
66// -------------------------------------------------------- //
67
68// this should be a bit more sophisticated :)
69const BRect DormantNodeWindow::s_initFrame(500.0, 350.0, 640.0, 480.0);
70
71// -------------------------------------------------------- //
72// ctor/dtor
73// -------------------------------------------------------- //
74
75DormantNodeWindow::DormantNodeWindow(
76	BWindow* parent)
77	: BWindow(s_initFrame,
78			  B_TRANSLATE("Media add-ons"),
79			  B_FLOATING_WINDOW_LOOK,
80			  B_FLOATING_SUBSET_WINDOW_FEEL,
81			  B_WILL_ACCEPT_FIRST_CLICK|B_AVOID_FOCUS|B_ASYNCHRONOUS_CONTROLS),
82	  m_parent(parent),
83	  m_zoomed(false),
84	  m_zooming(false) {
85	D_ALLOC(("DormantNodeWindow::DormantNodeWindow()\n"));
86
87	ASSERT(m_parent);
88	AddToSubset(m_parent);
89
90	// Create the ListView
91	BRect r = Bounds();
92	r.right -= B_V_SCROLL_BAR_WIDTH;
93	m_listView = new DormantNodeView(r, "Dormant Node ListView", B_FOLLOW_ALL_SIDES);
94
95	// Add the vertical ScrollBar
96	r.left = r.right + 1.0;
97	r.right = r.left + B_V_SCROLL_BAR_WIDTH;
98	r.InsetBy(0.0, -1.0);
99	AddChild(new BScrollBar(r, "", m_listView, 0.0, 0.0, B_VERTICAL));
100
101	// Add the ListView
102	AddChild(m_listView);
103	_constrainToScreen();
104}
105
106DormantNodeWindow::~DormantNodeWindow() {
107	D_ALLOC(("DormantNodeWindow::~DormantNodeWindow()\n"));
108
109}
110
111// -------------------------------------------------------- //
112// BWindow impl.
113// -------------------------------------------------------- //
114
115bool DormantNodeWindow::QuitRequested() {
116	D_HOOK(("DormantNodeWindow::QuitRequested()\n"));
117
118	// [e.moon 29nov99] the RouteWindow is now responsible for
119	// closing me
120	m_parent->PostMessage(RouteWindow::M_TOGGLE_DORMANT_NODE_WINDOW);
121	return false;
122}
123
124void DormantNodeWindow::Zoom(
125	BPoint origin,
126	float width,
127	float height) {
128	D_HOOK(("DormantNodeWindow::Zoom()\n"));
129
130	m_zooming = true;
131
132	BScreen screen(this);
133	if (!screen.Frame().Contains(Frame())) {
134		m_zoomed = false;
135	}
136
137	if (!m_zoomed) {
138		// resize to the ideal size
139		m_manualSize = Bounds();
140		m_listView->GetPreferredSize(&width, &height);
141		ResizeTo(width + B_V_SCROLL_BAR_WIDTH, height);
142		m_zoomed = true;
143		_constrainToScreen();
144	}
145	else {
146		// resize to the most recent manual size
147		ResizeTo(m_manualSize.Width(), m_manualSize.Height());
148		m_zoomed = false;
149	}
150}
151
152// -------------------------------------------------------- //
153// internal operations
154// -------------------------------------------------------- //
155
156void DormantNodeWindow::_constrainToScreen() {
157	D_INTERNAL(("DormantNodeWindow::_constrainToScreen()\n"));
158
159	BScreen screen(this);
160	BRect screenRect = screen.Frame();
161	BRect windowRect = Frame();
162
163	// if the window is outside the screen rect
164	// move it to the default position
165	if (!screenRect.Intersects(windowRect)) {
166		windowRect.OffsetTo(screenRect.LeftTop());
167		MoveTo(windowRect.LeftTop());
168		windowRect = Frame();
169	}
170
171	// if the window is larger than the screen rect
172	// resize it to fit at each side
173	if (!screenRect.Contains(windowRect)) {
174		if (windowRect.left < screenRect.left) {
175			windowRect.left = screenRect.left + 5.0;
176			MoveTo(windowRect.LeftTop());
177			windowRect = Frame();
178		}
179		if (windowRect.top < screenRect.top) {
180			windowRect.top = screenRect.top + 5.0;
181			MoveTo(windowRect.LeftTop());
182			windowRect = Frame();
183		}
184		if (windowRect.right > screenRect.right) {
185			windowRect.right = screenRect.right - 5.0;
186		}
187		if (windowRect.bottom > screenRect.bottom) {
188			windowRect.bottom = screenRect.bottom - 5.0;
189		}
190		ResizeTo(windowRect.Width(), windowRect.Height());
191	}
192}
193
194// END -- DormantNodeWindow.cpp --
195