Files
2022-10-26 12:25:11 +08:00

402 lines
9.4 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "Interface\uiBase.h"
#include "treecontroller.h"
TreeController::TreeController(void)
{
select_item_ = NULL;
//상위 트리 자체는 열린트리.
root_tree_.tree_data.isFolder = true;
origin_value_ = 0;
scroll_tick_move_ = 1;
}
TreeController::~TreeController(void)
{
}
HTREEITEM TreeController::AddTreeItem( const TCHAR* ItemName ,
int Icon_index,
int Type_item,
bool isfolder,
DWORD font_ID,
void* user_date_ptr,
HTREEITEM perent )
{
TreebaseItem* TreeItem = new TreebaseItem();
strcpy(TreeItem->tree_data.tree_item_str_,ItemName);
TreeItem->tree_data.icon_index_ = Icon_index;
TreeItem->tree_data.type_item = Type_item;
TreeItem->tree_data.font_ID = font_ID;
TreeItem->tree_data.tree_left_off_ = Left_Gap;
TreeItem->offset_col_ = Sell_range_;
TreeItem->tree_data.user_data_Ptr_ = user_date_ptr;
TreeItem->set_open(isfolder);
if(perent)
{
perent->addChildTree(TreeItem,origin_value_);
}
else
{
root_tree_.addChildTree(TreeItem,origin_value_);
}
Reflush(TreeItem);
return TreeItem;
}
HTREEITEM TreeController::AddTreeItemGauge( const TCHAR* ItemName,
int Icon_index,
int Type_item,
bool isfolder ,
DWORD font_ID,
int maxGauge,
void* user_date_ptr /*= NULL */,
HTREEITEM perent /*= NULL*/ )
{
GaugeTreeItem* TreeItem = new GaugeTreeItem();
strcpy(TreeItem->tree_data.tree_item_str_,ItemName);
TreeItem->tree_data.icon_index_ = Icon_index;
TreeItem->tree_data.type_item = Type_item;
TreeItem->tree_data.font_ID = font_ID;
TreeItem->tree_data.tree_left_off_ = Left_Gap;
TreeItem->offset_col_ = Sell_range_;
TreeItem->tree_data.user_data_Ptr_ = user_date_ptr;
TreeItem->set_open(isfolder);
TreeItem->SetRange(0,maxGauge);
TreeItem->SetPos(0);
if(perent)
{
perent->addChildTree(TreeItem,origin_value_);
}
else
{
root_tree_.addChildTree(TreeItem,origin_value_);
}
Reflush(TreeItem);
return TreeItem;
}
HTREEITEM TreeController::AddTreeItemCheckBox( const TCHAR* ItemName,
int Icon_index,
int Type_item,
bool isfolder ,
DWORD font_ID,
void* user_date_ptr /*= NULL */
,HTREEITEM perent /*= NULL*/ )
{
CheckBoxTree* TreeItem = new CheckBoxTree();
strcpy(TreeItem->tree_data.tree_item_str_,ItemName);
TreeItem->tree_data.icon_index_ = Icon_index;
TreeItem->tree_data.type_item = Type_item;
TreeItem->tree_data.font_ID = font_ID;
TreeItem->tree_data.tree_left_off_ = Left_Gap;
TreeItem->offset_col_ = Sell_range_;
TreeItem->tree_data.user_data_Ptr_ = user_date_ptr;
TreeItem->set_open(isfolder);
if(perent)
{
perent->addChildTree(TreeItem,origin_value_);
}
else
{
root_tree_.addChildTree(TreeItem,origin_value_);
}
Reflush(TreeItem);
return TreeItem;
}
TreeController* TreeController::CreateTree( int Sell,int Leff_offset, CCtrlVScrollWZ* VScroller, CCtrlListWZ* listcontrol )
{
TreeController* Controller = new TreeController();
Controller->Sell_range_ = Sell;
Controller->vscroll_control_ = VScroller;
Controller->list_control_ = listcontrol;
Controller->Left_Gap = Leff_offset;
if(Controller->list_control_)
{
Controller->list_control_->SetSellHeight(Controller->Sell_range_);
}
if(Controller->list_control_)
{
Controller->render_max_object_counter_ = listcontrol->GetSize().bottom / Sell;
}
return Controller;
}
void TreeController::Reflush()
{
if (list_control_ == NULL)
{
return;
}
if (root_tree_.getchilditem().empty())
{
return;
}
list_control_->DeleteItemAll();
Reflush(&root_tree_);
resetScroll();
}
void TreeController::Reflush( HTREEITEM item )
{
if (list_control_ == NULL)
{
return;
}
item->push_Item(list_control_);
}
void TreeController::MessageProc( SI_MESSAGE* msg )
{
switch (msg->eResultMsg)
{
case RT_MSG_LBUTTONCLICK:
OnLbuttomDown();
break;
case RT_MSG_SB_LINETOP:
{
if(vscroll_control_&& msg->dwCtrlID == vscroll_control_->GetCtrlID())
{
UpScroll();
}
}
break;
case RT_MSG_SB_LINEBOTTOM:
{
if(vscroll_control_&& msg->dwCtrlID == vscroll_control_->GetCtrlID())
{
DownScroll();
}
}
break;
case RT_MSG_SB_THUMBTRACK: //!< 썸을 드래그 하고 있다.
case RT_MSG_SB_THUMBPOSITION: //!< 썸을 드래그한후 마우스를 놓았다.
case RT_MSG_SB_ENDSCROLL: //!< 스크롤이 종료 되었다.
{
if(vscroll_control_ && msg->dwCtrlID == vscroll_control_->GetCtrlID())
{
ThumbScroll();
}
}
break;
}
}
void TreeController::UpdateTree( HTREEITEM item )
{
if(item == NULL)
{
return;
}
item->set_select(true);
//리프 아이템의 경우 갱신할 필요 없음
if(item->is_leaf())
{
return;
}
bool isOpen = item->is_open();
item->set_open(!isOpen);
//폴더 갱신
Reflush();
}
void TreeController::OnLbuttomDown()
{
//이전에 선택된 목록은 선택해지
if(select_item_)
{
select_item_->set_select(false);
}
HTREEITEM Contexted_item = (HTREEITEM)(list_control_->GetItemUserData(list_control_->GetCurSel(), 0));
if(Contexted_item)
{
select_item_ = Contexted_item;
}
UpdateTree(select_item_);
}
void TreeController::UpScroll()
{
if(vscroll_control_ == NULL)
{
return;
}
int pos = vscroll_control_->GetScrollPosWZ();
int mmin = 0, mmax = 0;
vscroll_control_->GetScrollRangeWZ(&mmin, &mmax);
if(pos > mmin)
{
pos -= scroll_tick_move_;
vscroll_control_->SetScrollPosWZ(pos);
}
list_control_->SetBeginDrawIndex(pos);
}
void TreeController::DownScroll()
{
if(vscroll_control_ == NULL)
{
return;
}
int pos = vscroll_control_->GetScrollPosWZ();
int mmin = 0, mmax = 0;
vscroll_control_->GetScrollRangeWZ(&mmin, &mmax);
if (pos < mmax)
{
pos += scroll_tick_move_;
vscroll_control_->SetScrollPosWZ(pos);
}
list_control_->SetBeginDrawIndex(pos);
}
void TreeController::ThumbScroll()
{
if(vscroll_control_ == NULL)
{
return;
}
int pos2 = vscroll_control_->GetScrollPosWZ();
int pos = pos2;
int mmin = 0, mmax = 0;
vscroll_control_->GetScrollRangeWZ(&mmin, &mmax);
pos = max(mmin, pos);
pos = min(mmax, pos);
if(pos != pos2)
{
vscroll_control_->SetScrollPosWZ(pos);
}
list_control_->SetBeginDrawIndex(pos);
}
void TreeController::resetScroll()
{
if (vscroll_control_ == NULL || list_control_ == NULL)
{
return;
}
int scroll_max_num = max(0, list_control_->GetListRowCnt() - list_control_->GetDrawRowCount());
int thumb_size = 100 / (scroll_max_num + 1);
thumb_size = max(10, thumb_size);
vscroll_control_->SetChangeSizeThumb(thumb_size);
vscroll_control_->SetScrollRangeWZ(0, scroll_max_num);
int begin_index = list_control_->GetBeginDrawIndex();
int new_draw_index = begin_index <= scroll_max_num ? begin_index : scroll_max_num;
list_control_->SetBeginDrawIndex(new_draw_index);
vscroll_control_->SetScrollPosWZ(new_draw_index);
}
void TreeController::update()
{
if (list_control_ != NULL && vscroll_control_ != NULL)
{
RECT area = list_control_->GetSizeRect();
BYTE wheel_msg = uiBase::GetMouseWheelStatus(&area);
switch (wheel_msg)
{
case MOUSE_WHEEL_UP: return UpScroll();
case MOUSE_WHEEL_DOWN: return DownScroll();
}
}
}
void TreeController::DeleteAllItem()
{
root_tree_.deleteAllItem();
list_control_->DeleteItemAll();
select_item_ = NULL;
if(vscroll_control_)
{
vscroll_control_->SetScrollRangeWZ(0, 0);
vscroll_control_->SetScrollPosWZ(0);
}
Reflush();
}
void TreeController::Release()
{
root_tree_.deleteAllItem();
}
void TreeController::set_scroll_tick_move_value( const int& scroll_tick_move )
{
scroll_tick_move_ = scroll_tick_move;
}
HTREEITEM TreeController::getOrigin( int origin_value )
{
for (int i = 0 ; i < (int)root_tree_.child_list_.size() ; ++i)
{
HTREEITEM item = root_tree_.child_list_[i]->OriginItem(origin_value);
if(item)
{
return item;
}
}
return NULL;
}
void TreeController::SetSellItem( HTREEITEM item )
{
if(select_item_)
select_item_->set_select(false);
select_item_ = item;
select_item_->set_select(true);
UpdateTree(select_item_);
}