reman3/Rayman_X/cpa/tempgrp/ITF/CPAdLBox.cpp

1161 lines
29 KiB
C++

/*=========================================================================
*
* CPAdList.cpp : Lists - Implementation file
*
*
* Version 1.0
* Creation date
* Revision date
*
* Shaitan
*=======================================================================*/
#include "stdafx.h"
#ifdef ACTIVE_EDITOR
#include "acp_base.h"
#include "ITF/CPAdLbox.hpp"
#include "ITF/CPAdList.hpp"
#include "ITF/CPABaseO.hpp"
#include "ITF/CPAEditB.hpp"
#include "IncTUT.h"
#define C_uiHeaderEntry 0
#define C_uiAutoAdjustEntry 1
#define C_uiDrawStateEntry 2
#define C_uiDrawIconEntry 3
#define C_uiDrawTypeEntry 4
#define C_uiDrawOwnerEntry 5
#define C_uiDrawInfoEntry 6
#define C_uiSortAlphaEntry 7
#define C_uiSortCommonEntry 8
#define C_uiSortEditedEntry 9
#define C_uiDisplayAllEntry 10
#define C_uiCustomEntryStart 20
BOOL g_bIsAdjusting = FALSE;
BOOL g_bIsBuildingList = FALSE;
//#################################################################################
// Sorted ListBox
//#################################################################################
BEGIN_MESSAGE_MAP(CPA_SortedListBox, CListCtrl)
ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBeginDrag)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClicked)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDBLCLK()
ON_WM_RBUTTONDOWN()
ON_WM_KEYDOWN()
ON_WM_KEYUP()
ON_WM_DRAWITEM()
ON_WM_SIZE()
END_MESSAGE_MAP()
/*----------------------------------------
Constructor
----------------------------------------*/
CPA_SortedListBox::CPA_SortedListBox (void)
{
// init parameters
m_pOwnerEditor = NULL;
m_pParentDialog = NULL;
m_pSortedList = NULL;
m_pIconList = NULL;
m_pStateList = NULL;
// init styles
m_eCurrentOrder = E_lo_Alpha;
m_bDisplayGray = TRUE;
m_lDrawStyle = C_lDrawNothing;
m_lNbColumns = 0;
m_bHeaders = TRUE;
m_bAdjustSize = TRUE;
// init permissions
m_bCanChangeOrder = TRUE;
m_bCanChangeDisplay = TRUE;
m_bCanChangeDrawStyle = TRUE;
m_bCanChangeHeaders = TRUE;
m_bCanDragDrop = TRUE;
// init state
m_bIsSelecting = FALSE;
m_iDraggedItem = -1;
m_iTargetItem = -1;
}
/*----------------------------------------
Set list
----------------------------------------*/
void CPA_SortedListBox::SetSortedList (CPA_BaseObjectList *pSortedList)
{
m_pSortedList = pSortedList;
fn_vReinitListObjects();
}
/*----------------------------------------
Set icons
----------------------------------------*/
void CPA_SortedListBox::SetIconList (CImageList *pIconList, BOOL bUpdate)
{
// user icon list
m_pIconList = pIconList;
SetImageList(pIconList, LVSIL_SMALL);
if (bUpdate)
fn_vReinitListObjects();
}
/*----------------------------------------
Set icons
----------------------------------------*/
void CPA_SortedListBox::SetStateList (CImageList *pStateList, BOOL bUpdate)
{
// user icon list
m_pStateList = pStateList;
SetImageList(pStateList, LVSIL_STATE);
if (bUpdate)
fn_vReinitListObjects();
}
/*----------------------------------------
Set order
----------------------------------------*/
void CPA_SortedListBox::SetOrder (tdeListOrder eNewOrder, BOOL bCanChange, BOOL bUpdateList)
{
// update order
m_bCanChangeOrder = bCanChange;
m_eCurrentOrder = eNewOrder;
if (!bUpdateList)
return;
// update list
if (m_pParentDialog)
{
m_pParentDialog->GetCurrentList()->SetOrder(eNewOrder);
m_pParentDialog->fn_vInitListObjects();
}
else
fn_vReinitListObjects();
}
/*----------------------------------------
Set column headers
----------------------------------------*/
void CPA_SortedListBox::SetColumnHeaders (BOOL bHeaders, BOOL bCanChange, BOOL bUpdateList)
{
if (bHeaders)
ModifyStyle(LVS_NOCOLUMNHEADER, 0);
else
ModifyStyle(0, LVS_NOCOLUMNHEADER);
m_bHeaders = bHeaders;
}
/*----------------------------------------
Set draw style
----------------------------------------*/
void CPA_SortedListBox::SetDrawStyle (long lNewStyle, BOOL bCanChange, BOOL bUpdateList)
{
int iInd;
// update flag
m_bCanChangeDrawStyle = bCanChange;
// update style
if (lNewStyle != m_lDrawStyle)
{
// delete old colums
for (iInd = 0; iInd < m_lNbColumns; iInd++)
DeleteColumn(m_lNbColumns - iInd - 1);
// update draw style
m_lDrawStyle = lNewStyle;
// init new columns
iInd = 0;
// state icon
if ((m_lDrawStyle & C_lDrawState)&&(m_pStateList))
InsertColumn(iInd++, "v", LVCFMT_LEFT, -1, -1);
// item icon
if ((m_lDrawStyle & C_lDrawIcon)&&(m_pIconList))
InsertColumn(iInd++, "v", LVCFMT_LEFT, -1, -1);
// name
if (m_lDrawStyle & C_lDrawName)
InsertColumn(iInd++, "v Name", LVCFMT_LEFT, -1, -1);
// type
if (m_lDrawStyle & C_lDrawType)
InsertColumn(iInd++, "v Type", LVCFMT_LEFT, -1, 0);
// owner
if (m_lDrawStyle & C_lDrawOwner)
InsertColumn(iInd++, "v Owner", LVCFMT_LEFT, -1, 1);
// info
if (m_lDrawStyle & C_lDrawInfo)
InsertColumn(iInd++, "Info", LVCFMT_LEFT, -1, 2);
// init nb of columns
m_lNbColumns = iInd;
// init columns size
fn_vReinitColumnWidth();
}
// update list
if (m_pParentDialog)
m_pParentDialog->GetCurrentList()->SetStyle(lNewStyle);
if (!bUpdateList)
return;
// update list
if (m_pParentDialog)
m_pParentDialog->fn_vInitListObjects();
else
fn_vReinitListObjects();
}
/*----------------------------------------
Set draw style
----------------------------------------*/
void CPA_SortedListBox::SetDisplayGray (BOOL bNewDisplay, BOOL bCanChange, BOOL bUpdateList)
{
// update style
m_bCanChangeDisplay = bCanChange;
m_bDisplayGray = bNewDisplay;
if (!bUpdateList)
return;
// update list
if (m_pParentDialog)
m_pParentDialog->fn_vInitListObjects();
else
fn_vReinitListObjects();
}
/*----------------------------------------
Columns
----------------------------------------*/
void CPA_SortedListBox::fn_vReinitColumnWidth (void)
{
RECT rWindow;
long lSize, lWidth;
long lNbColumns = m_lNbColumns;
long lIconSize = 0;
int iInd = 0;
// state column
if ((m_lDrawStyle & C_lDrawState)&&(m_pStateList))
{
lIconSize += 20;
SetColumnWidth(iInd++, 20);
}
// icon column
if ((m_lDrawStyle & C_lDrawIcon)&&(m_pIconList))
{
lIconSize += 20;
SetColumnWidth(iInd++, 20);
}
// init columns size
GetWindowRect(&rWindow);
lNbColumns = m_lNbColumns - iInd;
// get minimal width
lWidth = rWindow.right - rWindow.left - lIconSize - 2*lNbColumns - 5;
if (GetCountPerPage() < GetItemCount())
lWidth = lWidth - 15;
// adust colums size
lSize = (m_lNbColumns > 0) ? lWidth / lNbColumns : 0;
while (iInd < m_lNbColumns)
SetColumnWidth(iInd++, lSize);
}
/*----------------------------------------
List
----------------------------------------*/
void CPA_SortedListBox::fn_vReinitListObjects (void)
{
CPA_BaseObject *pElem;
BOOL bRes;
long lIndex, lRealIndex;
int iPos = 0;
// RAZ
DeleteAllItems();
if (!m_pSortedList)
return;
// update list in case of changes
// m_pSortedList->fn_vUpdateSortedList();
// for size
g_bIsBuildingList = TRUE;
// look for instances of selected descriptor
for (lIndex = 0, lRealIndex = 0; lIndex < m_pSortedList->GetCount(); lIndex++)
{
pElem = m_pSortedList->GetObjectWithIndex(lRealIndex, GetOrder());
// test function
if (m_pParentDialog)
bRes = m_pParentDialog->fn_bCanInsertElement(pElem);
else
bRes = ((pElem->fn_bIsAvailable())||(m_bDisplayGray));
if ((bRes)&&(pElem->fn_bIsValid()))
{
// insert item
iPos = InsertNewItem(iPos, pElem) + 1;
lRealIndex++;
}
else if (GetOrder() == E_lo_Common)
m_pSortedList->fn_bChangeObjectOrder(pElem, m_pSortedList->GetCount() - 1, E_lo_Common);
else
lRealIndex++;
}
// for size
g_bIsBuildingList = FALSE;
}
/*----------------------------------------
Insertion
----------------------------------------*/
int CPA_SortedListBox::InsertNewItem (int iNumItem, CPA_BaseObject *pElem)
{
int iNumIcon, iPos;
// get icon
iNumIcon = GetCorrespondingIcon(pElem);
// insert item and set data
iPos = InsertItem(iNumItem, pElem->GetNameToDraw(), iNumIcon);
SetItemData(iPos, (DWORD) pElem);
return iPos;
}
/*----------------------------------------
Selection
----------------------------------------*/
void CPA_SortedListBox::SetSelectedItem (int iNumItem)
{
int iInd;
// set flag
m_bIsSelecting = TRUE;
// select item
if (iNumItem != -1)
{
SetItemState(iNumItem, LVIS_SELECTED, LVIS_SELECTED);
EnsureVisible(iNumItem, TRUE);
}
// unselect item
else
{
iInd = GetNextItem(-1, LVNI_SELECTED);
if (iInd != -1)
SetItemState(iInd, 0, LVIS_SELECTED);
}
m_iSelectedItem = iNumItem;
// update flag
m_bIsSelecting = FALSE;
}
/*----------------------------------------
Selection
----------------------------------------*/
int CPA_SortedListBox::GetSelectedItem (void)
{
return GetNextItem(-1, LVNI_SELECTED);
}
/*----------------------------------------
Popup Menu
----------------------------------------*/
void CPA_SortedListBox::OnRButtonDown(UINT nFlags, CPoint point)
{
BOOL bEntry = FALSE;
BOOL bCustom = FALSE;
ClientToScreen( &point );
// create popup menu
CMenu oMenu;
oMenu.CreatePopupMenu();
// Headers
if (m_bCanChangeHeaders)
{
oMenu.AppendMenu( MF_STRING | ((m_bHeaders)?MF_CHECKED:MF_UNCHECKED), C_uiHeaderEntry, "Headers");
bEntry = TRUE;
}
// Auto Size
if ((m_lNbColumns != 2) || (m_bCanChangeDrawStyle))
{
oMenu.AppendMenu( MF_STRING | ((m_bAdjustSize)?MF_CHECKED:MF_UNCHECKED), C_uiAutoAdjustEntry, "Adjust Size");
bEntry = TRUE;
}
// Draw Style
if (m_bCanChangeDrawStyle)
{
// separator
if (bEntry)
oMenu.AppendMenu(MF_SEPARATOR);
// entries to change draw style
if (m_pStateList)
oMenu.AppendMenu( MF_STRING | ((m_lDrawStyle & C_lDrawState)?MF_CHECKED:MF_UNCHECKED), C_uiDrawStateEntry, "State");
if (m_pIconList)
oMenu.AppendMenu( MF_STRING | ((m_lDrawStyle & C_lDrawIcon)?MF_CHECKED:MF_UNCHECKED), C_uiDrawIconEntry, "Icon");
oMenu.AppendMenu( MF_STRING | ((m_lDrawStyle & C_lDrawType)?MF_CHECKED:MF_UNCHECKED), C_uiDrawTypeEntry, "Type");
oMenu.AppendMenu( MF_STRING | ((m_lDrawStyle & C_lDrawOwner)?MF_CHECKED:MF_UNCHECKED), C_uiDrawOwnerEntry, "Owner");
oMenu.AppendMenu( MF_STRING | ((m_lDrawStyle & C_lDrawInfo)?MF_CHECKED:MF_UNCHECKED), C_uiDrawInfoEntry, "Info");
bEntry = TRUE;
}
// Order
if (m_bCanChangeOrder)
{
// separator
if (bEntry)
oMenu.AppendMenu(MF_SEPARATOR);
// entries to change display order
oMenu.AppendMenu( MF_STRING | ((m_eCurrentOrder == E_lo_Alpha)?MF_CHECKED:MF_UNCHECKED), C_uiSortAlphaEntry, "Alphabetic");
oMenu.AppendMenu( MF_STRING | ((m_eCurrentOrder == E_lo_Common)?MF_CHECKED:MF_UNCHECKED), C_uiSortCommonEntry, "Common");
oMenu.AppendMenu( MF_STRING | ((m_eCurrentOrder == E_lo_Edited)?MF_CHECKED:MF_UNCHECKED), C_uiSortEditedEntry, "Edited");
bEntry = TRUE;
}
// Invalid Objects
if (m_bCanChangeDisplay)
{
// separator
if (bEntry)
oMenu.AppendMenu(MF_SEPARATOR);
// entry to change display mode
oMenu.AppendMenu( MF_STRING | ((m_bDisplayGray)?MF_CHECKED:MF_UNCHECKED), C_uiDisplayAllEntry, "Display All");
}
// separator
if (bEntry)
oMenu.AppendMenu(MF_SEPARATOR);
// Custom Entries
if (m_pParentDialog)
bCustom = m_pOwnerEditor->fn_bAddEntriesToListPopup(m_pParentDialog, m_pParentDialog->GetCurrentType(), &oMenu, C_uiCustomEntryStart);
else
bCustom = m_pOwnerEditor->fn_bAddEntriesToListPopup(this, m_pSortedList, &oMenu, C_uiCustomEntryStart);
// no custom entries => remove separator
if (!bCustom)
oMenu.DeleteMenu(oMenu.GetMenuItemCount() - 1, MF_BYPOSITION);
// display & track popup menu
if ((bEntry)||(bCustom))
{
TUT_M_vGetTutDll ();
TUT_M_vRegisterMenu (this -> m_hWnd , oMenu . m_hMenu , point . x , point . y);
oMenu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
// destroy menus
oMenu.DestroyMenu();
}
/*----------------------------------------
Answer to Popup
----------------------------------------*/
BOOL CPA_SortedListBox::OnCommand( WPARAM wParam, LPARAM lParam )
{
// command from a menu ?
if (HIWORD(wParam) == 0)
{
// ID of menu item ?
switch (LOWORD(wParam))
{
// column headers
case C_uiHeaderEntry:
if (m_bHeaders)
SetColumnHeaders(FALSE);
else
SetColumnHeaders(TRUE);
break;
case C_uiAutoAdjustEntry:
SetAdjustSize(!m_bAdjustSize);
break;
// draw style
case C_uiDrawStateEntry:
if (m_lDrawStyle & C_lDrawState)
SetDrawStyle(m_lDrawStyle - C_lDrawState);
else
SetDrawStyle(m_lDrawStyle + C_lDrawState);
break;
case C_uiDrawIconEntry:
if (m_lDrawStyle & C_lDrawIcon)
SetDrawStyle(m_lDrawStyle - C_lDrawIcon);
else
SetDrawStyle(m_lDrawStyle + C_lDrawIcon);
break;
case C_uiDrawTypeEntry:
if (m_lDrawStyle & C_lDrawType)
SetDrawStyle(m_lDrawStyle - C_lDrawType);
else
SetDrawStyle(m_lDrawStyle + C_lDrawType);
break;
case C_uiDrawOwnerEntry:
if (m_lDrawStyle & C_lDrawOwner)
SetDrawStyle(m_lDrawStyle - C_lDrawOwner);
else
SetDrawStyle(m_lDrawStyle + C_lDrawOwner);
break;
case C_uiDrawInfoEntry:
if (m_lDrawStyle & C_lDrawInfo)
SetDrawStyle(m_lDrawStyle - C_lDrawInfo);
else
SetDrawStyle(m_lDrawStyle + C_lDrawInfo);
break;
// list order
case C_uiSortAlphaEntry:
SetOrder(E_lo_Alpha);
break;
case C_uiSortCommonEntry:
SetOrder(E_lo_Common);
break;
case C_uiSortEditedEntry:
SetOrder(E_lo_Edited);
break;
// list order
case C_uiDisplayAllEntry:
SetDisplayGray(!m_bDisplayGray);
break;
}
// custom entries
if (LOWORD(wParam) >= C_uiCustomEntryStart)
{
if (m_pParentDialog)
m_pOwnerEditor->fn_vOnCommandInListPopup(m_pParentDialog, m_pParentDialog->GetCurrentType(), LOWORD(wParam) - C_uiCustomEntryStart);
else
m_pOwnerEditor->fn_vOnCommandInListPopup(this, m_pSortedList, LOWORD(wParam) - C_uiCustomEntryStart);
}
}
return CListCtrl::OnCommand(wParam, lParam);
}
/*----------------------------------------
Load
----------------------------------------*/
void CPA_SortedListBox::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CPA_BaseObject *pElem = NULL;
BOOL bRedraw;
BOOL bRes = FALSE;
UINT pFlag;
int iSelect;
// get selected element
iSelect = HitTest(point, &pFlag);
if (iSelect != -1)
pElem = (CPA_BaseObject *) GetItemData(iSelect);
if (m_pParentDialog)
bRes = m_pOwnerEditor->fn_bOnDblClkListObjects(m_pParentDialog, m_pParentDialog->GetCurrentType(), pElem);
if ((bRes)||(!m_bDisplayGray))
{
CListCtrl::OnLButtonDblClk(nFlags, point);
return;
}
// non available object => load
if ((pElem)&&(!pElem->fn_bIsAvailable()))
{
bRedraw = pElem->GetEditor()->fn_bLoadBaseObject(pElem);
if (bRedraw)
SetSelectedItem(iSelect);
}
else
CListCtrl::OnLButtonDblClk(nFlags, point);
}
/*----------------------------------------
Init Drag&Drop
----------------------------------------*/
void CPA_SortedListBox::OnBeginDrag (NMHDR* pNMHDR, LRESULT* pResult)
{
LPNM_LISTVIEW pNMListView = (LPNM_LISTVIEW)pNMHDR;
if ((m_eCurrentOrder != E_lo_Edited)||(!m_bCanDragDrop))
m_iDraggedItem = -1;
else
m_iDraggedItem = pNMListView->iItem;
}
/*----------------------------------------
End Drag&Drop
----------------------------------------*/
void CPA_SortedListBox::OnLButtonUp (UINT nFlags, CPoint point)
{
CPA_BaseObject *pObjectToDrag;
CPA_BaseObject *pTarget;
int iOldIndex, iNewIndex;
// no dragged item => no action
if (m_iDraggedItem == -1)
{
CListCtrl::OnLButtonUp (nFlags, point);
return;
}
// find target
if ((m_iTargetItem > -1)&&(m_iTargetItem < GetItemCount()))
{
// find object current index
pObjectToDrag = (CPA_BaseObject *) GetItemData(m_iDraggedItem);
iOldIndex = m_pSortedList->GetIndexOfObject(pObjectToDrag, E_lo_Edited);
// find target index
pTarget = (CPA_BaseObject *) GetItemData(m_iTargetItem);
iNewIndex = m_pSortedList->GetIndexOfObject(pTarget, E_lo_Edited);
// update order
m_pSortedList->fn_vChangeObjectOrder(iOldIndex, iNewIndex, E_lo_Edited);
}
// update state
SetItemState(m_iTargetItem, 0, TVIS_DROPHILITED);
m_iDraggedItem = -1;
m_iTargetItem = -1;
// update list
if (m_pParentDialog)
m_pParentDialog->fn_vInitListObjects();
else
fn_vReinitListObjects();
}
/*----------------------------------------
Drag&Drop
----------------------------------------*/
void CPA_SortedListBox::OnMouseMove (UINT nFlags, CPoint point)
{
int iTarget;
UINT pFlag;
if (m_iDraggedItem == -1)
{
CListCtrl::OnMouseMove (nFlags, point);
return;
}
// find target
iTarget = HitTest(point, &pFlag);
if (iTarget != m_iTargetItem)
{
// update old target
if (m_iTargetItem)
SetItemState(m_iTargetItem, 0, TVIS_DROPHILITED);
// update new target
m_iTargetItem = iTarget;
if (m_iTargetItem)
SetItemState(m_iTargetItem, TVIS_DROPHILITED, TVIS_DROPHILITED);
}
}
/*----------------------------------------
KeyDown
----------------------------------------*/
void CPA_SortedListBox::OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (m_pParentDialog && !m_pParentDialog->fn_bOnKeyDownInControl(nChar, nRepCnt, nFlags))
CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
else
fn_vOnKeyDown(nChar, nRepCnt, nFlags);
}
/*----------------------------------------
KeyUp
----------------------------------------*/
void CPA_SortedListBox::OnKeyUp (UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (m_pParentDialog && !m_pParentDialog->fn_bOnKeyUpInControl(nChar, nRepCnt, nFlags))
CListCtrl::OnKeyUp(nChar, nRepCnt, nFlags);
}
/*----------------------------------------
GetIndex
----------------------------------------*/
int CPA_SortedListBox::GetCorrespondingIndex (DWORD pElem)
{
DWORD pData;
int iIndex;
for (iIndex = 0; iIndex < GetItemCount(); iIndex++)
{
pData = GetItemData(iIndex);
if (pData == pElem)
return iIndex;
}
return -1;
}
/*----------------------------------------
Get Icon
----------------------------------------*/
int CPA_SortedListBox::GetCorrespondingIcon (CPA_BaseObject *pObject)
{
if (m_pParentDialog)
return m_pOwnerEditor->GetIconForListItem(m_pParentDialog, m_pParentDialog->GetCurrentType(), pObject);
else
return m_pOwnerEditor->GetIconForListItem(this, m_pSortedList, pObject);
}
/*----------------------------------------
Get State
----------------------------------------*/
int CPA_SortedListBox::GetCorrespondingState (CPA_BaseObject *pObject)
{
if (m_pParentDialog)
return m_pOwnerEditor->GetStateForListItem(m_pParentDialog, m_pParentDialog->GetCurrentType(), pObject);
else
return m_pOwnerEditor->GetStateForListItem(this, m_pSortedList, pObject);
}
/*----------------------------------------
Get Colors
----------------------------------------*/
BOOL CPA_SortedListBox::GetCorrespondingColors (CPA_BaseObject *pObject, COLORREF *pRectColor, COLORREF *pTextColor)
{
if (m_pParentDialog)
return m_pOwnerEditor->GetColorsForListItem(m_pParentDialog, m_pParentDialog->GetCurrentType(),
pObject, pRectColor, pTextColor);
else
return m_pOwnerEditor->GetColorsForListItem(this, m_pSortedList, pObject, pRectColor, pTextColor);
}
/*----------------------------------------
Get Info
----------------------------------------*/
CString CPA_SortedListBox::GetCorrespondingInfo (CPA_BaseObject *pObject)
{
if (m_pParentDialog)
return m_pOwnerEditor->GetInfoForListItem(m_pParentDialog, m_pParentDialog->GetCurrentType(), pObject);
else
return m_pOwnerEditor->GetInfoForListItem(this, m_pSortedList, pObject);
}
/*----------------------------------------
Owner Draw List
----------------------------------------*/
void CPA_SortedListBox::SetOwnerDrawStyle (BOOL bOwnerDraw)
{
if (bOwnerDraw)
ModifyStyle(0, LVS_OWNERDRAWFIXED);
else
ModifyStyle(LVS_OWNERDRAWFIXED, 0);
}
/*----------------------------------------
Adjust colums width
----------------------------------------*/
void CPA_SortedListBox::SetAdjustSize (BOOL bAdjust)
{
m_bAdjustSize = bAdjust;
if (m_bAdjustSize)
{
fn_vReinitColumnWidth();
fn_vReinitListObjects();
SetSelectedItem(m_iSelectedItem);
}
}
/*----------------------------------------
Adjust colums width when size changes
----------------------------------------*/
void CPA_SortedListBox::OnSize (UINT nType, int cx, int cy)
{
if (!g_bIsBuildingList)
{
if ((m_bAdjustSize)&&(!g_bIsAdjusting))
{
g_bIsAdjusting = TRUE;
fn_vReinitColumnWidth();
fn_vReinitListObjects();
SetSelectedItem(m_iSelectedItem);
g_bIsAdjusting = FALSE;
}
else
CListCtrl::OnSize(nType, cx, cy);
}
}
/*----------------------------------------
Disable Icon
----------------------------------------*/
void CPA_SortedListBox::fn_vDisableIcon (CDC *pDC, POINT pt, COLORREF cRectColor)
{
int i, j;
for (i = 0; i < 17; i+=2)
{
for (j = 0; j < 17 ; j+=2)
{
pDC->SetPixelV(pt.x + i, pt.y + j, cRectColor);
}
}
}
/*----------------------------------------
Draw Item
----------------------------------------*/
void CPA_SortedListBox::DrawItem (LPDRAWITEMSTRUCT lpDIS)
{
CPA_BaseObject *pElem;
COLORREF cTextColor;
COLORREF cRectColor;
CString csInfo;
POINT pt;
RECT rcItem;
BOOL bRes;
CDC *pDC;
int iNumIcon, iState, iInd = 0;
// get element
pElem = (CPA_BaseObject *) GetItemData(lpDIS->itemID);
if (!pElem)
return;
// get icon
if ((m_pIconList)&&(m_lDrawStyle & C_lDrawIcon))
iNumIcon = GetCorrespondingIcon(pElem);
// get state
if ((m_pStateList)&&(m_lDrawStyle & C_lDrawState))
iState = GetCorrespondingState(pElem);
// get colors
bRes = GetCorrespondingColors(pElem, &cRectColor, &cTextColor);
if (!bRes)
{
if (lpDIS->itemState & ODS_SELECTED)
{
cRectColor = RGB (0, 0, 254);
cTextColor = (pElem->fn_bIsAvailable()) ? RGB(254, 254, 254) : RGB(126, 126, 126);
}
else if ((int)lpDIS->itemID == m_iTargetItem)
{
cRectColor = RGB (0, 0, 0);
cTextColor = (pElem->fn_bIsAvailable()) ? RGB(254, 254, 254) : RGB(126, 126, 126);
}
else
{
cRectColor = RGB (254, 254, 254);
cTextColor = (pElem->fn_bIsAvailable()) ? RGB(0, 0, 0) : RGB(126, 126, 126);
}
}
// drawing parameters
pDC = CDC::FromHandle(lpDIS->hDC);
pt.x = lpDIS->rcItem.left;
pt.y = lpDIS->rcItem.top;
// draw background
pDC->FillSolidRect(&lpDIS->rcItem, cRectColor);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(cTextColor);
// if necessary, draw state icon
if ((m_pStateList)&&(m_lDrawStyle & C_lDrawState))
{
m_pStateList->SetBkColor(cRectColor);
m_pStateList->Draw(pDC, iState, pt, ILD_NORMAL);
if (!pElem->fn_bIsAvailable())
fn_vDisableIcon(pDC, pt, cRectColor);
pt.x += 20;
iInd++;
}
// draw icon
if ((m_pIconList)&&(m_lDrawStyle & C_lDrawIcon))
{
m_pIconList->SetBkColor(cRectColor);
m_pIconList->Draw(pDC, iNumIcon, pt, ILD_NORMAL);
if (!pElem->fn_bIsAvailable())
fn_vDisableIcon(pDC, pt, cRectColor);
pt.x += 20;
iInd++;
}
// draw name
rcItem = lpDIS->rcItem;
rcItem.left = pt.x;
rcItem.right = rcItem.left + GetColumnWidth(iInd++) - 5;
pDC->DrawText(pElem->GetNameToDraw(), &rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
// draw type
if (m_lDrawStyle & C_lDrawType)
{
rcItem.left = rcItem.right + 5;
rcItem.right = rcItem.left + GetColumnWidth(iInd++) - 5;
pDC->DrawText(pElem->GetTypeToDraw(), &rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
}
// owner
if (m_lDrawStyle & C_lDrawOwner)
{
rcItem.left = rcItem.right + 5;
rcItem.right = rcItem.left + GetColumnWidth(iInd++) - 5;
pDC->DrawText(pElem->GetOwnerToDraw(), &rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
}
// info
if (m_lDrawStyle & C_lDrawInfo)
{
rcItem.left = rcItem.right + 5;
rcItem.right = rcItem.left + GetColumnWidth(iInd++) - 5;
csInfo = GetCorrespondingInfo(pElem);
pDC->DrawText(csInfo, &rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
}
}
/*----------------------------------------
Update order when column is clicked
----------------------------------------*/
void CPA_SortedListBox::OnColumnClicked (NMHDR* pNMHDR, LRESULT* pResult)
{
LPNM_LISTVIEW pNMListView = (LPNM_LISTVIEW)pNMHDR;
tdeSortCriteria eCriteria;
int iNumColumn;
if (!m_bCanChangeOrder)
return;
if (pNMListView->iItem != -1)
return;
// get corresponding column
iNumColumn = pNMListView->iSubItem;
eCriteria = GetColumnType(iNumColumn);
if (eCriteria == E_sc_None)
return;
// update list order
fn_vSortListByCriteria(eCriteria);
SetOrder(E_lo_Edited);
}
/*----------------------------------------
Get Column Type from number
----------------------------------------*/
tdeSortCriteria CPA_SortedListBox::GetColumnType (int iNumColumn)
{
int iInd = 0;
// state ?
if ((m_lDrawStyle & C_lDrawState)&&(m_pStateList))
{
if (iInd++ == iNumColumn)
return E_sc_State;
}
// icon ?
if ((m_lDrawStyle & C_lDrawIcon)&&(m_pIconList))
{
if (iInd++ == iNumColumn)
return E_sc_Icon;
}
// name
if (iInd++ == iNumColumn)
return E_sc_Name;
if (m_lDrawStyle & C_lDrawType)
{
if (iInd++ == iNumColumn)
return E_sc_Type;
}
if (m_lDrawStyle & C_lDrawOwner)
{
if (iInd++ == iNumColumn)
return E_sc_Owner;
}
return E_sc_None;
}
/*----------------------------------------
Index By State To Draw
----------------------------------------*/
int CPA_SortedListBox::GetIndexByStateToDraw (CPA_BaseObject *pObject)
{
CPA_BaseObject *pElem;
CString csName, csNameRef;
int iState, iStateRef;
int iInd;
iStateRef = GetCorrespondingState(pObject);
csNameRef = pObject->GetNameToDraw();
for (iInd = 0; iInd < m_pSortedList->GetCount(); iInd++)
{
pElem = m_pSortedList->GetObjectWithIndex(iInd, E_lo_Edited);
// get icon
csName = pElem->GetNameToDraw();
iState = GetCorrespondingState(pElem);
if (iState > iStateRef)
return iInd;
if ((iState == iStateRef)&&(csName >= csNameRef))
return iInd;
}
return (m_pSortedList->GetCount() - 1);
}
/*----------------------------------------
Index By Icon To Draw
----------------------------------------*/
int CPA_SortedListBox::GetIndexByIconToDraw (CPA_BaseObject *pObject)
{
CPA_BaseObject *pElem;
CString csName, csNameRef;
int iIcon, iIconRef;
int iInd;
iIconRef = GetCorrespondingIcon(pObject);
csNameRef = pObject->GetNameToDraw();
for (iInd = 0; iInd < m_pSortedList->GetCount(); iInd++)
{
pElem = m_pSortedList->GetObjectWithIndex(iInd, E_lo_Edited);
// get icon
iIcon = GetCorrespondingIcon(pElem);
csName = pElem->GetNameToDraw();
if (iIcon > iIconRef)
return iInd;
if ((iIcon == iIconRef)&&(csName >= csNameRef))
return iInd;
}
return (m_pSortedList->GetCount() - 1);
}
/*----------------------------------------
Index By Name To Draw
----------------------------------------*/
int CPA_SortedListBox::GetIndexByNameToDraw (CPA_BaseObject *pObject)
{
CPA_BaseObject *pElem;
CString csName, csNameRef;
int iInd;
csNameRef = pObject->GetNameToDraw();
for (iInd = 0; iInd < m_pSortedList->GetCount(); iInd++)
{
pElem = m_pSortedList->GetObjectWithIndex(iInd, E_lo_Edited);
csName = pElem->GetNameToDraw();
if (csName >= csNameRef)
return iInd;
}
return (m_pSortedList->GetCount() - 1);
}
/*----------------------------------------
Index By Type To Draw
----------------------------------------*/
int CPA_SortedListBox::GetIndexByTypeToDraw (CPA_BaseObject *pObject)
{
CPA_BaseObject *pElem;
CString csType, csTypeRef;
CString csName, csNameRef;
int iInd;
csTypeRef = pObject->GetTypeToDraw();
csNameRef = pObject->GetNameToDraw();
for (iInd = 0; iInd < m_pSortedList->GetCount(); iInd++)
{
pElem = m_pSortedList->GetObjectWithIndex(iInd, E_lo_Edited);
csType = pElem->GetTypeToDraw();
csName = pElem->GetNameToDraw();
if (csType > csTypeRef)
return iInd;
if ((csType == csTypeRef)&&(csName >= csNameRef))
return iInd;
}
return (m_pSortedList->GetCount() - 1);
}
/*----------------------------------------
Index By Owner To Draw
----------------------------------------*/
int CPA_SortedListBox::GetIndexByOwnerToDraw (CPA_BaseObject *pObject)
{
CPA_BaseObject *pElem;
CString csOwner, csOwnerRef;
CString csName, csNameRef;
int iInd;
csOwnerRef = pObject->GetOwnerToDraw();
csNameRef = pObject->GetNameToDraw();
for (iInd = 0; iInd < m_pSortedList->GetCount(); iInd++)
{
pElem = m_pSortedList->GetObjectWithIndex(iInd, E_lo_Edited);
csOwner = pElem->GetOwnerToDraw();
csName = pElem->GetNameToDraw();
if (csOwner > csOwnerRef)
return iInd;
if ((csOwner == csOwnerRef)&&(csName >= csNameRef))
return iInd;
}
return (m_pSortedList->GetCount() - 1);
}
/*----------------------------------------
Resort List
----------------------------------------*/
void CPA_SortedListBox::fn_vSortListByCriteria(tdeSortCriteria eCriteria)
{
CPA_BaseObject *pElem;
int iInd, iNewInd;
for (iInd = 0; iInd < m_pSortedList->GetCount(); iInd++)
{
pElem = m_pSortedList->GetObjectWithIndex(iInd, E_lo_Alpha);
switch (eCriteria)
{
case E_sc_State:
iNewInd = GetIndexByStateToDraw(pElem);
break;
case E_sc_Icon:
iNewInd = GetIndexByIconToDraw(pElem);
break;
case E_sc_Name:
iNewInd = GetIndexByNameToDraw(pElem);
break;
case E_sc_Type:
iNewInd = GetIndexByTypeToDraw(pElem);
break;
case E_sc_Owner:
iNewInd = GetIndexByOwnerToDraw(pElem);
break;
}
m_pSortedList->fn_bChangeObjectOrder(pElem, iNewInd, E_lo_Edited);
}
}
#endif // ACTIVE_EDITOR