/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef BAGEL_BOFLIB_GUI_WINDOW_H #define BAGEL_BOFLIB_GUI_WINDOW_H #include "common/list.h" #include "common/events.h" #include "bagel/spacebar/boflib/array.h" #include "bagel/boflib/stdinc.h" #include "bagel/boflib/error.h" #include "bagel/boflib/object.h" #include "bagel/boflib/point.h" #include "bagel/boflib/rect.h" #include "bagel/boflib/size.h" #include "bagel/spacebar/boflib/timer.h" #include "bagel/boflib/llist.h" #include "bagel/spacebar/boflib/gfx/bitmap.h" #include "bagel/boflib/palette.h" #include "bagel/spacebar/boflib/gfx/text.h" namespace Bagel { class CBofString; namespace SpaceBar { #define MAX_TITLE 64 #define USE_DEFAULT (-1) class CBofBitmap; class CBofTimerPacket; class CBofWindow : public CLList, public CBofObject, public CBofError { private: bool _visible = true; bool _enabled = true; Common::List _timers; uint32 _lastLButtonTime = 0, _lastRButtonTime = 0; /** * Handles translating from a ScummVM event structure to * a code used by the game engine */ uint32 translateKey(const Common::Event &event) const; protected: /** * Checks window timers for expiry */ void checkTimers(); public: /** * Default constructor */ CBofWindow(); /** * Constructor for CBofWindow * @param pszName Name of window * @param x X position * @param y Y position * @param nWidth Width of window to create (optional) * @param nHeight Height of window to create (optional) * @param pParent Parent of this window (optional) */ CBofWindow(const char *pszName, int x, int y, int nWidth, int nHeight, CBofWindow *pParent); /** * Destructor */ virtual ~CBofWindow(); static ErrorCode initialize(); static ErrorCode shutdown(); static Common::Point getMousePos(); /** * Creates a window * @param pszName Name of window * @param x X position of upper-left corner * @param y Y position of upper-left corner * @param nWidth Width of window to create (optional) * @param nHeight Height of window to create (optional) * @param pParent Parent of this window (optional) * @param nControlID User defined ID of this window * @return Error return code */ virtual ErrorCode create(const char *pszName, int x, int y, int nWidth, int nHeight, CBofWindow *pParent, uint32 nControlID = 0); /** * Creates a window * @param pszName Name of window * @param pRect Rectangle for window placement * @param pParent Parent of this window (optional) * @param nControlID User defined ID of this window * @return Error return code */ virtual ErrorCode create(const char *pszName, CBofRect *pRect, CBofWindow *pParent, uint32 nControlID = 0); /** * Destroys the Window attached to this CBofWindow (if any) */ virtual void destroy(); virtual void destroyWindow() { destroy(); } /** * Shows current window (if hidden) */ void show(); void select(); /** * Hides current window (if shown) */ void hide(); /** * Centers current window in parent window or in screen */ void center(); /** * Moves current window to specified location in parent * @param x New upper left corner X position * @param y New upper left corner Y position * @param bRepaint true if should update the window */ void move(int x, int y, bool bRepaint = false); /** * Resizes current window to specified area * @param pRect New area for window * @param bRepaint Optional repaint after resize */ void reSize(CBofRect *pRect, bool bRepaint = false); virtual ErrorCode close() { onClose(); return ERR_NONE; } /** * Posts a message * @param nMessage Message to post * @param lParam1 User info * @param lParam2 More user info */ void postMessage(uint32 nMessage, uint32 lParam1, uint32 lParam2); /** * Posts a user defined message */ void postUserMessage(uint32 lMessage, uint32 lExtraInfo); /** * Sets a timer which calls specified callback (or onTimer) * @param nID ID of timer to set * @param nInterval Number of milliseconds till event * @param pCallBack Function to call when time is up */ void setTimer(uint32 nID, uint32 nInterval, BofCallback pCallBack = nullptr); /** * Stops specified timer * @param nID ID of timer to stop */ void killTimer(uint32 nID); /** * Stops all timers associated with current window */ void killMyTimers(); /** * Returns the parent window element, if any */ CBofWindow *getParent() const { return _parent; } /** * Causes all parent windows to have valid paint regions * @param pRect Area to validate */ void validateAnscestors(CBofRect *pRect = nullptr); static CBofWindow *getActiveWindow() { return _pActiveWindow; } void setActive() { _pActiveWindow = this; } static CBofWindow *getWindowList() { return _pWindowList; } CBofRect getWindowRect() const { return _cWindowRect; } CBofRect getClientRect(); CBofRect getRect() const { return _cRect; } int width() const { return _cRect.width(); } int height() const { return _cRect.height(); } void screenToClient(CBofPoint *pPoint); /** * Selects and Realizes specified palette into current DC * @param pPal Palette to select */ void selectPalette(CBofPalette *pPal); /** * Associates a new background bitmap to this window * @param pNewBitmap New background bitmap * @param bRefresh true if should repaint now * @return Error return code */ ErrorCode setBackdrop(CBofBitmap *pNewBitmap, bool bRefresh = false); /** * Associates a new background bitmap to this window * @param pszFileName new background bitmap from file * @param bRefresh true if should repaint now * @return Error return code */ ErrorCode setBackdrop(const char *pszFileName, bool bRefresh = false); void clearBackdrop() { _pBackdrop = nullptr; } CBofBitmap *getBackdrop() const { return _pBackdrop; } bool hasBackdrop() const { return _pBackdrop != nullptr; } /** * Deletes the background bitmap associated with this window */ void killBackdrop(); /** * Updates the specified section of the background bitmap * @param pRect Area of bitmap to update on screen * @param nTransparentColor Color index used for transparency (-1 = none) * @return Error return code */ ErrorCode paintBackdrop(CBofRect *pRect = nullptr, int nTransparentColor = -1); void setControlID(uint32 nID) { _nID = nID; } uint32 getControlID() const { return _nID; } void setBkColor(COLORREF cColor) { _cBkColor = cColor; } COLORREF getBkColor() const { return _cBkColor; } void setFgColor(COLORREF cColor) { _cFgColor = cColor; } COLORREF getFgColor() const { return _cFgColor; } void setPrevMouseDown(CBofPoint p) { _cPrevMouseDown = p; } CBofPoint getPrevMouseDown() const { return _cPrevMouseDown; } /** * Sets mouse capture for this window */ void setCapture(); /** * Release mouse capture for this window */ void releaseCapture(); /** * Returns true if the control is capturing mouse events */ bool hasCapture() const; /** * Sets the focus on a control for keyboard input */ void setFocus(); /** * Releases focus from an edit control */ void releaseFocus(); /** * Returns true if the control has focus */ bool hasFocus() const; void flushAllMessages(); /** * Adds specified rectangle to dirty rect list for this window * @param pRect Rectangle to add to dirty list */ void validateRect(const CBofRect *pRect); /** * Removes specified rectangle from dirty rect for this window * @param pRect Rectangle to remove from dirty list */ void invalidateRect(const CBofRect *pRect); virtual void onBofButton(CBofObject *pButton, int nExtraInfo); virtual void onBofScrollBar(CBofObject *pButton, int nNewPos); virtual void onBofListBox(CBofObject *pListBox, int nItemIndex); virtual void onMainLoop(); virtual void onSoundNotify(CBofObject *pObject, uint32 lParam2); virtual void onMovieNotify(uint32 lParam1, uint32 lParam2); virtual void onMCINotify(uint32 wParam, uint32 lParam); virtual void onTimer(uint32 nTimerId); /** * Handles a pending ScummVM event * @param event Event to process */ virtual void handleEvent(const Common::Event &event); Graphics::ManagedSurface *getSurface(); bool isCreated() const { return _surface != nullptr; } virtual void enable() { _enabled = true; updateWindow(); } virtual void disable() { _enabled = false; updateWindow(); } bool isVisible() const { return _visible; } bool isEnabled() const { return _enabled; } void updateWindow(); void setParent(CBofWindow *parent); /** * Handle all pending ScummVM events */ void handleEvents(); virtual void onKeyHit(uint32 lKey, uint32 lRepCount); void fillWindow(byte iColor); void fillRect(CBofRect *pRect, byte iColor); ErrorCode paintBeveledText(CBofRect *rect, const CBofString &string, int size, int weight, COLORREF color, int justify, uint32 format); protected: CBofWindow *_parent = nullptr; // Pointer to parent window Array _children; // Child element pointers virtual void onMouseMove(uint32 nFlags, CBofPoint *pPoint, void * = nullptr); virtual void onLButtonDown(uint32 nFlags, CBofPoint *pPoint, void * = nullptr); virtual void onLButtonUp(uint32 nFlags, CBofPoint *pPoint, void * = nullptr); virtual void onLButtonDblClk(uint32 nFlags, CBofPoint *pPoint); virtual void onRButtonDown(uint32 nFlags, CBofPoint *pPoint); virtual void onRButtonUp(uint32 nFlags, CBofPoint *pPoint); virtual void onRButtonDblClk(uint32 nFlags, CBofPoint *pPoint); virtual void onReSize(CBofSize *pSize); virtual void onPaint(CBofRect *pRect); virtual void onClose(); virtual void onUserMessage(uint32 nMessage, uint32 lParam); virtual void onActivate(); virtual void onDeActivate(); // Window Data char _szTitle[MAX_TITLE] = { 0 }; // Title of window CBofRect _cWindowRect; // Screen based area of this window CBofRect _cRect; // Window-based area of this window CBofBitmap *_pBackdrop = nullptr; // Backdrop bitmap uint32 _nID = 0; // ID of this window COLORREF _cBkColor = RGB(255, 255, 255); COLORREF _cFgColor = RGB(0, 0, 0); bool _bCaptured = false; Graphics::ManagedSurface *_surface = nullptr; static CBofWindow *_pWindowList; static CBofWindow *_pActiveWindow; static CBofTimerPacket *_pTimerList; CBofPoint _cPrevMouseDown; static int _mouseX; static int _mouseY; }; class CBofMessage : public CBofObject { public: CBofWindow *_pWindow; // destination window for message uint32 _nMessage; // message to send (usually WM_USER) uint32 _lParam1; // user defined info uint32 _lParam2; // more user defined info }; class CBofTimerPacket : public CBofObject, public CLList { public: CBofWindow *_pOwnerWindow; BofCallback _pCallBack; uint32 _nID; uint32 _nInterval; }; extern CBofWindow *g_hackWindow; } // namespace SpaceBar } // namespace Bagel #endif