imported catch-22 sol clone with authors permission
[reactos.git] / rosapps / games / solitaire / cardlib / cardregion.h
diff --git a/rosapps/games/solitaire/cardlib/cardregion.h b/rosapps/games/solitaire/cardlib/cardregion.h
new file mode 100644 (file)
index 0000000..d2806a9
--- /dev/null
@@ -0,0 +1,216 @@
+#ifndef CARDREGION_INCLUDED\r
+#define CARDREGION_INCLUDED\r
+\r
+#include "globals.h"\r
+#include "cardstack.h"\r
+#include "cardlib.h"\r
+\r
+class CardWindow;\r
+\r
+//\r
+//     This class defines a physical card-stack,\r
+//     which draws the cards, supports\r
+//\r
+\r
+class CardRegion\r
+{\r
+       friend class CardWindow;\r
+       friend class CardStack;\r
+\r
+       //\r
+       //      Constructor is PRIVATE - only\r
+       //  a CardWindow can create cardstacks!\r
+       //\r
+       CardRegion(CardWindow &parent, int id, bool fVisible, \r
+               int x, int y, int xOffset, int yOffset);\r
+\r
+       ~CardRegion();\r
+\r
+public:\r
+\r
+       void SetBackColor(COLORREF cr);\r
+       \r
+       void              SetCardStack(const CardStack &cs);\r
+       const CardStack & GetCardStack();\r
+\r
+       //\r
+       //      Event-callback support\r
+       //\r
+       bool SetDragRule(UINT uDragType, pCanDragProc proc = 0);\r
+       bool SetDropRule(UINT uDropType, pCanDropProc proc = 0);\r
+       \r
+       void SetClickProc    (pClickProc proc);\r
+       void SetDblClickProc (pClickProc proc);\r
+\r
+       void SetAddCardProc    (pAddProc proc);\r
+       void SetRemoveCardProc (pRemoveProc proc);\r
+\r
+       //\r
+       //      Physical attribute support\r
+       //\r
+       bool SetThreedCount (int count);\r
+       void SetOffsets     (int x, int y);\r
+       void SetPos         (int x, int y);\r
+       void Show           (bool fShow);\r
+       bool IsVisible      ();\r
+\r
+       void SetEmptyImage      (UINT uImage);\r
+       void SetBackCardIdx (UINT uBackIdx);\r
+       void SetPlacement   (UINT xJustify, UINT yJustify, int xAdjust, int yAdjust);\r
+\r
+       void Update();\r
+       void Redraw();\r
+\r
+       void SetFaceDirection(UINT uDirType, int nOption);\r
+       UINT GetFaceDirection(int *pnOption);\r
+\r
+       void Flash(int count, int timeout);\r
+       void StopFlash();\r
+\r
+       int  Id();\r
+\r
+       CardWindow &GetCardWindow() { return parentWnd; }\r
+\r
+       bool PlayCard(CardRegion *pDestStack, int value, int num);\r
+       bool MoveCard(CardRegion *pDestStack, int nNumCards, bool fAnimate);\r
+       bool SimulateDrag(CardRegion *pDestStack, int nNumCards, bool fAnimate);\r
+\r
+       bool Lock();\r
+       bool UnLock();\r
+\r
+       //\r
+       //      Common wrappers for the CardStack object\r
+       //\r
+       int         NumCards() const;\r
+       void        NewDeck()        { cardstack.NewDeck();  }\r
+       void        Shuffle()        { cardstack.Shuffle();  }\r
+       void        Clear()          { cardstack.Clear();    }\r
+\r
+       void            Reverse()        { cardstack.Reverse();  }\r
+       \r
+       void            Push(const Card card)     { cardstack.Push(card); }\r
+       void            Push(const CardStack &cs) { cardstack.Push(cs);   }\r
+\r
+       Card            Pop()          { return cardstack.Pop();      }\r
+       CardStack       Pop(int items) { return cardstack.Pop(items); }\r
+\r
+       Card            Top()          { return cardstack.Top();      }\r
+       CardStack       Top(int items) { return cardstack.Top(items); }\r
+\r
+\r
+private:\r
+\r
+       void DoFlash();\r
+       void RedrawIfNotDim(CardRegion *compare, bool fFullRedraw);\r
+\r
+       void UpdateFaceDir(CardStack &cards);\r
+       void Clip(HDC hdc);\r
+       void Render(HDC hdc);\r
+       int      GetOverlapRatio(int x, int y, int width, int height);\r
+\r
+       void MoveDragCardTo(HDC hdc, int x, int y);\r
+       void ZoomCard(HDC hdc, int xpos, int ypos, CardRegion *dest);\r
+\r
+       void RenderBottomMost(HDC hdc, int minustopmost = 0);\r
+       void PrepareDragBitmaps(int numtodrag);\r
+       void PrepareDragBitmapsThreed(int numtodrag);\r
+       void ReleaseDragBitmaps(void);\r
+\r
+       bool CanDragCards(int iNumCards);\r
+       bool CanDropCards(CardStack &cards);\r
+       \r
+       void CalcApparentCards();\r
+       int      CalcApparentCards(int realnum);\r
+\r
+       void UpdateSize();\r
+       void AdjustPosition(int winwidth, int winheight);\r
+\r
+       bool IsPointInStack(int x, int y);\r
+\r
+       int       GetNumDragCards(int x, int y);\r
+       bool  OnLButtonDown(int x, int y);\r
+       bool  OnLButtonDblClk(int x, int y);\r
+       bool  OnMouseMove(int x, int y);\r
+       bool  OnLButtonUp(int x, int y);\r
+\r
+       \r
+       //\r
+       //      Private data members\r
+       //\r
+\r
+       int             id;\r
+       \r
+       CardWindow &parentWnd;\r
+       \r
+       CardStack  cardstack;   //cards in this stack\r
+       CardStack  dragstack;   //cards which we might be dragging\r
+\r
+       bool    fMouseDragging;\r
+\r
+       int             xoffset;                //direction that cards take\r
+       int             yoffset;\r
+       \r
+       int             xpos;                   //coordinates of stack\r
+       int             ypos;\r
+\r
+       int             width;                  //stack-size of all cards\r
+       int             height;\r
+\r
+       //\r
+       //      justify / placement vars\r
+       int             xjustify;\r
+       int             yjustify;\r
+       int             xadjust;\r
+       int             yadjust;\r
+\r
+       //\r
+       //      Used for mouse-dragging / moving cards\r
+       //\r
+       int             iNumDragCards;\r
+       int             mousexoffset;   \r
+       int             mouseyoffset;\r
+       int             oldx;\r
+       int             oldy;\r
+       \r
+       int             nDragCardWidth;\r
+       int             nDragCardHeight;\r
+       \r
+       HDC             hdcBackGnd;\r
+       HBITMAP hbmBackGnd;\r
+       HDC             hdcDragCard;\r
+       HBITMAP hbmDragCard;\r
+\r
+       int             nNumApparentCards;\r
+       int             nThreedCount;\r
+       bool    fVisible;\r
+       \r
+       int             nFlashCount;\r
+       bool    fFlashVisible;\r
+       UINT    uFlashTimer;\r
+\r
+       COLORREF crBackgnd;\r
+\r
+       UINT    uEmptyImage;\r
+       UINT    uFaceDirType;\r
+       int             nFaceDirOption;\r
+       int             nBackCardIdx;\r
+\r
+       UINT    uDragRule;\r
+       UINT    uDropRule;\r
+       \r
+       //\r
+       //      Stack callback support\r
+       //      \r
+       pCanDragProc    CanDragCallback;\r
+       pCanDropProc    CanDropCallback;\r
+       pClickProc              ClickCallback;\r
+       pClickProc              DblClickCallback;\r
+       pAddProc                AddCallback;\r
+       pRemoveProc             RemoveCallback;\r
+\r
+       //locking mechanism to prevent user dragging etc\r
+       HANDLE                  mxlock;         \r
+};\r
+\r
+#endif\r
+\r