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
This commit is contained in:
Vadim Zeitlin
2000-03-02 00:58:11 +00:00
parent bc9027cc74
commit a95e38c034
9 changed files with 79 additions and 53 deletions

View File

@@ -80,6 +80,7 @@ class WXDLLEXPORT wxHashTableLong : public wxObject
{ {
public: public:
wxHashTableLong(size_t size = wxHASH_SIZE_DEFAULT) { Init(size); } wxHashTableLong(size_t size = wxHASH_SIZE_DEFAULT) { Init(size); }
virtual ~wxHashTableLong();
void Create(size_t size = wxHASH_SIZE_DEFAULT); void Create(size_t size = wxHASH_SIZE_DEFAULT);
void Destroy(); void Destroy();

View File

@@ -256,6 +256,17 @@ extern HBITMAP wxInvertMask(HBITMAP hbmpMask, int w = 0, int h = 0);
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
#endif // GET_X_LPARAM #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 // small helper classes
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@@ -123,6 +123,11 @@ wxNodeBase *wxHashTableBase::GetNode(long key, long value) const
// wxHashTableLong // wxHashTableLong
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
wxHashTableLong::~wxHashTableLong()
{
Destroy();
}
void wxHashTableLong::Init(size_t size) void wxHashTableLong::Init(size_t size)
{ {
m_hashSize = size; m_hashSize = size;

View File

@@ -914,8 +914,8 @@ void wxGridCellBoolEditor::SetSize(const wxRect& r)
// so shift it to the right // so shift it to the right
size.x -= 8; size.x -= 8;
#elif defined(__WXMSW__) #elif defined(__WXMSW__)
// here too... // here too, but in other way
size.x -= 6; size.x += 1;
size.y -= 2; size.y -= 2;
#endif #endif
@@ -1457,11 +1457,7 @@ wxSize wxGridCellBoolRenderer::ms_sizeCheckMark;
// FIXME these checkbox size calculations are really ugly... // FIXME these checkbox size calculations are really ugly...
// between checkmark and box // between checkmark and box
#ifdef __WXGTK__ static const wxCoord wxGRID_CHECKMARK_MARGIN = 2;
static const wxCoord wxGRID_CHECKMARK_MARGIN = 4;
#else
static const wxCoord wxGRID_CHECKMARK_MARGIN = 2;
#endif
wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid, wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid,
wxGridCellAttr& WXUNUSED(attr), wxGridCellAttr& WXUNUSED(attr),
@@ -1476,7 +1472,7 @@ wxSize wxGridCellBoolRenderer::GetBestSize(wxGrid& grid,
wxCoord checkSize = 0; wxCoord checkSize = 0;
wxCheckBox *checkbox = new wxCheckBox(&grid, -1, wxEmptyString); wxCheckBox *checkbox = new wxCheckBox(&grid, -1, wxEmptyString);
wxSize size = checkbox->GetBestSize(); wxSize size = checkbox->GetBestSize();
checkSize = size.y + wxGRID_CHECKMARK_MARGIN; checkSize = size.y + 2*wxGRID_CHECKMARK_MARGIN;
// FIXME wxGTK::wxCheckBox::GetBestSize() gives "wrong" result // FIXME wxGTK::wxCheckBox::GetBestSize() gives "wrong" result
#if defined(__WXGTK__) || defined(__WXMOTIF__) #if defined(__WXGTK__) || defined(__WXMOTIF__)
@@ -1512,22 +1508,11 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid,
} }
// draw a border around checkmark // draw a border around checkmark
wxRect rectMark; wxRect rectBorder;
rectMark.x = rect.x + rect.width/2 - size.x/2; rectBorder.x = rect.x + rect.width/2 - size.x/2;
rectMark.y = rect.y + rect.height/2 - size.y/2; rectBorder.y = rect.y + rect.height/2 - size.y/2;
rectMark.width = size.x; rectBorder.width = size.x;
rectMark.height = size.y; rectBorder.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
bool value; bool value;
if ( grid.GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL) ) if ( grid.GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL) )
@@ -1537,9 +1522,23 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid,
if ( value ) 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.SetTextForeground(attr.GetTextColour());
dc.DrawCheckMark(rectMark); 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(); editor->IncRef();
} }
if ( grid ) // get renderer for the data type if ( !editor && grid ) // get renderer for the data type
editor = grid->GetDefaultEditorForCell(row, col); editor = grid->GetDefaultEditorForCell(row, col);
if ( !editor ) if ( !editor )
// if we still don't have one then use the grid default // 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) void wxGridRowOrColAttrData::SetAttr(wxGridCellAttr *attr, int rowOrCol)
{ {
int n = m_rowsOrCols.Index(rowOrCol); int i = m_rowsOrCols.Index(rowOrCol);
if ( n == wxNOT_FOUND ) if ( i == wxNOT_FOUND )
{ {
// add the attribute // add the attribute
m_rowsOrCols.Add(rowOrCol); m_rowsOrCols.Add(rowOrCol);
@@ -1864,17 +1863,19 @@ void wxGridRowOrColAttrData::SetAttr(wxGridCellAttr *attr, int rowOrCol)
} }
else else
{ {
size_t n = (size_t)i;
if ( attr ) if ( attr )
{ {
// change the attribute // change the attribute
m_attrs[(size_t)n] = attr; m_attrs[n]->DecRef();
m_attrs[n] = attr;
} }
else else
{ {
// remove this attribute // remove this attribute
m_attrs[(size_t)n]->DecRef(); m_attrs[n]->DecRef();
m_rowsOrCols.RemoveAt((size_t)n); m_rowsOrCols.RemoveAt(n);
m_attrs.RemoveAt((size_t)n); m_attrs.RemoveAt(n);
} }
} }
} }
@@ -2121,8 +2122,6 @@ int wxGridTypeRegistry::FindOrCloneDataType(const wxString& typeName)
editor->SetParameters(params); editor->SetParameters(params);
// register the new typename // register the new typename
renderer->IncRef();
editor->IncRef();
RegisterDataType(typeName, renderer, editor); RegisterDataType(typeName, renderer, editor);
// we just registered it, it's the last one // we just registered it, it's the last one
@@ -4254,7 +4253,8 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
wxClientDC dc( m_gridWin ); wxClientDC dc( m_gridWin );
PrepareDC( dc ); PrepareDC( dc );
y = wxMax( y, GetRowTop(m_dragRowOrCol) + WXGRID_MIN_ROW_HEIGHT ); y = wxMax( y, GetRowTop(m_dragRowOrCol) +
GetRowMinimalHeight(m_dragRowOrCol) );
dc.SetLogicalFunction(wxINVERT); dc.SetLogicalFunction(wxINVERT);
if ( m_dragLastPos >= 0 ) if ( m_dragLastPos >= 0 )
{ {
@@ -7257,7 +7257,9 @@ void wxGrid::AutoSizeColOrRow( int colOrRow, bool setAsMin, bool column )
{ {
wxClientDC dc(m_gridWin); 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 ) if ( column )
col = colOrRow; col = colOrRow;
else else
@@ -7312,8 +7314,11 @@ void wxGrid::AutoSizeColOrRow( int colOrRow, bool setAsMin, bool column )
} }
else else
{ {
// leave some space around text if ( column )
extentMax += 10; {
// leave some space around text
extentMax += 10;
}
} }
if ( column ) if ( column )

View File

@@ -237,8 +237,9 @@ bool wxButton::MSWCommand(WXUINT param, WXWORD id)
bool processed = FALSE; bool processed = FALSE;
switch ( param ) switch ( param )
{ {
case 1: // means that the message came from an accelerator case 1: // message came from an accelerator
case BN_CLICKED: case BN_CLICKED: // normal buttons send this
case BN_DOUBLECLICKED: // owner-drawn ones also send this
processed = SendClickEvent(); processed = SendClickEvent();
break; break;
} }
@@ -256,6 +257,11 @@ long wxButton::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
// let the default processign take place too // 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 // let the base class do all real processing
return wxControl::MSWWindowProc(nMsg, wParam, lParam); return wxControl::MSWWindowProc(nMsg, wParam, lParam);

View File

@@ -145,6 +145,8 @@ void wxCheckBox::SetLabel(const wxString& label)
SetWindowText(GetHwnd(), label); SetWindowText(GetHwnd(), label);
} }
#define CHECK_SIZE 13
wxSize wxCheckBox::DoGetBestSize() const wxSize wxCheckBox::DoGetBestSize() const
{ {
int wCheckbox, hCheckbox; int wCheckbox, hCheckbox;
@@ -154,15 +156,15 @@ wxSize wxCheckBox::DoGetBestSize() const
if ( !str.IsEmpty() ) if ( !str.IsEmpty() )
{ {
GetTextExtent(str, &wCheckbox, &hCheckbox); GetTextExtent(str, &wCheckbox, &hCheckbox);
wCheckbox += RADIO_SIZE; wCheckbox += CHECK_SIZE;
if ( hCheckbox < RADIO_SIZE ) if ( hCheckbox < CHECK_SIZE )
hCheckbox = RADIO_SIZE; hCheckbox = CHECK_SIZE;
} }
else else
{ {
wCheckbox = RADIO_SIZE; wCheckbox = CHECK_SIZE;
hCheckbox = RADIO_SIZE; hCheckbox = CHECK_SIZE;
} }
return wxSize(wCheckbox, hCheckbox); return wxSize(wCheckbox, hCheckbox);

View File

@@ -164,9 +164,13 @@ wxSize wxEnhMetaFile::GetSize() const
bool wxEnhMetaFile::SetClipboard(int WXUNUSED(width), int WXUNUSED(height)) 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") ); wxCHECK_MSG( m_hMF, FALSE, _T("can't copy invalid metafile to clipboard") );
return wxTheClipboard->AddData(new wxEnhMetaFileDataObject(*this)); 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
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -86,10 +86,6 @@
// looks quite ugly. // looks quite ugly.
#define wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE 0 #define wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE 0
// from msw/window.cpp
extern bool wxIsShiftDown();
extern bool wxIsCtrlDown();
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// private functions // private functions
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -129,10 +129,6 @@ wxWindow *wxFindWinFromHandle(WXHWND hWnd);
// mouse clicks // mouse clicks
static void TranslateKbdEventToMouse(wxWindow *win, int *x, int *y, WPARAM *flags); 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 // event tables
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------