Files
2026-06-01 12:46:52 +02:00

462 lines
14 KiB
C++

#pragma once
//#include "KUIControl.h"
#include "KUIControlListItem.h"
#include <list>
//#include <vector>
#include <map>
using namespace std;
//---------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------
// 2010.03.17 bintitle
//
// : ListControl 을 구현.
//
// MFC의 구조와 유사하게 구현하려 노력했음.
// ListControl 을 포함하는 윈도우(여기선 KUIWnd)에 컨트롤에대한 이벤트 내용을 전달한다.
// ( PumpUpMessage()의 lparam 에 MSG_LISTCONTROL 메세지 구조체를 전달함. )
//
// ListControl은 이러한 구조를 가진다.
//
//----------------------ListControl Base--------------------
//| |
//| --------------------------------------------------- |
//| | HEADER _____________ ____________ | |
//| | | item_column1 | | item_column2 | | |
//| | ------------- ------------ | |
//| --------------------------------------------------- |
//| --------------------------------------------------- |
//| | ITEM_Base1 _____________ _____________ | |
//| | | item_column1 | | item_column2 | | |
//| | ------------- ------------- | |
//| --------------------------------------------------- |
//| --------------------------------------------------- |
//| | ITEM_Base2 _____________ _____________ | |
//| | | item_column1 | | item_column2 | | |
//| | ------------- ------------- | |
//| --------------------------------------------------- |
//| |
// ---------------------------------------------------------
//---------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------
//
// class KUIListItem
//
// ListControl의 개별 목록으로 삽입될 컨트롤.
// 리스트의 한줄(Row) 에 해당한다.
//
//---------------------------------------------------------------------------------------------
class KUIListItem : public KUIControl
{
protected:
// Column Control들의 아래에 깔릴 Base Control.
KUIControl * m_pBaseControl;
// Base Control 위에 올려질 Column Control 들.
std::list< KUIControl * > m_Columns;
bool m_bShow; // 보임, 숨김 여부.
public:
bool m_bExtendBaseCtrl; // Base Control의 확장여부.
bool m_bHalfExtend; // 절반 확장상태.
public:
//--------------------------------
// Contruct & Distruct
KUIListItem();
~KUIListItem();
void Release(); // 메모리 해제.
//--------------------------------
// 일반함수들
// 마우스 충돌검사.
bool Collision( int mouseX, int mouseY );
// column 구하기.
bool GetColumnIndex( int & out_columnIndex, int mouseX, int mouseY );
// Base Control 설정.
void SetBase( KUIControl * pBase ){
m_pBaseControl = pBase;
}
// Column Control 추가.
void AddColumn( KUIControl * pColumn );
// 높이 위치값 재조정.
void ReadjustPosition( int index, int gap );
// 높이 위치값 재조정.
void ReadjustPosition( int pushHeight );
// Item 보임, 숨김 처리.
void SetShowItem( bool bShow );
// Item 에 속하는 자식 컨트롤들의 보임, 숨김 처리.
void SetShowItemChild( bool bShow );
// Item내부의 Control 보임, 숨김 처리.(확장시에만 나와야하는 경우의 컨트롤들)
//void SetShowControl();
void SetShowControl( bool bShow );
//--------------------------------
// Getter
bool GetIsExtension(){ // Base Control의 확장여부.
return m_bExtendBaseCtrl;
}
bool GetIsHalfExtension(){ // 절반 확장상태.
return m_bHalfExtend;
}
// Base Control 의 높이값.
int GetBaseHeight();
// Base Control 반환.
KUIControl * GetBaseControl(){
return m_pBaseControl;
}
bool GetIsShow(){ return m_bShow; } // 보임, 숨김 여부.
bool GetControl( KUIControl *& out_pControl/*OUT*/, int column ); // Column Control 반환. 성공:true / 실패:false
bool GetControl( KUIControl *& out_pControl/*OUT*/, const char * strID ); // // Column Control 반환. 성공:true / 실패:false
//--------------------------------
// Setter
void SetHalfExtension( bool bFlag ){
m_bHalfExtend = bFlag;
}
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 해당 컨트롤의 타입을 정의.
// 아이템의 type, header or item.
enum ITEMTYPE
{
TYPE_NONE = 0,
TYPE_HEADER_Base,
TYPE_HEADER_Column,
TYPE_ITEM_Base,
TYPE_ITEM_Column,
};
// 아이템들이 확장상태.
enum ITEMEXTENDSTATE
{
ITEMEXTEND_NONE = 0, // 개별 확장 상태 다름.
ITEMEXTEND_ORIGINAL, // 전체 원본상태.
ITEMEXTEND_EXTEND, // 전체 확장상태.
};
// 각 아이템의 상태정보.
struct SItemState
{
bool bExtend; // 펼침여부.
bool bSelection;
int nRow;
SItemState() : bExtend(false), nRow(0), bSelection(false)
{}
SItemState( bool bEx, int _nRow, bool bS=false ) : bExtend(bEx), nRow(_nRow), bSelection(bS)
{}
};
//---------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------
//
// class KUIListControl
//
// 여러개의 리스트 목록을 관리하는 리스트 컨트롤.
// - ListItem 을 관리.
//
//---------------------------------------------------------------------------------------------
class KUIListControl : public KUIControl
{
protected:
// Parent Wnd.
KUIWnd * m_pParentWnd;
// ListControl Base.
string m_StrList;
KUIControl * m_ListControl;
KRect m_RectListControl;
// Header.
string m_StrBaseHeader;
vector< string > m_arrHeaderColumn;
KUIListItem * m_pHeader; // Header Item
// Item.
string m_StrBaseItem;
vector< string > m_arrItemColumn;
std::list< KUIListItem * > m_ListRows; // Item Rows
KRect m_SrcRect; // 원본 크기.
// 최종적으로 보이는 인덱스.
vector< int > m_arrShowIndex;
int m_nListCount; // List 개수.
int m_nListDataCountMAX; // 리스트컨트롤을 이용할 Data의 총개수. (화면에 보이는 아이템 개수가 아님)
int m_Gap; // 칸사이 간격.
int m_nMagnifycation; // 아이템이 확장되는경우, 확장되는 배율.
int m_nSelectedIndex; // 선택된 아이템 인덱스. 기본 -1
bool m_bExtendControl; // 확장가능 리스트인가? ( 리스트의 아이템에 해당하는 컨트롤의 크기가 변하는가 여부 )
bool m_bExtendAll; // 전체확장상태.
int m_nListControlIndex; // nui에서 리스트를 여러개 쓰는 경우 구분할 index;
//
// Mouse Event.
map< DWORD, DWORD > m_Map_MouseEvent;
public:
// 최대 리스트로 들어올 수 있는 개수만큼 상태정보를 가진다.
vector< SItemState > m_ArrItemState;
vector< SItemState > m_OldArrItemState;
public:
void RefreshItemState( int n );
//--------------------------------
// Contruct & Distruct
// pParent : 부모Wnd, strList : ListControl의 전체 Base, strHeader : Header, strItem : 행, listCount : 행개수, gap : 행사이 간격
// ** 해더가 존재하지 않는 리스트는 strHeader="" 로 값을 지정해야한다.
KUIListControl::KUIListControl( KUIWnd * pParent, char * strList, char * strHeader, char * strItem,
int listCount, bool bExtendControl=false/*=false*/, int gap=0/*=0*/, int magnifycation=1/*=1*/);
~KUIListControl();
void Release(); // 메모리 해제.
//--------------------------------
// Override
// 1. 아이템과 아이템안에 들어갈 컬럼들을 뽑아내어
// 아이템생성시 인자로 넘겨주고, 생성한 아이템은
// AddItem으로 추가한다.
// 2. 해더 동일
//virtual bool InitControls();
virtual void PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam );
virtual DWORD OnMouseMessage( DWORD dwMessage, int x, int y );
//--------------------------------
// 일반함수들
// ** 컬럼명 추가 후 반드시 호출할것.
// string을 이용해 control을 가져와 원하는 개수만큼 복사하여 리스트를 형성한다.
void Create();
void AddStringHeaderColumn( char * str ); // Header Column 명 추가.
void AddStringItemColumn( char * str ); // Item Column 명 추가.
// Header Item 설정.
void SetHeader( KUIListItem * pHeader );
// 생성한 ListItem을 자식리스트에 넣어 관리한다.
void AddItem( KUIListItem * p );
// Item 을 생성하고 List에 추가한다.
void AddItem();
// 아이템을 생성하여 반환한다.
//KUIListItem * CreateItem( int index );
KUIListItem * CreateItem();
// 아이템 제거.
void DeleteItem( int index );
// ** 폐기된함수.
// 스크롤 다운, 최상위 아이템을 제거.
void ScrollDown();
// ** 폐기된함수.
// 스크롤 업, 최하위 아이템을 제거.
void ScrollUp();
// 마우스 좌표에 따른 선택정보 반환.
// * type - header OR baseItem OR column
// * index - 아이템경우 index.
bool GetSeletionInfo( ITEMTYPE & out_type, int & out_index, int & out_columnIndex, int mouseX, int mouseY );
// 스크롤 처리. nValue:스크롤의 움직임값.
void UpdateScrollBar( int nOldPos, int nCrrPos );
// List 상태 변경.
void UpdateListItem();
void SetResizeWidth( KUIControl * pControl, float nMagnifycation ); // 배율만큼 세로 사이즈 조정
void SetResizeWidth( unsigned int type, int nRow, int nCol, float nMagnifycation, int scrollPos ); // 배율만큼 세로 사이즈 조정
void ResizeSourceWidth( KUIControl * pControl, float nMagnifycation ); // 원본사이즈로 되돌림.
void ResizeSourceWidth( unsigned int type, int nRow, int nCol, float nMagnifycation ); // 원본사이즈로 되돌림.
void ResizeSourceHeight( int nRow ); // 원본사이즈로 되돌림.
void ReadjustPosition( int index, int pushHeight ); // index 아이템 이하 위치재조정.
// 해당 아이템을 확장 or 축소(원본크기) 한다.
//void SetResize( int nRow, bool bExtend, int nMagnifycation );
void SetResize( int nRow, int nItemStateIndex, int nMagnifycation );
// 전체 아이템 확장 or 축소 한다.
void SetResizeAll( bool bExtend );
// ListControl에서 보이는 Item들중 최하단 아이템을 반환한다.
KUIListItem * FindEndItem();
// 아이템 상태배열에 선택활성화 여부 설정, 활성화는 한번에 하나만 되므로 나머지 아이템 활성화는 비활성화 한다.
void SetSelectItem( int nScroll, int nRow );
// 리스트컨트롤 전체 보임,숨김 처리.( 내부 아이템들까지 영향. )
void SetShowList( bool bShow );
// 보이는 최하단아이템의 확장상태가 반겹침인 경우에서, 확장상태로 전환.
void SetEndItemExtend();
//--------------------------------
// Getter
const KUIControl * GetListControl(){
return m_ListControl;
}
bool GetControl( KUIControl *& out_pControl/*OUT*/, ITEMTYPE type, int row, int column ); // 인자에 해당하는 Control 을 반환.
bool GetControl( KUIControl *& out_pControl/*OUT*/, ITEMTYPE type, int row, const char * strID ); // 인자에 해당하는 Control 을 반환.
int GetListConutMAX(){
return m_nListCount; // List 최대개수.
}
int GetListConut(){
return m_ListRows.size(); // 현재 List 개수.
}
int GetListDataCountMAX(){ // 리스트컨트롤을 이용할 Data의 총개수. (화면에 보이는 아이템 개수가 아님)
return m_nListDataCountMAX;
}
// 최대 리스트로 들어올 수 있는 개수만큼 상태정보를 가진다.
// 해당 아이템의 확장여부.
bool GetIsExtend( int i ){
return m_ArrItemState.size() > i ? m_ArrItemState[ i ].bExtend : false;
}
// 선택 활성화 여부.
bool GetIsSelection( int i ){
return m_ArrItemState.size() > i ? m_ArrItemState[ i ].bSelection : false;
}
int GetItemIndex( KUIListItem * pItem ); // 아이템이 리스트에서 몇번째 인덱스인지 반환, 찾지못하면 -1 반환.
int GetIndexOfVisibleEndItem(); // 보이는 마지막 아이템의 인덱스 반환.
int GetSelectedIndex(){ // 선택된 아이템 인덱스. 기본 -1
return m_nSelectedIndex;
}
void ResetSelectedIndex(){ // 선택된 아이템 무효화. -1
m_nSelectedIndex = -1;
}
// 확장된 아이템 개수.
int GetExtendItemCount();
KUIListItem * GetItem( int row ); // KUIListItem 반환.
KUIListItem * GetFrontItem(); // Front KUIListItem 반환.
KUIListItem * GetEndItem(); // End KUIListItem 반환.
// 전체 아이템의 확장 비확장여부. 확장 true, 비확장 false.
int GetIsAllExtend();
//--------------------------------
// Setter
void SetListControlIndex( int index ){
m_nListControlIndex = index;
}
// 리스트정보 최종 업데이트.
void RefreshList( int nScroll );
};
// 윈도우의 PumpMessage() 함수의 DWORD 형으로 보내진다. 따라서 MAX 32비트까지됨. (현재 20비트사용).
// ListControl을 포함하고 있는 윈도우에 보낼 메세지 구조체.
// ListControl에서 발생한 이벤트.
struct MSG_LISTCONTROL
{
DWORD type : 4;
DWORD itemIndex : 12; // 4096 행까지 지원.
DWORD columnIndex : 4;
DWORD listControlIndex : 4; // 리스트컨트롤이 여러개 있는경우 구분할 ID. 15개.
DWORD ex : 8;
MSG_LISTCONTROL( DWORD _type, DWORD _itemIndex, DWORD _columnIndex, DWORD _listcontrolIndex )
: type( _type ), itemIndex( _itemIndex ), columnIndex( _columnIndex ), listControlIndex( _listcontrolIndex )
{}
};