diff --git a/ctl/ctlSQLResult.cpp b/ctl/ctlSQLResult.cpp index d37e729..1ccf200 100644 --- a/ctl/ctlSQLResult.cpp +++ b/ctl/ctlSQLResult.cpp @@ -446,6 +446,7 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) { wxArrayInt cols; wxArrayString leg; wxArrayInt colsY; + wxString rez="Draw plot"; if (IsSelection()) { unsigned int i; int row, col; @@ -476,11 +477,45 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) { else { return "not select cells or columns"; } + std::vector lbar; + size_t numRows = GetNumberRows(); if (cols.Count()>0) { + int idx = 0; + int cl1 = cols[idx]; + int legC = -1; + int xC = -1; //cols = GetSelectedCols(); + if (cols.Count() == 2) { + legC = cl1; idx++; + cl1 = cols[idx]; + if (colTypClasses.Item(cl1) != PGTYPCLASS_NUMERIC) { + wxMessageBox("The number of selected column 2 needed Number type\nExample: LY", "Plot"); + return ""; + } + std::vector x, y; + double xv=0, yv; + for (int i = 0; i < numRows; i++) + { + if (GetRowSize(i) == 0) continue; + //str.Append(GetExportLine(i, cols)); + wxString yVal = GetCellValue(i, cl1); + if (!yVal.ToCDouble(&yv)) { yVal.ToDouble(&yv); /* error! */ } + x.push_back(xv); + y.push_back(yv); + xv++; + lbar.push_back(GetCellValue(i, legC)); + } + frmPlot* frame = new frmPlot(parent, "Plot Bar"); + frame->ClearAndSetAxis(ctlSQLGrid::GetColumnName(legC), mpX_NORMAL, ctlSQLGrid::GetColumnName(cl1)); + frame->AddSeries("Bar", x, y, lbar); + frame->Go(); + return rez; + + } if (cols.Count() < 3) { - wxMessageBox("The number of selected columns must be more than 2\nExample: LXY or XYYYY...", "Plot"); + + wxMessageBox("The number of selected columns must be more than 1\nExample: LXY or XYYYY...", "Plot"); return ""; } } @@ -519,9 +554,9 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) { frmPlot* frame = new frmPlot(parent,"Plot"); frame->ClearAndSetAxis(xA, typeAxisX, yA); // Rows read - size_t numRows = GetNumberRows(); + wxString lg,currLg; - + if (legC !=-1) { // 3 cols std::vector x,y; @@ -532,7 +567,7 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) { if (GetRowSize(i) == 0) continue; currLg= GetCellValue(i, legC); if (lg != currLg && !lg.IsEmpty()) { - frame->AddSeries(lg, x, y); + if (x.size()>0) frame->AddSeries(lg, x, y,lbar); lg = wxEmptyString; } if (lg.IsEmpty()) { @@ -550,8 +585,9 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) { dt = parseDT(fmttype, xVal); if (fmttype == -1) { wxString temp = wxString::Format("The values of column X must be timestamp [row: %d,col: %d]",i+1, colsY[0]); - wxMessageBox(temp, "Plot"); - return ""; + rez = temp; + //wxMessageBox(temp, "Plot"); + continue; } xv = (double)dt.GetTicks(); } @@ -562,7 +598,7 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) { x.push_back(xv); y.push_back(yv); } - frame->AddSeries(lg, x, y); + frame->AddSeries(lg, x, y,lbar); } else { @@ -601,13 +637,13 @@ wxString ctlSQLResult::AutoColsPlot(int flags,frmQuery* parent) { y.push_back(yv); } - frame->AddSeries(lg, x, y); + frame->AddSeries(lg, x, y,lbar); y.clear(); first = false; } } frame->Go(); - return "plot draw"; + return rez; } wxString ctlSQLResult::SummaryColumn() diff --git a/frm/frmPlot.cpp b/frm/frmPlot.cpp index ab36636..e379e59 100644 --- a/frm/frmPlot.cpp +++ b/frm/frmPlot.cpp @@ -10,10 +10,10 @@ enum { ID_ALIGN_X_AXIS, ID_ALIGN_Y_AXIS, ID_TOGGLE_GRID, - ID_TOGGLE_SCROLLBARS, + ID_COPY_SCREEN, ID_TOGGLE_INFO, ID_SAVE_SCREENSHOT, - ID_TOGGLE_LISSAJOUX, + ID_TOGGLE_SHOW_SERIES, ID_TOGGLE_SHOW_SIMBOL, ID_TOGGLE_COSINE, ID_BLACK_THEME @@ -73,13 +73,22 @@ EVT_MENU(mpID_FIT, frmPlot::OnFit) EVT_MENU(ID_ALIGN_X_AXIS, frmPlot::OnAlignXAxis) EVT_MENU(ID_ALIGN_Y_AXIS, frmPlot::OnAlignYAxis) EVT_MENU(ID_TOGGLE_GRID, frmPlot::OnToggleGrid) -EVT_MENU(ID_TOGGLE_SCROLLBARS, frmPlot::OnCopy) +EVT_MENU(ID_COPY_SCREEN, frmPlot::OnCopy) EVT_MENU(ID_TOGGLE_INFO, frmPlot::OnToggleInfoLayer) EVT_MENU(ID_SAVE_SCREENSHOT, frmPlot::OnSaveScreenshot) EVT_MENU(ID_BLACK_THEME, frmPlot::OnBlackTheme) -EVT_MENU(ID_TOGGLE_LISSAJOUX, frmPlot::OnToggleLissajoux) +EVT_MENU(ID_TOGGLE_SHOW_SERIES, frmPlot::OnToggleShowSeries) EVT_MENU(ID_TOGGLE_SHOW_SIMBOL, frmPlot::OnToggleShowSimbol) EVT_MENU(ID_TOGGLE_COSINE, frmPlot::OnToggleCosine) +EVT_MENU(mpID_CENTER, frmPlot::OnCenter) +EVT_MENU(mpID_ZOOM_IN, frmPlot::OnZoomIn) +EVT_MENU(mpID_ZOOM_INX, frmPlot::OnZoomInX) +EVT_MENU(mpID_ZOOM_INY, frmPlot::OnZoomInY) +EVT_MENU(mpID_ZOOM_OUTX, frmPlot::OnZoomOutX) +EVT_MENU(mpID_ZOOM_OUTY, frmPlot::OnZoomOutY) +EVT_MENU(mpID_ZOOM_OUT, frmPlot::OnZoomOut) +EVT_MENU(mpID_LOCKASPECT, frmPlot::OnLockAspect) +EVT_KEY_DOWN(frmPlot::OnKEY_DOWN) EVT_CLOSE(frmPlot::OnClose) wxEND_EVENT_TABLE() @@ -99,7 +108,7 @@ frmPlot::frmPlot(frmQuery* parent, const wxString& _title) : pgFrame(parent, _ti file_menu->Append(ID_PRINT_PREVIEW, wxT("Print Pre&view...")); file_menu->Append(ID_PRINT, wxT("&Print...")); file_menu->Append(ID_SAVE_SCREENSHOT, wxT("Save screenshot")); - file_menu->Append(ID_TOGGLE_SCROLLBARS, wxT("Copy clipboard screenshot\tCtrl+C")); + file_menu->Append(ID_COPY_SCREEN, wxT("Copy clipboard screenshot\tCtrl+C")); file_menu->AppendSeparator(); file_menu->Append(ID_ABOUT, wxT("&About...")); @@ -108,20 +117,28 @@ frmPlot::frmPlot(frmQuery* parent, const wxString& _title) : pgFrame(parent, _ti view_menu->Append(mpID_FIT, wxT("&Fit bounding box"), wxT("Set plot view to show all items")); view_menu->Append(mpID_ZOOM_IN, wxT("Zoom in"), wxT("Zoom in plot view.")); view_menu->Append(mpID_ZOOM_OUT, wxT("Zoom out"), wxT("Zoom out plot view.")); + view_menu->AppendCheckItem(mpID_LOCKASPECT, _("Lock aspect"),_("Lock horizontal and vertical zoom aspect.")); + view_menu->AppendSeparator(); + + view_menu->Append(mpID_ZOOM_INX, wxT("Zoom in X axis\tKP_Add"), wxT("Zoom in plot view X axis.")); + view_menu->Append(mpID_ZOOM_OUTX, wxT("Zoom out X axis\tKP_Subtract"), wxT("Zoom out plot view X axis.")); + view_menu->Append(mpID_ZOOM_INY, wxT("Zoom in Y axis\tCtrl+KP_Add"), wxT("Zoom in plot view Y axis.")); + view_menu->Append(mpID_ZOOM_OUTY, wxT("Zoom out Y axis\tCtrl+KP_Subtract"), wxT("Zoom out plot view Y axis.")); + view_menu->AppendSeparator(); view_menu->Append(ID_ALIGN_X_AXIS, wxT("Switch &X axis align")); view_menu->Append(ID_ALIGN_Y_AXIS, wxT("Switch &Y axis align")); view_menu->AppendCheckItem(ID_TOGGLE_GRID, wxT("Toggle grid/ticks")); - //view_menu->AppendCheckItem( ID_TOGGLE_SCROLLBARS, wxT("Show Scroll Bars")); + //view_menu->AppendCheckItem( ID_COPY_SCREEN, wxT("Show Scroll Bars")); view_menu->AppendCheckItem(ID_TOGGLE_INFO, wxT("Show overlay info box")); view_menu->Check(ID_TOGGLE_INFO, true); view_menu->AppendCheckItem(ID_BLACK_THEME, wxT("Switch to black background theme")); - //show_menu->AppendCheckItem(ID_TOGGLE_LISSAJOUX, wxT("Lissajoux")); + show_menu->AppendCheckItem(ID_TOGGLE_SHOW_SERIES, wxT("Show name series")); show_menu->AppendCheckItem(ID_TOGGLE_SHOW_SIMBOL, wxT("Show Simbol")); //show_menu->AppendCheckItem(ID_TOGGLE_COSINE, wxT("Cosine")); // Start with all plots visible - //show_menu->Check(ID_TOGGLE_LISSAJOUX, true); + show_menu->Check(ID_TOGGLE_SHOW_SERIES, false); show_menu->Check(ID_TOGGLE_SHOW_SIMBOL, true); //show_menu->Check(ID_TOGGLE_COSINE, true); @@ -135,9 +152,10 @@ frmPlot::frmPlot(frmQuery* parent, const wxString& _title) : pgFrame(parent, _ti mpLayer* l; m_plot = new mpWindow(this, -1, wxPoint(0, 0), wxSize(100, 100), wxSUNKEN_BORDER); - + m_plot->SetMargins(30, 100, 50, 100); wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); + m_plot->Bind(wxEVT_KEY_DOWN, &frmPlot::OnKEY_DOWN, this); topsizer->Add(m_plot, 1, wxEXPAND); // topsizer->Add(m_log, 0, wxEXPAND); @@ -184,23 +202,24 @@ void frmPlot::ClearAndSetAxis(wxString XtextAxis, unsigned int X_labelType, wxSt yaxis->SetFont(graphFont); xaxis->SetDrawOutsideMargins(false); yaxis->SetDrawOutsideMargins(false); - m_plot->AddLayer(xaxis); - m_plot->AddLayer(yaxis); - m_plot->AddLayer(nfo = new mpInfoCoords(wxRect(80, 20, 10, 10), wxTRANSPARENT_BRUSH)); //&hatch)); - nfo->SetVisible(true); + m_plot->AddLayer(xaxis); // 0 + m_plot->AddLayer(yaxis); // 1 + m_plot->AddLayer(nfo = new mpInfoCoords(wxRect(80, 80, 10, 10), wxTRANSPARENT_BRUSH)); //&hatch)); + nfo->SetVisible(true); // 2 //wxBrush hatch2(wxColour(163,208,212), wxSOLID); mpInfoLegend* leg; m_plot->AddLayer(leg = new mpInfoLegend(wxRect(20, 20, 40, 40), wxTRANSPARENT_BRUSH)); //&hatch2)); - leg->SetVisible(true); + leg->SetVisible(true); // 3 leg->SetDrawOutsideMargins(false); indexColor = 0; //m_plot->Fit(); } -void frmPlot::AddSeries(const wxString legend, const std::vector& x, const std::vector& y) +void frmPlot::AddSeries(const wxString legend, const std::vector& x, const std::vector& y, const std::vector& l) { mpFXYVector* vectorLayer = new mpFXYVector(legend); vectorLayer->SetData(x, y); + if (l.size()>0) vectorLayer->SetLegendBar(l); vectorLayer->SetContinuity(true); size_t n; wxColourDesc cc; @@ -212,17 +231,71 @@ void frmPlot::AddSeries(const wxString legend, const std::vector& x, con //= new wxColour(cc.name); } if (indexColor >= WXSIZEOF(colors)) cc.name = L"#000000"; - - wxPen vectorpen(wxColour(cc.name), 2, wxPENSTYLE_SOLID); - - vectorLayer->SetPen(vectorpen); vectorLayer->SetDrawOutsideMargins(false); - vectorLayer->ShowName(false); vectorLayer->ShowSimbol(true); + if (vectorLayer->IsLegendBar()) { + wxPen vectorpen(wxColour(cc.name), 1, wxPENSTYLE_SOLID); + wxBrush br(wxColour(cc.name)); + vectorLayer->SetPen(vectorpen); + vectorLayer->ShowName(false); + vectorLayer->SetBrush(br); + vectorLayer->SetContinuity(false); + } + else + { + wxPen vectorpen(wxColour(cc.name), 2, wxPENSTYLE_SOLID); + vectorLayer->SetPen(vectorpen); + vectorLayer->ShowName(false); + } m_plot->AddLayer(vectorLayer); //m_plot->Fit(); } +void frmPlot::OnKEY_DOWN(wxKeyEvent& event) { + //void OnScrollThumbTrack(wxScrollWinEvent & event); + bool modctrl; + if ((event.GetModifiers() & wxMOD_CONTROL) == wxMOD_CONTROL) { + modctrl = true; + } + else modctrl = false; + int go = 0; + int orient = wxHORIZONTAL; + if (event.GetKeyCode() == WXK_DOWN) { + go =-( m_plot->GetScrY() - m_plot->GetMarginTop() - m_plot->GetMarginBottom()); + orient = wxVERTICAL; + } + if (event.GetKeyCode() == WXK_UP) { + go = (m_plot->GetScrY() - m_plot->GetMarginTop() - m_plot->GetMarginBottom()); + orient = wxVERTICAL; + } + if (event.GetKeyCode() == WXK_LEFT) { + go = -(m_plot->GetScrX()-m_plot->GetMarginRight() - m_plot->GetMarginLeft()); + } + if (event.GetKeyCode() == WXK_RIGHT) { + go = m_plot->GetScrX()-m_plot->GetMarginRight() - m_plot->GetMarginLeft(); + } + if ((go != 0)) { + + wxScrollWinEvent evt(wxEVT_NULL, go ,orient); + double npos; + if (orient == wxHORIZONTAL) { + npos = m_plot->GetPosX() + (double)go / m_plot->GetScaleX(); + //m_plot->OnScrollThumbTrack(evt); + m_plot->SetPosX(npos); + } + else { + npos = m_plot->GetPosY() + (double)go / m_plot->GetScaleY(); + //m_plot->OnScrollThumbTrack(evt); + m_plot->SetPosY(npos); + + } + event.Skip(false); + return; + } + + event.Skip(true); + +} void frmPlot::OnFit(wxCommandEvent& WXUNUSED(event)) { m_plot->Fit(); @@ -379,9 +452,18 @@ void frmPlot::OnSaveScreenshot(wxCommandEvent& event) event.Skip(); } -void frmPlot::OnToggleLissajoux(wxCommandEvent& event) +void frmPlot::OnToggleShowSeries(wxCommandEvent& event) { - m_plot->SetLayerVisible(wxT("Lissajoux"), event.IsChecked()); + bool v = event.IsChecked(); + for (unsigned int p = 4; p < m_plot->CountAllLayers(); p++) { + mpFXYVector* ly = dynamic_cast(m_plot->GetLayer(p)); + if (ly == NULL) continue; + if ((ly->GetLayerType() == mpLAYER_PLOT) && (ly->IsVisible())) { + ly->ShowName(v); + } + } + //m_plot->SetLayerVisible(wxT("Lissajoux"), event.IsChecked()); + m_plot->UpdateAll(); } void frmPlot::OnToggleShowSimbol(wxCommandEvent& event) diff --git a/frm/frmQuery.cpp b/frm/frmQuery.cpp index 1e34b2e..dad1246 100644 --- a/frm/frmQuery.cpp +++ b/frm/frmQuery.cpp @@ -2172,7 +2172,7 @@ void frmQuery::OnLabelRightClick(wxGridEvent &event) xmenu->Append(MNU_COPY, _("&Copy"), _("Copy selected cells to clipboard.")); xmenu->Append(MNU_PASTE, _("&Paste"), _("Paste data from the clipboard.")); xmenu->Append(MNU_DELETE, _("&Delete"), _("Delete selected rows.")); - xmenu->Append(MNU_AUTOCOLSPLOT, _("Draw plot LXY or XYYY..."), _("Draw plot LXY or XYYY...")); + xmenu->Append(MNU_AUTOCOLSPLOT, _("Draw plot LY(bar) or LXY or XYYY..."), _("Draw plot LY(bar) LXY or XYYY...")); xmenu->Append(MNU_SUMMARY_COL, _("Summary"), _("Summary selected cells.")); xmenu->Append(MNU_CHECK_COLUMN_DATE, _("Check the sequence of dates"), _("Check the sequence of dates")); xmenu->Append(MNU_COPY_INSERT, _("Copy Insert format"), _("Copy Insert format.")); diff --git a/frm/mathplot.cpp b/frm/mathplot.cpp index bf2b960..cc06670 100644 --- a/frm/mathplot.cpp +++ b/frm/mathplot.cpp @@ -58,7 +58,7 @@ #define mpSCROLL_NUM_PIXELS_PER_LINE 10 // See doxygen comments. -double mpWindow::zoomIncrementalFactor = 1.5; +double mpWindow::zoomIncrementalFactor = 1.2; //----------------------------------------------------------------------------- // mpLayer @@ -180,13 +180,15 @@ void mpInfoCoords::UpdateInfo(mpWindow &w, wxEvent &event) { int mouseY = ((wxMouseEvent &)event).GetY(); double xx=w.p2x(mouseX); double yy=w.p2y(mouseY); - double tx,ty; + double tx=0,ty=0; double dd; wxCoord sx,sy; wxString namel; + int size_vec; for (unsigned int p = 0; p < w.CountAllLayers(); p++) { - mpFXYVector *ly = reinterpret_cast(w.GetLayer(p)); + mpFXYVector *ly = dynamic_cast(w.GetLayer(p)); + if (ly == NULL) continue; if ((ly->GetLayerType() == mpLAYER_PLOT) && (ly->IsVisible())) { tx=xx;ty=yy; double d=ly->GetDistance(tx,ty); @@ -195,7 +197,9 @@ void mpInfoCoords::UpdateInfo(mpWindow &w, wxEvent &event) { dd=sqrt((double)(sx-mouseX)*(double)(sx-mouseX)+(double)(sy-mouseY)*(double)(sy-mouseY)); if (dd<4) { - namel=ly->GetName(); + size_vec = ly->GetSize(); + namel.Printf("%s\nNumber points: %d",ly->GetName(),size_vec); + size_vec = ly->GetSize(); mouseX=1; break; } @@ -213,6 +217,7 @@ void mpInfoCoords::UpdateInfo(mpWindow &w, wxEvent &event) { wxString s = xaxis->GetLabelTextValue(x); wxString xname = xaxis->GetName(); wxString yname = yaxis->GetName(); + toolTipContent.Printf(_("%s\n%s = %s\n%s = %f"), namel,xname,s,yname, ty); wxTipWindow** ptr = NULL; wxRect rectBounds(sx, sy, 5, 5); @@ -550,17 +555,46 @@ void mpFXY::UpdateViewBoundary(wxCoord xnew, wxCoord ynew) { minDrawY = (minDrawY < ynew) ? minDrawY : ynew; // drawnPoints++; } +void drawInRectText(wxDC &dc, wxString text,wxRect out,int align) { + wxCoord tx, ty; + dc.GetMultiLineTextExtent(text, &tx, &ty); + wxRect in(0,0,tx,ty); + int angle = 0; + //if ((ix2 - ix) < ty) continue; + if (out.width < tx) { + angle = 90; + in.SetWidth(ty); + in.SetHeight(tx); + in = in.CenterIn(out); + in.y = in.y + tx; + if (in.y > (out.y+out.height)) in.y = out.y + out.height; + if (align == wxALIGN_TOP) { + in.y = out.y + tx+15; + } + } + else + { + in = in.CenterIn(out); + if (align == wxALIGN_TOP) { + in.y = out.y + ty; + } + } + dc.DrawRotatedText(text, in.x, in.y, angle); +} void mpFXY::Plot(wxDC &dc, mpWindow &w) { if (m_visible) { + mpFXYVector *v= dynamic_cast(this); + bool isBar = false; + if (v != NULL) isBar = v->IsLegendBar(); + int wsimb = m_pen.GetWidth(); - if (IsSelect()) { + if (IsSelect() && !isBar) { wxPen pensel(m_pen); pensel.SetWidth(wsimb * 2); dc.SetPen(pensel); } else { - dc.SetPen(m_pen); } dc.SetBrush(m_brush); @@ -569,10 +603,10 @@ void mpFXY::Plot(wxDC &dc, mpWindow &w) { // positioning Rewind(); GetNextXY(x, y); - maxDrawX = x; - minDrawX = x; - maxDrawY = y; - minDrawY = y; + maxDrawX = 0; + minDrawX = 10000000000; + maxDrawY = 0; + minDrawY = 10000000000; // drawnPoints = 0; Rewind(); @@ -588,7 +622,41 @@ void mpFXY::Plot(wxDC &dc, mpWindow &w) { if (!m_continuous) { // for some reason DrawPoint does not use the current pen, // so we use DrawLine for fat pens - if (m_pen.GetWidth() <= 1) { + if (isBar) { + double widthbar = 0.9; + int ix2,iy2; + iy2 = w.y2p(0); + dc.SetFont(m_font); + if (iy2 > maxYpx) iy2 = maxYpx; + bool viewY = false; + while (GetNextXY(x, y)) { + ix = w.x2p(x- widthbar/2); + ix2 = w.x2p(x + widthbar / 2); + iy = w.y2p(y); + viewY = false; + if (iy < minYpx) { iy = minYpx; viewY = true; } + if (ix2 > endPx) ix2 = endPx; + if (ix < startPx) ix = startPx; + if (ix2 < startPx|| ix>endPx) continue; + if (m_drawOutsideMargins || ((ix >= startPx) && (ix <= endPx) && + (iy >= minYpx) && (iy <= maxYpx))) { + dc.DrawRectangle(ix, iy, ix2 - ix, iy2 - iy); + UpdateViewBoundary(ix, iy); + wxCoord tx, ty; + wxString s = v->GetLegendBar(); + + + wxRect rectBig(ix,iy, ix2 - ix, iy2 - iy); + wxRect rectSmall(0, 0, tx, ty); + drawInRectText(dc,s,rectBig,wxALIGN_CENTER); + if (viewY) { + s.Printf("%f",y); + drawInRectText(dc, s, rectBig, wxALIGN_TOP); + } + }; + } + + } else if (m_pen.GetWidth() <= 1) { while (GetNextXY(x, y)) { ix = w.x2p(x); iy = w.y2p(y); @@ -923,11 +991,7 @@ void mpScaleX::Plot(wxDC &dc, mpWindow &w) { // double n = floor( (w.GetPosX() - (double)extend / w.GetScaleX()) / step ) // * step ; - double n0 = - floor( - (w.GetPosX() /* - (double)(extend - w.GetMarginLeft() - w.GetMarginRight())/ w.GetScaleX() */) / - step) * - step; + double n0 =floor((w.GetPosX() /* - (double)(extend - w.GetMarginLeft() - w.GetMarginRight())/ w.GetScaleX() */) /step) * step; double n = 0; #ifdef MATHPLOT_DO_LOGGING wxLogMessage(wxT("mpScaleX::Plot: dig: %f , step: %f, end: %f, n: %f"), dig, @@ -1325,6 +1389,10 @@ EVT_LEFT_UP(mpWindow::OnMouseLeftRelease) EVT_MENU(mpID_CENTER, mpWindow::OnCenter) EVT_MENU(mpID_FIT, mpWindow::OnFit) EVT_MENU(mpID_ZOOM_IN, mpWindow::OnZoomIn) +EVT_MENU(mpID_ZOOM_INX, mpWindow::OnZoomInX) +EVT_MENU(mpID_ZOOM_INX, mpWindow::OnZoomInY) +EVT_MENU(mpID_ZOOM_OUTX, mpWindow::OnZoomOutX) +EVT_MENU(mpID_ZOOM_OUTX, mpWindow::OnZoomOutY) EVT_MENU(mpID_ZOOM_OUT, mpWindow::OnZoomOut) EVT_MENU(mpID_LOCKASPECT, mpWindow::OnLockAspect) EVT_MENU(mpID_HELP_MOUSE, mpWindow::OnMouseHelp) @@ -1777,6 +1845,18 @@ void mpWindow::ZoomOut(const wxPoint ¢erPoint) { #endif UpdateAll(); } +void mpWindow::OnZoomInX(wxCommandEvent& WXUNUSED(event)) { + ZoomInX(); +} +void mpWindow::OnZoomInY(wxCommandEvent& WXUNUSED(event)) { + ZoomInY(); +} +void mpWindow::OnZoomOutX(wxCommandEvent& WXUNUSED(event)) { + ZoomOutX(); +} +void mpWindow::OnZoomOutY(wxCommandEvent& WXUNUSED(event)) { + ZoomOutY(); +} void mpWindow::ZoomInX() { m_scaleX = m_scaleX * zoomIncrementalFactor; @@ -2566,6 +2646,7 @@ bool mpFXYVector::GetNextXY(double &x, double &y) { return FALSE; else { x = m_xs[m_index]; + if (m_leg.size() > 0) m_current_leg = m_leg[m_index]; y = m_ys[m_index++]; return m_index <= m_xs.size(); } @@ -2574,6 +2655,10 @@ bool mpFXYVector::GetNextXY(double &x, double &y) { void mpFXYVector::Clear() { m_xs.clear(); m_ys.clear(); + m_leg.clear(); +} +int mpFXYVector::GetSize() { + return m_xs.size(); } double mpFXYVector::GetDistance(double &x,double &y) { std::vector::const_iterator itX; @@ -2593,7 +2678,15 @@ double mpFXYVector::GetDistance(double &x,double &y) { return minD; } +void mpFXYVector::SetLegendBar(const std::vector& leg) { + if (leg.size() != m_ys.size()) { + wxLogError( + _("wxMathPlot error: X and Y vector are not of the same length!")); + return; + } + m_leg = leg; +} void mpFXYVector::SetData(const std::vector &xs, const std::vector &ys) { // Check if the data vectora are of the same size diff --git a/include/frm/frmPlot.h b/include/frm/frmPlot.h index 891a72c..f0632f7 100644 --- a/include/frm/frmPlot.h +++ b/include/frm/frmPlot.h @@ -13,7 +13,7 @@ public: frmPlot(frmQuery* parent, const wxString& _title); ~frmPlot(); void Go(); - void AddSeries(const wxString legend, const std::vector& x, const std::vector& y); + void AddSeries(const wxString legend, const std::vector& x, const std::vector& y,const std::vector& l); void ClearAndSetAxis(wxString XtextAxis, unsigned int X_labelType, wxString YtextAxis); void OnAbout(wxCommandEvent& event); void OnQuit(wxCommandEvent& event); @@ -26,10 +26,20 @@ public: void OnCopy(wxCommandEvent& event); void OnToggleInfoLayer(wxCommandEvent& event); void OnSaveScreenshot(wxCommandEvent& event); - void OnToggleLissajoux(wxCommandEvent& event); + void OnToggleShowSeries(wxCommandEvent& event); void OnToggleShowSimbol(wxCommandEvent& event); void OnToggleCosine(wxCommandEvent& event); void OnBlackTheme(wxCommandEvent& event); + void OnCenter(wxCommandEvent& event) { m_plot->OnCenter(event); }; + void OnZoomIn(wxCommandEvent& event) { m_plot->OnZoomIn(event); }; + void OnZoomInX(wxCommandEvent& event) { m_plot->OnZoomInX(event); }; + void OnZoomInY(wxCommandEvent& event) { m_plot->OnZoomInY(event); }; + void OnZoomOutX(wxCommandEvent& event) { m_plot->OnZoomOutX(event); }; + void OnZoomOutY(wxCommandEvent& event) { m_plot->OnZoomOutY(event); }; + void OnZoomOut(wxCommandEvent& event) { m_plot->OnZoomOut(event); }; + void OnLockAspect(wxCommandEvent& event) { m_plot->OnLockAspect(event); }; + void OnKEY_DOWN(wxKeyEvent& event); + mpWindow* m_plot; diff --git a/include/frm/mathplot.h b/include/frm/mathplot.h index fd280c7..9408a49 100644 --- a/include/frm/mathplot.h +++ b/include/frm/mathplot.h @@ -122,6 +122,10 @@ enum { mpID_FIT = 2000, //!< Fit view to match bounding box of all layers mpID_ZOOM_IN, //!< Zoom into view at clickposition / window center mpID_ZOOM_OUT, //!< Zoom out + mpID_ZOOM_INX, + mpID_ZOOM_INY, + mpID_ZOOM_OUTX, + mpID_ZOOM_OUTY, mpID_CENTER, //!< Center view on click position mpID_LOCKASPECT, //!< Lock x/y scaling aspect mpID_HELP_MOUSE //!< Shows information about the mouse commands @@ -662,6 +666,14 @@ public: */ virtual bool GetNextXY(double &x, double &y) = 0; + /** Get legend value for N. + Override this function in your implementation. + @param x Returns X value + @param y Returns Y value + */ + virtual wxString GetLegendBar() = 0; + + /** Layer plot handler. This implementation will plot the locus in the visible area and put a label according to the alignment specified. @@ -1315,6 +1327,18 @@ public: @return reference to axis colour used in theme */ const wxColour &GetAxesColour() { return m_axColour; }; + void OnCenter(wxCommandEvent& event); //!< Context menu handler + void OnFit(wxCommandEvent& event); //!< Context menu handler + void OnZoomIn(wxCommandEvent& event); //!< Context menu handler + void OnZoomOut(wxCommandEvent& event); //!< Context menu handler + void OnZoomInX(wxCommandEvent& WXUNUSED(event)); + void OnZoomInY(wxCommandEvent& WXUNUSED(event)); + void OnZoomOutX(wxCommandEvent& WXUNUSED(event)); + void OnZoomOutY(wxCommandEvent& WXUNUSED(event)); + void OnScrollThumbTrack( + wxScrollWinEvent& event); //!< Scroll thumb on scroll bar moving + + void OnLockAspect(wxCommandEvent& event); //!< Context menu handler protected: void OnPaint( wxPaintEvent &event); //!< Paint handler, will plot all attached layers @@ -1328,11 +1352,6 @@ protected: //when the user drags with the //right button or just "clicks" //for the menu - void OnCenter(wxCommandEvent &event); //!< Context menu handler - void OnFit(wxCommandEvent &event); //!< Context menu handler - void OnZoomIn(wxCommandEvent &event); //!< Context menu handler - void OnZoomOut(wxCommandEvent &event); //!< Context menu handler - void OnLockAspect(wxCommandEvent &event); //!< Context menu handler void OnMouseHelp(wxCommandEvent &event); //!< Context menu handler void OnMouseWheel(wxMouseEvent &event); //!< Mouse handler for the wheel void OnMouseMove( @@ -1341,8 +1360,6 @@ protected: OnMouseLeftDown(wxMouseEvent &event); //!< Mouse left click (for rect zoom) void OnMouseLeftRelease(wxMouseEvent &event); //!< Mouse left click (for rect zoom) - void OnScrollThumbTrack( - wxScrollWinEvent &event); //!< Scroll thumb on scroll bar moving void OnScrollPageUp(wxScrollWinEvent &event); //!< Scroll page up void OnScrollPageDown(wxScrollWinEvent &event); //!< Scroll page down void OnScrollLineUp(wxScrollWinEvent &event); //!< Scroll line up @@ -1451,17 +1468,24 @@ public: * @sa Clear */ void SetData(const std::vector &xs, const std::vector &ys); - + void SetLegendBar(const std::vector& leg); + bool IsLegendBar() { return m_leg.size() > 0; } + wxString GetLegendBar() { + return m_current_leg + ; + } /** Clears all the data, leaving the layer empty. * @sa SetData */ void Clear(); double GetDistance(double &x,double &y); + int GetSize(); protected: /** The internal copy of the set of data to draw. */ std::vector m_xs, m_ys; - + std::vector m_leg; + wxString m_current_leg; /** The internal counter for the "GetNextXY" interface */ size_t m_index; diff --git a/x64/Release_(3.0)/pgAdmin3.exe b/x64/Release_(3.0)/pgAdmin3.exe index 99c8afd..0786f3f 100644 Binary files a/x64/Release_(3.0)/pgAdmin3.exe and b/x64/Release_(3.0)/pgAdmin3.exe differ