#pragma once //#include "KUIControl.h" #include "KUIControlListItem.h" #include //#include #include 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 ) {} };