- HDITEM item;
- item.mask = HDI_LPARAM;
- Header_GetItem((HWND)m_hWnd, nmHDR->iItem, &item);
-
- return (unsigned int)item.lParam;
-}
-
-bool wxDataViewHeaderWindowMSW::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
-{
- NMHDR *nmhdr = (NMHDR *)lParam;
-
- // is it a message from the header?
- if ( nmhdr->hwndFrom != (HWND)m_hWnd )
- return wxWindow::MSWOnNotify(idCtrl, lParam, result);
-
- NMHEADER *nmHDR = (NMHEADER *)nmhdr;
- switch ( nmhdr->code )
- {
- case HDN_BEGINTRACK:
- // user has started to resize a column:
- // do we need to veto it?
- if (!GetColumn(nmHDR->iItem)->IsResizeable())
- {
- // veto it!
- *result = TRUE;
- }
- break;
-
- case HDN_BEGINDRAG:
- // user has started to reorder a column
- if ((nmHDR->iItem != -1) && (!GetColumn(nmHDR->iItem)->IsReorderable()))
- {
- // veto it!
- *result = TRUE;
- }
- break;
-
- case HDN_ENDDRAG: // user has finished reordering a column
- {
- wxDataViewColumn *col = GetColumn(nmHDR->iItem);
- unsigned int new_pos = nmHDR->pitem->iOrder;
- m_owner->ColumnMoved( col, new_pos );
- m_delayedUpdate = true;
- }
- break;
-
- case HDN_ITEMCHANGING:
- if (nmHDR->pitem != NULL &&
- (nmHDR->pitem->mask & HDI_WIDTH) != 0)
- {
- int minWidth = GetColumnFromHeader(nmHDR)->GetMinWidth();
- if (nmHDR->pitem->cxy < minWidth)
- {
- // do not allow the user to resize this column under
- // its minimal width:
- *result = TRUE;
- }
- }
- break;
-
- case HDN_ITEMCHANGED: // user is resizing a column
- case HDN_ENDTRACK: // user has finished resizing a column
-
- // update the width of the modified column:
- if (nmHDR->pitem != NULL &&
- (nmHDR->pitem->mask & HDI_WIDTH) != 0)
- {
- unsigned int idx = GetColumnIdxFromHeader(nmHDR);
- unsigned int w = nmHDR->pitem->cxy;
- wxDataViewColumn *col = GetColumn(idx);
-
- // see UpdateDisplay() for more info about COLUMN_WIDTH_OFFSET
- if (idx == 0 && w > COLUMN_WIDTH_OFFSET)
- w -= COLUMN_WIDTH_OFFSET;
-
- if (w >= (unsigned)col->GetMinWidth())
- col->SetInternalWidth(w);
- }
- break;
-
- case HDN_ITEMCLICK:
- {
- unsigned int idx = GetColumnIdxFromHeader(nmHDR);
- wxDataViewModel * model = GetOwner()->GetModel();
-
- if(nmHDR->iButton == 0)
- {
- wxDataViewColumn *col = GetColumn(idx);
- if(col->IsSortable())
- {
- if(model && m_owner->GetSortingColumn() == col)
- {
- bool order = col->IsSortOrderAscending();
- col->SetSortOrder(!order);
- }
- else if(model)
- {
- m_owner->SetSortingColumn(col);
- }
- }
- UpdateDisplay();
- if(model)
- model->Resort();
- }
-
- wxEventType evt = nmHDR->iButton == 0 ?
- wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK :
- wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK;
- SendEvent(evt, idx);
- }
- break;
-
- case NM_RCLICK:
- {
- // NOTE: for some reason (i.e. for a bug in Windows)
- // the HDN_ITEMCLICK notification is not sent on
- // right clicks, so we need to handle NM_RCLICK
-
- POINT ptClick;
- int column = wxMSWGetColumnClicked(nmhdr, &ptClick);
- if (column != wxNOT_FOUND)
- {
- HDITEM item;
- item.mask = HDI_LPARAM;
- Header_GetItem((HWND)m_hWnd, column, &item);
-
- // 'idx' may be different from 'column' if there are
- // hidden columns...
- unsigned int idx = (unsigned int)item.lParam;
- SendEvent(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
- idx);
- }
- }
- break;