diff --git a/include/ctl/ctlSQLGrid.h b/include/ctl/ctlSQLGrid.h index 2fa56f6..81f01f1 100644 --- a/include/ctl/ctlSQLGrid.h +++ b/include/ctl/ctlSQLGrid.h @@ -20,323 +20,331 @@ class GroupRows; class ctlSQLGrid : public wxGrid { public: - ctlSQLGrid(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size); - ctlSQLGrid(); + ctlSQLGrid(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size); + ctlSQLGrid(); - wxString GetExportLine(int row); - wxString GetExportLine(int row, wxArrayInt cols); - wxString GetExportLine(int row, int col1, int col2); - virtual bool IsColText(int col) - { - return false; - } - int CopyTableToHtml(wxString htmlquery); - int Copy(int gensql); + wxString GetExportLine(int row); + wxString GetExportLine(int row, wxArrayInt cols); + wxString GetExportLine(int row, int col1, int col2); + virtual bool IsColText(int col) + { + return false; + } + int CopyTableToHtml(wxString htmlquery); + int Copy(int gensql); - virtual bool CheckRowPresent(int row) - { - return true; - }; - bool IsSort() - { - return isSort; - }; - void SetSort(bool flag) - { - isSort=flag; - }; + virtual bool CheckRowPresent(int row) + { + return true; + }; + bool IsSort() + { + return isSort; + }; + void SetSort(bool flag) + { + isSort = flag; + }; - wxString GetColumnName(int colNum); - wxSize GetBestSize(int row, int col); - void OnLabelDoubleClick(wxGridEvent &event); - void OnGridSelectCell(wxGridEvent& evt); - void OnLabelClick(wxGridEvent &event); - void OnCellRightClick(wxGridEvent &event); - bool FullArrayCollapseRowsPlan(bool clear); - void AutoSizeColumn(int col, bool setAsMin = false, bool doLimit = true); - void AutoSizeColumns(bool setAsMin); - wxString GetRowLabelValue( int row ); - void SetRowGroup(int row); - GroupRows *grp; - int generatesql; // 0 -���, 1 - insert , 2 - in_list - wxString sqlquerytext; - // Fast searh - wxString searchStr; + wxString GetColumnName(int colNum); + wxSize GetBestSize(int row, int col); + void OnLabelDoubleClick(wxGridEvent& event); + void OnGridSelectCell(wxGridEvent& evt); + void OnLabelClick(wxGridEvent& event); + void OnCellRightClick(wxGridEvent& event); + bool FullArrayCollapseRowsPlan(bool clear); + void AutoSizeColumn(int col, bool setAsMin = false, bool doLimit = true); + void AutoSizeColumns(bool setAsMin); + wxString GetRowLabelValue(int row); + void SetRowGroup(int row); + GroupRows* grp; + int generatesql; // 0 -���, 1 - insert , 2 - in_list + wxString sqlquerytext; + // Fast searh + wxString searchStr; - WX_DECLARE_STRING_HASH_MAP( int, ColKeySizeHashMap ); + WX_DECLARE_STRING_HASH_MAP(int, ColKeySizeHashMap); + + DECLARE_DYNAMIC_CLASS(ctlSQLGrid) + DECLARE_EVENT_TABLE() - DECLARE_DYNAMIC_CLASS(ctlSQLGrid) - DECLARE_EVENT_TABLE() - private: - void setresizedpi(); - void OnCopy(wxCommandEvent &event); - void OnMouseWheel(wxMouseEvent &event); - void OnGridColSize(wxGridSizeEvent &event); - void DrawColLabel( wxDC& dc, int col ); - void DrawRowLabel(wxDC& dc, int row); - wxString GetColKeyValue(int col); - void AppendColumnHeader(wxString &str, int start, int end); - void AppendColumnHeader(wxString &str, wxArrayInt columns); - // Stores sizes of colums explicitly resized by user - ColKeySizeHashMap colSizes; - // Max size for each column - wxArrayInt colMaxSizes; - bool isSort; - + void setresizedpi(); + void OnCopy(wxCommandEvent& event); + void OnMouseWheel(wxMouseEvent& event); + void OnGridColSize(wxGridSizeEvent& event); + void DrawColLabel(wxDC& dc, int col); + void DrawRowLabel(wxDC& dc, int row); + wxString GetColKeyValue(int col); + void AppendColumnHeader(wxString& str, int start, int end); + void AppendColumnHeader(wxString& str, wxArrayInt columns); + // Stores sizes of colums explicitly resized by user + ColKeySizeHashMap colSizes; + // Max size for each column + wxArrayInt colMaxSizes; + bool isSort; + }; class GroupRows { public: - GroupRows( ctlSQLGrid *grid) { - g=grid; - rowsGroup.Clear(); - rowsGroup.Add(0,g->GetNumberRows()); - end.Clear(); - end.Add(-1,g->GetNumberRows()); - run.Clear(); - run.Add(0.0,g->GetNumberRows()); - }; - void AddGroup( int rowgroup, int lastrowgroup, double actualtime) { - // default group open - rowsGroup[rowgroup]=-rowgroup; - //beg[rowgroup]=rowgroup; - wxASSERT_MSG(lastrowgroup>end.Count()," out of bounds"); - end[rowgroup]=lastrowgroup; - run[rowgroup]=actualtime; - }; - void VisibleGroup(int row, bool visible) { - int endg=end[row]; - int grp=IsGroupRow(row); - int gg; - int r=row+1; - if (grp!=0) { + GroupRows(ctlSQLGrid* grid) { + g = grid; + rowsGroup.Clear(); + rowsGroup.Add(0, g->GetNumberRows()); + end.Clear(); + end.Add(-1, g->GetNumberRows()); + run.Clear(); + run.Add(0.0, g->GetNumberRows()); + }; + void AddGroup(int rowgroup, int lastrowgroup, double actualtime) { + // default group open + rowsGroup[rowgroup] = -rowgroup; + //beg[rowgroup]=rowgroup; + wxASSERT_MSG(lastrowgroup > end.Count(), " out of bounds"); + end[rowgroup] = lastrowgroup; + run[rowgroup] = actualtime; + }; + void VisibleGroup(int row, bool visible) { + int endg = end[row]; + int grp = IsGroupRow(row); + int gg; + int r = row + 1; + if (grp != 0) { - if (!visible) { - // hide group - rowsGroup[row]*=-1; - for(int i=r;i<(endg+1);i++) { - g->HideRow(i); - } - wxGridCellAttr* pAttrg = new wxGridCellAttr; - pAttrg->SetBackgroundColour(wxColour(200,191,232)); - g->SetRowAttr(row,pAttrg); - } else - { - // show group - rowsGroup[row]*=-1; - int sizerow=g->GetDefaultRowSize(); - //pAttr->SetBackgroundColour(wxColour(0,162,232)); - wxGridCellAttr* pAttrg = new wxGridCellAttr; - pAttrg->SetBackgroundColour(wxColour(248,240,130)); - g->SetRowAttr(row,pAttrg); - for(int i=r;i<(endg+1);i++) { - gg=IsGroupRow(i); - if (gg<=0) { - g->SetRowSize(i,sizerow); - } - else - { - g->SetRowSize(i,sizerow); - i=end[i]; - } + if (!visible) { + // hide group + rowsGroup[row] *= -1; + for (int i = r; i < (endg + 1); i++) { + g->HideRow(i); + } + wxGridCellAttr* pAttrg = new wxGridCellAttr; + pAttrg->SetBackgroundColour(wxColour(200, 191, 232)); + g->SetRowAttr(row, pAttrg); + } + else + { + // show group + rowsGroup[row] *= -1; + int sizerow = g->GetDefaultRowSize(); + //pAttr->SetBackgroundColour(wxColour(0,162,232)); + wxGridCellAttr* pAttrg = new wxGridCellAttr; + pAttrg->SetBackgroundColour(wxColour(248, 240, 130)); + g->SetRowAttr(row, pAttrg); + for (int i = r; i < (endg + 1); i++) { + gg = IsGroupRow(i); + if (gg <= 0) { + g->SetRowSize(i, sizerow); + } + else + { + g->SetRowSize(i, sizerow); + i = end[i]; + } - } + } - } - } - }; - // 0 - no group, -int - open group ,+int - close gruop - int IsGroupRow(int row) { - if (end[row]!=-1) { - // is group - return rowsGroup[row]; - } else return 0; - }; - void ColoriseRow(int row,const wxColour& color) { - //g->GetTable()->SetRowLabelValue(row-1,s); - wxGridCellAttr* pAttr = new wxGridCellAttr; - pAttr->SetBackgroundColour(color); - g->SetRowAttr(row,pAttr); - }; - void CalcTime() { - //g->GetTable()->SetRowLabelValue(row-1,s); - double sum=0; - double total=1; - for(int i=0;iGetTable()->SetRowLabelValue(i,"100"); - } else - { - wxString str; - if (total==0||t==0) { - str=""; - } else - { - - t=(t/total)*100; - str.Printf(wxT("%5.2f"), t); - } - g->GetTable()->SetRowLabelValue(i,str); - } + } + } + }; + // 0 - no group, -int - open group ,+int - close gruop + int IsGroupRow(int row) { + if (end[row] != -1) { + // is group + return rowsGroup[row]; + } + else return 0; + }; + void ColoriseRow(int row, const wxColour& color) { + //g->GetTable()->SetRowLabelValue(row-1,s); + wxGridCellAttr* pAttr = new wxGridCellAttr; + pAttr->SetBackgroundColour(color); + g->SetRowAttr(row, pAttr); + }; + void CalcTime() { + //g->GetTable()->SetRowLabelValue(row-1,s); + double sum = 0; + double total = 1; + for (int i = 0; i < run.Count(); i++) { + double t = run[i]; + if (i == 0) { + total = abs(t); + g->GetTable()->SetRowLabelValue(i, "100"); + } + else + { + wxString str; + if (total == 0 || t == 0) { + str = ""; + } + else + { - } - + t = (t / total) * 100; + str.Printf(wxT("%5.2f"), t); + } + g->GetTable()->SetRowLabelValue(i, str); + } - }; + } + + + }; private: - ctlSQLGrid *g; - wxArrayInt rowsGroup, end; - wxArrayDouble run; + ctlSQLGrid* g; + wxArrayInt rowsGroup, end; + wxArrayDouble run; }; //#define TEST_wxGridCellAutoWrapStringRenderer #ifndef TEST_wxGridCellAutoWrapStringRenderer class CursorCellRenderer : public wxGridCellStringRenderer - { - public: - virtual void Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, - const wxRect& rect, int row, int col, bool isSelected) - { - int hAlign, vAlign; - int sPos=-1; - bool multiline = false; - attr.GetAlignment(&hAlign, &vAlign); - ////////////////////////////////////////////////////////////////////////////// - //CursorCellRenderer::Draw(grid, attr, dc, rect, row, col, isSelected); // - dc.SetBackgroundMode( wxSOLID ); - wxString text=grid.GetCellValue(row, col); - // grey out fields if the grid is disabled - if ( grid.IsEnabled() ) - { - if ( isSelected ) - { - wxColour clr; - if ( wxWindow::FindFocus() == grid.GetGridWindow() ) - clr = grid.GetSelectionBackground(); - else - clr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW); - - - dc.SetBrush( *wxTheBrushList->FindOrCreateBrush(clr)); - } - else - { - wxColor color; - color.Set(239, 228, 176); - if (sPos = text.Find(wxT('\n')) != wxNOT_FOUND) { - dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(color)); - multiline = true; - } - else - dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(attr.GetBackgroundColour())); - } - } - else - { - dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE))); - } +{ +public: + virtual void Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, + const wxRect& rect, int row, int col, bool isSelected) + { + int hAlign, vAlign; + int sPos = -1; + bool multiline = false; + attr.GetAlignment(&hAlign, &vAlign); + ////////////////////////////////////////////////////////////////////////////// + //CursorCellRenderer::Draw(grid, attr, dc, rect, row, col, isSelected); // + dc.SetBackgroundMode(wxSOLID); + wxString text = grid.GetCellValue(row, col); + // grey out fields if the grid is disabled + if (grid.IsEnabled()) + { + if (isSelected) + { + wxColour clr; + if (wxWindow::FindFocus() == grid.GetGridWindow()) + clr = grid.GetSelectionBackground(); + else + clr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW); - dc.SetPen( *wxTRANSPARENT_PEN ); - dc.DrawRectangle(rect); - ////////////////////////////////////////////////////////////////////////////// - SetTextColoursAndFont(grid, attr, dc, isSelected); - ctlSQLGrid* ctrl = static_cast(&grid); - if (!ctrl->searchStr.IsEmpty()) { - if (sPos == -1) sPos = text.Len(); - int pp; - pp = text.Find(ctrl->searchStr); - if (pp >= 0) { - wxArrayString lines; - grid.StringToLines(text, lines); - wxRect r; - r.y = rect.y; - dc.SetBrush(*wxYELLOW_BRUSH); - size_t nLines = lines.GetCount(); - for (size_t l = 0; l < nLines; l++) - { - const wxString& line = lines[l]; - pp = line.Find(ctrl->searchStr); - if (line.empty() || (pp==-1)) - { - r.y += dc.GetCharHeight(); - continue; - } - - int lineWidth, lineWidthP, lineHeight,start=0; - wxString pref; - if (hAlign == wxALIGN_RIGHT) { - start = pp + ctrl->searchStr.Len(); - pref = line.substr(start); - } else - pref = line.substr(start, pp); + dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(clr)); + } + else + { + wxColor color; + color.Set(239, 228, 176); + if (sPos = text.Find(wxT('\n')) != wxNOT_FOUND) { + dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(color)); + multiline = true; + } + else + dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(attr.GetBackgroundColour())); + } + // replace \t to u+2192 + wxUniChar cc = 8594; + text.Replace("\t", cc); + } + else + { + dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE))); + } - dc.GetTextExtent(pref, &lineWidthP, &lineHeight); - r.x=rect.x+lineWidthP; - pref= line.substr(pp, ctrl->searchStr.Len()); - dc.GetTextExtent(pref, &lineWidth, &lineHeight); - r.width = lineWidth; - r.height = lineHeight; - if (hAlign == wxALIGN_RIGHT) r.x = rect.x + (rect.width - lineWidth- lineWidthP); - if (!(r.y < (rect.y + rect.height))) { r.y = rect.y + rect.height - 5; r.height = 5; } - if (!((r.x < (rect.x + rect.width)))) { r.x = rect.x + rect.width - 5; r.width = 5; } - dc.DrawRoundedRectangle(r, 3); - break; - } - } - } + dc.SetPen(*wxTRANSPARENT_PEN); + dc.DrawRectangle(rect); + ////////////////////////////////////////////////////////////////////////////// + SetTextColoursAndFont(grid, attr, dc, isSelected); + ctlSQLGrid* ctrl = static_cast(&grid); + if (!ctrl->searchStr.IsEmpty()) { + if (sPos == -1) sPos = text.Len(); + int pp; - if (!multiline) { - //int textWidth = dc.GetTextExtent(text).GetWidth(); - wxEllipsizeMode mode(wxELLIPSIZE_END); - if (hAlign == wxALIGN_RIGHT) mode = wxELLIPSIZE_START; - const wxString& ellipsizedText = wxControl::Ellipsize - ( - text, - dc, - mode, - rect.GetWidth() - 2, - wxELLIPSIZE_FLAGS_NONE - ); - if (ellipsizedText != text) text=ellipsizedText; - } - grid.DrawTextRectangle(dc, text, - rect, hAlign, vAlign); - } + pp = text.Find(ctrl->searchStr); + if (pp >= 0) { + wxArrayString lines; + grid.StringToLines(text, lines); + wxRect r; + r.y = rect.y; + dc.SetBrush(*wxYELLOW_BRUSH); + size_t nLines = lines.GetCount(); + for (size_t l = 0; l < nLines; l++) + { + const wxString& line = lines[l]; + pp = line.Find(ctrl->searchStr); + if (line.empty() || (pp == -1)) + { + r.y += dc.GetCharHeight(); + continue; + } + + int lineWidth, lineWidthP, lineHeight, start = 0; + wxString pref; + if (hAlign == wxALIGN_RIGHT) { + start = pp + ctrl->searchStr.Len(); + pref = line.substr(start); + } + else + pref = line.substr(start, pp); + + dc.GetTextExtent(pref, &lineWidthP, &lineHeight); + r.x = rect.x + lineWidthP; + pref = line.substr(pp, ctrl->searchStr.Len()); + dc.GetTextExtent(pref, &lineWidth, &lineHeight); + r.width = lineWidth; + r.height = lineHeight; + if (hAlign == wxALIGN_RIGHT) r.x = rect.x + (rect.width - lineWidth - lineWidthP); + if (!(r.y < (rect.y + rect.height))) { r.y = rect.y + rect.height - 5; r.height = 5; } + if (!((r.x < (rect.x + rect.width)))) { r.x = rect.x + rect.width - 5; r.width = 5; } + dc.DrawRoundedRectangle(r, 3); + break; + } + } + } + + if (!multiline) { + //int textWidth = dc.GetTextExtent(text).GetWidth(); + wxEllipsizeMode mode(wxELLIPSIZE_END); + if (hAlign == wxALIGN_RIGHT) mode = wxELLIPSIZE_START; + const wxString& ellipsizedText = wxControl::Ellipsize + ( + text, + dc, + mode, + rect.GetWidth() - 2, + wxELLIPSIZE_FLAGS_NONE + ); + if (ellipsizedText != text) text = ellipsizedText; + } + grid.DrawTextRectangle(dc, text, + rect, hAlign, vAlign); + } #else class CursorCellRenderer : public wxGridCellAutoWrapStringRenderer { public: - virtual void Draw(wxGrid& grid, - wxGridCellAttr& attr, - wxDC& dc, - const wxRect& rectCell, - int row, int col, - bool isSelected) { - bool f = false; - wxString text = grid.GetCellValue(row, col); - wxColor prev; - if (!isSelected) { - wxColor color; - color.Set(239, 228, 176); - if (text.Find(wxT('\n')) != wxNOT_FOUND) - { - //dc.SetBrush(wxBrush(color, wxSOLID)); - prev = attr.GetBackgroundColour(); - attr.SetBackgroundColour(color); - f = true; - } - - } + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rectCell, + int row, int col, + bool isSelected) { + bool f = false; + wxString text = grid.GetCellValue(row, col); + wxColor prev; + if (!isSelected) { + wxColor color; + color.Set(239, 228, 176); + if (text.Find(wxT('\n')) != wxNOT_FOUND) + { + //dc.SetBrush(wxBrush(color, wxSOLID)); + prev = attr.GetBackgroundColour(); + attr.SetBackgroundColour(color); + f = true; + } - wxGridCellAutoWrapStringRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected); - if (f) attr.SetBackgroundColour(prev); - } + } + + wxGridCellAutoWrapStringRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected); + if (f) attr.SetBackgroundColour(prev); + } #endif - }; +}; #endif