⛏️ index : haiku.git

//*****************************************************************************
//
//	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;
}