462 lines
14 KiB
C++
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 )
|
|
{}
|
|
}; |