void SelectDrawValidator::OnMouseRightDown(wxMouseEvent &event) { DrawInfo* di = m_draws_wdg->GetDrawInfo(m_index); if (di == NULL) return; wxMenu menu; DrawParam* dp = di->GetParam(); if (di->IsValid() && dp->GetIPKParam()->GetPSC()) menu.Append(seldrawID_PSC,_("Set parameter")); menu.SetClientData(m_cb); if (m_draws_wdg->GetDrawBlocked(m_index)) { wxMenuItem* item = menu.AppendCheckItem(seldrawID_CTX_BLOCK_MENU, _("Draw blocked\tCtrl-B")); item->Check(); } else { int non_blocked_count = 0; for (unsigned int i = 0; i < m_draws_wdg->GetDrawsCount(); ++i) if (!m_draws_wdg->GetDrawBlocked(i)) non_blocked_count++; //one draw shall be non-blocked if (non_blocked_count > 1) menu.AppendCheckItem(seldrawID_CTX_BLOCK_MENU, _("Draw blocked\tCtrl-B")); } menu.Append(seldrawID_CTX_DOC_MENU, _("Parameter documentation\tCtrl-H")); menu.Append(seldrawID_CTX_COPY_PARAM_NAME_MENU, _("Copy parameter name\tCtrl+Shift+C")); wxMenu* submenu = new wxMenu(); submenu->SetClientData(m_cb); wxMenuItem* averageItem = submenu->AppendRadioItem(seldrawID_CTX_AVERAGE_VALUE, _("Average value for selected period")); wxMenuItem* lastItem = submenu->AppendRadioItem(seldrawID_CTX_LAST_VALUE, _("Last value")); wxMenuItem* diffItem = submenu->AppendRadioItem(seldrawID_CTX_DIFFERENCE_VALUE, _("Difference between last and first value")); menu.AppendSubMenu(submenu, _("Type of average values shown")); switch (di->GetAverageValueCalculationMethod()) { case AVERAGE_VALUE_CALCULATION_AVERAGE: averageItem->Check(true); break; case AVERAGE_VALUE_CALCULATION_LAST: lastItem->Check(true); break; case AVERAGE_VALUE_CALCULATION_LAST_FIRST: diffItem->Check(true); break; } if (dynamic_cast<DefinedParam*>(dp) != NULL) menu.Append(seldrawID_CTX_EDIT_PARAM, _("Edit parameter associated with graph\tCtrl-E")); m_cb->PopupMenu(&menu); }
void GCDCGraphs::DrawYAxisVals(wxGraphicsContext& dc) { Draw* draw = m_draws_wdg->GetSelectedDraw(); if (draw == NULL) return; DrawInfo *di = draw->GetDrawInfo(); if (!di->IsValid()) return; double min = di->GetMin(); double max = di->GetMax(); if( max <= min ) { // FIXME: Draw3 should atomaticly detect axes in that case, but // it currently doesnt :( wxLogWarning(_T("Parameter %s has invalid min/max values: min %f, max %f. Min is set to 0, and max to 100."), di->GetName().c_str(), min, max); min = 0; max = 100; } //procedure for calculating distance between marks stolen from SzarpDraw2 double x = max - min; double step; int i = 0; if (x < 1) for (;x < 1; x *=10, --i); else for (;(int)x / 10; x /=10, ++i); if (x <= 1.5) step = .1; else if (x <= 3.) step = .2; else if (x <= 7.5) step = .5; else step = 1.; double acc = 1; int prec = di->GetPrec(); for (int p = prec; p > 0; --p) acc /= 10; double factor = (i > 0) ? 10 : .1; for (;i; i -= i / abs(i)) step *= factor; if (step < acc) step = acc; dc.SetPen(wxPen(*wxWHITE, 1, wxSOLID)); int w, h; GetClientSize(&w, &h); h -= m_screen_margins.bottommargin + m_screen_margins.topmargin; for (double val = max; (min - val) < acc; val -= step) { int y = GetY(val, di); dc.StrokeLine(m_screen_margins.leftmargin - 8, y, m_screen_margins.leftmargin, y); wxString sval = di->GetValueStr(val, _T("- -")); double textw, texth, textd, textel; dc.GetTextExtent(sval, &textw, &texth, &textd, &textel); dc.DrawText(sval, m_screen_margins.leftmargin - textw - 1, y + 2); } }