X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/22f3361e1cf25c52a2da8fdfc5cb081809e18fb9..08af0d25f9d74cfd380975acfd3d61573d92c4c9:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 47a7c9a1e7..e4559c6849 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -923,7 +923,7 @@ void wxGridCellNumberEditor::StartingKey(wxKeyEvent& event) { if ( !HasRange() ) { - int keycode = (int) event.KeyCode(); + int keycode = event.GetKeyCode(); if ( isdigit(keycode) || keycode == '+' || keycode == '-' || keycode == WXK_NUMPAD0 || keycode == WXK_NUMPAD1 @@ -1063,7 +1063,7 @@ void wxGridCellFloatEditor::Reset() void wxGridCellFloatEditor::StartingKey(wxKeyEvent& event) { - int keycode = (int)event.KeyCode(); + int keycode = event.GetKeyCode(); if ( isdigit(keycode) || keycode == '+' || keycode == '-' || keycode == '.' || keycode == WXK_NUMPAD0 || keycode == WXK_NUMPAD1 @@ -1238,14 +1238,14 @@ void wxGridCellBoolEditor::SetSize(const wxRect& r) int vAlign = wxALIGN_CENTRE; if (GetCellAttr()) GetCellAttr()->GetAlignment(& hAlign, & vAlign); - + int x = 0, y = 0; if (hAlign == wxALIGN_LEFT) { x = r.x + 2; #ifdef __WXMSW__ x += 2; -#endif +#endif y = r.y + r.height/2 - size.y/2; } else if (hAlign == wxALIGN_RIGHT) @@ -1258,7 +1258,7 @@ void wxGridCellBoolEditor::SetSize(const wxRect& r) x = r.x + r.width/2 - size.x/2; y = r.y + r.height/2 - size.y/2; } - + m_control->Move(x, y); } @@ -1495,7 +1495,7 @@ wxString wxGridCellChoiceEditor::GetValue() const void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event) { - switch ( event.KeyCode() ) + switch ( event.GetKeyCode() ) { case WXK_ESCAPE: m_editor->Reset(); @@ -1520,7 +1520,7 @@ void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event) void wxGridCellEditorEvtHandler::OnChar(wxKeyEvent& event) { - switch ( event.KeyCode() ) + switch ( event.GetKeyCode() ) { case WXK_ESCAPE: case WXK_TAB: @@ -1575,7 +1575,7 @@ void wxGridCellRenderer::Draw(wxGrid& grid, { dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) ); } - } + } else { dc.SetBrush(wxBrush(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE), wxSOLID)); @@ -1995,7 +1995,7 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid, // draw a border around checkmark int vAlign, hAlign; attr.GetAlignment(& hAlign, &vAlign); - + wxRect rectBorder; if (hAlign == wxALIGN_CENTRE) { @@ -2009,14 +2009,14 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid, rectBorder.x = rect.x + 2; rectBorder.y = rect.y + rect.height/2 - size.y/2; rectBorder.width = size.x; - rectBorder.height = size.y; + rectBorder.height = size.y; } else if (hAlign == wxALIGN_RIGHT) { rectBorder.x = rect.x + rect.width - size.x - 2; rectBorder.y = rect.y + rect.height/2 - size.y/2; rectBorder.width = size.x; - rectBorder.height = size.y; + rectBorder.height = size.y; } bool value; @@ -3963,14 +3963,14 @@ void wxGrid::Init() // TODO: something better than this ? // m_labelFont = this->GetFont(); -// m_labelFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); -// m_labelFont.SetWeight( m_labelFont.GetWeight() + 2 ); + m_labelFont.SetWeight( wxBOLD ); m_rowLabelHorizAlign = wxALIGN_CENTRE; m_rowLabelVertAlign = wxALIGN_CENTRE; m_colLabelHorizAlign = wxALIGN_CENTRE; m_colLabelVertAlign = wxALIGN_CENTRE; + m_colLabelTextOrientation = wxHORIZONTAL; m_defaultColWidth = WXGRID_DEFAULT_COL_WIDTH; m_defaultRowHeight = m_gridWin->GetCharHeight(); @@ -4006,10 +4006,8 @@ void wxGrid::Init() m_selectingTopLeft = wxGridNoCellCoords; m_selectingBottomRight = wxGridNoCellCoords; -// m_selectionBackground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); -// m_selectionForeground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); - m_selectionBackground = *wxBLACK; - m_selectionForeground = *wxWHITE; + m_selectionBackground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); + m_selectionForeground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); m_editable = TRUE; // default for whole grid @@ -4793,11 +4791,20 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) // else if (event.LeftDClick() ) { - if ( YToEdgeOfRow(y) < 0 ) + int row = YToEdgeOfRow(y); + if ( row < 0 ) { row = YToRow(y); SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, row, -1, event ); } + else + { + // adjust row height depending on label text + AutoSizeRowLabelSize( row ); + + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_colLabelWin); + m_dragLastPos = -1; + } } @@ -4999,11 +5006,20 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) // if ( event.LeftDClick() ) { - if ( XToEdgeOfCol(x) < 0 ) + int col = XToEdgeOfCol(x); + if ( col < 0 ) { col = XToCol(x); SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, -1, col, event ); } + else + { + // adjust column width depending on label text + AutoSizeColLabelSize( col ); + + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_colLabelWin); + m_dragLastPos = -1; + } } @@ -6083,7 +6099,7 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) // try local handlers // - switch ( event.KeyCode() ) + switch ( event.GetKeyCode() ) { case WXK_UP: if ( event.ControlDown() ) @@ -6248,7 +6264,7 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) // is special and will always start editing, for // other keys - ask the editor itself - if ( (event.KeyCode() == WXK_F2 && !event.HasModifiers()) + if ( (event.GetKeyCode() == WXK_F2 && !event.HasModifiers()) || editor->IsAcceptedKey(event) ) { // ensure cell is visble @@ -6286,7 +6302,7 @@ void wxGrid::OnKeyUp( wxKeyEvent& event ) { // try local handlers // - if ( event.KeyCode() == WXK_SHIFT ) + if ( event.GetKeyCode() == WXK_SHIFT ) { if ( m_selectingTopLeft != wxGridNoCellCoords && m_selectingBottomRight != wxGridNoCellCoords ) @@ -7066,99 +7082,130 @@ void wxGrid::DrawColLabel( wxDC& dc, int col ) dc.SetTextForeground( GetLabelTextColour() ); dc.SetFont( GetLabelFont() ); - dc.SetBackgroundMode( wxTRANSPARENT ); - dc.SetTextForeground( GetLabelTextColour() ); - dc.SetFont( GetLabelFont() ); - - int hAlign, vAlign; + int hAlign, vAlign, orient; GetColLabelAlignment( &hAlign, &vAlign ); + orient = GetColLabelTextOrientation(); wxRect rect; rect.SetX( colLeft + 2 ); rect.SetY( 2 ); rect.SetWidth( GetColWidth(col) - 4 ); rect.SetHeight( m_colLabelHeight - 4 ); - DrawTextRectangle( dc, GetColLabelValue( col ), rect, hAlign, vAlign ); + DrawTextRectangle( dc, GetColLabelValue( col ), rect, hAlign, vAlign, orient ); } void wxGrid::DrawTextRectangle( wxDC& dc, const wxString& value, const wxRect& rect, int horizAlign, - int vertAlign ) + int vertAlign, + int textOrientation ) { wxArrayString lines; - + StringToLines( value, lines ); - - + + //Forward to new API. DrawTextRectangle( dc, - lines, - rect, - horizAlign, - vertAlign ); - + lines, + rect, + horizAlign, + vertAlign, + textOrientation ); + } void wxGrid::DrawTextRectangle( wxDC& dc, - const wxArrayString& lines, - const wxRect& rect, - int horizAlign, - int vertAlign ) + const wxArrayString& lines, + const wxRect& rect, + int horizAlign, + int vertAlign, + int textOrientation ) { long textWidth, textHeight; long lineWidth, lineHeight; int nLines; - + dc.SetClippingRegion( rect ); - + nLines = lines.GetCount(); if( nLines > 0 ) { - int l; - float x, y; - GetTextBoxSize(dc, lines, &textWidth, &textHeight); - switch( vertAlign ) - { + int l; + float x = 0.0, y = 0.0; + + if( textOrientation == wxHORIZONTAL ) + GetTextBoxSize(dc, lines, &textWidth, &textHeight); + else + GetTextBoxSize( dc, lines, &textHeight, &textWidth ); + + switch( vertAlign ) + { case wxALIGN_BOTTOM: - y = rect.y + (rect.height - textHeight - 1); - break; - + if( textOrientation == wxHORIZONTAL ) + y = rect.y + (rect.height - textHeight - 1); + else + x = rect.x + rect.width - textWidth; + break; + case wxALIGN_CENTRE: - y = rect.y + ((rect.height - textHeight)/2); - break; - + if( textOrientation == wxHORIZONTAL ) + y = rect.y + ((rect.height - textHeight)/2); + else + x = rect.x + ((rect.width - textWidth)/2); + break; + case wxALIGN_TOP: default: - y = rect.y + 1; - break; - } - - // Align each line of a multi-line label - for( l = 0; l < nLines; l++ ) - { - dc.GetTextExtent(lines[l], &lineWidth, &lineHeight); - - switch( horizAlign ) - { - case wxALIGN_RIGHT: - x = rect.x + (rect.width - lineWidth - 1); - break; - - case wxALIGN_CENTRE: - x = rect.x + ((rect.width - lineWidth)/2); - break; - - case wxALIGN_LEFT: - default: - x = rect.x + 1; + if( textOrientation == wxHORIZONTAL ) + y = rect.y + 1; + else + x = rect.x + 1; break; } - - dc.DrawText( lines[l], (int)x, (int)y ); - y += lineHeight; - } + + // Align each line of a multi-line label + for( l = 0; l < nLines; l++ ) + { + dc.GetTextExtent(lines[l], &lineWidth, &lineHeight); + + switch( horizAlign ) + { + case wxALIGN_RIGHT: + if( textOrientation == wxHORIZONTAL ) + x = rect.x + (rect.width - lineWidth - 1); + else + y = rect.y + lineWidth + 1; + break; + + case wxALIGN_CENTRE: + if( textOrientation == wxHORIZONTAL ) + x = rect.x + ((rect.width - lineWidth)/2); + else + y = rect.y + rect.height - ((rect.height - lineWidth)/2); + break; + + case wxALIGN_LEFT: + default: + if( textOrientation == wxHORIZONTAL ) + x = rect.x + 1; + else + y = rect.y + rect.height - 1; + break; + } + + if( textOrientation == wxHORIZONTAL ) + { + dc.DrawText( lines[l], (int)x, (int)y ); + y += lineHeight; + } + else + { + dc.DrawRotatedText( lines[l], (int)x, (int)y, 90.0 ); + x += lineHeight; + } + } } dc.DestroyClippingRegion(); } @@ -8276,6 +8323,11 @@ void wxGrid::GetColLabelAlignment( int *horiz, int *vert ) *vert = m_colLabelVertAlign; } +int wxGrid::GetColLabelTextOrientation() +{ + return m_colLabelTextOrientation; +} + wxString wxGrid::GetRowLabelValue( int row ) { if ( m_table ) @@ -8458,6 +8510,26 @@ void wxGrid::SetColLabelAlignment( int horiz, int vert ) } } +// Note: under MSW, the default column label font must be changed because it +// does not support vertical printing +// +// Example: wxFont font(9, wxSWISS, wxNORMAL, wxBOLD); +// pGrid->SetLabelFont(font); +// pGrid->SetColLabelTextOrientation(wxVERTICAL); +// +void wxGrid::SetColLabelTextOrientation( int textOrientation ) +{ + if( textOrientation == wxHORIZONTAL || textOrientation == wxVERTICAL ) + { + m_colLabelTextOrientation = textOrientation; + } + + if ( !GetBatchCount() ) + { + m_colLabelWin->Refresh(); + } +} + void wxGrid::SetRowLabelValue( int row, const wxString& s ) { if ( m_table ) @@ -9329,7 +9401,11 @@ void wxGrid::AutoSizeColOrRow( int colOrRow, bool setAsMin, bool column ) dc.SetFont( GetLabelFont() ); if ( column ) + { dc.GetTextExtent( GetColLabelValue(col), &w, &h ); + if( GetColLabelTextOrientation() == wxVERTICAL ) + w = h; + } else dc.GetTextExtent( GetRowLabelValue(row), &w, &h ); @@ -9514,6 +9590,55 @@ void wxGrid::AutoSize() SetClientSize(sizeFit); } +void wxGrid::AutoSizeRowLabelSize( int row ) +{ + wxArrayString lines; + long w, h; + + // Hide the edit control, so it + // won't interfer with drag-shrinking. + if( IsCellEditControlShown() ) + { + HideCellEditControl(); + SaveEditControlValue(); + } + + // autosize row height depending on label text + StringToLines( GetRowLabelValue( row ), lines ); + wxClientDC dc( m_rowLabelWin ); + GetTextBoxSize( dc, lines, &w, &h); + if( h < m_defaultRowHeight ) + h = m_defaultRowHeight; + SetRowSize(row, h); + ForceRefresh(); +} + +void wxGrid::AutoSizeColLabelSize( int col ) +{ + wxArrayString lines; + long w, h; + + // Hide the edit control, so it + // won't interfer with drag-shrinking. + if( IsCellEditControlShown() ) + { + HideCellEditControl(); + SaveEditControlValue(); + } + + // autosize column width depending on label text + StringToLines( GetColLabelValue( col ), lines ); + wxClientDC dc( m_colLabelWin ); + if( GetColLabelTextOrientation() == wxHORIZONTAL ) + GetTextBoxSize( dc, lines, &w, &h); + else + GetTextBoxSize( dc, lines, &h, &w); + if( w < m_defaultColWidth ) + w = m_defaultColWidth; + SetColSize(col, w); + ForceRefresh(); +} + wxSize wxGrid::DoGetBestSize() const { // don't set sizes, only calculate them