1//*****************************************************************************
2//
3//	File:		PulseWindow.cpp
4//
5//	Written by:	Daniel Switkin
6//
7//	Copyright 1999, Be Incorporated
8//
9//*****************************************************************************
10
11
12#include "PulseWindow.h"
13#include "PulseApp.h"
14#include "Common.h"
15#include "DeskbarPulseView.h"
16
17#include <Alert.h>
18#include <Catalog.h>
19#include <Deskbar.h>
20#include <Screen.h>
21#include <TextView.h>
22
23#include <stdlib.h>
24#include <string.h>
25
26#undef B_TRANSLATION_CONTEXT
27#define B_TRANSLATION_CONTEXT "PulseWindow"
28
29
30PulseWindow::PulseWindow(BRect rect)
31	:
32	BWindow(rect, B_TRANSLATE_SYSTEM_NAME("Pulse"), B_TITLED_WINDOW,
33		B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_QUIT_ON_WINDOW_CLOSE)
34{
35	SetPulseRate(200000);
36
37	PulseApp *pulseapp = (PulseApp *)be_app;
38	BRect bounds = Bounds();
39	fNormalPulseView = new NormalPulseView(bounds);
40	AddChild(fNormalPulseView);
41
42	fMiniPulseView = new MiniPulseView(bounds, "MiniPulseView",
43		pulseapp->fPrefs);
44	AddChild(fMiniPulseView);
45
46	fMode = pulseapp->fPrefs->window_mode;
47	if (fMode == MINI_WINDOW_MODE) {
48		SetLook(B_MODAL_WINDOW_LOOK);
49		SetFeel(B_NORMAL_WINDOW_FEEL);
50		SetFlags(B_NOT_ZOOMABLE);
51		fNormalPulseView->Hide();
52		SetSizeLimits(GetMinimumViewWidth() - 1, 4096, 2, 4096);
53		ResizeTo(rect.Width(), rect.Height());
54	} else {
55		fMiniPulseView->Hide();
56		BRect r = fNormalPulseView->Bounds();
57		ResizeTo(r.Width(), r.Height());
58	}
59}
60
61
62PulseWindow::~PulseWindow()
63{
64	PulseApp *pulseapp = (PulseApp *)be_app;
65
66	if (fMode == NORMAL_WINDOW_MODE)
67		pulseapp->fPrefs->normal_window_rect = Frame();
68	else if (fMode == MINI_WINDOW_MODE)
69		pulseapp->fPrefs->mini_window_rect = Frame();
70}
71
72
73void
74PulseWindow::MessageReceived(BMessage *message)
75{
76	switch (message->what) {
77		case PV_NORMAL_MODE:
78		case PV_MINI_MODE:
79		case PV_DESKBAR_MODE:
80			SetMode(message->what);
81			break;
82		case PRV_NORMAL_FADE_COLORS:
83		case PRV_NORMAL_CHANGE_COLOR:
84			fNormalPulseView->UpdateColors(message);
85			break;
86		case PRV_MINI_CHANGE_COLOR:
87			fMiniPulseView->UpdateColors(message);
88			break;
89		case PV_PREFERENCES: {
90			DetachCurrentMessage();
91			message->AddMessenger("settingsListener", this);
92			be_app->PostMessage(message);
93			break;
94		}
95		case PV_ABOUT: {
96			be_app->PostMessage(B_ABOUT_REQUESTED);
97			break;
98		}
99		case PV_QUIT:
100			PostMessage(B_QUIT_REQUESTED);
101			break;
102		case PV_CPU_MENU_ITEM:
103			// Call the correct version based on whose menu sent the message
104			if (fMiniPulseView->IsHidden())
105				fNormalPulseView->ChangeCPUState(message);
106			else
107				fMiniPulseView->ChangeCPUState(message);
108			break;
109		default:
110			BWindow::MessageReceived(message);
111			break;
112	}
113}
114
115
116void
117PulseWindow::SetMode(int newmode)
118{
119	PulseApp *pulseapp = (PulseApp *)be_app;
120
121	switch (newmode) {
122		case PV_NORMAL_MODE:
123		{
124			if (fMode == MINI_WINDOW_MODE) {
125				pulseapp->fPrefs->mini_window_rect = Frame();
126				pulseapp->fPrefs->window_mode = NORMAL_WINDOW_MODE;
127				pulseapp->fPrefs->Save();
128			}
129			fMiniPulseView->Hide();
130			fNormalPulseView->Show();
131			fMode = NORMAL_WINDOW_MODE;
132			SetType(B_TITLED_WINDOW);
133			SetFlags(B_NOT_RESIZABLE | B_NOT_ZOOMABLE);
134			BRect r = fNormalPulseView->Bounds();
135			ResizeTo(r.Width(), r.Height());
136			MoveTo(pulseapp->fPrefs->normal_window_rect.left,
137				pulseapp->fPrefs->normal_window_rect.top);
138			MoveOnScreen(B_MOVE_IF_PARTIALLY_OFFSCREEN);
139			break;
140		}
141
142		case PV_MINI_MODE:
143			if (fMode == NORMAL_WINDOW_MODE) {
144				pulseapp->fPrefs->normal_window_rect = Frame();
145				pulseapp->fPrefs->window_mode = MINI_WINDOW_MODE;
146				pulseapp->fPrefs->Save();
147			}
148			fNormalPulseView->Hide();
149			fMiniPulseView->Show();
150			fMode = MINI_WINDOW_MODE;
151			SetLook(B_MODAL_WINDOW_LOOK);
152			SetFeel(B_NORMAL_WINDOW_FEEL);
153			SetFlags(B_NOT_ZOOMABLE);
154			SetSizeLimits(GetMinimumViewWidth() - 1, 4096, 2, 4096);
155			ResizeTo(pulseapp->fPrefs->mini_window_rect.IntegerWidth(),
156				pulseapp->fPrefs->mini_window_rect.IntegerHeight());
157			MoveTo(pulseapp->fPrefs->mini_window_rect.left,
158				pulseapp->fPrefs->mini_window_rect.top);
159			MoveOnScreen(B_MOVE_IF_PARTIALLY_OFFSCREEN);
160			break;
161
162		case PV_DESKBAR_MODE:
163			// Do not set window's mode to DESKBAR_MODE because the
164			// destructor needs to save the correct BRect. ~PulseApp()
165			// will handle launching the replicant after our prefs are saved.
166			pulseapp->fPrefs->window_mode = DESKBAR_MODE;
167			LoadInDeskbar();
168			break;
169	}
170}
171
172
173bool
174PulseWindow::QuitRequested()
175{
176	return true;
177}
178