#include "StdAfx.h" #include "ListFolderBox.h" #include "UIManager.h" #include "UISkinLexer.h" #include "Token.h" #include "Parser.h" #include "UIEvent.h" #include "ScrollBar.h" #include "FontAgent.h" #include "UIImage.h" #include "PlaneObject.h" #include "GameResourceManager.h" cListFolderBox::cListFolderBox( eUINodeType type ) :cListCtrl( type ) , mpScrollBar(0) , mpSelectImage(0) , mTopColumnIdx(0) , mSelectedColumnIdx(0) , mRowHeight(0) , mMaxRowInPage(0) , mTotalMaxNum(0) , mHighCheckPos(0, 0) , mHighNoCheckPos(0, 0) , mLowCheckPos(0, 0) , mLowNoCheckPos(0, 0) , mSelectedRow(0) , mSelectedRowColumn(0) , mColumnCount(0) , mRenderRow(0) , mRenderStartColumn(0) , mLowGap(0) , mShowNumber(true) , mShowSelect(true) { } cListFolderBox::~cListFolderBox() { mpScrollBar = 0; SAFE_DELETE( mpSelectImage ); } void cListFolderBox::Clear() { mSelectedColumnIdx = 0; mSelectedRow = 0; mSelectedRowColumn = 0; mTopColumnIdx = 0; mColumnCount = 0; UpdateScrollBar(); UpdateSelectImage(); cListCtrl::Clear(); } void cListFolderBox::InitSelectRow() { mSelectedColumnIdx = 0; mSelectedRow = 0; mSelectedRowColumn = 0; mTopColumnIdx = 0; UpdateScrollBar(); UpdateSelectImage(); } bool cListFolderBox::OnCreate( cUINodeProperty* pproperty ) { if( cUIWindow::OnCreate( pproperty ) == false ) return false; /// ½ºÅ©·Ñ¹Ù »ý¼º if( mScrollSkin ) { mpScrollBar = new cScrollBar; if( mpScrollBar->CreateBySkinName( mScrollSkin, this, eLIST_SCROLL ) == false ) { assert( 0 && "failed to create scroll bar" ); return false; } } if( mpScrollBar ) { mpScrollBar->SetHeight( GetAbsoluteRect().GetHeight() ); mpScrollBar->SetPosX( GetRelativeRect().mRight - GetRelativeRect().mLeft - mpScrollBar->GetAbsoluteRect().GetWidth() ); UpdateScrollBar(); } return true; } bool cListFolderBox::SetSkin( const cUINodeSkin* pskin ) { if( pskin->IsKindof( eUINODE_LISTFOLDERBOX ) == false ) { assert( 0 && "not list skin type" ); return false; } if( cUINode::SetSkin( pskin ) == false ) return false; /// ½ºÅ©¸³Æ®·ÎºÎÅÍ ÅØ½ºÃÄ ¹è°æÀ̹ÌÁöÀÇ ¼Ó¼ºÀ» ¹Þ´Â´Ù cListFolderBoxSkin* p = (cListFolderBoxSkin*)pskin; mScrollSkin = p->mScrollSkin; /// ¸®½ºÆ®ÄÁÆ®·Ñ¿¡ ¾ÆÀÌÅÛ ³ôÀÌ ¼¼ÆÃ mRowHeight = p->mRowHeight; /// ¸®½ºÆ®¿¡ ÃÖ´ë µé¾î°¥¼ö ÀÖ´Â °¹¼ö ¼¼ÆÃ mTotalMaxNum = p->mTotalMaxNum; /// ¸®½ºÆ® ÇÑÆäÀÌÁö¿¡ ÃÖ´ë µé¾î°¥¼ö ÀÖ´Â °¹¼ö ¼¼ÆÃ mMaxRowInPage = pskin->mSkinInfo->mHeight / mRowHeight; assert( mMaxRowInPage ); if( p->mpSelectBarTexture ) { /// ÅØ½ºÃ³ ¿µ¿ª ¼³Á¤ unsigned short tx = (unsigned short)p->mSelectBarSkin->mTexX; unsigned short ty = (unsigned short)p->mSelectBarSkin->mTexY; unsigned short tw = (unsigned short)p->mSelectBarSkin->mTexWidth; unsigned short th = (unsigned short)p->mSelectBarSkin->mTexHeight; if( mpSelectImage == 0 ) { mpSelectImage = new cPlaneObject; if( mpSelectImage->Create( p->mpSelectBarTexture, (short)GetAbsoluteRect().mLeft, (short)GetAbsoluteRect().mTop, tw, th, tx, ty, tx + tw, ty + th ) == false ) { assert( 0 && "failed to create select image"); return false; } } else { mpSelectImage->SetTextureRect( tx, ty, tx + tw, ty + th ); } } return true; } /// ÁÖÀÇ»çÇ× : bool cListFolderBox::HandleEvent( const cUIEvent& event ) { if( mEnabled == false || mVisible == false ) return mpParent->HandleEvent( event ); switch( event.mType ) { case eUIEVENT_COMMAND: CheckButtonEvent( event.mID ); case eUIEVENT_BUTTON_DOWNED: //CheckButtonEvent( event.mID ); break; case eUIEVENT_SCROLLBAR_MOVE: OnScrollbarMoved( event.mPos ); break; default: cUIWindow::HandleEvent( event ); break; } return true; } void cListFolderBox::UpdateRect() { cUIWindow::UpdateRect(); if( mpSelectImage ) UpdateSelectImage(); } void cListFolderBox::UpdateSkin() { cUIWindow::UpdateSkin(); /// ¼±Åà À̹ÌÁö ÃʱâÈ­ if( mpSelectImage ) UpdateSelectImage(); /// ½ºÅ©·Ñ¹Ù°¡ ÀÖÀ¸¸é ½ºÅ©·Ñ¹Ùµµ Àç¼¼ÆÃ if( mpScrollBar ) { /// ½ºÅ©·Ñ¹Ù ³ôÀÌ ¼¼ÆÃ mpScrollBar->SetHeight( GetAbsoluteRect().GetHeight() ); /// ½ºÅ©·Ñ¹Ù x À§Ä¡ ¼¼ÆÃ mpScrollBar->SetPosX( GetRelativeRect().mRight - GetRelativeRect().mLeft - mpScrollBar->GetAbsoluteRect().GetWidth() ); /// ½ºÅ©·Ñ¹Ù °»½Å UpdateScrollBar(); } } void cListFolderBox::OnProcess(unsigned long deltaTime, unsigned long accumTime ) { cUIWindow::OnProcess( deltaTime, accumTime ); if( mVisible == false ) return; /// mTopColumnIdx·Î ÇØ´ç row¿Í rowÀÇ Ä÷³À» ã´Â´Ù if( mColumnCount > 0 ) { mRenderRow = 0; mRenderStartColumn = 0; unsigned int totalColumn = 0; for( unsigned int i = 0; i < GetRowCount(); ++i ) { sRowData* p = GetRowData(i); if( p ) { /// ÇØ´ç rowÀÇ Ä÷³Ä«¿îÆ® mRenderRow = i; mRenderStartColumn = mTopColumnIdx - totalColumn; /// Æ®¸®°¡ Á¢ÇôÁ®ÀÖ´ÂÁö °Ë»ç. sFolderData* data = (sFolderData*)p->mColumes[0]; if( data->mCheck == true ) totalColumn += p->mColumes.GetSize(); else totalColumn += 1; if( totalColumn > mTopColumnIdx ) break; mRenderStartColumn = 0; } } } } void cListFolderBox::OnRender( cUIFontItemKeeper* pKeeper ) { if( mVisible == false ) return; /// À̹ÌÁö ·»´õ¸µ if( mpImage ) mpImage->Draw(); /// ÀÚ½Ä ·»´õ¸µ cChildList::cIterator i = mChildList.Begin(); cChildList::cIterator end = mChildList.End(); for( ; i != end; ++i ) { if( ((cUINode*)(*i))->IsVisible() == true ) { ((cUINode*)(*i))->OnRender(pKeeper); } } /// Àüü ¸®½ºÆ®¸¦ ¾ò¾î¿È if( mColumnCount > 0 ) { /// ¼±ÅÃÀ̹ÌÁö ¹Ù°¡, ¸®½ºÆ®¹Ú½º¸¦ ³Ñ¾î°¡Áö ¾Êµµ·Ï ÇÑ´Ù. if( mShowSelect == true ) { if( mSelectedColumnIdx >= mTopColumnIdx && mSelectedColumnIdx < mTopColumnIdx + mMaxRowInPage ) { mpSelectImage->Draw(); } } int textposX = GetAbsoluteRect().mLeft + 1; int textPosY = GetAbsoluteRect().mTop + 1; unsigned int addX = 0; //unsigned int addY = 0; /// Ãâ·Â unsigned int maxLine = ( mMaxRowInPage > mColumnCount )? mColumnCount : mMaxRowInPage; unsigned int line = 0; for( unsigned int i=mRenderRow; i= maxLine ) break; sRowData* rData = GetRowData( i ); if( rData == 0 ) continue; unsigned int colCount = rData->mColumes.GetSize(); for( unsigned int col = mRenderStartColumn; col < colCount; ++col ) { sFolderData* data = (sFolderData*)rData->mColumes[col]; if( data == 0 ) break; addX = 0; cUIImage* image = data->mCheckImg; if( image ) { /// À̹ÌÁö ÅØ½ºÃÄ ÁÂÇ¥ ¼¼ÆÃ cUIPos texPos = mLowCheckPos; if( col == 0 && data->mCheck == true ) texPos = mHighCheckPos; else if( col == 0 && data->mCheck == false ) texPos = mHighNoCheckPos; else if( data->mCheck == false ) texPos = mLowNoCheckPos; image->SetTextureRect( cUIRect( texPos.mX, texPos.mY,texPos.mX + image->GetWidth(), texPos.mY + image->GetHeight() ) ); image->SetPos( GetAbsoluteRect().mLeft + IMAGE_GAP, textPosY ); image->Draw(); addX += (image->GetWidth() + IMAGE_GAP + IMAGE_GAP); } /// »óÀ§¿­À̸é if( col == 0 ) { /// ÇÏÀ§¿­ °¹¼ö º¸¿©ÁÖ±â if( mShowNumber == true ) { TCHAR temp[256] = {0,}; ::_stprintf_s( temp, GAMERESOURCEMAN->GetGameText(470), (LPTSTR)data->mText.Cstr(), colCount-1 ); pKeeper->AddFontItem( cFontAgent::eFont_UI, temp, textposX + addX, textPosY, data->mTextColor ); } else { pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPTSTR)data->mText.Cstr(), textposX + addX, textPosY, data->mTextColor, mOutLine ); } } /// ÇÏÀ§¿­À̸é else { // »óÀ§¿­ Ãâ·ÂºÎ¿Í ¸ÂÃá´Ù if( addX == 0 ) { addX = IMAGE_GAP * 2; } pKeeper->AddFontItem( cFontAgent::eFont_UI, (LPTSTR)data->mText.Cstr(), textposX + addX + mLowGap, textPosY, data->mTextColor, mOutLine ); } textPosY += mRowHeight; line++; if( line >= maxLine ) break; /// Á¢ÇôÀÖÀ¸¸é ¹Ø¿¡°ÍÀº Ãâ·Â¾ÈÇÔ if( col == 0 && data->mCheck == false ) break; } mRenderStartColumn = 0; } } pKeeper->DrawAll(); } /// ÁÖÀÇ»çÇ× : void cListFolderBox::OnLButtonDown( const cUIPos& pos, bool ctrl, bool alt, bool shift ) { cUINode::OnLButtonDown( pos, ctrl, alt, shift ); unsigned int column = (pos.mY - GetAbsoluteRect().mTop) / mRowHeight + mTopColumnIdx; if( column >= mColumnCount ) return; sRowData* p = 0; unsigned int row = 0; unsigned int rowColumn = 0; unsigned int totalColumn = 0; for( unsigned int i = 0; i < GetRowCount(); ++i ) { p = GetRowData( i ); if( p ) { /// ÇØ´ç rowÀÇ Ä÷³Ä«¿îÆ® row = i; rowColumn = totalColumn; /// Æ®¸®°¡ Á¢ÇôÁ®ÀÖ´ÂÁö °Ë»ç. sFolderData* data = (sFolderData*)p->mColumes[0]; if( data->mCheck == true ) totalColumn += p->mColumes.GetSize(); else totalColumn += 1; if( totalColumn > column ) break; } } mSelectedRow = row; mSelectedRowColumn = column - rowColumn; /// ¼±ÅÃµÈ ¶óÀÎÀÌ »óÀ§¿­À̸é,[üũ] °»½Å if( rowColumn == column ) { sRowData* p = GetRowData( mSelectedRow ); if( p ) { mSelectedColumnIdx = column; sFolderData* data = (sFolderData*)p->mColumes[0]; unsigned int colCount = p->mColumes.GetSize(); /// ¸®½ºÆ®¿¡ À̹ÌÁö°¡ ÀÖÀ¸¸é À̹ÌÁö¿¡ µû¸¥ À̺¥Æ® üũ if( data->mCheckImg && colCount > 1 ) { int x1 = GetAbsoluteRect().mLeft; int x2 = GetAbsoluteRect().mLeft + GetAbsoluteRect().GetWidth(); if( pos.mX > x1 && pos.mX < x2 ) { data->mCheck = !data->mCheck; /// Ä÷³ ÃÑ °¹¼ö °»½Å UpdateColumnCount(); /// ÇÑÆäÀÌÁö¿¡ ÃæºÐÈ÷ µé¾î°¡¸é °»½Å if( mColumnCount < mMaxRowInPage ) { mTopColumnIdx = 0; } else if( mColumnCount - rowColumn <= mMaxRowInPage ) { mTopColumnIdx = mColumnCount - mMaxRowInPage; } UpdateScrollBar(); } } cUIEvent event; event.mpCaller = this; event.mID = mID; event.mType = eUIEVENT_LISTBOX_CHANGED; mpParent->HandleEvent( event ); } } else { sRowData* data = GetRowData( mSelectedRow ); if( data ) { sFolderData* colData = (sFolderData*)data->mColumes[mSelectedRowColumn]; if( colData ) { /// ¸®½ºÆ®¿¡ À̹ÌÁö°¡ ÀÖÀ¸¸é À̹ÌÁö¿¡ µû¸¥ À̺¥Æ® üũ if( colData->mCheckImg ) { int x1 = GetAbsoluteRect().mLeft; int x2 = x1 + colData->mCheckImg->GetWidth(); if( pos.mX > x1 && pos.mX < x2 ) { /// À̹ÌÁö °ü·Ã À̺¥Æ® ¹ß»ý cUIEvent event; event.mpCaller = this; event.mID = mID; event.mType = eUIEVENT_IMAGE_CLICKED; mpParent->HandleEvent( event ); } } } } /// ÇÏÀ§¿­À̸é À̺¥Æ® ½î±â if( mSelectedColumnIdx != column ) { mSelectedColumnIdx = column; /// À̺¥Æ® º¸³»±â cUIEvent event; event.mType = eUIEVENT_LISTBOX_CHANGED; event.mpCaller = this; event.mID = mID; mpParent->HandleEvent( event ); } } /// ¼±ÅúΠ°»½Å UpdateSelectImage(); } void cListFolderBox::OnLButtonDoubleClick( const cUIPos& pos ) { cListCtrl::OnLButtonDoubleClick( pos ); OnLButtonDown( pos, false, false, false ); } void cListFolderBox::OnScrollbarMoved( const cUIPos& ) { if( mpScrollBar == 0) return; assert( mColumnCount > mMaxRowInPage ); /// ¹Ù ¹öư À§Ä¡¸¦ ¾ò¾î¿È. unsigned int barbuttonPos = mpScrollBar->GetBarButtonPosY(); double h = mpScrollBar->GetScrollMarginHeight() / (double)(mColumnCount-mMaxRowInPage); /// ÇöÀç ¹Ù ¹öư À§Ä¡¿¡ ÇØ´çÇÏ´Â ¾ÆÀÌÅÛ À妽º ±¸Çϱâ double x = ((double)barbuttonPos / h); mTopColumnIdx = (int)x; UpdateSelectImage(); } /// void cListFolderBox::OnMouseWheel( const cUIPos& /*pos*/, int wheel ) { if( !mpScrollBar || mpScrollBar->IsVisible() == false ) return; assert( mColumnCount > mMaxRowInPage ); /// ½ºÅ©·Ñ¹Ù À§·Î ÈÙ Àû¿ë if( wheel > 0 ) { if( mTopColumnIdx > 0 ) { mTopColumnIdx--; UpdateSelectImage(); } } /// ¾Æ·¡·Î ÈÙ Àû¿ë else if ( wheel < 0 ) { /// ³²´Â ¿µ¿ªÀÌ ¾ø°Ô²û ½ºÅ©·Ñ if( mColumnCount - mTopColumnIdx > mMaxRowInPage ) { mTopColumnIdx++; UpdateSelectImage(); } } /// ½ºÅ©·Ñ¹Ù ¾÷µ¥ÀÌÆ® UpdateScrollBar(); } /// ÁÖÀÇ»çÇ× : ¹öưÀÇ »óÅ üũ void cListFolderBox::CheckButtonEvent( unsigned int id ) { if( !mpScrollBar ) { /// ¿©±â µé¾î¿Â´Ù¸é À߸øµÈ ºÎºÐÀδÙ. assert(0); return; } /// ½ºÅ©·Ñ¹Ù°¡ ±×·ÁÁöÁö ¾Ê´Â »óÅÂ¸é ¸®ÅÏ if( mpScrollBar->IsVisible() == false ) { /// ¿©±â µé¾î¿Â´Ù¸é À߸øµÈ ºÎºÐÀδÙ. assert(0); return; } assert(mColumnCount > mMaxRowInPage); switch( id ) { case eSCROOLBAR_UP: if( mTopColumnIdx > 0 ) { mTopColumnIdx--; UpdateSelectImage(); } break; case eSCROOLBAR_DOWN: /// ³²´Â ¿µ¿ªÀÌ ¾ø°Ô²û ½ºÅ©·Ñ if( mColumnCount - mTopColumnIdx > mMaxRowInPage ) { mTopColumnIdx++; UpdateSelectImage(); } break; } /// ½ºÅ©·Ñ¹Ù ¹öư À§Ä¡ ¾÷µ¥ÀÌÆ® UpdateScrollBar(); } /// »óÀ§¿­ Ãß°¡ int cListFolderBox::AddHighData( long key, LPCTSTR str, unsigned long color, void* pExtraData, cUIImage* pImage, bool check ) { /// ¼ö¿ë°¹¼ö¸¦ ³Ñ¾î°¡¸é ¸®ÅÏ if( mColumnCount >= mTotalMaxNum ) return -1; /// ÀÌ¹Ì µ¥ÀÌÅͰ¡ ÀÖ´ÂÁö °Ë»ç for( unsigned int i = 0; i < mRows.GetSize(); ++i ) { sRowData* p = (sRowData*)mRows[i]; if( p && p->mColumes.GetSize() > 0 ) { sFolderData* data = (sFolderData*)p->mColumes[0]; if( data && data->key == key ) return -1; } } /// µ¥ÀÌÅÍ »ðÀÔ sFolderData* data = new sFolderData; data->key = key; data->mText = str; data->mTextColor = color; data->mCheck = check; data->mCheckImg = pImage; data->mExtraData = pExtraData; int ret = cListCtrl::AddRowData( data, pExtraData ); UpdateColumnCount(); UpdateScrollBar(); UpdateSelectImage(); return ret; } /// ÇÏÀ§¿­ Ãß°¡ bool cListFolderBox::AddLowData( long key, LPCTSTR str, unsigned long color, void* pExtraData, cUIImage* pImage, bool check ) { /// ÇØ´ç »óÀ§¿­ °¡Á®¿À±â int row = -1; for( unsigned int i = 0; i < mRows.GetSize(); ++i ) { sRowData* p = (sRowData*)mRows[i]; if( p && p->mColumes.GetSize() > 0 ) { sFolderData* data = (sFolderData*)p->mColumes[0]; if( data && data->key == key ) { row = i; break; } } } if( row == -1 ) { assert(0); return false; } sFolderData* data = new sFolderData; data->mText = str; data->mTextColor = color; data->mCheck = check; data->mCheckImg = pImage; data->mExtraData = pExtraData; bool ret = cListCtrl::AddColumeData( row, data ); UpdateColumnCount(); UpdateScrollBar(); return ret; } sFolderData* cListFolderBox::GetFolderData( unsigned int row, unsigned int column ) { sRowData* p = GetRowData( row ); if( p ) { if( column >= p->mColumes.GetSize() ) { assert(0); return 0; } return (sFolderData*)p->mColumes[column]; } return 0; } sFolderData* cListFolderBox::GetFolderDataByExtra( long key, void* extraData ) { int rowSize = mRows.GetSize(); for( int ri = 0; ri < rowSize; ++ri ) { sRowData* p = (sRowData*)mRows[ri]; if( p && p->mColumes.GetSize() > 0 ) { sFolderData* data = (sFolderData*)p->mColumes[0]; if( data && data->key == key ) { /// µ¿ÀÏ µ¥ÀÌÅÍ °Ë»ö for( unsigned int ci = 0; ci < p->mColumes.GetSize(); ++ci ) { sFolderData* data = (sFolderData*)p->mColumes[ci]; if( ci > 0 && data && data->mExtraData == extraData ) { return data; } } break; } } } return 0; } // Á¢ÇûÀ¸¸é Ç¥½Ã ¾ÈµÊ void cListFolderBox::ChangeSelectColumn( unsigned int selectRow, bool sendEvent ) { if( selectRow == -1 ) { mSelectedRow = 0; mSelectedRowColumn = 0; mSelectedColumnIdx = 0; mShowSelect = false; return; } if( selectRow >= mColumnCount ) { mSelectedRow = 0; mSelectedRowColumn = 0; mSelectedColumnIdx = 0; mShowSelect = false; return; } sRowData* p = 0; unsigned int row = 0; unsigned int rowColumn = 0; unsigned int totalColumn = 0; for( unsigned int i = 0; i < GetRowCount(); ++i ) { p = GetRowData( i ); if( p ) { /// ÇØ´ç rowÀÇ Ä÷³Ä«¿îÆ® row = i; rowColumn = totalColumn; /// Æ®¸®°¡ Á¢ÇôÁ®ÀÖ´ÂÁö °Ë»ç. sFolderData* data = (sFolderData*)p->mColumes[0]; if( data->mCheck == true ) totalColumn += p->mColumes.GetSize(); else totalColumn += 1; if( totalColumn > selectRow ) break; } } mSelectedRow = row; mSelectedRowColumn = selectRow - rowColumn; mSelectedColumnIdx = rowColumn + mSelectedRowColumn; if( mSelectedColumnIdx >= mMaxRowInPage ) { /// ¿©¹éÀÌ ¾È³²°Ô²û Á¶Àý if( mColumnCount - mSelectedColumnIdx >= mMaxRowInPage ) mTopColumnIdx = mSelectedColumnIdx; else mTopColumnIdx = mColumnCount - mMaxRowInPage; /// ½ºÅ©·Ñ¹Ù¸¦ °»½ÅÇÑ´Ù. UpdateScrollBar(); } // À̺¥Æ® ¹ß»ý if( sendEvent ) { cUIEvent event; event.mpCaller = this; event.mID = mID; event.mType = eUIEVENT_LISTBOX_CHANGED; mpParent->HandleEvent( event ); } /// ¼±ÅúΠ°»½Å UpdateSelectImage(); } /// ÁÖÀÇ»çÇ× : ¼±ÅÃµÈ À̹ÌÁö ¿µ¿ª ¾÷µ¥ÀÌÆ® void cListFolderBox::UpdateSelectImage() { mShowSelect = true; int scrollWidth = 0; if( mpScrollBar && mpScrollBar->IsVisible() ) scrollWidth = mpScrollBar->GetAbsoluteRect().GetWidth(); cUIRect imageRc; imageRc.mLeft = GetAbsoluteRect().mLeft; imageRc.mRight = imageRc.mLeft + GetAbsoluteRect().GetWidth() - scrollWidth; imageRc.mTop = GetAbsoluteRect().mTop + ( mRowHeight * ( mSelectedColumnIdx - mTopColumnIdx) ); imageRc.mBottom = imageRc.mTop + mRowHeight; /// À§Ä¡ ¼¼ÆÃ mpSelectImage->SetScreenXY( (unsigned short)imageRc.mLeft, (unsigned short)imageRc.mTop ); mpSelectImage->SetScreenWH( (unsigned short)imageRc.GetWidth(), (unsigned short)imageRc.GetHeight() ); } /// void cListFolderBox::UpdateScrollBar() { if( !mpScrollBar ) return; if( mColumnCount > mMaxRowInPage ) { /// ½ºÅ©·Ñ¹ÙÀÇ ¹Ù ¹öưÀ» ±×¸°´Ù mpScrollBar->Show(); unsigned int scrollHeight = mpScrollBar->GetAbsoluteRect().GetHeight(); unsigned int buttonHeight = mpScrollBar->GetScrollButtonHeight() * 2; if( scrollHeight > buttonHeight ) { scrollHeight -= buttonHeight; } double hsize = scrollHeight - scrollHeight * (double)mColumnCount / (double)mTotalMaxNum; /// ¹Ù ¹öưÀÇ ÃÖ¼Ò»çÀÌÁî¶û ºñ±³ÈÄ ¼¼ÆÃ unsigned int minsize = mpScrollBar->GetMinimumHeight(); if( hsize < minsize ) { hsize = minsize; } /// ½ºÅ©·Ñ¹Ù À§Ä¡ °è»ê.. /// ÇÑ ¾ÆÀÌÅÛ´ç ½ºÅ©·Ñ¹Ù°¡ ¿òÁ÷ÀÌ´Â °Å¸® ±¸Çϱâ double h = mpScrollBar->GetScrollMarginHeight() / (double)(mColumnCount-mMaxRowInPage); /// ÇöÀç žÀ妽º * ÇѰ³¿µ¿ª = »õ·Î¿î ½ºÅ©·Ñ¹Ù À§Ä¡ double newposY = h * mTopColumnIdx; double oldY = mpScrollBar->GetBarButtonPosY(); /// ±âÁ¸ À§Ä¡¶û ºñ±³Çؼ­ ½ºÅ©·Ñ¹ÙÀÇ À§Ä¡¸¦ ÀçÁ¶Á¤ÇÑ´Ù. int value = (int)(newposY-oldY); if( newposY > oldY ) { mpScrollBar->MoveScrollDown( value ); } else { mpScrollBar->MoveScrollUp( -value ); } } else { mpScrollBar->Hide(); } } void cListFolderBox::UpdateColumnCount() { mColumnCount = 0; /// ÃÑ Ä÷³¼ö ¼¼±â for( unsigned int i = 0; i < mRows.GetSize(); ++i ) { sRowData* p = (sRowData*)mRows[i]; if( p ) { sFolderData* data = (sFolderData*)p->mColumes[0]; if( !data ) { assert(0); break; } if( data->mCheck == true ) mColumnCount += p->mColumes.GetSize(); else mColumnCount += 1; } } } /// void* cListFolderBox::GetColumnData( unsigned int row, unsigned int column ) { if( mColumnCount == 0 ) return 0; if( mRows.GetSize() <= row ) return 0; sRowData* data = (sRowData*)mRows[row]; if( !data ) return 0; if( data->mColumes.GetSize() <= column ) return 0; sFolderData* colData = (sFolderData*)data->mColumes[column]; return ( colData ) ? colData->mExtraData : 0; } /// Á¢ÇôÁ® ÀÖ´Â Ä«Å×°í¸® Ű °ª °¡Á®¿À±â void cListFolderBox::GetClosedCategory( tHashSet& keySet ) { int rowSize = mRows.GetSize(); for( int ri = 0; ri < rowSize; ++ri ) { sRowData* p = (sRowData*)mRows[ri]; if( p && p->mColumes.GetSize() > 0 ) { sFolderData* data = (sFolderData*)p->mColumes[0]; if( data && data->mCheck == false ) { keySet.Insert( data->key ); } } } } /// Á¢ÇôÁ® ÀÖ´Â Ä«Å×°í¸® Ű °ª °¡Á®¿À±â void cListFolderBox::SetClosedCategory( long key ) { int rowSize = mRows.GetSize(); for( int ri = 0; ri < rowSize; ++ri ) { sRowData* p = (sRowData*)mRows[ri]; if( p && p->mColumes.GetSize() > 0 ) { sFolderData* data = (sFolderData*)p->mColumes[0]; if( data && data->key == key ) { data->mCheck = false; /// Ä÷³ ÃÑ °¹¼ö °»½Å UpdateColumnCount(); UpdateScrollBar(); } } } } ////////////////////////////////////////////////////////// cListFolderBoxSkin::cListFolderBoxSkin( eUINodeType type ) : cUINodeSkin( type ) , mSelectBarSkin(0) , mpSelectBarTexture(0) , mSelectBarWidth(0) { mSelectBarSkin = new sSkinInfo; mRowHeight = FONTAGENT->GetTextHeight(cFontAgent::eFont_UI); } cListFolderBoxSkin::~cListFolderBoxSkin() { SAFE_DELETE(mSelectBarSkin); } /// ÁÖÀÇ»çÇ× : bool cListFolderBoxSkin::Load( cParser& parser ) { if( parser.ExpectTokenString( "{" ) == false ) return false; cToken token; cLexer* lexer = parser.GetLexer(); while( lexer->GetNextToken( &token ) ) { if( token == "}" ) { /// ºí·Ï Å»Ãâ ^^ break; } switch( token.mType ) { case eTOKEN_ROWHEIGHT: { mRowHeight = parser.ParseInt(); } break; case eTOKEN_MAXITEMNUM: { mTotalMaxNum = parser.ParseInt(); } break; /// ui image °ü·Ã case eTOKEN_CHILD_IMAGEINDEX: { int i = parser.ParseInt(); mpSelectBarTexture = UIMAN->GetSkin()->GetTexture( i ); if( mpSelectBarTexture == 0 ) { assert( 0 && "failed to load texture" ); return false; } } break; case eTOKEN_CHILD_SIZE: { mSelectBarSkin->mWidth = mSelectBarSkin->mTexWidth = (unsigned short)parser.ParseInt(); mSelectBarSkin->mHeight = mSelectBarSkin->mTexHeight = (unsigned short)parser.ParseInt(); } break; case eTOKEN_CHILD_TEXPOS: { mSelectBarSkin->mTexX = (unsigned short)parser.ParseInt(); mSelectBarSkin->mTexY = (unsigned short)parser.ParseInt(); } break; case eTOKEN_SELECTWIDTH: { mSelectBarWidth = parser.ParseInt(); } break; case eTOKEN_SCROLLSKIN: { mScrollSkin = parser.ParseString(); } break; default: if( cUINodeSkin::ParseLine( parser, token ) == false ) { return false; } break; } } return true; }