X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c4f4cf895c1576d2c474a8ebec5d3ee01b98d5f7..404b319a85dadd7decf7a5a5331020520031a41c:/src/os2/listctrl.cpp?ds=inline diff --git a/src/os2/listctrl.cpp b/src/os2/listctrl.cpp index adaa9a0532..3b4cd843ea 100644 --- a/src/os2/listctrl.cpp +++ b/src/os2/listctrl.cpp @@ -6,7 +6,7 @@ // Created: 01/21/03 // RCS-ID: $Id$ // Copyright: (c) David Webster -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,11 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "listctrl.h" - #pragma implementation "listctrlbase.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -36,12 +31,12 @@ #include "wx/intl.h" #include "wx/log.h" #include "wx/settings.h" + #include "wx/dcclient.h" + #include "wx/textctrl.h" #endif -#include "wx/textctrl.h" #include "wx/imaglist.h" #include "wx/listctrl.h" -#include "wx/dcclient.h" #include "wx/os2/private.h" @@ -59,16 +54,50 @@ ///////////////////////////////////////////////////////////////////////////// // STRUCT SMYRECORD // Under OS/2 we have to use our own RECORDCORE based struct if we have -// user data to store in a PM Container Control (and CListCtrl is a PM -// Container in ICON, NAME, TEXT or DETAILview). m_ulUserData is a four +// user data to store in a PM Container Control (and wxListCtrl is a PM +// Container in ICON, NAME, TEXT or DETAIL view). m_ulUserData is a four // byte value containing a pointer to our CListIntemInternalData class // instance. +// +// And now for the big time OS/2 Kludge. In traditional OS/2 PM +// applications using containers, programmers determine BEFORE creation +// how many records the view will have, initially, and how many columns +// the detail view of the container will have, as the container represents +// a known data block. Thus the OS/2 PM CV_DETAIL view, i.e. +// the wxWidgets wxLC_REPORT view, relies on STATIC structure for its +// columnar data. It gets the data to display by telling it the specific +// offset of the field in the struct containing the displayable data. That +// data has be of OS/2 Types, PSZ (char string), CDATE or CTIME format. +// wxWidgets is dynamic in nature, however. We insert columns, one at a +// time and do not know how many until the app is done inserting them. So +// for OS/2 I have to set a max allowable since they are fixed. We return +// an error to the app if they include more than we can handle. +// +// For example to display the data "Col 4 of Item 6" in a report view, I'd +// have to do: +// pRecord->m_pzColumn4 = "Col 4 of Item 6"; +// pField->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn4); +// and then call the PM API to set it. +// +// This really stinks but I can't use a pointer to another struct as the +// FIELDOFFSET call could only tell OS/2 the four byte value offset of +// pointer field and it would display giberish in the column. ///////////////////////////////////////////////////////////////////////////// typedef struct _MYRECORD { RECORDCORE m_vRecord; unsigned long m_ulItemId; - unsigned long m_ulUserData; + unsigned long m_ulUserData; //actually a pointer value to real data (a CListItemInternalData class instance) + PSZ m_pzColumn1; + PSZ m_pzColumn2; + PSZ m_pzColumn3; + PSZ m_pzColumn4; + PSZ m_pzColumn5; + PSZ m_pzColumn6; + PSZ m_pzColumn7; + PSZ m_pzColumn8; + PSZ m_pzColumn9; + PSZ m_pzColumn10; } MYRECORD, *PMYRECORD; ///////////////////////////////////////////////////////////////////////////// @@ -77,12 +106,12 @@ typedef struct _MYRECORD // Problem: // The MSW version had problems with SetTextColour() et al as the // CListItemAttr's were stored keyed on the item index. If a item was -// inserted anywhere but the end of the list the the text attributes +// inserted anywhere but the end of the list the text attributes // (colour etc) for the following items were out of sync. // // Solution: // Under MSW the only way to associate data with a -// List item independant of its position in the list is to store a pointer +// List item independent of its position in the list is to store a pointer // to it in its lParam attribute. However user programs are already using // this (via the SetItemData() GetItemData() calls). // @@ -111,8 +140,7 @@ public: ~CListItemInternalData() { - delete m_pAttr; - m_pAttr = NULL; + wxDELETE(m_pAttr); } wxListItemAttr* m_pAttr; @@ -458,14 +486,12 @@ SHORT EXPENTRY InternalDataCompareFunc ( // none // ///////////////////////////////////////////////////////////////////////////// -void ConvertFromOS2ListItem ( - HWND hWndListCtrl -, wxListItem& rInfo -, PMYRECORD pRecord -) +void ConvertFromOS2ListItem ( HWND hWndListCtrl, + wxListItem& rInfo, + PMYRECORD pRecord ) { - CListItemInternalData* pInternaldata = (CListItemInternalData *)pRecord->m_ulUserData; - bool bNeedText = FALSE; + CListItemInternalData* pInternaldata = (CListItemInternalData *)pRecord->m_ulUserData; + bool bNeedText = false; if (pInternaldata) rInfo.SetData(pInternaldata->m_lParam); @@ -581,9 +607,10 @@ void ConvertToOS2Flags ( // they are added to the container. // // PARAMETERS -// pCtrl -- the control to use -// rInfo -- the item to convert -// pRecord -- the OS list control to use, should be zeroed out +// pCtrl -- the control to use +// rInfo -- the item to convert +// pRecord -- the OS list control to use, should be zeroed out +// pFieldinfo -- a field struct that may contain columnar data for detail view // // RETURN VALUE // none @@ -593,9 +620,11 @@ void ConvertToOS2ListItem ( const wxListCtrl* pCtrl , const wxListItem& rInfo , PMYRECORD pRecord +, PFIELDINFO pFieldInfo ) { pRecord->m_ulItemId = (ULONG)rInfo.GetId(); + pRecord->m_vRecord.cb = sizeof(RECORDCORE); if (rInfo.GetMask() & wxLIST_MASK_STATE) { ConvertToOS2Flags( rInfo.m_state @@ -611,6 +640,72 @@ void ConvertToOS2ListItem ( { pRecord->m_vRecord.pszText = (char*)rInfo.GetText().c_str(); } + // + // In the case of a report view the text will be the data in the lead column + // ???? Don't know why, but that is how it works in other ports. + // + if (pCtrl->GetWindowStyleFlag() & wxLC_REPORT) + { + if (pFieldInfo) + { + switch(rInfo.GetColumn()) + { + case 0: + pRecord->m_pzColumn1 = (char*)rInfo.GetText().c_str(); + pFieldInfo->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn1); + break; + + case 1: + pRecord->m_pzColumn2 = (char*)rInfo.GetText().c_str(); + pFieldInfo->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn2); + break; + + case 2: + pRecord->m_pzColumn3 = (char*)rInfo.GetText().c_str(); + pFieldInfo->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn3); + break; + + case 3: + pRecord->m_pzColumn4 = (char*)rInfo.GetText().c_str(); + pFieldInfo->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn4); + break; + + case 4: + pRecord->m_pzColumn5 = (char*)rInfo.GetText().c_str(); + pFieldInfo->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn5); + break; + + case 5: + pRecord->m_pzColumn6 = (char*)rInfo.GetText().c_str(); + pFieldInfo->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn6); + break; + + case 6: + pRecord->m_pzColumn7 = (char*)rInfo.GetText().c_str(); + pFieldInfo->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn7); + break; + + case 7: + pRecord->m_pzColumn8 = (char*)rInfo.GetText().c_str(); + pFieldInfo->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn8); + break; + + case 8: + pRecord->m_pzColumn9 = (char*)rInfo.GetText().c_str(); + pFieldInfo->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn9); + break; + + case 9: + pRecord->m_pzColumn10 = (char*)rInfo.GetText().c_str(); + pFieldInfo->offStruct = FIELDOFFSET(MYRECORD, m_pzColumn10); + break; + + default: + wxFAIL_MSG( wxT("wxOS2 does not support more than 10 columns in REPORT view") ); + break; + } + } + } if (rInfo.GetMask() & wxLIST_MASK_IMAGE) { pRecord->m_vRecord.hptrIcon = (HPOINTER)rInfo.GetImage(); @@ -641,10 +736,17 @@ void ConvertToOS2ListCol ( { memset(pField, '\0', sizeof(FIELDINFO)); pField->cb = sizeof(FIELDINFO); + + // + // Default some settings + // + pField->flData = CFA_HORZSEPARATOR | CFA_SEPARATOR; + pField->flTitle = CFA_CENTER; + if (rItem.GetMask() & wxLIST_MASK_TEXT) { pField->flData |= CFA_STRING; - pField->pUserData = (void *)rItem.GetText().c_str(); + pField->pTitleData = (PVOID)rItem.GetText().c_str(); // text is column title not data } if (rItem.GetMask() & wxLIST_MASK_FORMAT) { @@ -655,6 +757,8 @@ void ConvertToOS2ListCol ( else if (rItem.m_format == wxLIST_FORMAT_CENTRE) pField->flData |= CFA_CENTER; } + else + pField->flData |= CFA_CENTER; // Just ensure the default is centered if (rItem.GetMask() & wxLIST_MASK_WIDTH) { if (!(rItem.GetWidth() == wxLIST_AUTOSIZE || @@ -662,40 +766,12 @@ void ConvertToOS2ListCol ( pField->cxWidth = rItem.GetWidth(); // else: OS/2 automatically sets the width if created with the approppriate style } -} // end of ConvertToOS2ListCol - -// ---------------------------------------------------------------------------- -// events -// ---------------------------------------------------------------------------- -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_DRAG) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_RDRAG) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_END_LABEL_EDIT) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ITEM) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_GET_INFO) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_SET_INFO) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_SELECTED) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_DESELECTED) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_KEY_DOWN) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_INSERT_ITEM) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_CLICK) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_RIGHT_CLICK) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_BEGIN_DRAG) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_DRAGGING) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_COL_END_DRAG) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_ACTIVATED) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_FOCUSED) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_CACHE_HINT) - -IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) -IMPLEMENT_DYNAMIC_CLASS(wxListView, wxListCtrl) -IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) - -IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxNotifyEvent) + // + // Still need to set the actual data + // + pField->offStruct = 0; +} // end of ConvertToOS2ListCol BEGIN_EVENT_TABLE(wxListCtrl, wxControl) EVT_PAINT(wxListCtrl::OnPaint) @@ -714,30 +790,28 @@ void wxListCtrl::Init () m_pImageListNormal = NULL; m_pImageListSmall = NULL; m_pImageListState = NULL; - m_bOwnsImageListNormal = FALSE; - m_bOwnsImageListSmall = FALSE; - m_bOwnsImageListState = FALSE; + m_bOwnsImageListNormal = false; + m_bOwnsImageListSmall = false; + m_bOwnsImageListState = false; m_lBaseStyle = 0L; m_nColCount = 0; m_pTextCtrl = NULL; - m_bAnyInternalData = FALSE; - m_bHasAnyAttr = FALSE; + m_bAnyInternalData = false; + m_bHasAnyAttr = false; } // end of wxListCtrl::Init -bool wxListCtrl::Create ( - wxWindow* pParent -, wxWindowID vId -, const wxPoint& rPos -, const wxSize& rSize -, long lStyle -, const wxValidator& rValidator -, const wxString& rsName -) +bool wxListCtrl::Create ( wxWindow* pParent, + wxWindowID vId, + const wxPoint& rPos, + const wxSize& rSize, + long lStyle, + const wxValidator& rValidator, + const wxString& rsName ) { - int nX = rPos.x; - int nY = rPos.y; - int nWidth = rSize.x; - int nHeight = rSize.y; + int nX = rPos.x; + int nY = rPos.y; + int nWidth = rSize.x; + int nHeight = rSize.y; #if wxUSE_VALIDATORS SetValidator(rValidator); @@ -757,7 +831,7 @@ bool wxListCtrl::Create ( m_windowId = (vId == -1) ? NewControlId() : vId; - long lSstyle = WS_VISIBLE | WS_TABSTOP; + long lSstyle = WS_VISIBLE | WS_TABSTOP; if (GetWindowStyleFlag() & wxCLIP_SIBLINGS) lSstyle |= WS_CLIPSIBLINGS; @@ -767,23 +841,19 @@ bool wxListCtrl::Create ( ,nWidth ,nHeight )) - return FALSE; + return false; if (pParent) pParent->AddChild(this); - return TRUE; + return true; } // end of wxListCtrl::Create -bool wxListCtrl::DoCreateControl ( - int nX -, int nY -, int nWidth -, int nHeight -) +bool wxListCtrl::DoCreateControl ( int nX, int nY, + int nWidth, int nHeight ) { - DWORD lWstyle = m_lBaseStyle; - long lOldStyle = 0; // Dummy + DWORD lWstyle = m_lBaseStyle; + long lOldStyle = 0; // Dummy - CNRINFO vCnrInfo; + CNRINFO vCnrInfo; lWstyle |= ConvertToOS2Style( lOldStyle ,GetWindowStyleFlag() @@ -802,7 +872,7 @@ bool wxListCtrl::DoCreateControl ( ); if (!m_hWnd) { - return FALSE; + return false; } // @@ -813,52 +883,49 @@ bool wxListCtrl::DoCreateControl ( ,MPFROMP(&vCnrInfo) ,(MPARAM)(USHORT)sizeof(CNRINFO) )) + return false; lWstyle = ConvertViewToOS2Style(GetWindowStyleFlag()); - vCnrInfo.flWindowAttr != lWstyle; - ::WinSendMsg( GetHWND() - ,CM_SETCNRINFO - ,MPFROMP(&vCnrInfo) - ,(MPARAM)CMA_FLWINDOWATTR - ); + vCnrInfo.flWindowAttr |= lWstyle; + if (!::WinSendMsg( GetHWND() + ,CM_SETCNRINFO + ,MPFROMP(&vCnrInfo) + ,(MPARAM)CMA_FLWINDOWATTR + )) + return false; // // And now set needed arrangement flags // lWstyle = ConvertArrangeToOS2Style(GetWindowStyleFlag()); - ::WinSendMsg( GetHWND() - ,CM_ARRANGE - ,(MPARAM)CMA_ARRANGEGRID - ,(MPARAM)lWstyle - ); + if (!::WinSendMsg( GetHWND() + ,CM_ARRANGE + ,(MPARAM)CMA_ARRANGEGRID + ,(MPARAM)lWstyle + )) + return false; SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); SetForegroundColour(GetParent()->GetForegroundColour()); SubclassWin(m_hWnd); SetFont(*wxSMALL_FONT); SetXComp(0); SetYComp(0); - SetSize( nX - ,nY - ,nWidth - ,nHeight - ); - return TRUE; + SetSize( nX, nY, nWidth, nHeight ); + return true; } // end of wxListCtrl::DoCreateControl void wxListCtrl::UpdateStyle () { if (GetHWND()) { - long lDummy; - DWORD dwStyleNew = ConvertToOS2Style( lDummy - ,GetWindowStyleFlag() - ); + long lDummy; + DWORD dwStyleNew = ConvertToOS2Style( lDummy, GetWindowStyleFlag() ); dwStyleNew |= m_lBaseStyle; // // Get the current window style. // - ULONG dwStyleOld = ::WinQueryWindowULong(GetHWND(), QWL_STYLE); + ULONG dwStyleOld = ::WinQueryWindowULong(GetHWND(), QWL_STYLE); // // Only set the window style if the view bits have changed. @@ -874,12 +941,12 @@ void wxListCtrl::FreeAllInternalData () { if (m_bAnyInternalData) { - int n = GetItemCount(); - int i = 0; + int n = GetItemCount(); + int i = 0; for (i = 0; i < n; i++) DeleteInternalData(this, (long)i); - m_bAnyInternalData = FALSE; + m_bAnyInternalData = false; } } // end of wxListCtrl::FreeAllInternalData @@ -890,8 +957,7 @@ wxListCtrl::~wxListCtrl () { m_pTextCtrl->SetHWND(0); m_pTextCtrl->UnsubclassWin(); - delete m_pTextCtrl; - m_pTextCtrl = NULL; + wxDELETE(m_pTextCtrl); } if (m_bOwnsImageListNormal) @@ -1034,57 +1100,48 @@ long wxListCtrl::ConvertViewToOS2Style ( // ---------------------------------------------------------------------------- // Sets the foreground, i.e. text, colour -bool wxListCtrl::SetForegroundColour ( - const wxColour& rCol) +bool wxListCtrl::SetForegroundColour (const wxColour& rCol) { - ULONG ulColor = wxColourToRGB(rCol); + ULONG ulColor = wxColourToRGB(rCol); if (!wxWindow::SetForegroundColour(rCol)) - return FALSE; - + return false; ::WinSetPresParam( GetHWND() ,PP_FOREGROUNDCOLOR ,sizeof(ULONG) ,&ulColor ); - return TRUE; + return true; } // end of wxListCtrl::SetForegroundColour // Sets the background colour -bool wxListCtrl::SetBackgroundColour ( - const wxColour& rCol -) +bool wxListCtrl::SetBackgroundColour ( const wxColour& rCol ) { if (!wxWindow::SetBackgroundColour(rCol)) - return FALSE; + return false; // // We set the same colour for both the "empty" background and the items // background // - ULONG ulColor = wxColourToRGB(rCol); + ULONG ulColor = wxColourToRGB(rCol); ::WinSetPresParam( GetHWND() ,PP_BACKGROUNDCOLOR ,sizeof(ULONG) ,&ulColor ); - return TRUE; + return true; } // end of wxListCtrl::SetBackgroundColour // Gets information about this column -bool wxListCtrl::GetColumn ( - int nCol -, wxListItem& rItem -) const +bool wxListCtrl::GetColumn ( int nCol, wxListItem& rItem ) const { - PFIELDINFO pFieldInfo = FindOS2ListFieldByColNum ( GetHWND() - ,nCol - ); + PFIELDINFO pFieldInfo = FindOS2ListFieldByColNum ( GetHWND(), nCol ); if (!pFieldInfo) - return FALSE; + return false; rItem.SetWidth(pFieldInfo->cxWidth); if ((rItem.GetMask() & wxLIST_MASK_TEXT) && (pFieldInfo->flData & CFA_STRING) && @@ -1101,37 +1158,25 @@ bool wxListCtrl::GetColumn ( else if (pFieldInfo->flData & CFA_CENTER) rItem.m_format = wxLIST_FORMAT_CENTRE; } - return TRUE; + return true; } // end of wxListCtrl::GetColumn // Sets information about this column -bool wxListCtrl::SetColumn ( - int nCol -, wxListItem& rItem -) +bool wxListCtrl::SetColumn ( int nCol, wxListItem& rItem ) { - PFIELDINFO pFieldInfo = FindOS2ListFieldByColNum( GetHWND() - ,nCol - ); - ConvertToOS2ListCol( nCol - ,rItem - ,pFieldInfo - ); + PFIELDINFO pFieldInfo = FindOS2ListFieldByColNum( GetHWND(), nCol ); + ConvertToOS2ListCol( nCol, rItem, pFieldInfo ); // // Since we changed the field pointed to, we invalidate to see the result // ::WinSendMsg(GetHWND(), CM_INVALIDATEDETAILFIELDINFO, NULL, NULL); - return TRUE; + return true; } // end of wxListCtrl::SetColumn // Gets the column width -int wxListCtrl::GetColumnWidth ( - int nCol -) const +int wxListCtrl::GetColumnWidth ( int nCol ) const { - PFIELDINFO pFieldInfo = FindOS2ListFieldByColNum ( GetHWND() - ,nCol - ); + PFIELDINFO pFieldInfo = FindOS2ListFieldByColNum ( GetHWND(), nCol ); if (!pFieldInfo) return 0; @@ -1139,23 +1184,18 @@ int wxListCtrl::GetColumnWidth ( } // end of wxListCtrl::GetColumnWidth // Sets the column width -bool wxListCtrl::SetColumnWidth ( - int nCol -, int nWidth -) +bool wxListCtrl::SetColumnWidth ( int nCol, int nWidth ) { - int nCol2 = nCol; - int nWidth2 = nWidth; + int nCol2 = nCol; + int nWidth2 = nWidth; if (GetWindowStyleFlag() & wxLC_LIST) nCol2 = -1; - PFIELDINFO pFieldInfo = FindOS2ListFieldByColNum( GetHWND() - ,nCol - ); + PFIELDINFO pFieldInfo = FindOS2ListFieldByColNum( GetHWND(), nCol ); pFieldInfo->cxWidth = nWidth; ::WinSendMsg(GetHWND(), CM_INVALIDATEDETAILFIELDINFO, NULL, NULL); - return TRUE; + return true; } // end of wxListCtrl::SetColumnWidth // Gets the number of items that can fit vertically in the @@ -1213,36 +1253,27 @@ wxTextCtrl* wxListCtrl::GetEditControl() const } // Gets information about the item -bool wxListCtrl::GetItem ( - wxListItem& rInfo -) const +bool wxListCtrl::GetItem ( wxListItem& rInfo ) const { - PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND() - ,rInfo.GetId() - ); + PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND(), rInfo.GetId() ); // // Give NULL as hwnd as we already have everything we need // - ConvertFromOS2ListItem( NULL - ,rInfo - ,pRecord - ); - return TRUE; + ConvertFromOS2ListItem( NULL, rInfo, pRecord ); + return true; } // end of wxListCtrl::GetItem // Sets information about the item -bool wxListCtrl::SetItem ( - wxListItem& rInfo -) +bool wxListCtrl::SetItem ( wxListItem& rInfo ) { - PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND() - ,rInfo.GetId() - ); + PFIELDINFO pFieldInfo = FindOS2ListFieldByColNum ( GetHWND(), rInfo.GetColumn() ); + PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND(), rInfo.GetId() ); ConvertToOS2ListItem( this ,rInfo ,pRecord + ,pFieldInfo ); // @@ -1263,7 +1294,7 @@ bool wxListCtrl::SetItem ( // // Need to set it // - m_bAnyInternalData = TRUE; + m_bAnyInternalData = true; pData = new CListItemInternalData(); pRecord->m_ulUserData = (unsigned long)pData; }; @@ -1282,32 +1313,41 @@ bool wxListCtrl::SetItem ( else pData->m_pAttr = new wxListItemAttr(*rInfo.GetAttributes()); } + pData->m_pMyRecord = pRecord; // they point to each other } // // We need to update the item immediately to show the new image // - bool bUpdateNow = (rInfo.GetMask() & wxLIST_MASK_IMAGE) != 0; + bool bUpdateNow = (rInfo.GetMask() & wxLIST_MASK_IMAGE) != 0; // // Check whether it has any custom attributes // if (rInfo.HasAttributes()) { - m_bHasAnyAttr = TRUE; + m_bHasAnyAttr = true; // // If the colour has changed, we must redraw the item // - bUpdateNow = TRUE; + bUpdateNow = true; + } + if (::WinIsWindowVisible(GetHWND())) + { + ::WinSendMsg( GetHWND() + ,CM_INVALIDATERECORD + ,MPFROMP(pRecord) + ,MPFROM2SHORT(1, CMA_ERASE | CMA_REPOSITION | CMA_TEXTCHANGED) + ); + RefreshItem(pRecord->m_ulItemId); } ::WinSendMsg( GetHWND() - ,CM_INVALIDATERECORD - ,MPFROMP(pRecord) - ,MPFROM2SHORT(1, CMA_ERASE | CMA_REPOSITION | CMA_TEXTCHANGED) + ,CM_INVALIDATEDETAILFIELDINFO + ,NULL + ,NULL ); - RefreshItem(pRecord->m_ulItemId); - return TRUE; + return true; } // end of wxListCtrl::SetItem long wxListCtrl::SetItem ( @@ -1349,23 +1389,15 @@ int wxListCtrl::GetItemState ( } // end of wxListCtrl::GetItemState // Sets the item state -bool wxListCtrl::SetItemState ( - long lItem -, long lState -, long lStateMask -) +bool wxListCtrl::SetItemState ( long lItem, long lState, long lStateMask ) { - PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND() - ,lItem - ); + PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND(), lItem ); // // Don't use SetItem() here as it doesn't work with the virtual list // controls // - ConvertToOS2Flags( lState - ,pRecord - ); + ConvertToOS2Flags( lState, pRecord ); // // for the virtual list controls we need to refresh the previously focused @@ -1407,7 +1439,7 @@ bool wxListCtrl::SetItemState ( RefreshItem(lFocusOld); } } - return TRUE; + return true; } // end of wxListCtrl::SetItemState // Sets the item image @@ -1415,14 +1447,24 @@ bool wxListCtrl::SetItemImage ( long lItem , int nImage , int WXUNUSED(nSelImage)) +{ + return SetItemColumnInfo(lItem, 0, nImage); +} // end of wxListCtrl::SetItemImage + +// Sets the item image +bool wxListCtrl::SetItemColumnImage ( + long lItem +, long lColumn +, int nImage) { wxListItem vInfo; vInfo.m_mask = wxLIST_MASK_IMAGE; vInfo.m_image = nImage; vInfo.m_itemId = lItem; + vInfo.m_col = lColumn; return SetItem(vInfo); -} // end of wxListCtrl::SetItemImage +} // end of wxListCtrl::SetItemColumnImage // Gets the item text wxString wxListCtrl::GetItemText ( @@ -1468,9 +1510,9 @@ long wxListCtrl::GetItemData ( } // end of wxListCtrl::GetItemData // Sets the item data -bool wxListCtrl::SetItemData ( +bool wxListCtrl::SetItemPtrData ( long lItem -, long lData +, wxUIntPtr lData ) { wxListItem vInfo; @@ -1479,25 +1521,21 @@ bool wxListCtrl::SetItemData ( vInfo.m_itemId = lItem; vInfo.m_data = lData; return SetItem(vInfo); -} // end of wxListCtrl::SetItemData +} // end of wxListCtrl::SetItemPtrData // Gets the item rectangle -bool wxListCtrl::GetItemRect ( - long lItem -, wxRect& rRect -, int nCode -) const +bool wxListCtrl::GetItemRect ( long lItem, + wxRect& rRect, + int nCode ) const { - bool bSuccess; - PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND() - ,lItem - ); - QUERYRECORDRECT vQueryRect; - RECTL vRect; - int nHeight; + bool bSuccess; + PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND(), lItem ); + QUERYRECORDRECT vQueryRect; + RECTL vRect; + int nHeight; if (!pRecord) - return FALSE; + return false; vQueryRect.cb = sizeof(QUERYRECORDRECT); vQueryRect.pRecord = &pRecord->m_vRecord; vQueryRect.fRightSplitWindow = TRUE; @@ -1510,33 +1548,26 @@ bool wxListCtrl::GetItemRect ( // // remember OS/2 is backwards // - GetClientSize( NULL - ,&nHeight - ); + GetClientSize( NULL, &nHeight ); rRect.x = vRect.xLeft; rRect.y = nHeight - vRect.yTop; rRect.width = vRect.xRight; rRect.height = nHeight - vRect.yBottom; - bSuccess = TRUE; + bSuccess = true; return bSuccess; } // end of wxListCtrl::GetItemRect // Gets the item position -bool wxListCtrl::GetItemPosition ( - long lItem -, wxPoint& rPos -) const +bool wxListCtrl::GetItemPosition ( long lItem, wxPoint& rPos ) const { - bool bSuccess; - PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND() - ,lItem - ); - QUERYRECORDRECT vQueryRect; - RECTL vRect; - int nHeight; + bool bSuccess; + PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND() , lItem ); + QUERYRECORDRECT vQueryRect; + RECTL vRect; + int nHeight; if (!pRecord) - return FALSE; + return false; vQueryRect.cb = sizeof(QUERYRECORDRECT); vQueryRect.pRecord = &pRecord->m_vRecord; vQueryRect.fRightSplitWindow = TRUE; @@ -1549,25 +1580,20 @@ bool wxListCtrl::GetItemPosition ( // // remember OS/2 is backwards // - GetClientSize( NULL - ,&nHeight - ); + GetClientSize( NULL, &nHeight ); rPos.x = vRect.xLeft; rPos.y = nHeight - vRect.yTop; - bSuccess = TRUE; + bSuccess = true; return bSuccess; } // end of wxListCtrl::GetItemPosition // Sets the item position. -bool wxListCtrl::SetItemPosition ( - long lItem -, const wxPoint& rPos -) +bool wxListCtrl::SetItemPosition ( long lItem, const wxPoint& rPos ) { // // Items cannot be positioned in X/Y coord in OS/2 // - return FALSE; + return false; } // end of wxListCtrl::SetItemPosition // Gets the number of items in the list control @@ -1585,11 +1611,9 @@ int wxListCtrl::GetItemCount () const } // end of wxListCtrl::GetItemCount // Retrieves the spacing between icons in pixels. -// If small is TRUE, gets the spacing for the small icon +// If bIsSmall is true, gets the spacing for the small icon // view, otherwise the large icon view. -int wxListCtrl::GetItemSpacing ( - bool bIsSmall -) const +int wxListCtrl::GetItemSpacing ( bool bIsSmall ) const { CNRINFO vCnrInfo; @@ -1778,48 +1802,42 @@ wxImageList* wxListCtrl::GetImageList ( return NULL; } // end of wxListCtrl::GetImageList -void wxListCtrl::SetImageList ( - wxImageList* pImageList -, int nWhich -) +void wxListCtrl::SetImageList ( wxImageList* pImageList, + int nWhich ) { if (nWhich == wxIMAGE_LIST_NORMAL) { if (m_bOwnsImageListNormal) delete m_pImageListNormal; m_pImageListNormal = pImageList; - m_bOwnsImageListNormal = FALSE; + m_bOwnsImageListNormal = false; } else if (nWhich == wxIMAGE_LIST_SMALL) { if (m_bOwnsImageListSmall) delete m_pImageListSmall; m_pImageListSmall = pImageList; - m_bOwnsImageListSmall = FALSE; + m_bOwnsImageListSmall = false; } else if (nWhich == wxIMAGE_LIST_STATE) { if (m_bOwnsImageListState) delete m_pImageListState; m_pImageListState = pImageList; - m_bOwnsImageListState = FALSE; + m_bOwnsImageListState = false; } } // end of wxListCtrl::SetImageList -void wxListCtrl::AssignImageList ( - wxImageList* pImageList -, int nWhich -) +void wxListCtrl::AssignImageList ( wxImageList* pImageList, int nWhich ) { - SetImageList( pImageList - ,nWhich - ); + SetImageList( pImageList, nWhich ); + if (nWhich == wxIMAGE_LIST_NORMAL ) - m_bOwnsImageListNormal = TRUE; + m_bOwnsImageListNormal = true; else if (nWhich == wxIMAGE_LIST_SMALL ) - m_bOwnsImageListSmall = TRUE; + m_bOwnsImageListSmall = true; else if (nWhich == wxIMAGE_LIST_STATE ) - m_bOwnsImageListState = TRUE; + m_bOwnsImageListState = true; } // end of wxListCtrl::AssignImageList // ---------------------------------------------------------------------------- @@ -1827,12 +1845,10 @@ void wxListCtrl::AssignImageList ( // ---------------------------------------------------------------------------- // Arranges the items -bool wxListCtrl::Arrange ( - int nFlag -) +bool wxListCtrl::Arrange ( int nFlag ) { - ULONG ulType = 0L; - ULONG ulFlags = 0L; + ULONG ulType = 0L; + ULONG ulFlags = 0L; if (nFlag == wxLIST_ALIGN_SNAP_TO_GRID) { @@ -1854,24 +1870,20 @@ bool wxListCtrl::Arrange ( // // We do not support CMA_ARRANGESELECTED // - return TRUE; + return true; } // end of wxListCtrl::Arrange // Deletes an item -bool wxListCtrl::DeleteItem ( - long lItem -) +bool wxListCtrl::DeleteItem ( long lItem ) { - PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND() - ,lItem - ); + PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND(), lItem ); if (LONGFROMMR(::WinSendMsg( GetHWND() ,CM_REMOVERECORD ,(MPARAM)pRecord ,MPFROM2SHORT(1, CMA_FREE) )) == -1L) { - return FALSE; + return false; } // @@ -1900,7 +1912,7 @@ bool wxListCtrl::DeleteItem ( vRectWin.y = vRectItem.GetBottom(); RefreshRect(vRectWin); } - return TRUE; + return true; } // end of wxListCtrl::DeleteItem // Deletes all items @@ -1923,18 +1935,14 @@ bool wxListCtrl::DeleteAllColumns () } wxASSERT_MSG(m_nColCount == 0, wxT("no columns should be left")); - return TRUE; + return true; } // end of wxListCtrl::DeleteAllColumns // Deletes a column -bool wxListCtrl::DeleteColumn ( - int nCol -) +bool wxListCtrl::DeleteColumn ( int nCol ) { - bool bSuccess = FALSE; - PFIELDINFO pField = FindOS2ListFieldByColNum( GetHWND() - ,nCol - ); + bool bSuccess = false; + PFIELDINFO pField = FindOS2ListFieldByColNum( GetHWND(), nCol ); bSuccess = ((LONG)::WinSendMsg( GetHWND() ,CM_REMOVEDETAILFIELDINFO ,MPFROMP(pField) @@ -1985,32 +1993,26 @@ wxTextCtrl* wxListCtrl::EditLabel ( // End label editing, optionally cancelling the edit. Under OS/2 you close // the record for editting -bool wxListCtrl::EndEditLabel ( - bool WXUNUSED(bCancel) -) +bool wxListCtrl::EndEditLabel ( bool WXUNUSED(bCancel) ) { ::WinSendMsg( GetHWND() ,CM_CLOSEEDIT ,(MPARAM)0 ,(MPARAM)0 ); - return TRUE; + return true; } // end of wxListCtrl::EndEditLabel // Ensures this item is visible -bool wxListCtrl::EnsureVisible ( - long lItem -) +bool wxListCtrl::EnsureVisible ( long lItem ) { - PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND() - ,lItem - ); + PMYRECORD pRecord = FindOS2ListRecordByID( GetHWND(), lItem ); ::WinSendMsg( GetHWND() ,CM_INVALIDATERECORD ,MPFROMP(pRecord) ,MPFROM2SHORT((SHORT)1, CMA_NOREPOSITION) ); - return TRUE; + return true; } // end of wxListCtrl::EnsureVisible // Find an item whose label matches this string, starting from the item after 'start' @@ -2131,7 +2133,7 @@ long wxListCtrl::FindItem ( vLibRect.SetTop(vRect.yTop); vLibRect.SetRight(vRect.xRight); vLibRect.SetBottom(vRect.yBottom); - if (vLibRect.Inside(rPoint)) + if (vLibRect.Contains(rPoint)) return pRecord->m_ulItemId; for (i = lStart + 1; i < vCnrInfo.cRecords; i++) @@ -2151,7 +2153,7 @@ long wxListCtrl::FindItem ( vLibRect.SetTop(vRect.yTop); vLibRect.SetRight(vRect.xRight); vLibRect.SetBottom(vRect.yBottom); - if (vLibRect.Inside(rPoint)) + if (vLibRect.Contains(rPoint)) return pRecord->m_ulItemId; } return -1L; @@ -2209,39 +2211,50 @@ long wxListCtrl::InsertItem ( wxListItem& rInfo ) { - wxASSERT_MSG( !IsVirtual(), _T("can't be used with virtual controls") ); + wxASSERT_MSG( !IsVirtual(), wxT("can't be used with virtual controls") ); - PMYRECORD pRecordAfter = FindOS2ListRecordByID ( GetHWND() - ,rInfo.GetId() - 1 - ); + PFIELDINFO pFieldInfo = FindOS2ListFieldByColNum ( GetHWND() + ,rInfo.GetColumn() + ); + PMYRECORD pRecordAfter = NULL; PMYRECORD pRecord = (PMYRECORD)::WinSendMsg( GetHWND() ,CM_ALLOCRECORD ,MPFROMLONG(sizeof(MYRECORD) - sizeof(RECORDCORE)) - ,MPFROMLONG(1) + ,MPFROMSHORT(1) ); + + ConvertToOS2ListItem( this + ,rInfo + ,pRecord + ,pFieldInfo + ); + + if (rInfo.GetId() > 0) + pRecordAfter = FindOS2ListRecordByID( GetHWND() + ,rInfo.GetId() - 1 + ); + RECORDINSERT vInsert; vInsert.cb = sizeof(RECORDINSERT); - vInsert.pRecordOrder = (PRECORDCORE)pRecordAfter; vInsert.pRecordParent = NULL; - vInsert.fInvalidateRecord = TRUE; + if (!pRecordAfter) + vInsert.pRecordOrder = (PRECORDCORE)CMA_FIRST; + else + vInsert.pRecordOrder = (PRECORDCORE)pRecordAfter; vInsert.zOrder = CMA_TOP; vInsert.cRecordsInsert = 1; - - ConvertToOS2ListItem( this - ,rInfo - ,pRecord - ); + vInsert.fInvalidateRecord = TRUE; // - // Check wether we need to allocate our internal data + // Check whether we need to allocate our internal data // bool bNeedInternalData = ((rInfo.GetMask() & wxLIST_MASK_DATA) || rInfo.HasAttributes() ); if (bNeedInternalData) { - m_bAnyInternalData = TRUE; + m_bAnyInternalData = true; // // Internal stucture that manages data @@ -2263,17 +2276,23 @@ long wxListCtrl::InsertItem ( pData->m_pAttr = new wxListItemAttr(*rInfo.GetAttributes()); } } - ::WinSendMsg( GetHWND() - ,CM_INSERTRECORD - ,MPFROMP(pRecord) - ,MPFROMP(pRecordAfter) - ); + if (!::WinSendMsg( GetHWND() + ,CM_INSERTRECORD + ,MPFROMP(pRecord) + ,MPFROMP(&vInsert) + )) + return -1; // // OS/2 must mannually bump the index's of following records // BumpRecordIds( GetHWND() ,pRecord ); + ::WinSendMsg( GetHWND() + ,CM_INVALIDATEDETAILFIELDINFO + ,NULL + ,NULL + ); return pRecord->m_ulItemId; } // end of wxListCtrl::InsertItem @@ -2284,6 +2303,7 @@ long wxListCtrl::InsertItem ( { wxListItem vInfo; + memset(&vInfo, '\0', sizeof(wxListItem)); vInfo.m_text = rsLabel; vInfo.m_mask = wxLIST_MASK_TEXT; vInfo.m_itemId = lIndex; @@ -2337,15 +2357,16 @@ long wxListCtrl::InsertColumn ( ); FIELDINFOINSERT vInsert; + ConvertToOS2ListCol ( lCol + ,rItem + ,pField + ); + vInsert.cb = sizeof(FIELDINFOINSERT); vInsert.pFieldInfoOrder = pFieldAfter; vInsert.fInvalidateFieldInfo = TRUE; vInsert.cFieldInfoInsert = 1; - ConvertToOS2ListCol ( lCol - ,rItem - ,pField - ); bSuccess = ::WinSendMsg( GetHWND() ,CM_INSERTDETAILFIELDINFO ,MPFROMP(pField) @@ -2379,10 +2400,7 @@ long wxListCtrl::InsertColumn ( // scroll the control by the given number of pixels (exception: in list view, // dx is interpreted as number of columns) -bool wxListCtrl::ScrollList ( - int nDx -, int nDy -) +bool wxListCtrl::ScrollList ( int nDx, int nDy ) { if (nDx > 0) ::WinSendMsg( GetHWND() @@ -2396,15 +2414,12 @@ bool wxListCtrl::ScrollList ( ,(MPARAM)CMA_VERTICAL ,(MPARAM)nDy ); - return TRUE; + return true; } // end of wxListCtrl::ScrollList -bool wxListCtrl::SortItems ( - wxListCtrlCompare fn -, long lData -) +bool wxListCtrl::SortItems ( wxListCtrlCompare fn, long lData ) { - SInternalDataSort vInternalData; + SInternalDataSort vInternalData; vInternalData.m_fnUser = fn; vInternalData.m_lData = lData; @@ -2416,48 +2431,39 @@ bool wxListCtrl::SortItems ( ,(PVOID)&vInternalData )) { - wxLogDebug(_T("CM_SORTRECORD failed")); - return FALSE; + wxLogDebug(wxT("CM_SORTRECORD failed")); + return false; } - return TRUE; + return true; } // end of wxListCtrl::SortItems // ---------------------------------------------------------------------------- // message processing // ---------------------------------------------------------------------------- -bool wxListCtrl::OS2Command ( - WXUINT uCmd -, WXWORD wId -) +bool wxListCtrl::OS2Command ( WXUINT uCmd, WXWORD wId ) { if (uCmd == CN_ENDEDIT) { - wxCommandEvent vEvent( wxEVT_COMMAND_TEXT_UPDATED - ,wId - ); + wxCommandEvent vEvent( wxEVT_COMMAND_TEXT_UPDATED, wId ); vEvent.SetEventObject( this ); ProcessCommand(vEvent); - return TRUE; + return true; } else if (uCmd == CN_KILLFOCUS) { - wxCommandEvent vEvent( wxEVT_KILL_FOCUS - ,wId - ); + wxCommandEvent vEvent( wxEVT_KILL_FOCUS, wId ); vEvent.SetEventObject( this ); ProcessCommand(vEvent); - return TRUE; + return true; } else - return FALSE; + return false; } // end of wxListCtrl::OS2Command // Necessary for drawing hrules and vrules, if specified -void wxListCtrl::OnPaint ( - wxPaintEvent& rEvent -) +void wxListCtrl::OnPaint ( wxPaintEvent& rEvent ) { wxPaintDC vDc(this); wxPen vPen(wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT) @@ -2558,7 +2564,7 @@ wxString wxListCtrl::OnGetItemText ( { // this is a pure virtual function, in fact - which is not really pure // because the controls which are not virtual don't need to implement it - wxFAIL_MSG( _T("not supposed to be called") ); + wxFAIL_MSG( wxT("not supposed to be called") ); return wxEmptyString; } // end of wxListCtrl::OnGetItemText @@ -2567,28 +2573,26 @@ int wxListCtrl::OnGetItemImage ( ) const { // same as above - wxFAIL_MSG( _T("not supposed to be called") ); + wxFAIL_MSG( wxT("not supposed to be called") ); return -1; } // end of wxListCtrl::OnGetItemImage -wxListItemAttr* wxListCtrl::OnGetItemAttr ( - long WXUNUSED_UNLESS_DEBUG(lItem) +int wxListCtrl::OnGetItemColumnImage ( + long lItem, + long lColumn ) const { - wxASSERT_MSG( lItem >= 0 && lItem < GetItemCount(), - _T("invalid item index in OnGetItemAttr()") ); + if (!lColumn) + return OnGetItemImage(lItem); - // - // No attributes by default - // - return NULL; -} // end of wxListCtrl::OnGetItemAttr + return -1; +} // end of wxListCtrl::OnGetItemColumnImage void wxListCtrl::SetItemCount ( long lCount ) { - wxASSERT_MSG( IsVirtual(), _T("this is for virtual controls only") ); + wxASSERT_MSG( IsVirtual(), wxT("this is for virtual controls only") ); // // Cannot explicitly set the record count in OS/2 @@ -2607,34 +2611,25 @@ void wxListCtrl::RefreshItem ( RefreshRect(vRect); } // end of wxListCtrl::RefreshItem -void wxListCtrl::RefreshItems ( - long lItemFrom -, long lItemTo -) +void wxListCtrl::RefreshItems ( long lItemFrom, long lItemTo ) { - wxRect vRect1; - wxRect vRect2; + wxRect vRect1; + wxRect vRect2; - GetItemRect( lItemFrom - ,vRect1 - ); - GetItemRect( lItemTo - ,vRect2 - ); + GetItemRect( lItemFrom , vRect1 ); + GetItemRect( lItemTo , vRect2 ); - wxRect vRect = vRect1; + wxRect vRect = vRect1; vRect.height = vRect2.GetBottom() - vRect1.GetTop(); RefreshRect(vRect); } // end of wxListCtrl::RefreshItems -MRESULT wxListCtrl::OS2WindowProc( - WXUINT uMsg -, WXWPARAM wParam -, WXLPARAM lParam -) +MRESULT wxListCtrl::OS2WindowProc( WXUINT uMsg, + WXWPARAM wParam, + WXLPARAM lParam ) { - bool bProcessed = FALSE; + bool bProcessed = false; MRESULT lRc; wxListEvent vEvent( wxEVT_NULL ,m_windowId @@ -2733,7 +2728,7 @@ MRESULT wxListCtrl::OS2WindowProc( // } vEvent.SetEventType(vEventType); - bProcessed = GetEventHandler()->ProcessEvent(vEvent); + bProcessed = HandleWindowEvent(vEvent); break; } if (!bProcessed)