388 lines
10 KiB
C++
388 lines
10 KiB
C++
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include "ViewColumn.h"
|
|
#include "Browse.h"
|
|
|
|
char *WndRegKeys[4][5] = {{"POPUP BOTTOM RX","POPUP BOTTOM RY","POPUP BOTTOM CX","POPUP BOTTOM CY","POPUP BOTTOM N"},
|
|
{"POPUP TOP RX","POPUP TOP RY","POPUP TOP CX","POPUP TOP CY","POPUP TOP N"},
|
|
{"POPUP LEFT RX","POPUP LEFT RY","POPUP LEFT CX","POPUP LEFT CY","POPUP LEFT N"},
|
|
{"POPUP RIGHT RX","POPUP RIGHT RY","POPUP RIGHT CX","POPUP RIGHT CY","POPUP RIGHT N"}};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ViewColumn dialog
|
|
|
|
|
|
ViewColumn::ViewColumn(CWnd* pParent /*=NULL*/)
|
|
: CDialog(ViewColumn::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(ViewColumn)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
list = NULL;
|
|
nTiles = sizetile_y = 0;
|
|
nTileInWnd = 1;
|
|
parent = 0;
|
|
MousePos.x = MousePos.y = 0;
|
|
}
|
|
|
|
|
|
void ViewColumn::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(ViewColumn)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(ViewColumn, CDialog)
|
|
//{{AFX_MSG_MAP(ViewColumn)
|
|
ON_WM_PAINT()
|
|
ON_WM_VSCROLL()
|
|
ON_WM_CLOSE()
|
|
ON_WM_SIZE()
|
|
ON_WM_RBUTTONDOWN()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ViewColumn message handlers
|
|
|
|
void ViewColumn::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
// TODO: Add your message handler code here
|
|
RECT rect,wndrect; SCROLLINFO inf;
|
|
int first,scroll,nInWnd,cx,cy;
|
|
GetClientRect(&wndrect);
|
|
rect = wndrect;
|
|
inf.fMask = SIF_ALL;
|
|
GetScrollInfo(SB_VERT,&inf);
|
|
|
|
if ((nTiles==0)||(nTiles==1))
|
|
{
|
|
dc.FillSolidRect (&wndrect, 0xffffffff);
|
|
}
|
|
if (inf.nPos>(10000 - (int)inf.nPage)) inf.nPos = 10000 - inf.nPage - 1;
|
|
if (inf.nPage>=10000) inf.nPage = 10000 -1;
|
|
if (nTileInWnd==4)
|
|
{
|
|
nInWnd = (((rect.bottom - rect.top)/(sizetile_y>>1))<<1)+2;
|
|
if (nTiles>nInWnd) first = ((inf.nPos*((nTiles-nInWnd)>>1))/(10000 - inf.nPage))<<1;
|
|
else first = 0;
|
|
int n = (nTiles+1)>>1;
|
|
scroll = ((inf.nPos*((sizetile_y>>1)*n - (rect.bottom - rect.top)))/(10000 - inf.nPage));
|
|
if (scroll>=0) scroll-= (first>>1)*(sizetile_y>>1);
|
|
else scroll = 0;
|
|
rect.top -= scroll; rect.bottom -= scroll;
|
|
cy = sizetile_y>>1;
|
|
cx = (rect.right - rect.left)>>1;
|
|
}
|
|
else
|
|
{
|
|
if (nTiles==1)
|
|
{
|
|
first = 0;
|
|
cy = sizetile_y;
|
|
cx = (rect.right - rect.left);
|
|
}
|
|
else
|
|
{
|
|
nInWnd = ((rect.bottom - rect.top)/sizetile_y)+1;
|
|
if (nTiles>nInWnd) first = ((inf.nPos*(nTiles-nInWnd))/(10000 - inf.nPage));
|
|
else first = 0;
|
|
scroll = ((inf.nPos*(sizetile_y*nTiles - (rect.bottom - rect.top)))/(10000 - inf.nPage));
|
|
if (scroll<0) scroll = 0;
|
|
else scroll-=first*sizetile_y;
|
|
rect.top -= scroll; rect.bottom -= scroll;
|
|
cy = sizetile_y;
|
|
cx = (rect.right - rect.left);
|
|
}
|
|
}
|
|
int i = first;
|
|
while (rect.top<wndrect.bottom)
|
|
{
|
|
if (i<nTiles)
|
|
{
|
|
StretchDIBits(dc,rect.left,rect.top,cx,cy,
|
|
0,0,list[i]->BmpInfo.bmiHeader.biWidth,list[i]->BmpInfo.bmiHeader.biHeight,
|
|
&*list[i]->Bits.begin(),&list[i]->BmpInfo,DIB_RGB_COLORS,SRCCOPY);
|
|
}
|
|
else
|
|
{
|
|
StretchDIBits(dc,rect.left,rect.top,cx,cy,
|
|
0,0,0,0,
|
|
0,0,DIB_RGB_COLORS,WHITENESS);
|
|
}
|
|
if (nTileInWnd==1)
|
|
{
|
|
rect.top += sizetile_y;
|
|
rect.bottom += sizetile_y;
|
|
}
|
|
else if (nTileInWnd==4)
|
|
{
|
|
if ((i&1)==0)
|
|
{
|
|
rect.left += cx;
|
|
rect.right += cx;
|
|
}
|
|
else
|
|
{
|
|
rect.left -= cx;
|
|
rect.right -= cx;
|
|
rect.top += cy;
|
|
rect.bottom += cy;
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
// Do not call CDialog::OnPaint() for painting messages
|
|
}
|
|
|
|
BOOL ViewColumn::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
HKEY regkey; int rx=-1,ry=-1,cx=-1,cy=-1;
|
|
if (RegOpenKey(HKEY_CURRENT_USER,REGKEY_TILEDIT,®key)==ERROR_SUCCESS)
|
|
{
|
|
unsigned long value;
|
|
RegQueryValueEx(regkey,WndRegKeys[pos&3][0],0,&value,(unsigned char *)&rx,&value);
|
|
RegQueryValueEx(regkey,WndRegKeys[pos&3][1],0,&value,(unsigned char *)&ry,&value);
|
|
RegQueryValueEx(regkey,WndRegKeys[pos&3][2],0,&value,(unsigned char *)&cx,&value);
|
|
RegQueryValueEx(regkey,WndRegKeys[pos&3][3],0,&value,(unsigned char *)&cy,&value);
|
|
RegQueryValueEx(regkey,WndRegKeys[pos&3][4],0,&value,(unsigned char *)&nTileInWnd,&value);
|
|
RegCloseKey(regkey);
|
|
}
|
|
EnableScrollBar(SB_VERT);
|
|
RECT rect;
|
|
parent->GetWindowRect(&rect);
|
|
if (rx==-1 || ry==-1 || cx==-1 || cy==-1)
|
|
{
|
|
rx = rect.left;
|
|
ry = rect.top;
|
|
cx = rect.right - rect.left;
|
|
cy = rect.bottom - rect.top;
|
|
switch (pos)
|
|
{
|
|
case 0:
|
|
ry=rect.bottom;
|
|
break;
|
|
case 1:
|
|
ry-=rect.bottom - rect.top;
|
|
break;
|
|
case 2:
|
|
rx-=rect.right - rect.left;
|
|
break;
|
|
case 3:
|
|
rx+=rect.right - rect.left;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rx += rect.left;
|
|
ry += rect.top;
|
|
}
|
|
SetWindowPos(0,rx,ry,cx,cy,0);
|
|
|
|
SendMessage(WM_VSCROLL,0,0);
|
|
// TODO: Add extra initialization here
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void ViewColumn::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
SCROLLINFO scroll; RECT rect;
|
|
scroll.fMask = SIF_TRACKPOS | SIF_POS;
|
|
GetScrollInfo(SB_VERT,&scroll);
|
|
scroll.cbSize = sizeof(SCROLLINFO);
|
|
scroll.fMask = SIF_ALL;
|
|
//scroll.nPos = scroll.nTrackPos;
|
|
scroll.nMax = 10000;
|
|
scroll.nMin = 0;
|
|
GetClientRect(&rect);
|
|
if (nTiles)
|
|
{
|
|
if (nTileInWnd==4)
|
|
{
|
|
scroll.nPage = ((rect.bottom - rect.top)*10000)/(( (nTiles>>1)+(nTiles&1) )*(sizetile_y>>1));
|
|
}
|
|
else
|
|
{
|
|
scroll.nPage = ((rect.bottom - rect.top)*10000)/(nTiles*sizetile_y);
|
|
}
|
|
}
|
|
else scroll.nPage = 10000;
|
|
|
|
switch(nSBCode)
|
|
{
|
|
case SB_BOTTOM:
|
|
scroll.nPos = 10000 - scroll.nPage;
|
|
break;
|
|
case SB_LINEDOWN:
|
|
scroll.nPos += scroll.nPage/4;
|
|
break;
|
|
case SB_LINEUP:
|
|
scroll.nPos -= scroll.nPage/4;
|
|
break;
|
|
case SB_PAGEDOWN:
|
|
scroll.nPos += scroll.nPage;
|
|
break;
|
|
case SB_PAGEUP:
|
|
scroll.nPos -= scroll.nPage;
|
|
break;
|
|
case SB_THUMBPOSITION:
|
|
case SB_THUMBTRACK:
|
|
scroll.nPos = scroll.nTrackPos;
|
|
break;
|
|
case SB_TOP:
|
|
scroll.nPos = 0;
|
|
break;
|
|
default:
|
|
scroll.fMask^=SIF_POS;
|
|
break;
|
|
}
|
|
if (scroll.nPos<0)
|
|
scroll.nPos = 0;
|
|
else if (scroll.nPos > (10000 - (int)scroll.nPage))
|
|
scroll.nPos = 10000 - scroll.nPage - 1;
|
|
this->SetScrollInfo(SB_VERT,&scroll);
|
|
RedrawWindow();
|
|
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
|
|
}
|
|
|
|
void ViewColumn::OnClose()
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
|
|
CDialog::OnClose();
|
|
}
|
|
|
|
void ViewColumn::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CDialog::OnSize(nType, cx, cy);
|
|
SendMessage(WM_VSCROLL,0,0);
|
|
}
|
|
|
|
LRESULT ViewColumn::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
if (message==WM_CLOSE || message==WM_DESTROY)
|
|
{
|
|
HKEY regkey;
|
|
if (RegCreateKey(HKEY_CURRENT_USER,REGKEY_TILEDIT,®key)==ERROR_SUCCESS)
|
|
{
|
|
|
|
RECT rect; RECT rpopup;
|
|
GetWindowRect(&rect);
|
|
parent->GetWindowRect(&rpopup);
|
|
int rx,ry,cx,cy; //on sauvegarde les coordonnes de la wnd relativement a la fenetre popup principale
|
|
rx = rect.left - rpopup.left;
|
|
ry = rect.top - rpopup.top;
|
|
cx = rect.right - rect.left;
|
|
cy = rect.bottom - rect.top;
|
|
RegSetValueEx(regkey,WndRegKeys[pos][0],0,REG_DWORD,(unsigned char*)&rx,4);
|
|
RegSetValueEx(regkey,WndRegKeys[pos][1],0,REG_DWORD,(unsigned char*)&ry,4);
|
|
RegSetValueEx(regkey,WndRegKeys[pos][2],0,REG_DWORD,(unsigned char*)&cx,4);
|
|
RegSetValueEx(regkey,WndRegKeys[pos][3],0,REG_DWORD,(unsigned char*)&cy,4);
|
|
RegSetValueEx(regkey,WndRegKeys[pos][4],0,REG_DWORD,(unsigned char*)&nTileInWnd,4);
|
|
RegCloseKey(regkey);
|
|
}
|
|
}
|
|
else if (message==WM_MOUSEMOVE)
|
|
{
|
|
MousePos.x = LOWORD(lParam);
|
|
MousePos.y = HIWORD(lParam);
|
|
}
|
|
else if (message==WM_ERASEBKGND)
|
|
{
|
|
return 0;
|
|
}
|
|
else if (message==WM_MOUSEWHEEL)
|
|
{
|
|
if ((short)(HIWORD(wParam))<0)
|
|
SendMessage(WM_VSCROLL,SB_LINEDOWN,0);
|
|
else
|
|
SendMessage(WM_VSCROLL,SB_LINEUP,0);
|
|
}
|
|
else if (message==WM_COMMAND)
|
|
{
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case 10:
|
|
if (nTileInWnd!=1)
|
|
{
|
|
nTileInWnd = 1;
|
|
SendMessage(WM_VSCROLL,0,0);
|
|
}
|
|
break;
|
|
case 12:
|
|
if (nTileInWnd!=4)
|
|
{
|
|
nTileInWnd = 4;
|
|
SendMessage(WM_VSCROLL,0,0);
|
|
}
|
|
break;
|
|
case 13:
|
|
RECT rect;
|
|
parent->GetWindowRect(&rect);
|
|
int rx,ry,cx,cy;
|
|
rx = rect.left;
|
|
ry = rect.top;
|
|
cx = rect.right - rect.left;
|
|
cy = rect.bottom - rect.top;
|
|
switch (pos)
|
|
{
|
|
case 0:
|
|
ry=rect.bottom;
|
|
break;
|
|
case 1:
|
|
ry-=rect.bottom - rect.top;
|
|
break;
|
|
case 2:
|
|
rx-=rect.right - rect.left;
|
|
break;
|
|
case 3:
|
|
rx+=rect.right - rect.left;
|
|
break;
|
|
}
|
|
SetWindowPos(0,rx,ry,cx,cy,0);
|
|
break;
|
|
}
|
|
}
|
|
return CDialog::WindowProc(message, wParam, lParam);
|
|
}
|
|
|
|
void ViewColumn::OnRButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
CMenu popup;
|
|
popup.CreatePopupMenu();
|
|
popup.AppendMenu(MF_STRING | (nTileInWnd==1?MF_CHECKED:0),10,"*1");
|
|
popup.AppendMenu(MF_STRING | (nTileInWnd==4?MF_CHECKED:0),12,"*4");
|
|
popup.AppendMenu(MF_STRING,13,"Replace window");
|
|
|
|
RECT rect; GetWindowRect(&rect);
|
|
popup.TrackPopupMenu(TPM_LEFTALIGN,MousePos.x+rect.left,MousePos.y+rect.top,this,NULL);
|
|
CDialog::OnRButtonDown(nFlags, point);
|
|
}
|