root/src/apps/deskcalc/CalcView.h
/*
 * 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                       fButtonTextColor;

                        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