haiku/src/apps/deskcalc/CalcView.h

170 lines
4.2 KiB
C++

/*
* Copyright 2006-2013, 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
* Philippe Saint-Pierre, stpere@gmail.com
* John Scipione, jscipione@gmail.com
* Timothy Wayper, timmy@wunderbear.com
*/
#ifndef _CALC_VIEW_H
#define _CALC_VIEW_H
#include <View.h>
enum {
MSG_OPTIONS_AUTO_NUM_LOCK = 'oanl',
MSG_OPTIONS_ANGLE_MODE_RADIAN = 'oamr',
MSG_OPTIONS_ANGLE_MODE_DEGREE = 'oamd',
MSG_OPTIONS_KEYPAD_MODE_COMPACT = 'okmc',
MSG_OPTIONS_KEYPAD_MODE_BASIC = 'okmb',
MSG_OPTIONS_KEYPAD_MODE_SCIENTIFIC = 'okms',
MSG_UNFLASH_KEY = 'uflk'
};
static const float kMinimumWidthBasic = 130.0f;
static const float kMaximumWidthBasic = 400.0f;
static const float kMinimumHeightBasic = 130.0f;
static const float kMaximumHeightBasic = 400.0f;
class BString;
class BMenuItem;
class BMessage;
class BMessageRunner;
class BPopUpMenu;
struct CalcOptions;
class CalcOptionsWindow;
class ExpressionTextView;
class _EXPORT CalcView : public BView {
public:
static CalcView* Instantiate(BMessage* archive);
CalcView(BRect frame,
rgb_color rgbBaseColor,
BMessage* settings);
CalcView(BMessage* archive);
virtual ~CalcView();
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage* message);
virtual void Draw(BRect updateRect);
virtual void MouseDown(BPoint point);
virtual void MouseUp(BPoint point);
virtual void KeyDown(const char* bytes, int32 numBytes);
virtual void MakeFocus(bool focused = true);
virtual void FrameResized(float width, float height);
// Archive this view.
virtual status_t Archive(BMessage* archive, bool deep) const;
// Cut contents of view to system clipboard.
void Cut();
// Copy contents of view to system clipboard.
void Copy();
// Paste contents of system clipboard to view.
void Paste(BMessage* message);
// Save current settings
status_t SaveSettings(BMessage* archive) const;
// Evaluate the expression
void Evaluate();
// Flash the key on the keypad
void FlashKey(const char* bytes, int32 numBytes);
// Toggle whether or not the Num Lock key starts on
void ToggleAutoNumlock(void);
// Set the angle mode to degrees or radians
void SetDegreeMode(bool degrees);
// Set the keypad mode
void SetKeypadMode(uint8 mode);
private:
static status_t _EvaluateThread(void* data);
void _Init(BMessage* settings);
status_t _LoadSettings(BMessage* archive);
void _ParseCalcDesc(const char** keypadDescription);
void _PressKey(int key);
void _PressKey(const char* label);
int32 _KeyForLabel(const char* label) const;
void _FlashKey(int32 key, uint32 flashFlags);
void _Colorize();
void _CreatePopUpMenu(bool addKeypadModeMenuItems);
BRect _ExpressionRect() const;
BRect _KeypadRect() const;
void _MarkKeypadItems(uint8 mode);
void _FetchAppIcon(BBitmap* into);
bool _IsEmbedded();
void _SetEnabled(bool enable);
// grid dimensions
int16 fColumns;
int16 fRows;
// color scheme
rgb_color fBaseColor;
rgb_color fLightColor;
rgb_color fDarkColor;
rgb_color fButtonTextColor;
rgb_color fExpressionBGColor;
rgb_color fExpressionTextColor;
bool fHasCustomBaseColor;
// view dimensions
float fWidth;
float fHeight;
// keypad grid
struct CalcKey;
const char** fKeypadDescription;
CalcKey* fKeypad;
// icon
BBitmap* fCalcIcon;
// expression
ExpressionTextView* fExpressionTextView;
// pop-up context menu.
BPopUpMenu* fPopUpMenu;
BMenuItem* fAutoNumlockItem;
BMenuItem* fAngleModeRadianItem;
BMenuItem* fAngleModeDegreeItem;
BMenuItem* fKeypadModeCompactItem;
BMenuItem* fKeypadModeBasicItem;
BMenuItem* fKeypadModeScientificItem;
// calculator options.
CalcOptions* fOptions;
thread_id fEvaluateThread;
BMessageRunner* fEvaluateMessageRunner;
sem_id fEvaluateSemaphore;
bool fEnabled;
};
#endif // _CALC_VIEW_H