169 lines
3.7 KiB
C++
169 lines
3.7 KiB
C++
/*
|
|
* Copyright 2006-2012 Haiku, Inc. All Rights Reserved.
|
|
* Copyright 1997, 1998 R3 Software Ltd. All Rights Reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* Stephan Aßmus, superstippi@gmx.de
|
|
* John Scipione, jscipione@gmail.com
|
|
* Timothy Wayper, timmy@wunderbear.com
|
|
*/
|
|
|
|
|
|
#include "CalcWindow.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
|
|
#include <Application.h>
|
|
#include <Catalog.h>
|
|
#include <Dragger.h>
|
|
#include <Screen.h>
|
|
|
|
#include "CalcApplication.h"
|
|
#include "CalcOptions.h"
|
|
#include "CalcView.h"
|
|
|
|
|
|
#undef B_TRANSLATION_CONTEXT
|
|
#define B_TRANSLATION_CONTEXT "Window"
|
|
|
|
|
|
CalcWindow::CalcWindow(BRect frame, BMessage* settings)
|
|
:
|
|
BWindow(frame, kAppName, B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS
|
|
| B_NOT_ANCHORED_ON_ACTIVATE)
|
|
{
|
|
// create calculator view with calculator description and
|
|
// desktop background color
|
|
BScreen screen(this);
|
|
rgb_color baseColor = screen.DesktopColor();
|
|
|
|
// Size Limits are defined in CalcView.h
|
|
SetSizeLimits(kMinimumWidthBasic, kMaximumWidthBasic,
|
|
kMinimumHeightBasic, kMaximumHeightBasic);
|
|
|
|
frame.OffsetTo(B_ORIGIN);
|
|
fCalcView = new CalcView(Frame(), baseColor, settings);
|
|
|
|
// create replicant dragger
|
|
BRect replicantFrame(frame);
|
|
replicantFrame.top = replicantFrame.bottom - 7.0f;
|
|
replicantFrame.left = replicantFrame.right - 7.0f;
|
|
BDragger* dragger = new BDragger(replicantFrame, fCalcView,
|
|
B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
|
|
|
|
// attach views
|
|
AddChild(fCalcView);
|
|
fCalcView->AddChild(dragger);
|
|
|
|
BRect rect;
|
|
if (settings->FindRect("window frame", &rect) == B_OK)
|
|
SetFrame(rect);
|
|
else
|
|
SetFrame(frame, true);
|
|
|
|
// Add shortcut keys to menu options
|
|
AddShortcut('0', B_COMMAND_KEY,
|
|
new BMessage(MSG_OPTIONS_KEYPAD_MODE_COMPACT));
|
|
AddShortcut('1', B_COMMAND_KEY,
|
|
new BMessage(MSG_OPTIONS_KEYPAD_MODE_BASIC));
|
|
AddShortcut('2', B_COMMAND_KEY,
|
|
new BMessage(MSG_OPTIONS_KEYPAD_MODE_SCIENTIFIC));
|
|
}
|
|
|
|
|
|
CalcWindow::~CalcWindow()
|
|
{
|
|
}
|
|
|
|
|
|
void
|
|
CalcWindow::MessageReceived(BMessage* message)
|
|
{
|
|
switch (message->what) {
|
|
case MSG_OPTIONS_AUTO_NUM_LOCK:
|
|
fCalcView->ToggleAutoNumlock();
|
|
break;
|
|
|
|
case MSG_OPTIONS_ANGLE_MODE_RADIAN:
|
|
fCalcView->SetDegreeMode(false);
|
|
return;
|
|
|
|
case MSG_OPTIONS_ANGLE_MODE_DEGREE:
|
|
fCalcView->SetDegreeMode(true);
|
|
return;
|
|
|
|
case MSG_OPTIONS_KEYPAD_MODE_COMPACT:
|
|
fCalcView->SetKeypadMode(KEYPAD_MODE_COMPACT);
|
|
break;
|
|
|
|
case MSG_OPTIONS_KEYPAD_MODE_BASIC:
|
|
fCalcView->SetKeypadMode(KEYPAD_MODE_BASIC);
|
|
break;
|
|
|
|
case MSG_OPTIONS_KEYPAD_MODE_SCIENTIFIC:
|
|
fCalcView->SetKeypadMode(KEYPAD_MODE_SCIENTIFIC);
|
|
break;
|
|
|
|
default:
|
|
BWindow::MessageReceived(message);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
CalcWindow::Show()
|
|
{
|
|
// NOTE: done here because the CalcView
|
|
// turns on numlock if the options say so...
|
|
// so we want to call MakeFocus() after
|
|
// the options have been read for sure...
|
|
fCalcView->MakeFocus();
|
|
BWindow::Show();
|
|
}
|
|
|
|
|
|
bool
|
|
CalcWindow::QuitRequested()
|
|
{
|
|
be_app->PostMessage(B_QUIT_REQUESTED);
|
|
Hide();
|
|
|
|
// NOTE: don't quit, since the app needs us
|
|
// for saving settings yet...
|
|
return false;
|
|
}
|
|
|
|
|
|
status_t
|
|
CalcWindow::SaveSettings(BMessage* archive) const
|
|
{
|
|
status_t ret = archive->AddRect("window frame", Frame());
|
|
if (ret < B_OK)
|
|
return ret;
|
|
|
|
return fCalcView->SaveSettings(archive);
|
|
}
|
|
|
|
|
|
void
|
|
CalcWindow::SetFrame(BRect frame, bool forceCenter)
|
|
{
|
|
// make sure window frame is on screen (center, if not)
|
|
BScreen screen(this);
|
|
BRect screenFrame = screen.Frame();
|
|
if (forceCenter || !screenFrame.Contains(frame)) {
|
|
float left = (screenFrame.Width() - frame.Width()) / 2.0;
|
|
float top = (screenFrame.Height() - frame.Height()) / 2.0;
|
|
left += screenFrame.left;
|
|
top += screenFrame.top;
|
|
frame.OffsetTo(left, top);
|
|
}
|
|
|
|
MoveTo(frame.left, frame.top);
|
|
ResizeTo(frame.Width(), frame.Height());
|
|
}
|