X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/df2c23e79b4a1753ec56d06c578bcf44c156946c..9a7b7798282622e445efc3318b6c85ff0bed9af8:/src/generic/datavgen.cpp?ds=sidebyside diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index d1017ac653..1b6a371e82 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -63,7 +63,7 @@ static const int EXPANDER_MARGIN = 4; // wxDataViewHeaderWindow //----------------------------------------------------------------------------- -#define USE_NATIVE_HEADER_WINDOW 0 +#define USE_NATIVE_HEADER_WINDOW 1 //Below is the compare stuff //For the generic implements, both the leaf nodes and the nodes are sorted for fast search when needed @@ -138,17 +138,23 @@ public: // the column count virtual void UpdateDisplay(); - // called when the main window gets scrolled + // called Refresh afterwards virtual void ScrollWindow(int dx, int dy, const wxRect *rect = NULL); protected: virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result); + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags); + wxSize DoGetBestSize() const; + unsigned int GetColumnIdxFromHeader(NMHEADER *nmHDR); wxDataViewColumn *GetColumnFromHeader(NMHEADER *nmHDR) { return GetColumn(GetColumnIdxFromHeader(nmHDR)); } + + int m_scrollOffsetX; + int m_buttonHeight; private: DECLARE_DYNAMIC_CLASS(wxDataViewHeaderWindowMSW) @@ -399,7 +405,7 @@ int LINKAGEMODE wxGenericTreeModelItemCmp( void ** id1, void ** id2) WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(unsigned int, wxDataViewSelection, WXDLLIMPEXP_ADV); WX_DECLARE_LIST(wxDataViewItem, ItemList); -WX_DEFINE_LIST(ItemList); +WX_DEFINE_LIST(ItemList) class wxDataViewMainWindow: public wxWindow { @@ -1198,17 +1204,24 @@ bool wxDataViewHeaderWindowMSW::Create( wxDataViewCtrl *parent, wxWindowID id, { m_owner = parent; - if ( !CreateControl(parent, id, pos, size, 0, wxDefaultValidator, name) ) - return false; + m_scrollOffsetX = 0; + m_buttonHeight = wxRendererNative::Get().GetHeaderButtonHeight( this ) + 10; int x = pos.x == wxDefaultCoord ? 0 : pos.x, y = pos.y == wxDefaultCoord ? 0 : pos.y, w = size.x == wxDefaultCoord ? 1 : size.x, - h = size.y == wxDefaultCoord ? 22 : size.y; + h = size.y == wxDefaultCoord ? m_buttonHeight : size.y; + + if ( !CreateControl(parent, id, pos, size, 0, wxDefaultValidator, name) ) + return false; // create the native WC_HEADER window: WXHWND hwndParent = (HWND)parent->GetHandle(); - WXDWORD msStyle = WS_CHILD | HDS_BUTTONS | HDS_HORZ | HDS_HOTTRACK | HDS_FULLDRAG; + WXDWORD msStyle = WS_CHILD | HDS_DRAGDROP | HDS_BUTTONS | HDS_HORZ | HDS_HOTTRACK | HDS_FULLDRAG; + + if ( m_isShown ) + msStyle |= WS_VISIBLE; + m_hWnd = CreateWindowEx(0, WC_HEADER, (LPCTSTR) NULL, @@ -1231,37 +1244,7 @@ bool wxDataViewHeaderWindowMSW::Create( wxDataViewCtrl *parent, wxWindowID id, // the following is required to get the default win's font for // header windows and must be done befor sending the HDM_LAYOUT msg SetFont(GetFont()); - - RECT rcParent; - HDLAYOUT hdl; - WINDOWPOS wp; - - // Retrieve the bounding rectangle of the parent window's - // client area, and then request size and position values - // from the header control. - ::GetClientRect((HWND)hwndParent, &rcParent); - - hdl.prc = &rcParent; - hdl.pwpos = ℘ - if (!SendMessage((HWND)m_hWnd, HDM_LAYOUT, 0, (LPARAM) &hdl)) - { - wxLogLastError(_T("SendMessage")); - return false; - } - - // Set the size, position, and visibility of the header control. - SetWindowPos((HWND)m_hWnd, - wp.hwndInsertAfter, - wp.x, wp.y, - wp.cx, wp.cy, - wp.flags | SWP_SHOWWINDOW); - - // set our size hints: wxDataViewCtrl will put this wxWindow inside - // a wxBoxSizer and in order to avoid super-big header windows, - // we need to set our height as fixed - SetMinSize(wxSize(-1, wp.cy)); - SetMaxSize(wxSize(-1, wp.cy)); - + return true; } @@ -1270,6 +1253,11 @@ wxDataViewHeaderWindowMSW::~wxDataViewHeaderWindow() UnsubclassWin(); } +wxSize wxDataViewHeaderWindowMSW::DoGetBestSize() const +{ + return wxSize(80, m_buttonHeight ); +} + void wxDataViewHeaderWindowMSW::UpdateDisplay() { // remove old columns @@ -1279,7 +1267,6 @@ void wxDataViewHeaderWindowMSW::UpdateDisplay() // add the updated array of columns to the header control unsigned int cols = GetOwner()->GetColumnCount(); unsigned int added = 0; - wxDataViewModel * model = GetOwner()->GetModel(); for (unsigned int i = 0; i < cols; i++) { wxDataViewColumn *col = GetColumn( i ); @@ -1294,13 +1281,12 @@ void wxDataViewHeaderWindowMSW::UpdateDisplay() hdi.fmt = HDF_LEFT | HDF_STRING; //hdi.fmt &= ~(HDF_SORTDOWN|HDF_SORTUP); - //sorting support - if(model && m_owner->GetSortingColumn() == col) + if (col->IsSortable() && GetOwner()->GetSortingColumn() == col) { //The Microsoft Comctrl32.dll 6.0 support SORTUP/SORTDOWN, but they are not default //see http://msdn2.microsoft.com/en-us/library/ms649534.aspx for more detail - //hdi.fmt |= model->GetSortOrderAscending()? HDF_SORTUP:HDF_SORTDOWN; - ; + // VZ: works with 5.81 + hdi.fmt |= col->IsSortOrderAscending() ? HDF_SORTUP : HDF_SORTDOWN; } // lParam is reserved for application's use: @@ -1330,7 +1316,7 @@ void wxDataViewHeaderWindowMSW::UpdateDisplay() default: // such alignment is not allowed for the column header! - wxFAIL; + break; // wxFAIL; } SendMessage((HWND)m_hWnd, HDM_INSERTITEM, @@ -1505,32 +1491,20 @@ bool wxDataViewHeaderWindowMSW::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARA return true; } -void wxDataViewHeaderWindowMSW::ScrollWindow(int WXUNUSED(dx), int WXUNUSED(dy), - const wxRect *WXUNUSED(rect)) +void wxDataViewHeaderWindowMSW::ScrollWindow(int dx, int WXUNUSED(dy), + const wxRect * WXUNUSED(rect)) { - wxSize ourSz = GetClientSize(); - wxSize ownerSz = m_owner->GetClientSize(); - - // where should the (logical) origin of this window be placed? - int x1 = 0, y1 = 0; - m_owner->CalcUnscrolledPosition(0, 0, &x1, &y1); - - // put this window on top of our parent and - SetWindowPos((HWND)m_hWnd, HWND_TOP, -x1, 0, - ownerSz.GetWidth() + x1, ourSz.GetHeight(), - SWP_SHOWWINDOW); + m_scrollOffsetX += dx; + + GetParent()->Layout(); } -void wxDataViewHeaderWindowMSW::DoSetSize(int WXUNUSED(x), int WXUNUSED(y), - int WXUNUSED(w), int WXUNUSED(h), - int WXUNUSED(f)) +void wxDataViewHeaderWindowMSW::DoSetSize(int x, int y, + int w, int h, + int f) { - // the wxDataViewCtrl's internal wxBoxSizer will call this function when - // the wxDataViewCtrl window gets resized: the following dummy call - // to ScrollWindow() is required in order to get this header window - // correctly repainted when it's (horizontally) scrolled: - - ScrollWindow(0, 0); + // TODO: why is there a border + 2px around it? + wxControl::DoSetSize( x+m_scrollOffsetX+1, y+1, w-m_scrollOffsetX-2, h-2, f ); } #else // !defined(__WXMSW__) @@ -1861,7 +1835,7 @@ END_EVENT_TABLE() wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, const wxString &name ) : - wxWindow( parent, id, pos, size, wxWANTS_CHARS, name ), + wxWindow( parent, id, pos, size, wxWANTS_CHARS|wxBORDER_NONE, name ), m_selection( wxDataViewSelectionCmp ) { @@ -3643,7 +3617,7 @@ wxDataViewItem wxDataViewMainWindow::GetSelection() const //----------------------------------------------------------------------------- // wxDataViewCtrl //----------------------------------------------------------------------------- -WX_DEFINE_LIST(wxDataViewColumnList); +WX_DEFINE_LIST(wxDataViewColumnList) IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl, wxDataViewCtrlBase) @@ -3667,7 +3641,7 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, long style, const wxValidator& validator ) { if (!wxControl::Create( parent, id, pos, size, - style | wxScrolledWindowStyle|wxSUNKEN_BORDER, validator)) + style | wxScrolledWindowStyle|wxBORDER_SUNKEN, validator)) return false; SetInitialSize(size);