Files
Work/common/Odlist.cpp
2024-08-07 09:09:36 -04:00

287 lines
9.6 KiB
C++

#include <common/odlist.hpp>
#include <common/purehdc.hpp>
#include <common/rect.hpp>
#include <common/gdipoint.hpp>
#include <common/drawitem.hpp>
#include <common/measure.hpp>
#include <common/puredwrd.hpp>
OwnerDrawList::OwnerDrawList(GUIWindow &parentWnd,HWND hControlWnd,UINT controlID)
: mParentWnd(parentWnd), Control(hControlWnd,controlID),
mDlgWidthUnits((LOWORD(::GetDialogBaseUnits())/4)*2)
{
mDrawItemHandler.setCallback(this,&OwnerDrawList::drawItemHandler);
mMeasureItemHandler.setCallback(this,&OwnerDrawList::measureItemHandler);
mControlColorHandler.setCallback(this,&OwnerDrawList::controlColorHandler);
mSizeHandler.setCallback(this,&OwnerDrawList::sizeHandler);
mParentWnd.insertHandler(VectorHandler::DrawItemHandler,&mDrawItemHandler);
mParentWnd.insertHandler(VectorHandler::MeasureItemHandler,&mMeasureItemHandler);
mParentWnd.insertHandler(VectorHandler::ControlColorHandler,&mControlColorHandler);
mParentWnd.insertHandler(VectorHandler::SizeHandler,&mSizeHandler);
}
OwnerDrawList::OwnerDrawList(GUIWindow &parentWnd,const Rect &initRect,UINT controlID,DWORD style)
: mParentWnd(parentWnd), mDlgWidthUnits((LOWORD(::GetDialogBaseUnits())/4)*2)
{
mDrawItemHandler.setCallback(this,&OwnerDrawList::drawItemHandler);
mMeasureItemHandler.setCallback(this,&OwnerDrawList::measureItemHandler);
mControlColorHandler.setCallback(this,&OwnerDrawList::controlColorHandler);
mSizeHandler.setCallback(this,&OwnerDrawList::sizeHandler);
mParentWnd.insertHandler(VectorHandler::DrawItemHandler,&mDrawItemHandler);
mParentWnd.insertHandler(VectorHandler::MeasureItemHandler,&mMeasureItemHandler);
mParentWnd.insertHandler(VectorHandler::ControlColorHandler,&mControlColorHandler);
mParentWnd.insertHandler(VectorHandler::SizeHandler,&mSizeHandler);
createControl("LISTBOX","",style,initRect,parentWnd,controlID);
}
OwnerDrawList::~OwnerDrawList()
{
mParentWnd.removeHandler(VectorHandler::DrawItemHandler,&mDrawItemHandler);
mParentWnd.removeHandler(VectorHandler::MeasureItemHandler,&mMeasureItemHandler);
mParentWnd.removeHandler(VectorHandler::ControlColorHandler,&mControlColorHandler);
mParentWnd.removeHandler(VectorHandler::SizeHandler,&mSizeHandler);
}
CallbackData::ReturnType OwnerDrawList::controlColorHandler(CallbackData &someCallbackData)
{
PureDevice pureDevice((HDC)someCallbackData.wParam());
Control wndListBox((HWND)someCallbackData.lParam(),::GetDlgCtrlID((HWND)someCallbackData.lParam()),FALSE);
if(!(*this==wndListBox))return (CallbackData::ReturnType)TRUE;
return handleControlColor(pureDevice,wndListBox);
}
CallbackData::ReturnType OwnerDrawList::drawItemHandler(CallbackData &someCallbackData)
{
DrawItem drawItem(*((LPDRAWITEMSTRUCT)someCallbackData.lParam()));
if(drawItem.controlID()!=controlID())return (CallbackData::ReturnType)TRUE;
handleDraw(drawItem);
return (CallbackData::ReturnType)TRUE;
}
CallbackData::ReturnType OwnerDrawList::measureItemHandler(CallbackData &someCallbackData)
{
if(controlID()!=someCallbackData.wParam())return (CallbackData::ReturnType)TRUE;
LPMEASUREITEMSTRUCT pMeasureItemStruct=(LPMEASUREITEMSTRUCT)someCallbackData.lParam();
MeasureItem measureItem(*pMeasureItemStruct);
handleMeasureItem(measureItem);
pMeasureItemStruct->CtlType=measureItem.ctlType();
pMeasureItemStruct->CtlID=measureItem.ctlID();
pMeasureItemStruct->itemID=measureItem.itemID();
pMeasureItemStruct->itemWidth=measureItem.itemWidth();
pMeasureItemStruct->itemHeight=measureItem.itemHeight();
pMeasureItemStruct->itemData=measureItem.itemData();
return (CallbackData::ReturnType)TRUE;
}
CallbackData::ReturnType OwnerDrawList::sizeHandler(CallbackData &someCallbackData)
{
handleResize(someCallbackData.loWord(),someCallbackData.hiWord());
return (CallbackData::ReturnType)FALSE;
}
BOOL OwnerDrawList::setTabStops(Block<PureDWORD> &tabStops)
{
if(!isOkay())return FALSE;
mTabStopArray.size(tabStops.size());
if(!mTabStopArray.size())return FALSE;
int *pIntArray=(int*)&mTabStopArray[0];
for(int itemIndex=0;itemIndex<tabStops.size();itemIndex++)pIntArray[itemIndex]=tabStops[itemIndex].getValue()*dlgWidthUnits();
return sendMessage(LB_SETTABSTOPS,mTabStopArray.size(),(LPARAM)pIntArray);
}
LONG OwnerDrawList::addString(const String &stringData)
{
int itemIndex;
if(!isOkay()||stringData.isNull())return FALSE;
sendMessage(LB_ADDSTRING,0,(LPARAM)(LPSTR)stringData);
return TRUE;
}
LONG OwnerDrawList::insertString(const String &stringData,int insertPos)
{
if(!isOkay()||stringData.isNull())return LB_ERR;
return sendMessage(LB_INSERTSTRING,(WPARAM)insertPos,(LPARAM)(LPSTR)stringData);
}
LONG OwnerDrawList::insertStringAndMakeCurrent(const String &stringData)
{
if(!isOkay()||stringData.isNull())return LB_ERR;
if(LB_ERR==insertString(stringData))return LB_ERR;
return setCurrent(getCount()-1);
}
LONG OwnerDrawList::deleteString(DWORD itemIndex)
{
if(!isOkay())return LB_ERR;
return sendMessage(LB_DELETESTRING,(WPARAM)itemIndex,0L);
}
LONG OwnerDrawList::getText(String &stringData,DWORD itemIndex)
{
if(!isOkay())return LB_ERR;
stringData.reserve(String::MaxString);
return sendMessage(LB_GETTEXT,(WPARAM)itemIndex,(LPARAM)(LPSTR)stringData);
}
LONG OwnerDrawList::getSel(UINT itemIndex)
{
if(!isOkay())return LB_ERR;
return sendMessage(LB_GETSEL,(WPARAM)itemIndex,(LPARAM)0);
}
LONG OwnerDrawList::getCursorItem(void)
{
GDIPoint cursorPoint;
::GetCursorPos(&((POINT&)cursorPoint));
::ScreenToClient(*this,&((POINT&)cursorPoint));
return itemFromPoint(cursorPoint);
}
LONG OwnerDrawList::getItemRect(UINT itemIndex,Rect &someRect)
{
if(!isOkay())return LB_ERR;
return sendMessage(LB_GETITEMRECT,(WPARAM)itemIndex,(LPARAM)&((RECT&)someRect));
}
LONG OwnerDrawList::itemFromPoint(const GDIPoint &someGDIPoint)
{
LONG itemCount;
Rect itemRect;
if(!isOkay())return LB_ERR;
itemCount=getCount();
for(int itemIndex=0;itemIndex<itemCount;itemIndex++)
{
if(LB_ERR==getItemRect(itemIndex,itemRect))continue;
if(::PtInRect(&((RECT&)itemRect),(POINT&)((GDIPoint&)someGDIPoint)))return itemIndex;
}
return LB_ERR;
}
LONG OwnerDrawList::setCaretIndex(int itemIndex,BOOL scrollIntoView)const
{
if(!isOkay())return LB_ERR;
return sendMessage(LB_SETCARETINDEX,itemIndex,MAKELPARAM(scrollIntoView,0));
}
LONG OwnerDrawList::getSelItems(GlobalData<DWORD> &selectedItems)
{
GlobalData<DWORD> selItems;
LONG itemCount;
if(!isOkay())return LB_ERR;
selItems.size(MaxItems);
itemCount=sendMessage(LB_GETSELITEMS,selItems.size(),(LPARAM)((DWORD*)&selItems[0]));
if(LB_ERR==itemCount)return LB_ERR;
selectedItems.size(itemCount);
for(DWORD itemIndex=0;itemIndex<itemCount;itemIndex++)selectedItems[itemIndex]=selItems[itemIndex];
return selectedItems.size();
}
LONG OwnerDrawList::setSelection(UINT itemIndex,WORD selectionState)
{
if(!isOkay())return LB_ERR;
return sendMessage(LB_SETSEL,selectionState,itemIndex);
}
LONG OwnerDrawList::getCount(void)
{
if(!isOkay())return LB_ERR;
return sendMessage(LB_GETCOUNT,0,0L);
}
LONG OwnerDrawList::getSelCount(void)
{
if(!isOkay())return LB_ERR;
return sendMessage(LB_GETSELCOUNT,0,0L);
}
WORD OwnerDrawList::setCurrent(WORD itemIndex)
{
if(!isOkay())return FALSE;
return sendMessage(LB_SETCURSEL,(WPARAM)itemIndex,0L);
}
LONG OwnerDrawList::getCurrent(void)
{
if(!isOkay())return LB_ERR;
return sendMessage(LB_GETCURSEL,0,0L);
}
LONG OwnerDrawList::findStringExact(const String &itemString,int startIndex)const
{
if(itemString.isNull()||!isOkay())return LB_ERR;
return sendMessage(LB_FINDSTRINGEXACT,startIndex,(LPARAM)(LPCTSTR)(LPSTR)(String&)itemString);
}
LONG OwnerDrawList::findString(const String &itemString,int startIndex)const
{
if(itemString.isNull()||!isOkay())return LB_ERR;
return sendMessage(LB_FINDSTRING,startIndex,(LPARAM)(LPCTSTR)(LPSTR)(String&)itemString);
}
LONG OwnerDrawList::selItemRange(UINT rangeFirst,UINT rangeLast,BOOL select)const
{
if(!isOkay())return LB_ERR;
return sendMessage(LB_SELITEMRANGE,(WPARAM)select,(LPARAM)MAKELPARAM(rangeFirst,rangeLast));
}
LONG OwnerDrawList::textOut(const DrawItem &drawItem,const String &strData,int xLocation)
{
TEXTMETRIC textMetric;
LONG retCode(FALSE);
Rect drawRect;
if(!isOkay())return retCode;
if(strData.isNull())return retCode;
drawRect=drawItem.rectItem();
::GetTextMetrics(drawItem.deviceContext(),&textMetric);
if(mTabStopArray.size())retCode=::TabbedTextOut(drawItem.deviceContext(),xLocation*dlgWidthUnits(),(drawRect.bottom()+drawRect.top()-textMetric.tmHeight)/2,(LPSTR)(String&)strData,strData.length(),mTabStopArray.size(),(int*)&mTabStopArray[0],0);
else retCode=::TextOut(drawItem.deviceContext(),xLocation*dlgWidthUnits(),(drawRect.bottom()+drawRect.top()-textMetric.tmHeight)/2,(LPSTR)(String&)strData,strData.length());
return retCode;
}
// ******* virtuals
GUIWindow &OwnerDrawList::controlWindow(void)
{
return *this;
}
LPARAM OwnerDrawList::handleControlColor(PureDevice &/*pureDevice*/,Control &/*wndListBox*/)
{
return FALSE;
}
WORD OwnerDrawList::handleDraw(const DrawItem &drawItem)
{
drawEntire(drawItem);
return TRUE;
}
WORD OwnerDrawList::handleMeasureItem(MeasureItem &measureItem)
{
measureItem.itemHeight(17);
return TRUE;
}
void OwnerDrawList::drawEntire(const DrawItem &drawItem)
{
String stringData;
HGDIOBJ hPrevGDIObj;
int strLen;
if((((UINT)drawItem.itemState())&ODS_SELECTED))::SetBkColor(drawItem.deviceContext(),RGBColor(192,192,192));
else ::SetBkColor(drawItem.deviceContext(),RGBColor(255,255,255));
strLen=sendMessage(drawItem.hwndItem(),LB_GETTEXTLEN,drawItem.itemID(),(LPARAM)(LPSTR)stringData);
stringData.reserve(strLen+1);
sendMessage(drawItem.hwndItem(),LB_GETTEXT,drawItem.itemID(),(LPARAM)(LPSTR)stringData);
stringData.length(180);
textOut(drawItem,stringData,0);
}
void OwnerDrawList::handleResize(WORD /*width*/,WORD /*height*/)
{
}