void MyFrame::OnOpen(wxCommandEvent & WXUNUSED(event)) { wxFileDialog dialog(this, wxEmptyString, wxEmptyString, wxEmptyString, wxEmptyString, wxFD_OPEN | wxFD_FILE_MUST_EXIST); if (dialog.ShowModal() == wxID_OK) { wxString filename(dialog.GetPath()); wxTextFile text_file(filename); if (!text_file.Open(wxConvUTF8)) { return; } grid->EnableEditing(false); if (text_file.GetLineCount() > grid->GetNumberRows()) { grid->AppendRows(text_file.GetLineCount() - grid->GetNumberRows()); } else if (text_file.GetLineCount() < grid->GetNumberRows()) { grid->DeleteRows(text_file.GetLineCount(), grid->GetNumberRows() - text_file.GetLineCount()); } grid->ClearGrid(); for (int row = 0; row < text_file.GetLineCount(); ++row) { wxStringTokenizer tokenizer(text_file[row], L","); for (int col = 0; tokenizer.HasMoreTokens() && col < grid->GetNumberCols(); ++col) { wxString token = tokenizer.GetNextToken(); grid->SetCellValue(row, col, token); } } grid->AutoSize(); text->Clear(); lines.clear(); for (int row = 0; row < text_file.GetLineCount(); ++row) { lines.push_back(text_file[row]); } text_file.Close(); topsizer->Layout(); SetStatusText(wxFileName(filename).GetFullName()); } }
void PopulateWXGridFromDataGrid(const CDataGrid& rSrcDataGrid, wxGrid& rDestWXGrid) { // Remove old rows, and insert new ones as appropriate rDestWXGrid.DeleteCols(0, rDestWXGrid.GetNumberCols()); rDestWXGrid.DeleteRows(0, rDestWXGrid.GetNumberRows()); rDestWXGrid.AppendCols(rSrcDataGrid.GetNumberCols()); rDestWXGrid.AppendRows(rSrcDataGrid.GetNumberRows()); rDestWXGrid.SetDefaultCellTextColour(wxColour(0, 0, 0)); rDestWXGrid.SetLabelTextColour(wxColour(0, 0, 0)); rDestWXGrid.SetRowLabelSize(0); rDestWXGrid.EnableDragRowSize(false); // Top Headings for (int iCol = 0; iCol < rSrcDataGrid.GetNumberCols(); iCol++) { rDestWXGrid.SetColLabelValue(iCol, wxString(rSrcDataGrid.GetTopHeadingText(iCol), wxConvUTF8)); } for (int iRow = 0; iRow < rSrcDataGrid.GetNumberRows(); iRow++) { // Side Heading rDestWXGrid.SetRowLabelValue(iRow, wxString(rSrcDataGrid.GetSideHeadingText(iRow), wxConvUTF8)); // Data Row for (int iCol = 0; iCol < rSrcDataGrid.GetNumberCols(); iCol++) { rDestWXGrid.SetCellValue(iRow, iCol, wxString(rSrcDataGrid.GetCellText(iRow, iCol), wxConvUTF8)); rDestWXGrid.SetReadOnly(iRow, iCol, true); wxFont vCellFont = rDestWXGrid.GetCellFont(iRow, iCol); if (rSrcDataGrid.IsCellBold(iRow, iCol)) vCellFont.SetWeight(wxFONTWEIGHT_BOLD); if (rSrcDataGrid.IsCellUnderlined(iRow, iCol)) vCellFont.SetUnderlined(true); rDestWXGrid.SetCellFont(iRow, iCol, vCellFont); } } rDestWXGrid.AutoSizeColumns(false); rDestWXGrid.AutoSizeRows(false); }
//------------------------------------------------------------------------------ // custom renderer //------------------------------------------------------------------------------ void CustomRenderer::Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, const wxRect& rect, int row, int col, bool isSelected) { dc.SetPen(wxPen(attr.GetBackgroundColour(), 1)); dc.SetBrush(wxBrush( attr.GetBackgroundColour(), wxBRUSHSTYLE_SOLID )); dc.DrawRectangle( rect ); if( m_IsDigit || m_dDir == GRIB_NOTDEF ) { //digital format wxString text(wxEmptyString); if( m_dDir != GRIB_NOTDEF ) text.Printf(_T("%03d\u00B0"), (int)m_dDir); dc.DrawLabel(text, rect, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL); } else { //graphical format double si = sin( (m_dDir - 90) * M_PI / 180. ); double co = cos( (m_dDir - 90) * M_PI / 180. ); int i = rect.GetTopLeft().x + (rect.GetWidth() / 2); int j = rect.GetTopLeft().y + (rect.GetHeight() / 2); int arrowSize = rect.GetHeight() - 3; int dec = -arrowSize / 2; #if wxUSE_GRAPHICS_CONTEXT wxGraphicsContext *gdc; wxClientDC *cdc = new wxClientDC(wxDynamicCast( &grid, wxWindow)); cdc = wxDynamicCast(&dc, wxClientDC); if( cdc ) { gdc = wxGraphicsContext::Create(*cdc); #ifdef __WXGTK__ /*platforms don't manage the same way the gdc origin for linux, we have to re-compute the good one. To DO : verify it works on all other plateforms (done for MSW*/ bool vis = false; int r = 0; for( int c = 0; c < grid.GetNumberCols(); c++){ for(r = 0; r < grid.GetNumberRows(); r++) { if(grid.IsVisible(r, c)){ //find the first row/col vis = true; i -= (c * grid.GetColSize(0)); j -= (r * grid.GetRowHeight(0)); break; } } if(vis) break; } #endif gdc->SetPen(wxPen(attr.GetTextColour(), 3)); gdc->SetBrush(wxBrush( attr.GetBackgroundColour(), wxBRUSHSTYLE_SOLID )); double ii, jj, kk, ll; GetArrowsPoints( si, co, i, j, dec, 0, dec + arrowSize, 0, ii, jj, kk, ll ); gdc->StrokeLine( ii, jj, kk, ll ); GetArrowsPoints( si, co, i, j, dec - 3, 0, dec + 5, 3, ii, jj, kk, ll ); gdc->StrokeLine( ii, jj, kk, ll ); GetArrowsPoints( si, co, i, j, dec - 3, 0, dec + 5, -3, ii, jj, kk, ll ); gdc->StrokeLine( ii, jj, kk, ll ); delete gdc; } else #endif { dc.SetPen(wxPen(attr.GetTextColour(), 3)); double ii, jj, kk, ll; GetArrowsPoints( si, co, i, j, dec, 0, dec + arrowSize, 0, ii, jj, kk, ll ); dc.DrawLine( (int)ii, (int)jj, (int)kk, (int)ll ); GetArrowsPoints( si, co, i, j, dec - 3, 0, dec + 5, 3, ii, jj, kk, ll ); dc.DrawLine( (int)ii, (int)jj, (int)kk, (int)ll ); GetArrowsPoints( si, co, i, j, dec - 3, 0, dec + 5, -3, ii, jj, kk, ll ); dc.DrawLine( (int)ii, (int)jj, (int)kk, (int)ll ); } } }
void wxGridCellStringRenderer::Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, const wxRect& rectCell, int row, int col, bool isSelected) { wxRect rect = rectCell; rect.Inflate(-1); // erase only this cells background, overflow cells should have been erased wxGridCellRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected); int hAlign, vAlign; attr.GetAlignment(&hAlign, &vAlign); int overflowCols = 0; if (attr.GetOverflow()) { int cols = grid.GetNumberCols(); int best_width = GetBestSize(grid,attr,dc,row,col).GetWidth(); int cell_rows, cell_cols; attr.GetSize( &cell_rows, &cell_cols ); // shouldn't get here if <= 0 if ((best_width > rectCell.width) && (col < cols) && grid.GetTable()) { int i, c_cols, c_rows; for (i = col+cell_cols; i < cols; i++) { bool is_empty = true; for (int j=row; j < row + cell_rows; j++) { // check w/ anchor cell for multicell block grid.GetCellSize(j, i, &c_rows, &c_cols); if (c_rows > 0) c_rows = 0; if (!grid.GetTable()->IsEmptyCell(j + c_rows, i)) { is_empty = false; break; } } if (is_empty) { rect.width += grid.GetColSize(i); } else { i--; break; } if (rect.width >= best_width) break; } overflowCols = i - col - cell_cols + 1; if (overflowCols >= cols) overflowCols = cols - 1; } if (overflowCols > 0) // redraw overflow cells w/ proper hilight { hAlign = wxALIGN_LEFT; // if oveflowed then it's left aligned wxRect clip = rect; clip.x += rectCell.width; // draw each overflow cell individually int col_end = col + cell_cols + overflowCols; if (col_end >= grid.GetNumberCols()) col_end = grid.GetNumberCols() - 1; for (int i = col + cell_cols; i <= col_end; i++) { clip.width = grid.GetColSize(i) - 1; dc.DestroyClippingRegion(); dc.SetClippingRegion(clip); SetTextColoursAndFont(grid, attr, dc, grid.IsInSelection(row,i)); grid.DrawTextRectangle(dc, grid.GetCellValue(row, col), rect, hAlign, vAlign); clip.x += grid.GetColSize(i) - 1; } rect = rectCell; rect.Inflate(-1); rect.width++; dc.DestroyClippingRegion(); } } // now we only have to draw the text SetTextColoursAndFont(grid, attr, dc, isSelected); grid.DrawTextRectangle(dc, grid.GetCellValue(row, col), rect, hAlign, vAlign); }