X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/12a3f2275c94a345cf83abf5151db68391859623..236de6f62add164687ca8461c3e1aa147598909d:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index a3390abd70..f60e2bced6 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -32,10 +32,6 @@ #if wxUSE_GRID -#if !defined(wxUSE_NEW_GRID) || !(wxUSE_NEW_GRID) - #include "gridg.cpp" -#else // wxUSE_NEW_GRID - #ifndef WX_PRECOMP #include "wx/utils.h" #include "wx/dcclient.h" @@ -3970,6 +3966,7 @@ void wxGrid::Init() m_colLabelHorizAlign = wxALIGN_CENTRE; m_colLabelVertAlign = wxALIGN_CENTRE; + m_colLabelTextOrientation = wxHORIZONTAL; m_defaultColWidth = WXGRID_DEFAULT_COL_WIDTH; m_defaultRowHeight = m_gridWin->GetCharHeight(); @@ -4005,10 +4002,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 @@ -4792,11 +4787,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; + } } @@ -4998,11 +5002,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; + } } @@ -5393,15 +5406,15 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) { if ( m_cursorMode == WXGRID_CURSOR_SELECT_CELL ) { + if (m_winCapture) + { + if (m_winCapture->HasCapture()) m_winCapture->ReleaseMouse(); + m_winCapture = NULL; + } + if ( m_selectingTopLeft != wxGridNoCellCoords && m_selectingBottomRight != wxGridNoCellCoords ) { - if (m_winCapture) - { - if (m_winCapture->HasCapture()) m_winCapture->ReleaseMouse(); - m_winCapture = NULL; - } - if ( m_selection ) { m_selection->SelectBlock( m_selectingTopLeft.GetRow(), @@ -7065,99 +7078,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(); } @@ -7954,7 +7998,7 @@ bool wxGrid::MovePageUp() int y = GetRowTop(row); int newRow = YToRow( y - ch + 1 ); - if ( newRow == -1 ) + if ( newRow < 0 ) { newRow = 0; } @@ -8275,6 +8319,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 ) @@ -8457,6 +8506,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 ) @@ -9328,7 +9397,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 ); @@ -9513,6 +9586,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 @@ -9905,7 +10027,5 @@ wxGridEditorCreatedEvent::wxGridEditorCreatedEvent(int id, wxEventType type, m_ctrl = ctrl; } - -#endif // !wxUSE_NEW_GRID/wxUSE_NEW_GRID - #endif // wxUSE_GRID +