mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 13:45:50 +00:00
remove some backup files created by editplus
svn path=/trunk/; revision=13905
This commit is contained in:
parent
e415037205
commit
26676ade4c
2 changed files with 0 additions and 1107 deletions
|
@ -1,489 +0,0 @@
|
||||||
//
|
|
||||||
// CardLib - CardButton class
|
|
||||||
//
|
|
||||||
// Freeware
|
|
||||||
// Copyright J Brown 2001
|
|
||||||
//
|
|
||||||
#include <windows.h>
|
|
||||||
#include <tchar.h>
|
|
||||||
|
|
||||||
#include "cardlib.h"
|
|
||||||
#include "cardwindow.h"
|
|
||||||
#include "cardbutton.h"
|
|
||||||
#include "cardcolor.h"
|
|
||||||
|
|
||||||
HPALETTE UseNicePalette(HDC, HPALETTE);
|
|
||||||
void RestorePalette(HDC, HPALETTE);
|
|
||||||
|
|
||||||
void PaintRect(HDC hdc, RECT *rect, COLORREF colour);
|
|
||||||
|
|
||||||
CardButton::CardButton(CardWindow &parent, int Id, TCHAR *szText, UINT Style, bool visible,
|
|
||||||
int x, int y, int width, int height)
|
|
||||||
|
|
||||||
: parentWnd(parent), id(Id), fVisible(visible), uStyle(Style), ButtonCallback(0)
|
|
||||||
{
|
|
||||||
crText = RGB(255,255,255);
|
|
||||||
crBack = RGB(0, 128, 0);
|
|
||||||
|
|
||||||
xadjust = 0;
|
|
||||||
yadjust = 0;
|
|
||||||
xjustify = 0;
|
|
||||||
yjustify = 0;
|
|
||||||
|
|
||||||
fMouseDown = false;
|
|
||||||
fButtonDown = false;
|
|
||||||
|
|
||||||
hIcon = 0;
|
|
||||||
|
|
||||||
SetText(szText);
|
|
||||||
Move(x, y, width, height);
|
|
||||||
|
|
||||||
mxlock = CreateMutex(0, FALSE, 0);
|
|
||||||
|
|
||||||
hFont = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
CardButton::~CardButton()
|
|
||||||
{
|
|
||||||
CloseHandle(mxlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::DrawRect(HDC hdc, RECT *rect, bool fNormal)
|
|
||||||
{
|
|
||||||
RECT fill;
|
|
||||||
|
|
||||||
HANDLE hOld;
|
|
||||||
|
|
||||||
HPEN hhi = CreatePen(0, 0, MAKE_PALETTERGB(crHighlight));
|
|
||||||
HPEN hsh = CreatePen(0, 0, MAKE_PALETTERGB(crShadow));
|
|
||||||
HPEN hbl = (HPEN)GetStockObject(BLACK_PEN);
|
|
||||||
|
|
||||||
int x = rect->left;
|
|
||||||
int y = rect->top;
|
|
||||||
int width = rect->right-rect->left - 1;
|
|
||||||
int height = rect->bottom-rect->top - 1;
|
|
||||||
|
|
||||||
SetRect(&fill, x+1, y+1, x+width-1, y+height-1);
|
|
||||||
|
|
||||||
int one = 1;
|
|
||||||
|
|
||||||
if(!fNormal)
|
|
||||||
{
|
|
||||||
x += width;
|
|
||||||
y += height;
|
|
||||||
width = -width;
|
|
||||||
height = -height;
|
|
||||||
one = -1;
|
|
||||||
OffsetRect(&fill, 1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fNormal)
|
|
||||||
hOld = SelectObject(hdc, hhi);
|
|
||||||
else
|
|
||||||
hOld = SelectObject(hdc, hhi);
|
|
||||||
|
|
||||||
MoveToEx(hdc, x, y+height, 0);
|
|
||||||
LineTo(hdc, x, y);
|
|
||||||
LineTo(hdc, x+width, y);
|
|
||||||
SelectObject(hdc, hOld);
|
|
||||||
|
|
||||||
hOld = SelectObject(hdc, hbl);
|
|
||||||
LineTo(hdc, x+width, y+height);
|
|
||||||
LineTo(hdc, x-one, y+height);
|
|
||||||
SelectObject(hdc, hOld);
|
|
||||||
|
|
||||||
hOld = SelectObject(hdc, hsh);
|
|
||||||
MoveToEx(hdc, x+one, y+height-one, 0);
|
|
||||||
LineTo(hdc, x+width-one, y+height-one);
|
|
||||||
LineTo(hdc, x+width-one, y);
|
|
||||||
SelectObject(hdc, hOld);
|
|
||||||
|
|
||||||
PaintRect(hdc, &fill, MAKE_PALETTERGB(crBack));
|
|
||||||
|
|
||||||
DeleteObject(hhi);
|
|
||||||
DeleteObject(hsh);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::Clip(HDC hdc)
|
|
||||||
{
|
|
||||||
if(fVisible == false) return;
|
|
||||||
|
|
||||||
ExcludeClipRect(hdc, rect.left, rect.top, rect.right, rect.bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::Draw(HDC hdc, bool fNormal)
|
|
||||||
{
|
|
||||||
SIZE textsize;
|
|
||||||
int x, y; //text x, y
|
|
||||||
int ix, iy; //icon x, y
|
|
||||||
int iconwidth = 0;
|
|
||||||
|
|
||||||
RECT cliprect;
|
|
||||||
|
|
||||||
if(fVisible == 0) return;
|
|
||||||
|
|
||||||
if(hFont == 0)
|
|
||||||
SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT));
|
|
||||||
else
|
|
||||||
SelectObject(hdc, hFont);
|
|
||||||
|
|
||||||
GetTextExtentPoint32(hdc, szText, lstrlen(szText), &textsize);
|
|
||||||
|
|
||||||
if(hIcon)
|
|
||||||
{
|
|
||||||
x = rect.left + 32 + 8;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(uStyle & CB_ALIGN_LEFT)
|
|
||||||
{
|
|
||||||
x = rect.left + iconwidth;
|
|
||||||
}
|
|
||||||
else if(uStyle & CB_ALIGN_RIGHT)
|
|
||||||
{
|
|
||||||
x = rect.left + (rect.right-rect.left-iconwidth-textsize.cx);
|
|
||||||
}
|
|
||||||
else //centered
|
|
||||||
{
|
|
||||||
x = rect.right - rect.left - iconwidth;
|
|
||||||
x = (x - textsize.cx) / 2;
|
|
||||||
x += rect.left + iconwidth;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
y = rect.bottom - rect.top;
|
|
||||||
y = (y - textsize.cy) / 2;
|
|
||||||
y += rect.top;
|
|
||||||
|
|
||||||
//calc icon position..
|
|
||||||
ix = rect.left + 4;
|
|
||||||
iy = rect.top + (rect.bottom-rect.top-32) / 2;
|
|
||||||
|
|
||||||
//if button is pressed, then shift text
|
|
||||||
if(fNormal == false && (uStyle & CB_PUSHBUTTON))
|
|
||||||
{
|
|
||||||
x += 1;
|
|
||||||
y += 1;
|
|
||||||
ix += 1;
|
|
||||||
iy += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetRect(&cliprect, x, y, x+textsize.cx, y+textsize.cy);
|
|
||||||
ExcludeClipRect(hdc, x, y, x+textsize.cx, y+textsize.cy);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calc icon pos
|
|
||||||
//
|
|
||||||
|
|
||||||
if(hIcon)
|
|
||||||
{
|
|
||||||
ExcludeClipRect(hdc, ix, iy, ix + 32, iy + 32);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(uStyle & CB_PUSHBUTTON)
|
|
||||||
{
|
|
||||||
DrawRect(hdc, &rect, fNormal);
|
|
||||||
|
|
||||||
SetBkColor(hdc, MAKE_PALETTERGB(crBack));
|
|
||||||
SetTextColor(hdc, crText);//MAKE_PALETTERGB(crText));
|
|
||||||
|
|
||||||
SelectClipRgn(hdc, 0);
|
|
||||||
|
|
||||||
ExtTextOut(hdc, x, y, ETO_OPAQUE, &cliprect, szText, lstrlen(szText), 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetBkColor(hdc, MAKE_PALETTERGB(crBack));
|
|
||||||
SetTextColor(hdc, crText);//MAKE_PALETTERGB(crText));
|
|
||||||
|
|
||||||
SelectClipRgn(hdc, 0);
|
|
||||||
|
|
||||||
ExtTextOut(hdc, x, y, ETO_OPAQUE, &rect, szText, lstrlen(szText), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(hIcon)
|
|
||||||
{
|
|
||||||
HBRUSH hbr = CreateSolidBrush(MAKE_PALETTERGB(crBack));
|
|
||||||
DrawIconEx(hdc, ix, iy, hIcon, 32, 32, 0, hbr, 0);
|
|
||||||
DeleteObject(hbr);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::AdjustPosition(int winwidth, int winheight)
|
|
||||||
{
|
|
||||||
int width = rect.right-rect.left;
|
|
||||||
int height = rect.bottom-rect.top;
|
|
||||||
|
|
||||||
width = width & ~0x1;
|
|
||||||
|
|
||||||
switch(xjustify)
|
|
||||||
{
|
|
||||||
case CS_XJUST_NONE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CS_XJUST_CENTER: //centered
|
|
||||||
rect.left = (winwidth - (width)) / 2;
|
|
||||||
rect.left += xadjust;
|
|
||||||
rect.right = rect.left+width;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CS_XJUST_RIGHT: //right-aligned
|
|
||||||
rect.left = winwidth - width;
|
|
||||||
rect.left += xadjust;
|
|
||||||
rect.right = rect.left+width;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(yjustify)
|
|
||||||
{
|
|
||||||
case CS_YJUST_NONE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CS_YJUST_CENTER: //centered
|
|
||||||
rect.top = (winheight - (height)) / 2;
|
|
||||||
rect.top += yadjust;
|
|
||||||
rect.bottom = rect.top+height;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CS_YJUST_BOTTOM: //right-aligned
|
|
||||||
rect.top = winheight - height;
|
|
||||||
rect.top += yadjust;
|
|
||||||
rect.bottom = rect.top+height;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int CardButton::OnLButtonDown(HWND hwnd, int x, int y)
|
|
||||||
{
|
|
||||||
if((uStyle & CB_PUSHBUTTON) == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
//make sure that the user is allowed to do something
|
|
||||||
if(WaitForSingleObject(mxlock, 0) != WAIT_OBJECT_0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ReleaseMutex(mxlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
fMouseDown = true;
|
|
||||||
fButtonDown = true;
|
|
||||||
|
|
||||||
Redraw();
|
|
||||||
|
|
||||||
SetCapture(hwnd);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CardButton::OnMouseMove(HWND hwnd, int x, int y)
|
|
||||||
{
|
|
||||||
if(fMouseDown)
|
|
||||||
{
|
|
||||||
bool fOldButtonDown = fButtonDown;
|
|
||||||
|
|
||||||
POINT pt;
|
|
||||||
|
|
||||||
pt.x = x;
|
|
||||||
pt.y = y;
|
|
||||||
|
|
||||||
if(PtInRect(&rect, pt))
|
|
||||||
fButtonDown = true;
|
|
||||||
else
|
|
||||||
fButtonDown = false;
|
|
||||||
|
|
||||||
if(fButtonDown != fOldButtonDown)
|
|
||||||
Redraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CardButton::OnLButtonUp(HWND hwnd, int x, int y)
|
|
||||||
{
|
|
||||||
if(fMouseDown)
|
|
||||||
{
|
|
||||||
fMouseDown = false;
|
|
||||||
fButtonDown = false;
|
|
||||||
|
|
||||||
if(uStyle & CB_PUSHBUTTON)
|
|
||||||
{
|
|
||||||
Redraw();
|
|
||||||
ReleaseCapture();
|
|
||||||
}
|
|
||||||
|
|
||||||
//if have clicked the button
|
|
||||||
if(parentWnd.CardButtonFromPoint(x, y) == this)
|
|
||||||
{
|
|
||||||
if(ButtonCallback)
|
|
||||||
{
|
|
||||||
ButtonCallback(*this);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
HWND hwnd = (HWND)parentWnd;
|
|
||||||
SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(id, BN_CLICKED), (LONG)hwnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _countof(array) (sizeof(array)/sizeof(array[0]))
|
|
||||||
|
|
||||||
CardButton *CardWindow::CreateButton(int id, TCHAR *szText, UINT uStyle, bool fVisible, int x, int y, int width, int height)
|
|
||||||
{
|
|
||||||
CardButton *cb;
|
|
||||||
|
|
||||||
if(nNumButtons == MAXBUTTONS)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
cb = new CardButton(*this, id, szText, uStyle, fVisible, x, y, width, height);
|
|
||||||
Buttons[nNumButtons++] = cb;
|
|
||||||
|
|
||||||
if(uStyle & CB_PUSHBUTTON)
|
|
||||||
{
|
|
||||||
cb->SetBackColor(CardButton::GetFace(crBackgnd));
|
|
||||||
//cb->SetBackColor(ScaleLumRGB(crBackgnd, 0.1));
|
|
||||||
cb->SetForeColor(RGB(255,255,255));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cb->SetBackColor(crBackgnd);
|
|
||||||
cb->SetForeColor(RGB(255,255,255));
|
|
||||||
}
|
|
||||||
|
|
||||||
return cb;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::SetText(TCHAR *lpszFormat, ...)
|
|
||||||
{
|
|
||||||
int count;
|
|
||||||
|
|
||||||
va_list args;
|
|
||||||
va_start(args, lpszFormat);
|
|
||||||
|
|
||||||
count = wvsprintf(szText, lpszFormat, args);
|
|
||||||
va_end(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
int CardButton::Id()
|
|
||||||
{
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::Show(bool fShow)
|
|
||||||
{
|
|
||||||
fVisible = fShow;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::Move(int x, int y, int width, int height)
|
|
||||||
{
|
|
||||||
SetRect(&rect, x, y, x+width, y+height);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::Redraw()
|
|
||||||
{
|
|
||||||
HDC hdc = GetDC((HWND)parentWnd);
|
|
||||||
|
|
||||||
HPALETTE hOldPal = UseNicePalette(hdc, __hPalette);
|
|
||||||
|
|
||||||
Draw(hdc, !fButtonDown);
|
|
||||||
|
|
||||||
RestorePalette(hdc, hOldPal);
|
|
||||||
|
|
||||||
ReleaseDC((HWND)parentWnd, hdc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::SetForeColor(COLORREF cr)
|
|
||||||
{
|
|
||||||
crText = cr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::SetBackColor(COLORREF cr)
|
|
||||||
{
|
|
||||||
crBack = cr;
|
|
||||||
|
|
||||||
crHighlight = GetHighlight(cr);
|
|
||||||
crShadow = GetShadow(cr);
|
|
||||||
|
|
||||||
//crHighlight = ScaleLumRGB(cr, +0.25);
|
|
||||||
//crShadow = ScaleLumRGB(cr, -0.25);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Static member
|
|
||||||
COLORREF CardButton::GetHighlight(COLORREF crBase)
|
|
||||||
{
|
|
||||||
return ColorScaleRGB(crBase, RGB(255,255,255), 0.25);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Static member
|
|
||||||
COLORREF CardButton::GetShadow(COLORREF crBase)
|
|
||||||
{
|
|
||||||
return ColorScaleRGB(crBase, RGB(0, 0, 0), 0.25);
|
|
||||||
}
|
|
||||||
|
|
||||||
COLORREF CardButton::GetFace(COLORREF crBase)
|
|
||||||
{
|
|
||||||
return ColorScaleRGB(crBase, RGB(255,255,255), 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::SetPlacement(UINT xJustify, UINT yJustify, int xAdjust, int yAdjust)
|
|
||||||
{
|
|
||||||
xadjust = xAdjust;
|
|
||||||
yadjust = yAdjust;
|
|
||||||
xjustify = xJustify;
|
|
||||||
yjustify = yJustify;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::SetIcon(HICON hicon, bool fRedraw)
|
|
||||||
{
|
|
||||||
hIcon = hicon;
|
|
||||||
|
|
||||||
if(fRedraw)
|
|
||||||
Redraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::SetFont(HFONT font)
|
|
||||||
{
|
|
||||||
//don't delete the existing font..
|
|
||||||
hFont = font;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::SetButtonProc(pButtonProc proc)
|
|
||||||
{
|
|
||||||
ButtonCallback = proc;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardButton::Lock()
|
|
||||||
{
|
|
||||||
DWORD dw = WaitForSingleObject(mxlock, 0);
|
|
||||||
|
|
||||||
if(dw == WAIT_OBJECT_0)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardButton::UnLock()
|
|
||||||
{
|
|
||||||
if(ReleaseMutex(mxlock))
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardButton::SetStyle(UINT style)
|
|
||||||
{
|
|
||||||
uStyle = style;
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT CardButton::GetStyle()
|
|
||||||
{
|
|
||||||
return uStyle;
|
|
||||||
}
|
|
|
@ -1,618 +0,0 @@
|
||||||
//
|
|
||||||
// CardLib - CardRegion mouse-related stuff
|
|
||||||
//
|
|
||||||
// Freeware
|
|
||||||
// Copyright J Brown 2001
|
|
||||||
//
|
|
||||||
#include <windows.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "cardlib.h"
|
|
||||||
#include "cardwindow.h"
|
|
||||||
#include "cardregion.h"
|
|
||||||
|
|
||||||
double __CARDZOOMSPEED = 32;
|
|
||||||
|
|
||||||
int ClipCard(HDC hdc, int x, int y, int width, int height);
|
|
||||||
void DrawCard(HDC hdc, int x, int y, HDC hdcSource, int width, int height);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
|
|
||||||
static pDebugClickProc DebugStackClickProc = 0;
|
|
||||||
|
|
||||||
void CardLib_SetStackClickProc(pDebugClickProc proc)
|
|
||||||
{
|
|
||||||
DebugStackClickProc = proc;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CardRegion *CardWindow::GetBestStack(int x, int y, int w, int h)
|
|
||||||
{
|
|
||||||
int maxoverlap = 0;
|
|
||||||
int maxoverlapidx = -1;
|
|
||||||
|
|
||||||
//find the stack which is most covered by the dropped
|
|
||||||
//cards. Only include those which allow drops.
|
|
||||||
//
|
|
||||||
for(int i = 0; i < nNumCardRegions; i++)
|
|
||||||
{
|
|
||||||
int percent = Regions[i]->GetOverlapRatio(x, y, w, h);
|
|
||||||
|
|
||||||
//if this stack has the biggest coverage yet
|
|
||||||
if(percent > maxoverlap && Regions[i]->IsVisible())
|
|
||||||
{
|
|
||||||
maxoverlap = percent;
|
|
||||||
maxoverlapidx = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//if we found a stack to drop onto
|
|
||||||
if(maxoverlapidx != -1)
|
|
||||||
{
|
|
||||||
return Regions[maxoverlapidx];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardRegion::IsPointInStack(int x, int y)
|
|
||||||
{
|
|
||||||
int axpos = xoffset < 0 ? xpos + (nNumApparentCards-1)*xoffset : xpos;
|
|
||||||
int aypos = yoffset < 0 ? ypos + (nNumApparentCards-1)*yoffset : ypos;
|
|
||||||
|
|
||||||
if(x >= axpos && x < axpos + width && y >= aypos && y < aypos + height && fVisible)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CardRegion::GetNumDragCards(int x, int y)
|
|
||||||
{
|
|
||||||
int cardindex = 0; //index from stack start
|
|
||||||
int maxidx;
|
|
||||||
|
|
||||||
//make x,y relative to the stack's upper left corner
|
|
||||||
x -= xpos + (xoffset < 0 ? (nNumApparentCards/*cardstack.NumCards()*/ - 1) * xoffset : 0);
|
|
||||||
y -= ypos + (yoffset < 0 ? (nNumApparentCards/*cardstack.NumCards()*/ - 1) * yoffset : 0);
|
|
||||||
|
|
||||||
//if stack is empty, cannot drag any cards from it
|
|
||||||
if(cardstack.NumCards() <= 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
//see which card in the stack has been clicked on
|
|
||||||
//top-bottom ordering
|
|
||||||
if(yoffset > 0)
|
|
||||||
{
|
|
||||||
if(y < height - __cardheight)
|
|
||||||
cardindex = y / yoffset;
|
|
||||||
else
|
|
||||||
cardindex = cardstack.NumCards() - 1;
|
|
||||||
}
|
|
||||||
else if(yoffset < 0)
|
|
||||||
{
|
|
||||||
if(y < __cardheight)
|
|
||||||
cardindex = cardstack.NumCards() - 1;
|
|
||||||
else
|
|
||||||
cardindex = cardstack.NumCards() - ((y - __cardheight) / -yoffset) - 2;
|
|
||||||
}
|
|
||||||
else //yoffset == 0
|
|
||||||
{
|
|
||||||
cardindex = cardstack.NumCards() - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
maxidx = cardindex;
|
|
||||||
|
|
||||||
//if left-right
|
|
||||||
if(xoffset > 0)
|
|
||||||
{
|
|
||||||
if(x < width - __cardwidth)
|
|
||||||
cardindex = x / xoffset;
|
|
||||||
else
|
|
||||||
cardindex = cardstack.NumCards() - 1;
|
|
||||||
}
|
|
||||||
else if(xoffset < 0)
|
|
||||||
{
|
|
||||||
if(x < __cardwidth)
|
|
||||||
cardindex = cardstack.NumCards() - 1;
|
|
||||||
else
|
|
||||||
cardindex = cardstack.NumCards() - ((x - __cardwidth) / -xoffset) - 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cardindex = cardstack.NumCards() - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cardindex > maxidx) cardindex = maxidx;
|
|
||||||
|
|
||||||
if(cardindex > cardstack.NumCards())
|
|
||||||
cardindex = 1;
|
|
||||||
|
|
||||||
//if are trying to drag too many cards at once
|
|
||||||
return cardstack.NumCards() - cardindex;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardRegion::CanDragCards(int iNumCards)
|
|
||||||
{
|
|
||||||
if(iNumCards <= 0) return false;
|
|
||||||
if(nThreedCount > 1 && iNumCards > 1) return false;
|
|
||||||
|
|
||||||
if(WaitForSingleObject(mxlock, 0) != WAIT_OBJECT_0)
|
|
||||||
{
|
|
||||||
// TRACE("Failed to gain access to card stack\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReleaseMutex(mxlock);
|
|
||||||
|
|
||||||
switch(uDragRule)
|
|
||||||
{
|
|
||||||
case CS_DRAG_ALL:
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case CS_DRAG_TOP:
|
|
||||||
|
|
||||||
if(iNumCards == 1)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case CS_DRAG_NONE:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case CS_DRAG_CALLBACK:
|
|
||||||
|
|
||||||
if(CanDragCallback)
|
|
||||||
{
|
|
||||||
return CanDragCallback(*this, iNumCards);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardRegion::CanDropCards(CardStack &cards)
|
|
||||||
{
|
|
||||||
if(WaitForSingleObject(mxlock, 0) != WAIT_OBJECT_0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReleaseMutex(mxlock);
|
|
||||||
|
|
||||||
switch(uDropRule)
|
|
||||||
{
|
|
||||||
case CS_DROP_ALL:
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case CS_DROP_NONE:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case CS_DROP_CALLBACK:
|
|
||||||
|
|
||||||
if(CanDropCallback)
|
|
||||||
{
|
|
||||||
return CanDropCallback(*this, cards);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardRegion::OnLButtonDblClk(int x, int y)
|
|
||||||
{
|
|
||||||
iNumDragCards = GetNumDragCards(x, y);
|
|
||||||
|
|
||||||
if(DblClickCallback)
|
|
||||||
DblClickCallback(*this, iNumDragCards);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardRegion::OnLButtonDown(int x, int y)
|
|
||||||
{
|
|
||||||
iNumDragCards = GetNumDragCards(x, y);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
if(DebugStackClickProc)
|
|
||||||
{
|
|
||||||
if(!DebugStackClickProc(*this))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(ClickCallback)
|
|
||||||
ClickCallback(*this, iNumDragCards);
|
|
||||||
|
|
||||||
if(CanDragCards(iNumDragCards) != false)
|
|
||||||
{
|
|
||||||
|
|
||||||
//offset of the mouse cursor relative to the top-left corner
|
|
||||||
//of the cards that are being dragged
|
|
||||||
mousexoffset = x - xpos - xoffset * (nNumApparentCards - iNumDragCards);
|
|
||||||
mouseyoffset = y - ypos - yoffset * (nNumApparentCards - iNumDragCards);
|
|
||||||
|
|
||||||
if(xoffset < 0)
|
|
||||||
mousexoffset += -xoffset * (iNumDragCards - 1);
|
|
||||||
|
|
||||||
if(yoffset < 0)
|
|
||||||
mouseyoffset += -yoffset * (iNumDragCards - 1);
|
|
||||||
|
|
||||||
//remove the cards from the source stack
|
|
||||||
dragstack = cardstack.Pop(iNumDragCards);
|
|
||||||
|
|
||||||
//prepare the back buffer, and the drag image
|
|
||||||
PrepareDragBitmaps(iNumDragCards);
|
|
||||||
|
|
||||||
oldx = x - mousexoffset;
|
|
||||||
oldy = y - mouseyoffset;
|
|
||||||
|
|
||||||
Update(); //Update this stack's card count + size
|
|
||||||
|
|
||||||
SetCapture((HWND)parentWnd);
|
|
||||||
|
|
||||||
//set AFTER settings the dragstack...
|
|
||||||
fMouseDragging = true;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardRegion::OnLButtonUp(int x, int y)
|
|
||||||
{
|
|
||||||
CardRegion *pDestStack = 0;
|
|
||||||
HDC hdc;
|
|
||||||
int dropstackid = CS_DROPZONE_NODROP;
|
|
||||||
|
|
||||||
RECT dragrect;
|
|
||||||
DropZone *dropzone;
|
|
||||||
|
|
||||||
fMouseDragging = false;
|
|
||||||
|
|
||||||
//first of all, see if any drop zones have been registered
|
|
||||||
SetRect(&dragrect, x-mousexoffset, y-mouseyoffset, x-mousexoffset+nDragCardWidth, y-mouseyoffset+nDragCardHeight);
|
|
||||||
|
|
||||||
dropzone = parentWnd.GetDropZoneFromRect(&dragrect);
|
|
||||||
|
|
||||||
if(dropzone)
|
|
||||||
{
|
|
||||||
dropstackid = dropzone->DropCards(dragstack);
|
|
||||||
|
|
||||||
if(dropstackid != CS_DROPZONE_NODROP)
|
|
||||||
pDestStack = parentWnd.CardRegionFromId(dropstackid);
|
|
||||||
else
|
|
||||||
pDestStack = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pDestStack = parentWnd.GetBestStack(x - mousexoffset, y - mouseyoffset, nDragCardWidth, nDragCardHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If have found a stack to drop onto
|
|
||||||
//
|
|
||||||
if(pDestStack && pDestStack->CanDropCards(dragstack))
|
|
||||||
{
|
|
||||||
hdc = GetDC((HWND)parentWnd);
|
|
||||||
// UseNicePalette(hdc);
|
|
||||||
ZoomCard(hdc, x - mousexoffset, y - mouseyoffset, pDestStack);
|
|
||||||
ReleaseDC((HWND)parentWnd, hdc);
|
|
||||||
|
|
||||||
//
|
|
||||||
//add the cards to the destination stack
|
|
||||||
//
|
|
||||||
CardStack temp = pDestStack->GetCardStack();
|
|
||||||
temp.Push(dragstack);
|
|
||||||
|
|
||||||
pDestStack->SetCardStack(temp);
|
|
||||||
// pDestStack->Update(); //Update this stack's card count + size
|
|
||||||
// pDestStack->UpdateFaceDir(temp);
|
|
||||||
|
|
||||||
// Call the remove callback on THIS stack, if one is specified
|
|
||||||
//
|
|
||||||
if(RemoveCallback)
|
|
||||||
RemoveCallback(*this, iNumDragCards);
|
|
||||||
|
|
||||||
// Call the add callback, if one is specified
|
|
||||||
//
|
|
||||||
if(pDestStack->AddCallback)
|
|
||||||
pDestStack->AddCallback(*pDestStack, pDestStack->cardstack);//index, deststack->numcards);
|
|
||||||
|
|
||||||
RedrawIfNotDim(pDestStack, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Otherwise, let the cards snap back onto this stack
|
|
||||||
//
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
hdc = GetDC((HWND)parentWnd);
|
|
||||||
ZoomCard(hdc, x - mousexoffset, y - mouseyoffset, this);
|
|
||||||
cardstack += dragstack;
|
|
||||||
ReleaseDC((HWND)parentWnd, hdc);
|
|
||||||
|
|
||||||
Update(); //Update this stack's card count + size
|
|
||||||
}
|
|
||||||
|
|
||||||
ReleaseDragBitmaps();
|
|
||||||
ReleaseCapture();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CardRegion::OnMouseMove(int x, int y)
|
|
||||||
{
|
|
||||||
HDC hdc;
|
|
||||||
|
|
||||||
hdc = GetDC((HWND)parentWnd);
|
|
||||||
|
|
||||||
x -= mousexoffset;
|
|
||||||
y -= mouseyoffset;
|
|
||||||
|
|
||||||
MoveDragCardTo(hdc, x, y);
|
|
||||||
|
|
||||||
//BitBlt(hdc, nDragCardWidth+10, 0, nDragCardWidth, nDragCardHeight, hdcBackGnd, 0, 0, SRCCOPY);
|
|
||||||
//BitBlt(hdc, 0, 0, nDragCardWidth, nDragCardHeight, hdcDragCard, 0, 0, SRCCOPY);
|
|
||||||
|
|
||||||
ReleaseDC((HWND)parentWnd, hdc);
|
|
||||||
|
|
||||||
oldx = x;
|
|
||||||
oldy = y;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// There is a bug in BitBlt when the source x,y
|
|
||||||
// become < 0. So this wrapper function simply adjusts
|
|
||||||
// the coords so that we never try to blt in from this range
|
|
||||||
//
|
|
||||||
BOOL ClippedBitBlt(HDC hdcDest, int x, int y, int width, int height, HDC hdcSrc, int srcx, int srcy, DWORD dwROP)
|
|
||||||
{
|
|
||||||
if(srcx < 0)
|
|
||||||
{
|
|
||||||
x = 0 - srcx;
|
|
||||||
width = width + srcx;
|
|
||||||
srcx = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(srcy < 0)
|
|
||||||
{
|
|
||||||
y = 0 - srcy;
|
|
||||||
height = height + srcy;
|
|
||||||
srcy = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return BitBlt(hdcDest, x, y, width, height, hdcSrc, srcx, srcy, dwROP);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardRegion::MoveDragCardTo(HDC hdc, int x, int y)
|
|
||||||
{
|
|
||||||
RECT inter, rect1, rect2;
|
|
||||||
|
|
||||||
//mask off the new position of the drag-card, so
|
|
||||||
//that it will not be painted over
|
|
||||||
ClipCard(hdc, x, y, nDragCardWidth, nDragCardHeight);
|
|
||||||
|
|
||||||
//restore the area covered by the card at its previous position
|
|
||||||
BitBlt(hdc, oldx, oldy, nDragCardWidth, nDragCardHeight, hdcBackGnd, 0, 0, SRCCOPY);
|
|
||||||
|
|
||||||
//remove clipping so we can draw the card at its new place
|
|
||||||
SelectClipRgn(hdc, NULL);
|
|
||||||
|
|
||||||
//if the card's old and new positions overlap, then we
|
|
||||||
//need some funky code to update the "saved background" image,
|
|
||||||
SetRect(&rect1, oldx, oldy, oldx+nDragCardWidth, oldy+nDragCardHeight);
|
|
||||||
SetRect(&rect2, x, y, x+nDragCardWidth, y+nDragCardHeight);
|
|
||||||
|
|
||||||
if(IntersectRect(&inter, &rect1, &rect2))
|
|
||||||
{
|
|
||||||
int interwidth = inter.right-inter.left;
|
|
||||||
int interheight = inter.bottom-inter.top;
|
|
||||||
int destx, desty, srcx, srcy;
|
|
||||||
|
|
||||||
if(rect2.left > rect1.left)
|
|
||||||
{
|
|
||||||
destx = 0; srcx = nDragCardWidth - interwidth;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
destx = nDragCardWidth - interwidth; srcx = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(rect2.top > rect1.top)
|
|
||||||
{
|
|
||||||
desty = 0; srcy = nDragCardHeight - interheight;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
desty = nDragCardHeight - interheight; srcy = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//shift the bit we didn't use for the restore (due to the clipping)
|
|
||||||
//into the opposite corner
|
|
||||||
BitBlt(hdcBackGnd, destx,desty, interwidth, interheight, hdcBackGnd, srcx, srcy, SRCCOPY);
|
|
||||||
|
|
||||||
ExcludeClipRect(hdcBackGnd, destx, desty, destx+interwidth, desty+interheight);
|
|
||||||
|
|
||||||
//this bit requires us to clip the BitBlt (from screen to background)
|
|
||||||
//as BitBlt is a bit buggy it seems
|
|
||||||
ClippedBitBlt(hdcBackGnd, 0,0, nDragCardWidth, nDragCardHeight, hdc, x, y, SRCCOPY);
|
|
||||||
SelectClipRgn(hdcBackGnd, NULL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
BitBlt(hdcBackGnd, 0,0, nDragCardWidth, nDragCardHeight, hdc, x, y, SRCCOPY);
|
|
||||||
}
|
|
||||||
|
|
||||||
//finally draw the card to the screen
|
|
||||||
DrawCard(hdc, x, y, hdcDragCard, nDragCardWidth, nDragCardHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//extern "C" int _fltused(void) { return 0; }
|
|
||||||
//extern "C" int _ftol(void) { return 0; }
|
|
||||||
|
|
||||||
//
|
|
||||||
// Better do this in fixed-point, to stop
|
|
||||||
// VC from linking in floatingpoint-long conversions
|
|
||||||
//
|
|
||||||
//#define FIXED_PREC_MOVE
|
|
||||||
#ifdef FIXED_PREC_MOVE
|
|
||||||
#define PRECISION 12
|
|
||||||
void ZoomCard(HDC hdc, int xpos, int ypos, CARDSTACK *dest)
|
|
||||||
{
|
|
||||||
long dx, dy, x , y;
|
|
||||||
|
|
||||||
|
|
||||||
int apparentcards;
|
|
||||||
x = xpos << PRECISION; y = ypos << PRECISION;
|
|
||||||
|
|
||||||
oldx = (int)xpos;
|
|
||||||
oldy = (int)ypos;
|
|
||||||
|
|
||||||
apparentcards=dest->numcards/dest->threedcount;
|
|
||||||
|
|
||||||
int idestx = dest->xpos + dest->xoffset * (apparentcards);// - iNumDragCards);
|
|
||||||
int idesty = dest->ypos + dest->yoffset * (apparentcards);// - iNumDragCards);
|
|
||||||
|
|
||||||
//normalise the motion vector
|
|
||||||
dx = (idestx<<PRECISION) - x;
|
|
||||||
dy = (idesty<<PRECISION) - y;
|
|
||||||
long recip = (1 << PRECISION) / 1;//sqrt(dx*dx + dy*dy);
|
|
||||||
|
|
||||||
dx *= recip * 16;//CARDZOOMSPEED;
|
|
||||||
dy *= recip * 16;//CARDZOOMSPEED;
|
|
||||||
|
|
||||||
//if(dx < 0) dxinc = 1.001; else
|
|
||||||
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
int ix, iy;
|
|
||||||
x += dx;
|
|
||||||
y += dy;
|
|
||||||
|
|
||||||
ix = (int)x>>PRECISION;
|
|
||||||
iy = (int)y>>PRECISION;
|
|
||||||
if(dx < 0 && ix < idestx) ix = idestx;
|
|
||||||
else if(dx > 0 && ix > idestx) ix = idestx;
|
|
||||||
|
|
||||||
if(dy < 0 && iy < idesty) iy = idesty;
|
|
||||||
else if(dy > 0 && iy > idesty) iy = idesty;
|
|
||||||
|
|
||||||
MoveDragCardTo(hdc, ix, iy);
|
|
||||||
|
|
||||||
if(ix == idestx && iy == idesty)
|
|
||||||
break;
|
|
||||||
|
|
||||||
oldx = (int)x >> PRECISION;
|
|
||||||
oldy = (int)y >> PRECISION;
|
|
||||||
|
|
||||||
//dx *= 1.2;
|
|
||||||
//dy *= 1.2;
|
|
||||||
|
|
||||||
Sleep(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void CardRegion::ZoomCard(HDC hdc, int xpos, int ypos, CardRegion *pDestStack)
|
|
||||||
{
|
|
||||||
double dx, dy, x ,y;
|
|
||||||
int apparentcards;
|
|
||||||
x = (double)xpos; y = (double)ypos;
|
|
||||||
|
|
||||||
oldx = (int)x;
|
|
||||||
oldy = (int)y;
|
|
||||||
|
|
||||||
apparentcards = pDestStack->cardstack.NumCards() / pDestStack->nThreedCount;
|
|
||||||
|
|
||||||
int idestx = pDestStack->xpos + pDestStack->xoffset * (apparentcards);
|
|
||||||
int idesty = pDestStack->ypos + pDestStack->yoffset * (apparentcards);
|
|
||||||
|
|
||||||
if(pDestStack->yoffset < 0)
|
|
||||||
idesty += pDestStack->yoffset * (iNumDragCards-1);
|
|
||||||
|
|
||||||
if(pDestStack->xoffset < 0)
|
|
||||||
idestx += pDestStack->xoffset * (iNumDragCards-1);
|
|
||||||
|
|
||||||
//normalise the motion vector
|
|
||||||
dx = idestx - x;
|
|
||||||
dy = idesty - y;
|
|
||||||
double recip = 1.0 / sqrt(dx*dx + dy*dy);
|
|
||||||
dx *= recip * __CARDZOOMSPEED; dy *= recip * __CARDZOOMSPEED;
|
|
||||||
|
|
||||||
//if(dx < 0) dxinc = 1.001; else
|
|
||||||
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
bool attarget = true;
|
|
||||||
int ix, iy;
|
|
||||||
x += dx;
|
|
||||||
y += dy;
|
|
||||||
|
|
||||||
ix = (int)x;
|
|
||||||
iy = (int)y;
|
|
||||||
if(dx < 0.0 && ix < idestx) ix = idestx;
|
|
||||||
else if(dx > 0.0 && ix > idestx) ix = idestx;
|
|
||||||
else attarget = false;
|
|
||||||
|
|
||||||
if(dy < 0.0 && iy < idesty) iy = idesty;
|
|
||||||
else if(dy > 0.0 && iy > idesty) iy = idesty;
|
|
||||||
else attarget = false;
|
|
||||||
|
|
||||||
//if the target stack wants the drag cards drawn differently
|
|
||||||
//to how they are, then redraw the drag card image just before
|
|
||||||
//the cards land
|
|
||||||
/*if(attarget == true)
|
|
||||||
{
|
|
||||||
for(int i = 0; i < iNumDragCards; i++)
|
|
||||||
{
|
|
||||||
int xdraw = pDestStack->xoffset*i;
|
|
||||||
int ydraw = pDestStack->yoffset*i;
|
|
||||||
|
|
||||||
if(pDestStack->yoffset < 0)
|
|
||||||
ydraw = -pDestStack->yoffset * (iNumDragCards-i-1);
|
|
||||||
if(pDestStack->xoffset < 0)
|
|
||||||
xdraw = -pDestStack->xoffset * (iNumDragCards-i-1);
|
|
||||||
|
|
||||||
if(pDestStack->facedirection == CS_FACEUP &&
|
|
||||||
pDestStack->numcards+i >= dest->numfacedown)
|
|
||||||
{
|
|
||||||
//cdtDraw(hdcDragCard, xdraw, ydraw, iDragCards[i], ectFACES, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//cdtDraw(hdcDragCard, xdraw, ydraw, CARDSTACK::backcard, ectBACKS, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
MoveDragCardTo(hdc, ix, iy);
|
|
||||||
|
|
||||||
if(attarget || ix == idestx && iy == idesty)
|
|
||||||
break;
|
|
||||||
|
|
||||||
oldx = (int)x;
|
|
||||||
oldy = (int)y;
|
|
||||||
|
|
||||||
//dx *= 1.2;
|
|
||||||
//dy *= 1.2;
|
|
||||||
|
|
||||||
Sleep(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
Loading…
Add table
Add a link
Reference in a new issue