From a95e38c03464c854af73b960b17db12624bd8f8c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 2 Mar 2000 00:58:11 +0000 Subject: [PATCH] 1. wxGrid row can't be resized to less than minimal height 2. memory leaks fixed in wxHashTableLong 3. and in wxGrid 4. changed newgrid sample to use char buffers 5. fixed double clicking owner-drawn buttons 6. compilation fix in enhmeta.cpp for !wxUSE_DND 7. bug introduced earlier today in wxGridCellAttr::GetEditor() fixed 8. bool renderer/editor now look as good as I may ever make them look good under MSW git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6391 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/hash.h | 1 + include/wx/msw/private.h | 11 ++++++ src/common/hash.cpp | 5 +++ src/generic/grid.cpp | 81 +++++++++++++++++++++------------------- src/msw/button.cpp | 10 ++++- src/msw/checkbox.cpp | 12 +++--- src/msw/enhmeta.cpp | 4 ++ src/msw/treectrl.cpp | 4 -- src/msw/window.cpp | 4 -- 9 files changed, 79 insertions(+), 53 deletions(-) diff --git a/include/wx/hash.h b/include/wx/hash.h index 4320f720c8..cf10d040c8 100644 --- a/include/wx/hash.h +++ b/include/wx/hash.h @@ -80,6 +80,7 @@ class WXDLLEXPORT wxHashTableLong : public wxObject { public: wxHashTableLong(size_t size = wxHASH_SIZE_DEFAULT) { Init(size); } + virtual ~wxHashTableLong(); void Create(size_t size = wxHASH_SIZE_DEFAULT); void Destroy(); diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index 6ed5fcb913..b9e0c1829b 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -256,6 +256,17 @@ extern HBITMAP wxInvertMask(HBITMAP hbmpMask, int w = 0, int h = 0); #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) #endif // GET_X_LPARAM +// get the current state of SHIFT/CTRL keys +extern inline bool wxIsShiftDown() +{ + return (::GetKeyState(VK_SHIFT) & 0x100) != 0; +} + +extern inline bool wxIsCtrlDown() +{ + return (::GetKeyState(VK_CONTROL) & 0x100) != 0; +} + // --------------------------------------------------------------------------- // small helper classes // --------------------------------------------------------------------------- diff --git a/src/common/hash.cpp b/src/common/hash.cpp index 1aa13adf84..78e1c6039d 100644 --- a/src/common/hash.cpp +++ b/src/common/hash.cpp @@ -123,6 +123,11 @@ wxNodeBase *wxHashTableBase::GetNode(long key, long value) const // wxHashTableLong // ---------------------------------------------------------------------------- +wxHashTableLong::~wxHashTableLong() +{ + Destroy(); +} + void wxHashTableLong::Init(size_t size) { m_hashSize = size; diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index dce4f7b9c8..9eced764e0 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -914,8 +914,8 @@ void wxGridCellBoolEditor::SetSize(const wxRect& r) // so shift it to the right size.x -= 8; #elif defined(__WXMSW__) - // here too... - size.x -= 6; + // here too, but in other way + size.x += 1; size.y -= 2; #endif @@ -1457,11 +1457,7 @@ wxSize wxGridCellBoolRenderer::ms_sizeCheckMark; // FIXME these checkbox size calculations are really ugly... // between checkmark and box -#ifdef __WXGTK__ - static const wxCoord wxGRID_CHECKMARK_MARGIN = 4; -#else - static const wxCoord wxGRID_CHECKMARK_MARGIN = 2; -#endif +static const wxCoord wxGRID_CHECKMARK_MARGIN = 2; wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid, wxGridCellAttr& WXUNUSED(attr), @@ -1476,7 +1472,7 @@ wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid, wxCoord checkSize = 0; wxCheckBox *checkbox = new wxCheckBox(&grid, -1, wxEmptyString); wxSize size = checkbox->GetBestSize(); - checkSize = size.y + wxGRID_CHECKMARK_MARGIN; + checkSize = size.y + 2*wxGRID_CHECKMARK_MARGIN; // FIXME wxGTK::wxCheckBox::GetBestSize() gives "wrong" result #if defined(__WXGTK__) || defined(__WXMOTIF__) @@ -1512,22 +1508,11 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid, } // draw a border around checkmark - wxRect rectMark; - rectMark.x = rect.x + rect.width/2 - size.x/2; - rectMark.y = rect.y + rect.height/2 - size.y/2; - rectMark.width = size.x; - rectMark.height = size.y; - - dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.SetPen(wxPen(attr.GetTextColour(), 1, wxSOLID)); - dc.DrawRectangle(rectMark); - - rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN); - -#ifdef __WXMSW__ - // looks nicer under MSW - rectMark.x++; -#endif // MSW + wxRect rectBorder; + rectBorder.x = rect.x + rect.width/2 - size.x/2; + rectBorder.y = rect.y + rect.height/2 - size.y/2; + rectBorder.width = size.x; + rectBorder.height = size.y; bool value; if ( grid.GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL) ) @@ -1537,9 +1522,23 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid, if ( value ) { + wxRect rectMark = rectBorder; +#ifdef __WXMSW__ + // MSW DrawCheckMark() is weird (and should probably be changed...) + rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN/2); + rectMark.x++; + rectMark.y++; +#else // !MSW + rectMark.Inflate(-wxGRID_CHECKMARK_MARGIN); +#endif // MSW/!MSW + dc.SetTextForeground(attr.GetTextColour()); dc.DrawCheckMark(rectMark); } + + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.SetPen(wxPen(attr.GetTextColour(), 1, wxSOLID)); + dc.DrawRectangle(rectBorder); } // ---------------------------------------------------------------------------- @@ -1689,8 +1688,8 @@ wxGridCellEditor* wxGridCellAttr::GetEditor(wxGrid* grid, int row, int col) cons editor->IncRef(); } - if ( grid ) // get renderer for the data type - editor = grid->GetDefaultEditorForCell(row, col); + if ( !editor && grid ) // get renderer for the data type + editor = grid->GetDefaultEditorForCell(row, col); if ( !editor ) // if we still don't have one then use the grid default @@ -1855,8 +1854,8 @@ wxGridCellAttr *wxGridRowOrColAttrData::GetAttr(int rowOrCol) const void wxGridRowOrColAttrData::SetAttr(wxGridCellAttr *attr, int rowOrCol) { - int n = m_rowsOrCols.Index(rowOrCol); - if ( n == wxNOT_FOUND ) + int i = m_rowsOrCols.Index(rowOrCol); + if ( i == wxNOT_FOUND ) { // add the attribute m_rowsOrCols.Add(rowOrCol); @@ -1864,17 +1863,19 @@ void wxGridRowOrColAttrData::SetAttr(wxGridCellAttr *attr, int rowOrCol) } else { + size_t n = (size_t)i; if ( attr ) { // change the attribute - m_attrs[(size_t)n] = attr; + m_attrs[n]->DecRef(); + m_attrs[n] = attr; } else { // remove this attribute - m_attrs[(size_t)n]->DecRef(); - m_rowsOrCols.RemoveAt((size_t)n); - m_attrs.RemoveAt((size_t)n); + m_attrs[n]->DecRef(); + m_rowsOrCols.RemoveAt(n); + m_attrs.RemoveAt(n); } } } @@ -2121,8 +2122,6 @@ int wxGridTypeRegistry::FindOrCloneDataType(const wxString& typeName) editor->SetParameters(params); // register the new typename - renderer->IncRef(); - editor->IncRef(); RegisterDataType(typeName, renderer, editor); // we just registered it, it's the last one @@ -4254,7 +4253,8 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) wxClientDC dc( m_gridWin ); PrepareDC( dc ); - y = wxMax( y, GetRowTop(m_dragRowOrCol) + WXGRID_MIN_ROW_HEIGHT ); + y = wxMax( y, GetRowTop(m_dragRowOrCol) + + GetRowMinimalHeight(m_dragRowOrCol) ); dc.SetLogicalFunction(wxINVERT); if ( m_dragLastPos >= 0 ) { @@ -7257,7 +7257,9 @@ void wxGrid::AutoSizeColOrRow( int colOrRow, bool setAsMin, bool column ) { wxClientDC dc(m_gridWin); - int row, col; + // init both of them to avoid compiler warnings, even if weo nly need one + int row = -1, + col = -1; if ( column ) col = colOrRow; else @@ -7312,8 +7314,11 @@ void wxGrid::AutoSizeColOrRow( int colOrRow, bool setAsMin, bool column ) } else { - // leave some space around text - extentMax += 10; + if ( column ) + { + // leave some space around text + extentMax += 10; + } } if ( column ) diff --git a/src/msw/button.cpp b/src/msw/button.cpp index 28dfc634da..64e3c798a2 100644 --- a/src/msw/button.cpp +++ b/src/msw/button.cpp @@ -237,8 +237,9 @@ bool wxButton::MSWCommand(WXUINT param, WXWORD id) bool processed = FALSE; switch ( param ) { - case 1: // means that the message came from an accelerator - case BN_CLICKED: + case 1: // message came from an accelerator + case BN_CLICKED: // normal buttons send this + case BN_DOUBLECLICKED: // owner-drawn ones also send this processed = SendClickEvent(); break; } @@ -256,6 +257,11 @@ long wxButton::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) // let the default processign take place too } + else if ( nMsg == WM_LBUTTONDBLCLK ) + { + // trick the base class into thinking that this was just a click + nMsg = WM_LBUTTONDOWN; + } // let the base class do all real processing return wxControl::MSWWindowProc(nMsg, wParam, lParam); diff --git a/src/msw/checkbox.cpp b/src/msw/checkbox.cpp index 97b471a1e3..04856bb161 100644 --- a/src/msw/checkbox.cpp +++ b/src/msw/checkbox.cpp @@ -145,6 +145,8 @@ void wxCheckBox::SetLabel(const wxString& label) SetWindowText(GetHwnd(), label); } +#define CHECK_SIZE 13 + wxSize wxCheckBox::DoGetBestSize() const { int wCheckbox, hCheckbox; @@ -154,15 +156,15 @@ wxSize wxCheckBox::DoGetBestSize() const if ( !str.IsEmpty() ) { GetTextExtent(str, &wCheckbox, &hCheckbox); - wCheckbox += RADIO_SIZE; + wCheckbox += CHECK_SIZE; - if ( hCheckbox < RADIO_SIZE ) - hCheckbox = RADIO_SIZE; + if ( hCheckbox < CHECK_SIZE ) + hCheckbox = CHECK_SIZE; } else { - wCheckbox = RADIO_SIZE; - hCheckbox = RADIO_SIZE; + wCheckbox = CHECK_SIZE; + hCheckbox = CHECK_SIZE; } return wxSize(wCheckbox, hCheckbox); diff --git a/src/msw/enhmeta.cpp b/src/msw/enhmeta.cpp index 0fd8b2d9af..5ce1e70d94 100644 --- a/src/msw/enhmeta.cpp +++ b/src/msw/enhmeta.cpp @@ -164,9 +164,13 @@ wxSize wxEnhMetaFile::GetSize() const bool wxEnhMetaFile::SetClipboard(int WXUNUSED(width), int WXUNUSED(height)) { +#if wxUSE_DRAG_AND_DROP wxCHECK_MSG( m_hMF, FALSE, _T("can't copy invalid metafile to clipboard") ); return wxTheClipboard->AddData(new wxEnhMetaFileDataObject(*this)); +#else // !wxUSE_DRAG_AND_DROP + wxFAIL_MSG(_T("not implemented")); +#endif // wxUSE_DRAG_AND_DROP/!wxUSE_DRAG_AND_DROP } // ---------------------------------------------------------------------------- diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index 63f54e57d3..bf062b7115 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -86,10 +86,6 @@ // looks quite ugly. #define wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE 0 -// from msw/window.cpp -extern bool wxIsShiftDown(); -extern bool wxIsCtrlDown(); - // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- diff --git a/src/msw/window.cpp b/src/msw/window.cpp index e0ca05bd88..3f8c4085f7 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -129,10 +129,6 @@ wxWindow *wxFindWinFromHandle(WXHWND hWnd); // mouse clicks static void TranslateKbdEventToMouse(wxWindow *win, int *x, int *y, WPARAM *flags); -// get the current state of SHIFT/CTRL keys -inline bool wxIsShiftDown() { return (GetKeyState(VK_SHIFT) & 0x100) != 0; } -inline bool wxIsCtrlDown() { return (GetKeyState(VK_CONTROL) & 0x100) != 0; } - // --------------------------------------------------------------------------- // event tables // --------------------------------------------------------------------------- -- 2.45.2