haiku/src/apps/pulse/PulseWindow.cpp

178 lines
4.3 KiB
C++

//*****************************************************************************
//
// File: PulseWindow.cpp
//
// Written by: Daniel Switkin
//
// Copyright 1999, Be Incorporated
//
//*****************************************************************************
#include "PulseWindow.h"
#include "PulseApp.h"
#include "Common.h"
#include "DeskbarPulseView.h"
#include <Alert.h>
#include <Catalog.h>
#include <Deskbar.h>
#include <Screen.h>
#include <TextView.h>
#include <stdlib.h>
#include <string.h>
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "PulseWindow"
PulseWindow::PulseWindow(BRect rect)
:
BWindow(rect, B_TRANSLATE_SYSTEM_NAME("Pulse"), B_TITLED_WINDOW,
B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_QUIT_ON_WINDOW_CLOSE)
{
SetPulseRate(200000);
PulseApp *pulseapp = (PulseApp *)be_app;
BRect bounds = Bounds();
fNormalPulseView = new NormalPulseView(bounds);
AddChild(fNormalPulseView);
fMiniPulseView = new MiniPulseView(bounds, "MiniPulseView",
pulseapp->fPrefs);
AddChild(fMiniPulseView);
fMode = pulseapp->fPrefs->window_mode;
if (fMode == MINI_WINDOW_MODE) {
SetLook(B_MODAL_WINDOW_LOOK);
SetFeel(B_NORMAL_WINDOW_FEEL);
SetFlags(B_NOT_ZOOMABLE);
fNormalPulseView->Hide();
SetSizeLimits(GetMinimumViewWidth() - 1, 4096, 2, 4096);
ResizeTo(rect.Width(), rect.Height());
} else {
fMiniPulseView->Hide();
BRect r = fNormalPulseView->Bounds();
ResizeTo(r.Width(), r.Height());
}
}
PulseWindow::~PulseWindow()
{
PulseApp *pulseapp = (PulseApp *)be_app;
if (fMode == NORMAL_WINDOW_MODE)
pulseapp->fPrefs->normal_window_rect = Frame();
else if (fMode == MINI_WINDOW_MODE)
pulseapp->fPrefs->mini_window_rect = Frame();
}
void
PulseWindow::MessageReceived(BMessage *message)
{
switch (message->what) {
case PV_NORMAL_MODE:
case PV_MINI_MODE:
case PV_DESKBAR_MODE:
SetMode(message->what);
break;
case PRV_NORMAL_FADE_COLORS:
case PRV_NORMAL_CHANGE_COLOR:
fNormalPulseView->UpdateColors(message);
break;
case PRV_MINI_CHANGE_COLOR:
fMiniPulseView->UpdateColors(message);
break;
case PV_PREFERENCES: {
DetachCurrentMessage();
message->AddMessenger("settingsListener", this);
be_app->PostMessage(message);
break;
}
case PV_ABOUT: {
be_app->PostMessage(B_ABOUT_REQUESTED);
break;
}
case PV_QUIT:
PostMessage(B_QUIT_REQUESTED);
break;
case PV_CPU_MENU_ITEM:
// Call the correct version based on whose menu sent the message
if (fMiniPulseView->IsHidden())
fNormalPulseView->ChangeCPUState(message);
else
fMiniPulseView->ChangeCPUState(message);
break;
default:
BWindow::MessageReceived(message);
break;
}
}
void
PulseWindow::SetMode(int newmode)
{
PulseApp *pulseapp = (PulseApp *)be_app;
switch (newmode) {
case PV_NORMAL_MODE:
{
if (fMode == MINI_WINDOW_MODE) {
pulseapp->fPrefs->mini_window_rect = Frame();
pulseapp->fPrefs->window_mode = NORMAL_WINDOW_MODE;
pulseapp->fPrefs->Save();
}
fMiniPulseView->Hide();
fNormalPulseView->Show();
fMode = NORMAL_WINDOW_MODE;
SetType(B_TITLED_WINDOW);
SetFlags(B_NOT_RESIZABLE | B_NOT_ZOOMABLE);
BRect r = fNormalPulseView->Bounds();
ResizeTo(r.Width(), r.Height());
MoveTo(pulseapp->fPrefs->normal_window_rect.left,
pulseapp->fPrefs->normal_window_rect.top);
MoveOnScreen(B_MOVE_IF_PARTIALLY_OFFSCREEN);
break;
}
case PV_MINI_MODE:
if (fMode == NORMAL_WINDOW_MODE) {
pulseapp->fPrefs->normal_window_rect = Frame();
pulseapp->fPrefs->window_mode = MINI_WINDOW_MODE;
pulseapp->fPrefs->Save();
}
fNormalPulseView->Hide();
fMiniPulseView->Show();
fMode = MINI_WINDOW_MODE;
SetLook(B_MODAL_WINDOW_LOOK);
SetFeel(B_NORMAL_WINDOW_FEEL);
SetFlags(B_NOT_ZOOMABLE);
SetSizeLimits(GetMinimumViewWidth() - 1, 4096, 2, 4096);
ResizeTo(pulseapp->fPrefs->mini_window_rect.IntegerWidth(),
pulseapp->fPrefs->mini_window_rect.IntegerHeight());
MoveTo(pulseapp->fPrefs->mini_window_rect.left,
pulseapp->fPrefs->mini_window_rect.top);
MoveOnScreen(B_MOVE_IF_PARTIALLY_OFFSCREEN);
break;
case PV_DESKBAR_MODE:
// Do not set window's mode to DESKBAR_MODE because the
// destructor needs to save the correct BRect. ~PulseApp()
// will handle launching the replicant after our prefs are saved.
pulseapp->fPrefs->window_mode = DESKBAR_MODE;
LoadInDeskbar();
break;
}
}
bool
PulseWindow::QuitRequested()
{
return true;
}