Files
Work/splitter/SplitterWnd.cpp
2024-08-07 09:16:27 -04:00

185 lines
6.2 KiB
C++

#include <splitter/SplitterWnd.hpp>
#include <common/purehdc.hpp>
char SplitterWnd::smszClassName[]="SplitterWnd";
SplitterWnd::SplitterWnd(GUIWindow &parent,GUIWindow &pane1,GUIWindow &pane2,int splitRatio)
: mBkGndBrush(RGBColor(COLORREF(::GetSysColor(COLOR_3DFACE)))),
mParent(&parent), mPane1(&pane1), mPane2(&pane2), mSplitRatio(splitRatio),
mSplitWidth(SplitWidth), mLightPen(RGBColor((COLORREF)::GetSysColor(COLOR_3DLIGHT))),
mHiLightPen(RGBColor((COLORREF)::GetSysColor(COLOR_3DHILIGHT))),
mShadowPen(RGBColor((COLORREF)::GetSysColor(COLOR_3DSHADOW))),
mDkShadowPen(RGBColor((COLORREF)::GetSysColor(COLOR_3DDKSHADOW)))
{
mCreateHandler.setCallback(this,&SplitterWnd::createHandler);
mPaintHandler.setCallback(this,&SplitterWnd::paintHandler);
mLeftButtonDownHandler.setCallback(this,&SplitterWnd::leftButtonDownHandler);
mLeftButtonUpHandler.setCallback(this,&SplitterWnd::leftButtonUpHandler);
mMouseMoveHandler.setCallback(this,&SplitterWnd::mouseMoveHandler);
mCaptureChangedHandler.setCallback(this,&SplitterWnd::captureChangedHandler);
mDestroyHandler.setCallback(this,&SplitterWnd::destroyHandler);
mSizeHandler.setCallback(this,&SplitterWnd::parentSizeHandler);
registerClass();
insertHandlers();
Rect winRect(CW_USEDEFAULT,CW_USEDEFAULT,SplitWidth,mParent->height());
createWindow(smszClassName,"Splitter",WS_VISIBLE|WS_CHILD,winRect,parent,(HMENU)ControlID,processInstance(),this);
show(SW_SHOW);
update();
}
SplitterWnd::~SplitterWnd()
{
removeHandlers();
}
void SplitterWnd::registerClass()
{
WNDCLASS wndClass;
HINSTANCE hInstance;
hInstance=processInstance();
if(::GetClassInfo(hInstance,smszClassName,(WNDCLASS FAR *)&wndClass))return;
wndClass.style =CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc =(WNDPROC)GUIWindow::WndProc;
wndClass.cbClsExtra =0;
wndClass.cbWndExtra =sizeof(SplitterWnd*);
wndClass.hInstance =hInstance;
wndClass.hIcon =0;
wndClass.hCursor =::LoadCursor(NULL,IDC_SIZEWE);
wndClass.hbrBackground =mBkGndBrush.getBrush();
wndClass.lpszMenuName =0;
wndClass.lpszClassName =smszClassName;
::RegisterClass(&wndClass);
}
void SplitterWnd::insertHandlers()
{
insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
insertHandler(VectorHandler::PaintHandler,&mPaintHandler);
insertHandler(VectorHandler::LeftButtonDownHandler,&mLeftButtonDownHandler);
insertHandler(VectorHandler::LeftButtonUpHandler,&mLeftButtonUpHandler);
insertHandler(VectorHandler::MouseMoveHandler,&mMouseMoveHandler);
insertHandler(VectorHandler::CaptureChangedHandler,&mCaptureChangedHandler);
insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
mParent->insertHandler(VectorHandler::SizeHandler,&mSizeHandler);
}
void SplitterWnd::removeHandlers()
{
removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
removeHandler(VectorHandler::PaintHandler,&mPaintHandler);
removeHandler(VectorHandler::LeftButtonDownHandler,&mLeftButtonDownHandler);
removeHandler(VectorHandler::LeftButtonUpHandler,&mLeftButtonUpHandler);
removeHandler(VectorHandler::MouseMoveHandler,&mMouseMoveHandler);
removeHandler(VectorHandler::CaptureChangedHandler,&mCaptureChangedHandler);
removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
mParent->removeHandler(VectorHandler::SizeHandler,&mSizeHandler);
}
CallbackData::ReturnType SplitterWnd::createHandler(CallbackData &cbData)
{
sizeControls();
return true;
}
CallbackData::ReturnType SplitterWnd::paintHandler(CallbackData &cbData)
{
PaintInformation *pPaintInfo=(PaintInformation*)cbData.lParam();
PureDevice &pureDevice=(PureDevice&)*pPaintInfo;
pureDevice.line(Point(0,0),Point(0,height()-1),mLightPen);
pureDevice.line(Point(1,0),Point(1,height()-1),mHiLightPen);
pureDevice.line(Point(width()-2,0),Point(width()-2,height()-1),mShadowPen);
pureDevice.line(Point(width()-1,0),Point(width()-1,height()-1),mDkShadowPen);
return false;
}
CallbackData::ReturnType SplitterWnd::parentSizeHandler(CallbackData &cbData)
{
sizeControls();
return false;
}
CallbackData::ReturnType SplitterWnd::leftButtonDownHandler(CallbackData &cbData)
{
Rect parentRect;
Rect currRect;
Point clickPoint;
clickPoint.x(cbData.loWord());
clickPoint.y(cbData.hiWord());
setCapture();
mParent->clientRect(parentRect);
mParent->clientToScreen(parentRect);
clientRect(currRect);
clientToScreen(currRect);
mDragStart=currRect.left()-parentRect.left()+width()/2-clickPoint.x();
mDragx=mDragStart+clickPoint.x();
PureDevice pureDevice(*mParent);
pureDevice.setDrawMode(PureDevice::R2NOTXORPEN);
pureDevice.line(Point(mDragx,0),Point(mDragx,height()-1));
return false;
}
CallbackData::ReturnType SplitterWnd::leftButtonUpHandler(CallbackData &cbData)
{
Point mousePoint;
mousePoint.x(cbData.loWord());
mousePoint.y(cbData.hiWord());
releaseCapture();
moveSplitter(mDragStart+mousePoint.x());
return false;
}
CallbackData::ReturnType SplitterWnd::mouseMoveHandler(CallbackData &cbData)
{
if(!hasCapture())return false;
Point mousePoint;
mousePoint.x(cbData.loWord());
mousePoint.y(cbData.hiWord());
PureDevice pureDevice(*mParent);
pureDevice.setDrawMode(PureDevice::R2NOTXORPEN);
pureDevice.line(Point(mDragx,0),Point(mDragx,height()-1));
mDragx=mDragStart+mousePoint.x();
pureDevice.line(Point(mDragx,0),Point(mDragx,height()-1));
return false;
}
CallbackData::ReturnType SplitterWnd::captureChangedHandler(CallbackData &cbData)
{
PureDevice pureDevice(*mParent);
pureDevice.setDrawMode(PureDevice::R2NOTXORPEN);
pureDevice.line(Point(mDragx,0),Point(mDragx,height()-1));
return false;
}
CallbackData::ReturnType SplitterWnd::destroyHandler(CallbackData &cbData)
{
return false;
}
void SplitterWnd::sizeControls()
{
int parentWidth=mParent->width();
int parentHeight=mParent->height();
int xsplit=(parentWidth*mSplitRatio)/100.00;
if(xsplit<0)xsplit=0;
if(xsplit+mSplitWidth>=parentWidth)xsplit=parentWidth-mSplitWidth;
moveWindow(xsplit,0,mSplitWidth,parentHeight,false);
mPane1->moveWindow(0,0,xsplit,parentHeight,true);
mPane2->moveWindow(xsplit+mSplitWidth,0,parentWidth-xsplit-mSplitWidth,parentHeight,true);
update();
}
void SplitterWnd::moveSplitter(int xLoc)
{
mSplitRatio=xLoc*100.00/mParent->width();
if(mSplitRatio<0)mSplitRatio=0;
else if(mSplitRatio>100)mSplitRatio=100;
sizeControls();
}