wxGridCellCoords coords;
wxGridCellAttr *attr;
+
+// Cannot do this:
+// DECLARE_NO_COPY_CLASS(wxGridCellWithAttr)
+// without rewriting the macros, which require a public copy constructor.
};
WX_DECLARE_EXPORTED_OBJARRAY(wxGridCellWithAttr, wxGridCellWithAttrArray);
DECLARE_DYNAMIC_CLASS(wxGridRowLabelWindow)
DECLARE_EVENT_TABLE()
+ DECLARE_NO_COPY_CLASS(wxGridRowLabelWindow)
};
DECLARE_DYNAMIC_CLASS(wxGridColLabelWindow)
DECLARE_EVENT_TABLE()
+ DECLARE_NO_COPY_CLASS(wxGridColLabelWindow)
};
DECLARE_DYNAMIC_CLASS(wxGridCornerLabelWindow)
DECLARE_EVENT_TABLE()
+ DECLARE_NO_COPY_CLASS(wxGridCornerLabelWindow)
};
class WXDLLEXPORT wxGridWindow : public wxWindow
void ScrollWindow( int dx, int dy, const wxRect *rect );
+ wxGrid* GetOwner() { return m_owner; }
+
private:
wxGrid *m_owner;
wxGridRowLabelWindow *m_rowLabelWin;
DECLARE_DYNAMIC_CLASS(wxGridWindow)
DECLARE_EVENT_TABLE()
+ DECLARE_NO_COPY_CLASS(wxGridWindow)
};
wxGridCellEditor* m_editor;
DECLARE_DYNAMIC_CLASS(wxGridCellEditorEvtHandler)
DECLARE_EVENT_TABLE()
+ DECLARE_NO_COPY_CLASS(wxGridCellEditorEvtHandler)
};
wxString m_typeName;
wxGridCellRenderer* m_renderer;
wxGridCellEditor* m_editor;
+
+ DECLARE_NO_COPY_CLASS(wxGridDataTypeInfo)
};
wxGridCellEditor::wxGridCellEditor()
{
m_control = NULL;
+ m_attr = NULL;
}
{
// erase the background because we might not fill the cell
wxClientDC dc(m_control->GetParent());
+ wxGridWindow* gridWindow = wxDynamicCast(m_control->GetParent(), wxGridWindow);
+ if (gridWindow)
+ gridWindow->GetOwner()->PrepareDC(dc);
+
dc.SetPen(*wxTRANSPARENT_PEN);
dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID));
dc.DrawRectangle(rectCell);
}
}
-// DJC MAPTEK
// return the value in the text control
wxString wxGridCellTextEditor::GetValue() const
{
{
if ( !HasRange() )
{
- int keycode = (int) event.KeyCode();
+ int keycode = event.GetKeyCode();
if ( isdigit(keycode) || keycode == '+' || keycode == '-'
|| keycode == WXK_NUMPAD0
|| keycode == WXK_NUMPAD1
}
}
-// DJC MAPTEK
// return the value in the spin control if it is there (the text control otherwise)
wxString wxGridCellNumberEditor::GetValue() const
{
if( HasRange() )
{
- int value = Spin()->GetValue();
+ long value = Spin()->GetValue();
s.Printf(wxT("%ld"), value);
}
else
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
size.y -= 2;
#endif
- m_control->Move(r.x + r.width/2 - size.x/2, r.y + r.height/2 - size.y/2);
+ int hAlign = wxALIGN_CENTRE;
+ 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
+ y = r.y + r.height/2 - size.y/2;
+ }
+ else if (hAlign == wxALIGN_RIGHT)
+ {
+ x = r.x + r.width - size.x - 2;
+ y = r.y + r.height/2 - size.y/2;
+ }
+ else if (hAlign == wxALIGN_CENTRE)
+ {
+ x = r.x + r.width/2 - size.x/2;
+ y = r.y + r.height/2 - size.y/2;
+ }
+
+ m_control->Move(x, y);
}
void wxGridCellBoolEditor::Show(bool show, wxGridCellAttr *attr)
return FALSE;
}
-// DJC MAPTEK
+
// return the value as "1" for true and the empty string for false
wxString wxGridCellBoolEditor::GetValue() const
{
bool bSet = CBox()->GetValue();
- return bSet ? "1" : wxEmptyString;
+ return bSet ? _T("1") : wxEmptyString;
}
#endif // wxUSE_CHECKBOX
}
}
-// DJC MAPTEK
// return the value in the text control
wxString wxGridCellChoiceEditor::GetValue() const
{
return Combo()->GetValue();
}
+
#endif // wxUSE_COMBOBOX
// ----------------------------------------------------------------------------
void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event)
{
- switch ( event.KeyCode() )
+ switch ( event.GetKeyCode() )
{
case WXK_ESCAPE:
m_editor->Reset();
void wxGridCellEditorEvtHandler::OnChar(wxKeyEvent& event)
{
- switch ( event.KeyCode() )
+ switch ( event.GetKeyCode() )
{
case WXK_ESCAPE:
case WXK_TAB:
{
dc.SetBackgroundMode( wxSOLID );
-// DJC (MAPTEK) grey out fields if the grid is disabled
+ // grey out fields if the grid is disabled
if( grid.IsEnabled() )
{
if ( isSelected )
{
dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) );
}
- }
+ }
else
{
dc.SetBrush(wxBrush(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE), wxSOLID));
// TODO some special colours for attr.IsReadOnly() case?
- // DJC (MAPTEK) different coloured text when the grid is disabled
+ // different coloured text when the grid is disabled
if( grid.IsEnabled() )
{
if ( isSelected )
}
// draw a border around checkmark
+ int vAlign, hAlign;
+ attr.GetAlignment(& hAlign, &vAlign);
+
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;
+ if (hAlign == wxALIGN_CENTRE)
+ {
+ 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;
+ }
+ else if (hAlign == wxALIGN_LEFT)
+ {
+ rectBorder.x = rect.x + 2;
+ rectBorder.y = rect.y + rect.height/2 - size.y/2;
+ rectBorder.width = size.x;
+ 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;
+ }
bool value;
if ( grid.GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL) )
EVT_ERASE_BACKGROUND( wxGridWindow::OnEraseBackground )
END_EVENT_TABLE()
-// DJC (MAPTEK) 19-Jun-2001 use wxCLIP_CHILDREN as well
wxGridWindow::wxGridWindow( wxGrid *parent,
wxGridRowLabelWindow *rowLblWin,
wxGridColLabelWindow *colLblWin,
- wxWindowID id, const wxPoint &pos, const wxSize &size )
- : wxWindow( parent, id, pos, size, wxWANTS_CHARS|wxCLIP_CHILDREN, wxT("grid window") )
+ wxWindowID id,
+ const wxPoint &pos,
+ const wxSize &size )
+ : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxCLIP_CHILDREN,
+ wxT("grid window") )
{
m_owner = parent;
// 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();
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
int w = m_numCols > 0 ? GetColRight(m_numCols - 1) + m_extraWidth + 1 : 0;
int h = m_numRows > 0 ? GetRowBottom(m_numRows - 1) + m_extraHeight + 1 : 0;
-// DJC (MAPTEK) 19-Jun-2001 account for editor since it could possibly
-// be larger than the cell
// take into account editor if shown
if( IsCellEditControlShown() )
{
//
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;
+ }
}
//
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;
+ }
}
// try local handlers
//
- switch ( event.KeyCode() )
+ switch ( event.GetKeyCode() )
{
case WXK_UP:
if ( event.ControlDown() )
// <F2> 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) )
{
- // DJC MAPTEK - ensure cell is visble
+ // ensure cell is visble
MakeCellVisible(row, col);
EnableCellEditControl();
- // DJC MAPTEK - a problem can arise if the cell is not
- // completely visible (even after calling MakeCellVisible
- // the control is not created and calling StartingKey will
+
+ // a problem can arise if the cell is not completely
+ // visible (even after calling MakeCellVisible the
+ // control is not created and calling StartingKey will
// crash the app
if( editor->IsCreated() && m_cellEditCtrlEnabled ) editor->StartingKey(event);
}
{
// try local handlers
//
- if ( event.KeyCode() == WXK_SHIFT )
+ if ( event.GetKeyCode() == WXK_SHIFT )
{
if ( m_selectingTopLeft != wxGridNoCellCoords &&
m_selectingBottomRight != wxGridNoCellCoords )
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();
}
rect.SetRight(client_right-1);
}
-// DJC (MAPTEK) 19-Feb-2001 do set size prior to showing the control
+ editor->SetCellAttr(attr);
editor->SetSize( rect );
editor->Show( TRUE, attr );
-// DJC (MAPTEK) 19-Jun-2001 recalc dimensions in case we need to
-// expand the scrolled window to account for editor
+
+ // recalc dimensions in case we need to
+ // expand the scrolled window to account for editor
CalcDimensions();
editor->BeginEdit(row, col, this);
+ editor->SetCellAttr(NULL);
editor->DecRef();
attr->DecRef();
}
else if ( right > cw )
{
- // DJC MAPTEK
// position the view so that the cell is on the right
int x0, y0;
CalcUnscrolledPosition(0, 0, &x0, &y0);
*vert = m_colLabelVertAlign;
}
+int wxGrid::GetColLabelTextOrientation()
+{
+ return m_colLabelTextOrientation;
+}
+
wxString wxGrid::GetRowLabelValue( int row )
{
if ( m_table )
}
}
+// 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 )
InitColWidths();
}
- // DJC MAPTEK if < 0 calc new width from label
+ // if < 0 calc new width from label
if( width < 0 )
{
long w, h;
dc.SetFont( GetLabelFont() );
if ( column )
+ {
dc.GetTextExtent( GetColLabelValue(col), &w, &h );
+ if( GetColLabelTextOrientation() == wxVERTICAL )
+ w = h;
+ }
else
dc.GetTextExtent( GetRowLabelValue(row), &w, &h );
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