Initial
This commit is contained in:
362
browse/scroll.hpp
Normal file
362
browse/scroll.hpp
Normal file
@@ -0,0 +1,362 @@
|
||||
#ifndef _NNTP_SCROLLINFO_HPP_
|
||||
#define _NNTP_SCROLLINFO_HPP_
|
||||
#ifndef _COMMON_WINDOWS_HPP_
|
||||
#include <common/windows.hpp>
|
||||
#endif
|
||||
|
||||
class ScrollInfo
|
||||
{
|
||||
public:
|
||||
ScrollInfo(void);
|
||||
ScrollInfo(const ScrollInfo &someScrollInfo);
|
||||
virtual ~ScrollInfo();
|
||||
ScrollInfo &operator=(const ScrollInfo &someScrollInfo);
|
||||
BOOL operator==(const ScrollInfo &someScrollInfo)const;
|
||||
void handleHorizontalScroll(CallbackData &someCallbackData);
|
||||
void handleVerticalScroll(CallbackData &someCallbackData);
|
||||
void handleSize(CallbackData &someCallbackData);
|
||||
int minScrollx(void)const;
|
||||
void minScrollx(int minScrollx);
|
||||
int maxScrollx(void)const;
|
||||
void maxScrollx(int maxScrollx);
|
||||
int currScrollx(void)const;;
|
||||
void currScrollx(int currScrollx);
|
||||
int minScrolly(void)const;
|
||||
void minScrolly(int minScrolly);
|
||||
int maxScrolly(void)const;
|
||||
void maxScrolly(int maxScrolly);
|
||||
int currScrolly(void)const;
|
||||
void currScrolly(int curScrolly);
|
||||
void scrollableObjectDimensions(int width,int height);
|
||||
int scrollableObjectWidth(void)const;
|
||||
int scrollableObjectHeight(void)const;
|
||||
BOOL scrollEvent(void)const;
|
||||
void scrollEvent(BOOL scrollEvent);
|
||||
BOOL sizeEvent(void)const;
|
||||
void sizeEvent(BOOL sizeEvent);
|
||||
HWND hwndOwner(void)const;
|
||||
void hwndOwner(HWND hwndOwner);
|
||||
private:
|
||||
void scrollableObjectWidth(int scrollableObjectWidth);
|
||||
void scrollableObjectHeight(int scrollableObjectHeight);
|
||||
enum{PageIncrement=50,LineIncrement=5};
|
||||
int imax(int param1,int param2);
|
||||
int imin(int param1,int param2);
|
||||
|
||||
HWND mhWndOwner;
|
||||
BOOL mSizeEvent;
|
||||
BOOL mScrollEvent;
|
||||
int mScrollableObjectWidth;
|
||||
int mScrollableObjectHeight;
|
||||
int mMinScrollx;
|
||||
int mMaxScrollx;
|
||||
int mCurrScrollx;
|
||||
int mMinScrolly;
|
||||
int mMaxScrolly;
|
||||
int mCurrScrolly;
|
||||
};
|
||||
|
||||
inline
|
||||
ScrollInfo::ScrollInfo(void)
|
||||
: mMinScrollx(0), mMaxScrollx(0), mCurrScrollx(0), mMinScrolly(0), mMaxScrolly(0), mCurrScrolly(0),
|
||||
mScrollableObjectWidth(0), mScrollableObjectHeight(0), mSizeEvent(FALSE), mhWndOwner(0), mScrollEvent(FALSE)
|
||||
{
|
||||
}
|
||||
|
||||
inline
|
||||
ScrollInfo::ScrollInfo(const ScrollInfo &someScrollInfo)
|
||||
{
|
||||
*this=someScrollInfo;
|
||||
}
|
||||
|
||||
inline
|
||||
ScrollInfo::~ScrollInfo()
|
||||
{
|
||||
}
|
||||
|
||||
inline
|
||||
ScrollInfo &ScrollInfo::operator=(const ScrollInfo &someScrollInfo)
|
||||
{
|
||||
minScrollx(someScrollInfo.minScrollx());
|
||||
maxScrollx(someScrollInfo.maxScrollx());
|
||||
currScrollx(someScrollInfo.currScrollx());
|
||||
maxScrolly(someScrollInfo.currScrolly());
|
||||
minScrolly(someScrollInfo.maxScrolly());
|
||||
currScrolly(someScrollInfo.minScrollx());
|
||||
sizeEvent(someScrollInfo.minScrollx());
|
||||
scrollEvent(someScrollInfo.scrollEvent());
|
||||
scrollableObjectWidth(someScrollInfo.scrollableObjectWidth());
|
||||
scrollableObjectHeight(someScrollInfo.scrollableObjectHeight());
|
||||
hwndOwner(someScrollInfo.hwndOwner());
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline
|
||||
BOOL ScrollInfo::operator==(const ScrollInfo &someScrollInfo)const
|
||||
{
|
||||
return (minScrollx()==someScrollInfo.minScrollx()&&
|
||||
maxScrollx()==someScrollInfo.maxScrollx()&&
|
||||
currScrollx()==someScrollInfo.currScrollx()&&
|
||||
minScrolly()==someScrollInfo.minScrolly()&&
|
||||
maxScrolly()==someScrollInfo.maxScrolly()&&
|
||||
currScrolly()==someScrollInfo.currScrolly()&&
|
||||
sizeEvent()==someScrollInfo.sizeEvent()&&
|
||||
scrollEvent()==someScrollInfo.scrollEvent()&&
|
||||
scrollableObjectWidth()==someScrollInfo.scrollableObjectWidth()&&
|
||||
scrollableObjectHeight()==someScrollInfo.scrollableObjectHeight()&&
|
||||
hwndOwner()==someScrollInfo.hwndOwner());
|
||||
}
|
||||
|
||||
inline
|
||||
int ScrollInfo::minScrollx(void)const
|
||||
{
|
||||
return mMinScrollx;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::minScrollx(int minScrollx)
|
||||
{
|
||||
mMinScrollx=minScrollx;
|
||||
}
|
||||
|
||||
inline
|
||||
int ScrollInfo::maxScrollx(void)const
|
||||
{
|
||||
return mMaxScrollx;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::maxScrollx(int maxScrollx)
|
||||
{
|
||||
mMaxScrollx=maxScrollx;
|
||||
}
|
||||
|
||||
inline
|
||||
int ScrollInfo::currScrollx(void)const
|
||||
{
|
||||
return mCurrScrollx;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::currScrollx(int currScrollx)
|
||||
{
|
||||
mCurrScrollx=currScrollx;
|
||||
}
|
||||
|
||||
inline
|
||||
int ScrollInfo::minScrolly(void)const
|
||||
{
|
||||
return mMinScrolly;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::minScrolly(int minScrolly)
|
||||
{
|
||||
mMinScrolly=minScrolly;
|
||||
}
|
||||
|
||||
inline
|
||||
int ScrollInfo::maxScrolly(void)const
|
||||
{
|
||||
return mMaxScrolly;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::maxScrolly(int maxScrolly)
|
||||
{
|
||||
mMaxScrolly=maxScrolly;
|
||||
}
|
||||
|
||||
inline
|
||||
int ScrollInfo::currScrolly(void)const
|
||||
{
|
||||
return mCurrScrolly;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::currScrolly(int currScrolly)
|
||||
{
|
||||
mCurrScrolly=currScrolly;
|
||||
}
|
||||
|
||||
inline
|
||||
BOOL ScrollInfo::scrollEvent(void)const
|
||||
{
|
||||
return mScrollEvent;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::scrollEvent(BOOL scrollEvent)
|
||||
{
|
||||
mScrollEvent=scrollEvent;
|
||||
}
|
||||
|
||||
inline
|
||||
BOOL ScrollInfo::sizeEvent(void)const
|
||||
{
|
||||
return mSizeEvent;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::sizeEvent(BOOL sizeEvent)
|
||||
{
|
||||
mSizeEvent=sizeEvent;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::scrollableObjectDimensions(int width,int height)
|
||||
{
|
||||
RECT clientRect;
|
||||
scrollableObjectWidth(width);
|
||||
scrollableObjectHeight(height);
|
||||
sizeEvent(FALSE);
|
||||
scrollEvent(FALSE);
|
||||
::GetClientRect(hwndOwner(),&clientRect);
|
||||
handleSize(CallbackData(0,MAKELPARAM(clientRect.right,clientRect.bottom)));
|
||||
}
|
||||
|
||||
inline
|
||||
int ScrollInfo::scrollableObjectWidth(void)const
|
||||
{
|
||||
return mScrollableObjectWidth;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::scrollableObjectWidth(int scrollableObjectWidth)
|
||||
{
|
||||
mScrollableObjectWidth=scrollableObjectWidth;
|
||||
}
|
||||
|
||||
inline
|
||||
int ScrollInfo::scrollableObjectHeight(void)const
|
||||
{
|
||||
return mScrollableObjectHeight;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::scrollableObjectHeight(int scrollableObjectHeight)
|
||||
{
|
||||
mScrollableObjectHeight=scrollableObjectHeight;
|
||||
}
|
||||
|
||||
inline
|
||||
HWND ScrollInfo::hwndOwner(void)const
|
||||
{
|
||||
return mhWndOwner;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::hwndOwner(HWND hwndOwner)
|
||||
{
|
||||
mhWndOwner=hwndOwner;
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::handleHorizontalScroll(CallbackData &someCallbackData)
|
||||
{
|
||||
int xDelta;
|
||||
int yDelta;
|
||||
int xNew;
|
||||
|
||||
yDelta=0;
|
||||
switch(LOWORD(someCallbackData.wParam()))
|
||||
{
|
||||
case SB_PAGEUP :
|
||||
xNew=currScrollx()-PageIncrement;
|
||||
break;
|
||||
case SB_PAGEDOWN :
|
||||
xNew=currScrollx()+PageIncrement;
|
||||
break;
|
||||
case SB_LINEUP :
|
||||
xNew=currScrollx()-LineIncrement;
|
||||
break;
|
||||
case SB_LINEDOWN :
|
||||
xNew=currScrollx()+LineIncrement;
|
||||
break;
|
||||
case SB_THUMBPOSITION :
|
||||
xNew= HIWORD(someCallbackData.wParam());
|
||||
break;
|
||||
default :
|
||||
xNew=currScrollx();
|
||||
break;
|
||||
}
|
||||
xNew=imax(0,xNew);
|
||||
xNew=imin(maxScrollx(),xNew);
|
||||
if(xNew==currScrollx())return;
|
||||
scrollEvent(TRUE);
|
||||
xDelta=xNew-currScrollx();
|
||||
currScrollx(xNew);
|
||||
::ScrollWindow(hwndOwner(),-xDelta,-yDelta,(const RECT*)0,(const RECT*)0);
|
||||
::UpdateWindow(hwndOwner());
|
||||
::SetScrollPos(hwndOwner(),SB_HORZ,currScrollx(),TRUE);
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::handleVerticalScroll(CallbackData &someCallbackData)
|
||||
{
|
||||
int yDelta;
|
||||
int yNew;
|
||||
int xDelta;
|
||||
|
||||
xDelta=0;
|
||||
switch(LOWORD(someCallbackData.wParam()))
|
||||
{
|
||||
case SB_PAGEUP :
|
||||
yNew=currScrolly()-PageIncrement;
|
||||
break;
|
||||
case SB_PAGEDOWN :
|
||||
yNew=currScrolly()+PageIncrement;
|
||||
break;
|
||||
case SB_LINEUP :
|
||||
yNew=currScrolly()-LineIncrement;
|
||||
break;
|
||||
case SB_LINEDOWN :
|
||||
yNew=currScrolly()+LineIncrement;
|
||||
break;
|
||||
case SB_THUMBPOSITION :
|
||||
yNew=HIWORD(someCallbackData.wParam());
|
||||
break;
|
||||
default :
|
||||
yNew=currScrolly();
|
||||
break;
|
||||
}
|
||||
yNew=imax(0,yNew);
|
||||
yNew=imin(maxScrolly(),yNew);
|
||||
if(yNew==currScrolly())return;
|
||||
scrollEvent(TRUE);
|
||||
yDelta=yNew-currScrolly();
|
||||
currScrolly(yNew);
|
||||
::ScrollWindow(hwndOwner(),-xDelta,-yDelta,(const RECT*)0,(const RECT*)0);
|
||||
::UpdateWindow(hwndOwner());
|
||||
::SetScrollPos(hwndOwner(),SB_VERT,currScrolly(),TRUE);
|
||||
}
|
||||
|
||||
inline
|
||||
void ScrollInfo::handleSize(CallbackData &someCallbackData)
|
||||
{
|
||||
int xNew(someCallbackData.loWord());
|
||||
int yNew(someCallbackData.hiWord());
|
||||
|
||||
sizeEvent(TRUE);
|
||||
maxScrollx(imax(scrollableObjectWidth()-xNew,0));
|
||||
::SetScrollRange(hwndOwner(),SB_HORZ,minScrollx(),maxScrollx(),FALSE);
|
||||
currScrollx(imin(currScrollx(),maxScrollx()));
|
||||
::SetScrollPos(hwndOwner(),SB_HORZ,currScrollx(),TRUE);
|
||||
maxScrolly(imax(scrollableObjectHeight()-yNew,0));
|
||||
::SetScrollRange(hwndOwner(),SB_VERT,minScrolly(),maxScrolly(),FALSE);
|
||||
currScrolly(imin(currScrolly(),maxScrolly()));
|
||||
::SetScrollPos(hwndOwner(),SB_VERT,currScrolly(),TRUE);
|
||||
}
|
||||
|
||||
inline
|
||||
int ScrollInfo::imax(int param1,int param2)
|
||||
{
|
||||
return param1>param2?param1:param2;
|
||||
}
|
||||
|
||||
inline
|
||||
int ScrollInfo::imin(int param1,int param2)
|
||||
{
|
||||
return param1<param2?param1:param2;
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user