%% options copyright owner = Dirk Krause copyright year = 2019-xxxx SPDX-License-Identifier: BSD-3-Clause %% module #include "wxdkdraw.h" #ifndef WXDKDRAWAPPH_INCLUDED #include "WxdkdrawApp.h" #endif #ifndef WXDKDRAWFRAME_H_INCLUDED #include "WxdkdrawFrame.h" #endif #ifndef WXDKDRAWDLGTEXTINPUT_H_INCLUDED #include "WxdkdrawDlgTextInput.h" #endif #ifndef WXDKDRAWDLGSPLINEVALUE_H_INCLUDED #include "WxdkdrawDlgSplineValue.h" #endif #ifndef WXDKDRAWDLGIMAGEOPTIONS_H_INCLUDED #include "WxdkdrawDlgImageOptions.h" #endif #ifndef WXDKDRAWDLGDOTFILLED_H_INCLUDED #include "WxdkdrawDlgDotFilled.h" #endif #ifndef WXDKDRAWDLGBOXRADIUS_H_INCLUDED #include "WxdkdrawDlgBoxRadius.h" #endif #ifndef DK4MAAU32_H_INCLUDED #include "dk4maau32.h" #endif #ifndef DK4MAAI32_H_INCLUDED #include "dk4maai32.h" #endif #ifndef DK4MAAU16_H_INCLUDED #include "dk4maau16.h" #endif #if DK4_HAVE_MATH_H #ifndef MATH_H_INCLUDED #include #define MATH_H_INCLUDED 1 #endif #endif $!trace-include /** Image file types we can handle. */ static wxChar const image_files_to_open[] = { #if DK4_HAVE_PNG_H wxT("PNG files (*.png)|*.png") #if DK4_HAVE_JPEGLIB_H wxT("|JPEG files (*.jpeg)|*.jpeg") wxT("|JPEG files (*.jpg)|*.jpg") #endif /* if DK4_HAVE_JPEGLIB_H */ #if DK4_HAVE_TIFF_H wxT("|TIFF files (*.tiff)|*.tiff") wxT("|TIFF files (*.tif)|*.tif") #endif /* if DK4_HAVE_TIFF_H */ wxT("|NetPBM files (*.pam)|*.pam") #else /* if DK4_HAVE_PNG_H */ #if DK4_HAVE_JPEGLIB_H wxT("JPEG files (*.jpeg)|*.jpeg") wxT("|JPEG files (*.jpg)|*.jpg") #if DK4_HAVE_TIFF_H wxT("|TIFF files (*.tiff)|*.tiff") wxT("|TIFF files (*.tif)|*.tif") #endif /* if DK4_HAVE_TIFF_H */ wxT("|NetPBM files (*.pam)|*.pam") #else /* if DK4_HAVE_JPEGLIB_H */ #if DK4_HAVE_TIFF_H wxT("TIFF files (*.tiff)|*.tiff") wxT("|TIFF files (*.tif)|*.tif") wxT("|NetPBM files (*.pam)|*.pam") #else /* if DK4_HAVE_TIFF_H */ wxT("NetPBM files (*.pam)|*.pam") #endif /* if DK4_HAVE_TIFF_H */ #endif /* if DK4_HAVE_JPEGLIB_H */ #endif /* DK4_HAVE_PNG_H */ wxT("|NetPBM files (*.pnm)|*.pnm") wxT("|NetPBM files (*.ppm)|*.ppm") wxT("|NetPBM files (*.pgm)|*.pgm") wxT("|NetPBM files (*.pbm)|*.pbm") }; bool WxdkdrawFrame::IsAcceptablePoint(void) { bool back = true; switch (m_iState) { case S_POLY_FURTHER : case S_SPLINE_FURTHER : case S_CIRCLE_RADIUS : case S_IMG_2 : { if ( (m_ptMousePosGrid.x == m_ptMouseMoveStart.x) && (m_ptMousePosGrid.y == m_ptMouseMoveStart.y) ) { back = false; } } break; case S_ELLIPSE_CORNER : case S_BOX_OPPOSITE : { back = false; /* For a box we accept neither equal x nor equal y coordinates */ if ( (m_ptMousePosGrid.x != m_ptMouseMoveStart.x) && (m_ptMousePosGrid.y != m_ptMouseMoveStart.y) ) { back = true; } } break; case S_ARC_2 : { if ( ((m_pCurrent->det).a.x1 == (m_pCurrent->det).a.x2) && ((m_pCurrent->det).a.y1 == (m_pCurrent->det).a.y2) ) { back = false; } } break; case S_ARC_3 : { if ( ( ((m_pCurrent->det).a.x1 == (m_pCurrent->det).a.x3) && ((m_pCurrent->det).a.y1 == (m_pCurrent->det).a.y3) ) || ( ((m_pCurrent->det).a.x2 == (m_pCurrent->det).a.x3) && ((m_pCurrent->det).a.y2 == (m_pCurrent->det).a.y3) ) ) { back = false; } } break; } return back; } void WxdkdrawFrame::MouseMoveNoop(void) { Wxd_object_t *pobj; size_t si; int oldtype = WXD_OT_GROUP_END; $? "+ MouseMoveNoop" if (m_bMousePos) { if (NULL != m_pCurrent) { oldtype = (int)(m_pCurrent->ot); } #if 0 if (NULL == m_pStyle) { #endif pobj = FindNearestObject(); if (m_pCurrent != pobj) { if ((NULL != pobj) && (NULL == m_pCurrent)) { msgMouseL->SetLabel(sTexts[201]); msgMouseL->Refresh(); m_bUpdate = true; } else { if ((NULL == pobj) && (NULL != m_pCurrent)) { msgMouseL->SetLabel(sNlWx[7]); msgMouseL->Refresh(); m_bUpdate = true; } } wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = pobj; if (NULL != m_pCurrent) { pobj->mark |= OBJ_MARKER_1; if (oldtype != (int)(m_pCurrent->ot)) { if ( (WXD_OT_TEXT <= m_pCurrent->ot) && (WXD_OT_DOT_WHITE >= m_pCurrent->ot) ) { si = (size_t)172U + (size_t)(m_pCurrent->ot); SetStatusText(sTexts[si]); m_bUpdate = true; } } } else { SetStatusText(sNlWx[19]); } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } #if 0 } #endif } else { if (NULL != m_pCurrent) { m_pCurrent = NULL; msgMouseL->SetLabel(sNlWx[7]); msgMouseL->Refresh(); SetStatusText(sNlWx[19]); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } } $? "- MouseMoveNoop" } void WxdkdrawFrame::MouseMoveDelete(void) { Wxd_object_t *pOldCurrent; $? "+ MouseMoveDelete" if (m_bMousePos) { pOldCurrent = m_pCurrent; m_pCurrent = FindNearestObject(true); if (m_pCurrent != pOldCurrent) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); if (NULL != m_pCurrent) { wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_1); if ( (WXD_OT_GROUP_BEGIN <= m_pCurrent->ot) && (WXD_OT_DOT_WHITE >= m_pCurrent->ot) ) { SetStatusText( sTexts[(size_t)172U + (size_t)(m_pCurrent->ot)] ); } else { SetStatusText(sNlWx[7]); } msgMouseL->SetLabel(sTexts[340]); } else { SetStatusText(sNlWx[7]); msgMouseL->SetLabel(sNlWx[7]); } msgMouseL->Refresh(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } } else { SetStatusText(sNlWx[7]); msgMouseL->SetLabel(sNlWx[7]); msgMouseL->Refresh(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } $? "- MouseMoveDelete" } void WxdkdrawFrame::MouseMoveMoveSelect(void) { Wxd_object_t *pOldCurrent; $? "+ MouseMoveMoveSelect" if (m_bMousePos) { $? ". mouse pos" pOldCurrent = m_pCurrent; m_pCurrent = FindNearestObject(true); if (m_pCurrent != pOldCurrent) { $? ". other object" wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); if (NULL != m_pCurrent) { $? ". object" wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_1); if ( (WXD_OT_GROUP_BEGIN <= m_pCurrent->ot) && (WXD_OT_DOT_WHITE >= m_pCurrent->ot) ) { $? ". type ok" SetStatusText( sTexts[(size_t)172U + (size_t)(m_pCurrent->ot)] ); } else { $? "! type" SetStatusText(sNlWx[7]); } msgMouseL->SetLabel(sTexts[342]); } else { $? ". no object" SetStatusText(sNlWx[7]); msgMouseL->SetLabel(sNlWx[7]); } msgMouseL->Refresh(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } #if TRACE_DEBUG else { $? ". no other object" } #endif } else { $? "! no mouse pos" SetStatusText(sNlWx[7]); msgMouseL->SetLabel(sNlWx[7]); msgMouseL->Refresh(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } $? "- MouseMoveMoveSelect" } void WxdkdrawFrame::MouseMoveMovePlace(void) { $? "+ MouseMoveMovePlace" $? ". m_bMousePos = %d", ((m_bMousePos) ? 1 : 0) $? ". m_bMouseDiff = %d", ((m_bMouseDiff) ? 1 : 0) if ((m_bMousePos) && (m_bMouseDiff)) { $? ". conditions" if (0 != wxdobj_shift_marked(m_pDrw, &m_ptMouseMoveDiff, 0)) { $? ". shift test ok" wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } #if TRACE_DEBUG else { $? "! overflow" } #endif } #if TRACE_DEBUG else { $? "! conditions" } #endif $? "- MouseMoveMovePlace" } void WxdkdrawFrame::MouseMoveCopySelect(void) { Wxd_object_t *pOldCurrent; $? "+ MouseMoveCopySelect" if (m_bMousePos) { pOldCurrent = m_pCurrent; m_pCurrent = FindNearestObject(true); if (m_pCurrent != pOldCurrent) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); if (NULL != m_pCurrent) { wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_1); if ( (WXD_OT_GROUP_BEGIN <= m_pCurrent->ot) && (WXD_OT_DOT_WHITE >= m_pCurrent->ot) ) { SetStatusText( sTexts[(size_t)172U + (size_t)(m_pCurrent->ot)] ); } else { SetStatusText(sNlWx[7]); } msgMouseL->SetLabel(sTexts[370]); } else { SetStatusText(sNlWx[7]); msgMouseL->SetLabel(sNlWx[7]); } msgMouseL->Refresh(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } } else { SetStatusText(sNlWx[7]); msgMouseL->SetLabel(sNlWx[7]); msgMouseL->Refresh(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } $? "- MouseMoveCopySelect" } void WxdkdrawFrame::MouseMoveCopyPlace(void) { $? "+ MouseMoveCopyPlace" if ((m_bMousePos) && (m_bMouseDiff)) { if (0 != wxdobj_shift_marked(m_pDrw, &m_ptMouseMoveDiff, 0)) { wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } else { } } else { } $? "- MouseMoveCopyPlace" } void WxdkdrawFrame::MouseLeftNoop(void) { Wxd_object_t *pobj; size_t si; $? "+ MouseLeftNoop" if (m_bMousePos) { #if 0 if (NULL == m_pStyle) { $? ". new style pointer" #endif pobj = FindNearestObject(); if (NULL != pobj) { m_pStyle = pobj; wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); $? ". all unmarked" if ( (WXD_OT_TEXT <= m_pStyle->ot) && (WXD_OT_DOT_WHITE >= m_pStyle->ot) ) { msgMouseR->SetLabel(sTexts[200]); $? ". r label set" msgMouseL->SetLabel(sNlWx[7]); $? ". l label set" si = (size_t)185U + (size_t)(m_pStyle->ot); $? ". si = %u", (unsigned)si SetStatusText(sTexts[si]); $? ". status text set" msgMouseR->Refresh(); $? ". refresh right" msgMouseL->Refresh(); $? ". refresh left" m_bUpdate = true; $? ". update flag set" StyleToGUI(); } else { SetStatusText(sNlWx[19]); } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } #if 0 } else { $? ". style pointer already available" } #endif } else { } $? "- MouseLeftNoop" } void WxdkdrawFrame::MouseLeftDelete(void) { Wxd_object_t *pobj; $? "+ MouseLeftDelete" if (m_bMousePos) { pobj = FindNearestObject(true); if (NULL != pobj) { wxdobj_obj_delete_from_drawing(m_pDrw, pobj); msgMouseL->SetLabel(sNlWx[7]); msgMouseL->Refresh(); SetStatusText(sNlWx[7]); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetModified(); } } else { } $? "- MouseLeftDelete" } void WxdkdrawFrame::MouseLeftMoveSelect(void) { $? "+ MouseLeftMoveSelect" if (m_bMousePos) { m_pCurrent = FindNearestObject(true); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); if (NULL != m_pCurrent) { wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_1); m_iState = S_MOVE_PLACE; DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); m_ptMouseMoveDiff.x = (int32_t)0L; m_ptMouseMoveDiff.y = (int32_t)0L; m_bMouseDiff = true; if ( (WXD_OT_GROUP_BEGIN <= m_pCurrent->ot) && (WXD_OT_DOT_WHITE >= m_pCurrent->ot) ) { SetStatusText(sTexts[(size_t)172U + (size_t)(m_pCurrent->ot)]); } else { SetStatusText(sNlWx[7]); } msgMouseL->SetLabel(sTexts[343]); } else { SetStatusText(sNlWx[7]); msgMouseL->SetLabel(sNlWx[7]); } msgMouseL->Refresh(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } else { } $? "- MouseLeftMoveSelect" } void WxdkdrawFrame::MouseLeftMovePlace(void) { $? "+ MouseLeftMovePlace" if ((m_bMousePos) && (m_bMouseDiff)) { if (0 != wxdobj_shift_marked(m_pDrw, &m_ptMouseMoveDiff, 0)) { wxdobj_shift_marked(m_pDrw, &m_ptMouseMoveDiff, 1); if (NULL != m_pCurrent) { wxdobj_bb_modified_object(m_pDrw, m_pCurrent); } else { wxdobj_bb_for_drawing(m_pDrw); } m_iState = S_MOVE_SELECT; SetModified(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } } $? "- MouseLeftMovePlace" } void WxdkdrawFrame::MouseLeftCopySelect(void) { $? "+ MouseLeftCopySelect" if (m_bMousePos) { m_pCurrent = FindNearestObject(true); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); if (NULL != m_pCurrent) { wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_1); m_iState = S_COPY_PLACE; DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); m_ptMouseMoveDiff.x = (int32_t)0L; m_ptMouseMoveDiff.y = (int32_t)0L; m_bMouseDiff = true; if ( (WXD_OT_GROUP_BEGIN <= m_pCurrent->ot) && (WXD_OT_DOT_WHITE >= m_pCurrent->ot) ) { SetStatusText(sTexts[(size_t)172U + (size_t)(m_pCurrent->ot)]); } else { SetStatusText(sNlWx[7]); } msgMouseL->SetLabel(sTexts[371]); } else { SetStatusText(sNlWx[7]); msgMouseL->SetLabel(sNlWx[7]); } msgMouseL->Refresh(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } $? "- MouseLeftCopySelect" } void WxdkdrawFrame::MouseLeftCopyPlace(void) { $? "+ MouseLeftCopyPlace" if ((m_bMousePos) && (m_bMouseDiff)) { if (0 != wxdobj_shift_marked(m_pDrw, &m_ptMouseMoveDiff, 0)) { /* Create copy and shift objects in copy */ if (NULL != m_pCurrent) { wxdobj_copy_recursive(m_pDrw, m_pCurrent, &m_ptMouseMoveDiff); SetModified(); } m_iState = S_COPY_SELECT; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } } $? "- MouseLeftCopyPlace" } void WxdkdrawFrame::EndOperationPolyFirst(void) { $? "+ EndOperationPolyFirst" if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = NULL; m_iState = S_NOOP; SetMouseAndStatusTexts(S_NOOP); $? "- EndOperationPolyFirst" } void WxdkdrawFrame::EndOperationPolyFurther(bool bComplete, bool bSkip) { dk4_er_t er; uint16_t itd; $? "+ EndOperationPolyFurther complete=%d skip=%d", (bComplete ? 1 : 0), (bSkip ? 1 : 0) if (bSkip) { $? ". skip input" if (NULL != m_pCurrent) { wxdobj_obj_delete_from_drawing(m_pDrw, m_pCurrent); m_iState = S_POLY_FIRST; } else { m_iState = S_NOOP; } } else { $? ". do not skip input" if (NULL != m_pCurrent) { $? ". have current object" m_pCurrent->mark &= (~(OBJ_MARKER_1)); if ( (WXD_OT_POLYLINE == m_pCurrent->ot) || (WXD_OT_POLYGON == m_pCurrent->ot) ) { $? ". polyline or polygon" if (2U < (m_pCurrent->det).p.n) { dk4error_init(&er); $? ". more than 2 points" itd = (m_pCurrent->det).p.n - 1U; if ( wxdobj_del_polypoint(m_pCurrent, itd, &er) ) { m_iState = S_POLY_FIRST; $? ". del point ok" } else { $? "! del point" m_iState = S_NOOP; dk4error_copy(&m_oErrorReport, &er); } wxdobj_bb_simple_object(m_pDrw, m_pCurrent); SetModified(); } else { $? ". 2 points or less" wxdobj_obj_delete_from_drawing(m_pDrw, m_pCurrent); } m_iState = S_POLY_FIRST; } else { $? "! not a polyline or polygon" m_iState = S_NOOP; } } else { $? "! no current object" m_iState = S_NOOP; } } m_pCurrent = NULL; if (bComplete) { m_iState = S_NOOP; } SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); $? "- EndOperationPolyFurther" } void WxdkdrawFrame::EndOperationSplineFirst(void) { $? "+ EndOperationSplineFirst" #if 0 if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = NULL; m_iState = S_NOOP; SetMouseAndStatusTexts(S_NOOP); #else EndOperationPolyFirst(); #endif $? "- EndOperationSplineFirst" } void WxdkdrawFrame::EndOperationSplineFurther(bool bComplete, bool bSkip) { dk4_er_t er; uint16_t itd; $? "+ EndOperationSplineFurther complete=%d skip=%d", (bComplete ? 1 : 0), (bSkip ? 1 : 0) if (bSkip) { $? ". skip input" if (NULL != m_pCurrent) { wxdobj_obj_delete_from_drawing(m_pDrw, m_pCurrent); m_iState = S_SPLINE_FIRST; } else { m_iState = S_NOOP; } } else { $? ". do not skip input" if (NULL != m_pCurrent) { $? ". have current object" m_pCurrent->mark &= (~(OBJ_MARKER_1)); if ( (WXD_OT_O_SPLINE == m_pCurrent->ot) || (WXD_OT_C_SPLINE == m_pCurrent->ot) ) { $? ". spline" if (2U < (m_pCurrent->det).s.n) { dk4error_init(&er); $? ". more than 2 points" itd = (m_pCurrent->det).s.n - 1U; if ( wxdobj_del_splinepoint(m_pCurrent, itd, &er) ) { ((m_pCurrent->det).s.p)[(m_pCurrent->det).s.n - 1U].s = SValueAtEnd(); m_iState = S_SPLINE_FIRST; $? ". del point ok" } else { $? "! del point" m_iState = S_NOOP; dk4error_copy(&m_oErrorReport, &er); } wxdobj_bb_simple_object(m_pDrw, m_pCurrent); SetModified(); } else { $? ". 2 points or less" wxdobj_obj_delete_from_drawing(m_pDrw, m_pCurrent); } m_iState = S_SPLINE_FIRST; } else { $? "! not a polyline or polygon" m_iState = S_NOOP; } } else { $? "! no current object" m_iState = S_NOOP; } } m_pCurrent = NULL; if (bComplete) { m_iState = S_NOOP; } SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); $? "- EndOperationSplineFurther" } void WxdkdrawFrame::EndOperationBoxFirst(void) { #if 0 if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = NULL; m_iState = S_NOOP; SetMouseAndStatusTexts(S_NOOP); #else EndOperationPolyFirst(); #endif } void WxdkdrawFrame::EndOperationTwoPointsSecond(int ns, bool bComplete) { if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); wxdobj_obj_delete_from_drawing(m_pDrw, m_pCurrent); m_pCurrent = NULL; } m_iState = ns; if (bComplete) { m_iState = S_NOOP; } SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } void WxdkdrawFrame::EndOperationBoxOpposite(bool bComplete) { EndOperationTwoPointsSecond(S_BOX_FIRST, bComplete); } void WxdkdrawFrame::EndOperationCircleCenter(void) { $? "+ EndOperationCircleCenter" #if 0 if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = NULL; m_iState = S_NOOP; SetMouseAndStatusTexts(S_NOOP); #else EndOperationPolyFirst(); #endif $? "- EndOperationCircleCenter" } void WxdkdrawFrame::EndOperationCircleRadius(bool bComplete) { $? "+ EndOperationCircleRadius" EndOperationTwoPointsSecond(S_CIRCLE_CENTER, bComplete); $? "- EndOperationCircleRadius" } void WxdkdrawFrame::EndOperationEllipseCenter(void) { $? "+ EndOperationEllipseCenter" #if 0 if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = NULL; m_iState = S_NOOP; SetMouseAndStatusTexts(S_NOOP); #else EndOperationPolyFirst(); #endif $? "- EndOperationEllipseCenter" } void WxdkdrawFrame::EndOperationEllipseCorner(bool bComplete) { $? "+ EndOperationEllipseCorner" EndOperationTwoPointsSecond(S_ELLIPSE_CENTER, bComplete); $? "- EndOperationEllipseCorner" } void WxdkdrawFrame::EndOperationArc1(void) { #if 0 if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = NULL; m_iState = S_NOOP; SetMouseAndStatusTexts(S_NOOP); #else EndOperationPolyFirst(); #endif } void WxdkdrawFrame::EndOperationArc2(bool bComplete) { if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); wxdobj_obj_delete_from_drawing(m_pDrw, m_pCurrent); m_pCurrent = NULL; } m_iState = S_ARC_1; if (bComplete) { m_iState = S_NOOP; } SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } void WxdkdrawFrame::EndOperationArc3(bool bComplete) { EndOperationArc2(bComplete); } void WxdkdrawFrame::EndOperationDot(void) { m_pCurrent = NULL; m_iState = S_NOOP; SetMouseAndStatusTexts(m_iState); } void WxdkdrawFrame::EndOperationLibelemPlace(void) { /* Remove library element group object from drawing */ if (NULL != m_pCurrent) { wxdobj_obj_delete_from_drawing(m_pDrw, m_pCurrent); } m_pCurrent = NULL; m_iState = S_NOOP; SetMouseAndStatusTexts(m_iState); } void WxdkdrawFrame::EndOperationPointMovePlace(void) { if (NULL != m_pCurrent) { switch ( (int)(m_pCurrent->ot) ) { case WXD_OT_ELLIPSE : case WXD_OT_CIRCLE : { DK4_MEMCPY(\ &((m_pCurrent->det).e),\ &m_ellPointMoveOri,\ sizeof(Wxd_det_ellipse_t)\ ); } break; } if ( wxdobj_set_control_point(m_pCurrent, &m_ptPointMoveOri, m_uCurrent) ) { switch ( (int)(m_pCurrent->ot) ) { case WXD_OT_BOX : { wxdobj_bb_correct(&((m_pCurrent->det).b.b), &m_uCurrent); } break; case WXD_OT_IMAGE : { wxdobj_bb_correct(&((m_pCurrent->det).i.br), &m_uCurrent); } break; } } m_pCurrent->mark &= (~(OBJ_MARKER_1)); wxdobj_bb_modified_object(m_pDrw, m_pCurrent); m_pCurrent = NULL; } m_uCurrent = (uint16_t)0U; #if 0 m_iState = S_NOOP; #endif /* 2020-03-21 Bugfix When aborting placement we probably want to select another point to move. */ m_iState = S_MOVEPT_SELECT; SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } void WxdkdrawFrame::EndOperationPointAddPlace(bool bComplete) { $? "+ EndOperationPointAddPlace" if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); wxdobj_delete_control_point(m_pCurrent, m_uCurrent); m_pCurrent = NULL; m_uCurrent = (uint16_t)0U; wxdobj_bb_modified_object(m_pDrw, m_pCurrent); } m_iState = ((bComplete) ? (S_NOOP) : (S_ADDPT_SELECT)); SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); $? "- EndOperationPointAddPlace" } void WxdkdrawFrame::EndOperationDrawingSizePlace(bool bComplete) { $? "+ EndOperationPointAddPlace" m_iState = ((bComplete) ? (S_NOOP) : (S_DRWSZ_SELECT)); SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); DK4_MEMCPY(&(m_pDrw->bb),&m_oOldSize,sizeof(Wxd_bb_t)); DK4_MEMCPY(&(m_oBorder.det.b.b),&m_oOldSize,sizeof(Wxd_bb_t)); SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_GRID); $? "- EndOperationPointAddPlace" } void WxdkdrawFrame::EndOperation(bool bComplete, bool bSkip) { int rdl = WXD_REFRESH_MARKUP; $? "+ EndOperation complete=%d skip=%d",(bComplete ? 1 : 0),(bSkip ? 1 : 0) /* _STATE_ End current operation. */ switch (m_iState) { /* When ending operations in states having objects under modification which are drawn in the markup pass, we must refresh the drawing. */ case S_MOVE_PLACE : case S_COPY_PLACE : case S_MOVEPT_SELECT : case S_MOVEPT_PLACE : case S_ADDPT_PLACE : { rdl = WXD_REFRESH_DRAWING; } break; } /* _STATE_ End current operation. */ switch (m_iState) { case S_NOOP : { if (NULL != m_pStyle) { m_pStyle = NULL; StyleToGUI(); wxdobj_drw_require_redraw(m_pDrw, rdl); msgMouseR->SetLabel(sNlWx[7]); msgMouseL->SetLabel(sNlWx[7]); SetStatusText(sNlWx[19]); msgMouseR->Refresh(); msgMouseL->Refresh(); m_bUpdate = true; } m_pCurrent = NULL; } break; case S_POLY_FIRST : { EndOperationPolyFirst(); } break; case S_POLY_FURTHER : { EndOperationPolyFurther(bComplete, bSkip); } break; case S_SPLINE_FIRST : { EndOperationSplineFirst(); } break; case S_SPLINE_FURTHER : { EndOperationSplineFurther(bComplete, bSkip); } break; case S_BOX_FIRST : { EndOperationBoxFirst(); } break; case S_BOX_OPPOSITE : { EndOperationBoxOpposite(bComplete); } break; case S_CIRCLE_CENTER : { EndOperationCircleCenter(); } break; case S_CIRCLE_RADIUS : { EndOperationCircleRadius(bComplete); } break; case S_ELLIPSE_CENTER : { EndOperationEllipseCenter(); } break; case S_ELLIPSE_CORNER : { EndOperationEllipseCorner(bComplete); } break; case S_ARC_1 : { EndOperationArc1(); } break; case S_ARC_2 : { EndOperationArc2(bComplete); } break; case S_ARC_3 : { EndOperationArc3(bComplete); } break; case S_DOT : { EndOperationDot(); } break; case S_LIBELEM_PLACE : { EndOperationLibelemPlace(); } break; case S_MOVEPT_PLACE : { EndOperationPointMovePlace(); } break; case S_ADDPT_PLACE : { EndOperationPointAddPlace(bComplete); } break; case S_DRWSZ_PLACE : { EndOperationDrawingSizePlace(bComplete); } break; case S_GROUP_ONE : { if ((2 > wxdobj_num_marked_2(m_pDrw)) || (bComplete)) { m_pStyle = NULL; m_pCurrent = NULL; m_iState = S_NOOP; } wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_2); SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, rdl); } break; case S_GROUP_RECT_2 : { m_iState = ((bComplete) ? (S_NOOP) : (S_GROUP_RECT_1)); m_pStyle = NULL; m_pCurrent = NULL; SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, rdl); } break; case S_REGION_DELETE : { m_iState = ((bComplete) ? (S_NOOP) : (S_DELETE)); m_pStyle = NULL; m_pCurrent = NULL; wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_2); SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, rdl); } break; default : { m_pStyle = NULL; m_pCurrent = NULL; m_iState = S_NOOP; SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, rdl); } break; } $? "- EndOperation" } void WxdkdrawFrame::MouseMovePolyFirst(void) { $? "+ MouseMovePolyFirst" $? "- MouseMovePolyFirst" } void WxdkdrawFrame::MouseLeftPolyFirst(void) { $? "+ MouseLeftPolyFirst" if (m_bMousePos) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = wxdobj_add_polyline( m_pDrw, NULL, 2U, ((WXD_OT_POLYGON == m_iObjToCreate) ? 1 : 0), &m_oStyle ); if ( (NULL != m_pCurrent) && (NULL != (m_pCurrent->det).p.p) ) { m_iState = S_POLY_FURTHER; m_pCurrent->mark |= OBJ_MARKER_1; ((m_pCurrent->det).p.p)[0].x = ((m_pCurrent->det).p.p)[1].x = m_ptMousePosGrid.x; ((m_pCurrent->det).p.p)[0].y = ((m_pCurrent->det).p.p)[1].y = m_ptMousePosGrid.y; if (WXD_OT_POLYGON == m_iObjToCreate) { if (WXD_FS_PURE < m_pCurrent->fs) { UpdateStipples(); } } wxdobj_bb_simple_object(m_pDrw, m_pCurrent); m_bAcceptablePoint = false; DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); SetMouseAndStatusTexts(m_iState); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } $? "- MouseLeftPolyFirst" } void WxdkdrawFrame::MouseMovePolyFurther(void) { bool bOldAcceptable; $? "+ MouseMovePolyFurther" if (m_bMousePos) { if ( (NULL != m_pCurrent) && (NULL != (m_pCurrent->det).p.p) ) { ((m_pCurrent->det).p.p)[(m_pCurrent->det).p.n - 1U].x = m_ptMousePosGrid.x; ((m_pCurrent->det).p.p)[(m_pCurrent->det).p.n - 1U].y = m_ptMousePosGrid.y; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); bOldAcceptable = m_bAcceptablePoint; m_bAcceptablePoint = IsAcceptablePoint(); if (bOldAcceptable != m_bAcceptablePoint) { SetMouseAndStatusTexts(m_iState); } } else { /* ERROR: Memory (already reported) */ } } else { /* ERROR: No mouse position available */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseMovePolyFurther" } void WxdkdrawFrame::MouseLeftPolyFurther(void) { dk4_er_t er; $? "+ MouseLeftPolyFurther" if (m_bMousePos) { if (IsAcceptablePoint()) { if ( (NULL != m_pCurrent) && (NULL != (m_pCurrent->det).p.p) ) { /* Fix current segment end point */ ((m_pCurrent->det).p.p)[(m_pCurrent->det).p.n - 1U].x = m_ptMousePosGrid.x; ((m_pCurrent->det).p.p)[(m_pCurrent->det).p.n - 1U].y = m_ptMousePosGrid.y; dk4error_init(&er); if ( wxdobj_add_polypoint(m_pCurrent, (m_pCurrent->det).p.n, &er) ) { /* Initial end point value for new segment */ ((m_pCurrent->det).p.p)[(m_pCurrent->det).p.n - 1U].x = m_ptMousePosGrid.x; ((m_pCurrent->det).p.p)[(m_pCurrent->det).p.n - 1U].y = m_ptMousePosGrid.y; SetModified(); m_bAcceptablePoint = false; DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); } else { dk4error_copy(&m_oErrorReport, &er); } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); } else { /* ERROR: Memory (already reported) */ } } } else { /* ERROR: Mouse position unknown */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftPolyFurther" } void WxdkdrawFrame::MouseMoveSplineFirst(void) { $? "+ MouseMoveSplineFirst" $? "- MouseMoveSplineFirst" } void WxdkdrawFrame::MouseLeftSplineFirst(void) { $? "+ MouseLeftSplineFirst" if (m_bMousePos) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = wxdobj_add_spline( m_pDrw, NULL, 2U, ((WXD_OT_C_SPLINE == m_iObjToCreate) ? 1 : 0), &m_oStyle ); if ( (NULL != m_pCurrent) && (NULL != (m_pCurrent->det).s.p) ) { m_iState = S_SPLINE_FURTHER; m_pCurrent->mark |= OBJ_MARKER_1; ((m_pCurrent->det).s.p)[0].x = ((m_pCurrent->det).s.p)[1].x = m_ptMousePosGrid.x; ((m_pCurrent->det).s.p)[0].y = ((m_pCurrent->det).s.p)[1].y = m_ptMousePosGrid.y; ((m_pCurrent->det).s.p)[0].s = ((m_pCurrent->det).s.p)[1].s = SValueAtEnd(); if (WXD_OT_C_SPLINE == m_iObjToCreate) { if (WXD_FS_PURE < m_pCurrent->fs) { UpdateStipples(); } } wxdobj_bb_simple_object(m_pDrw, m_pCurrent); m_bAcceptablePoint = false; DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); SetMouseAndStatusTexts(m_iState); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } $? "- MouseLeftSplineFirst" } void WxdkdrawFrame::MouseMoveSplineFurther(void) { bool bOldAcceptable; $? "+ MouseMoveSplineFurther" if (m_bMousePos) { if ( (NULL != m_pCurrent) && (NULL != (m_pCurrent->det).s.p) ) { ((m_pCurrent->det).s.p)[(m_pCurrent->det).s.n - 1U].x = m_ptMousePosGrid.x; ((m_pCurrent->det).s.p)[(m_pCurrent->det).s.n - 1U].y = m_ptMousePosGrid.y; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); bOldAcceptable = m_bAcceptablePoint; m_bAcceptablePoint = IsAcceptablePoint(); if (bOldAcceptable != m_bAcceptablePoint) { SetMouseAndStatusTexts(m_iState); } } else { /* ERROR: Memory (already reported) */ } } else { /* ERROR: No mouse position available */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseMoveSplineFurther" } double WxdkdrawFrame::SValueAtEnd(void) { double back = 0.0; if (NULL != m_pCurrent) { if (WXD_OT_C_SPLINE == m_pCurrent->ot) { back = ((m_bSplineInterpolated) ? (-1.0) : (1.0)); } } return back; } void WxdkdrawFrame::MouseLeftSplineFurther(void) { dk4_er_t er; $? "+ MouseLeftSplineFurther" if (m_bMousePos) { $? ". mouse position available" if (IsAcceptablePoint()) { if ( (NULL != m_pCurrent) && (NULL != (m_pCurrent->det).s.p) ) { $? ". pointers ok" /* Fix current segment end point */ ((m_pCurrent->det).s.p)[(m_pCurrent->det).s.n - 1U].x = m_ptMousePosGrid.x; ((m_pCurrent->det).s.p)[(m_pCurrent->det).s.n - 1U].y = m_ptMousePosGrid.y; ((m_pCurrent->det).s.p)[(m_pCurrent->det).s.n - 1U].s = (m_bSplineInterpolated ? (-1.0) : (1.0)); dk4error_init(&er); if ( wxdobj_add_splinepoint(m_pCurrent,(m_pCurrent->det).s.n,&er) ) { $? ". spline point added" /* Initial end point value for new segment */ ((m_pCurrent->det).s.p)[(m_pCurrent->det).s.n - 1U].x = m_ptMousePosGrid.x; ((m_pCurrent->det).s.p)[(m_pCurrent->det).s.n - 1U].y = m_ptMousePosGrid.y; ((m_pCurrent->det).s.p)[(m_pCurrent->det).s.n - 1U].s = SValueAtEnd(); SetModified(); m_bAcceptablePoint = false; DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); } else { $? "! failed to add spline point" dk4error_copy(&m_oErrorReport, &er); } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); } else { $? "! no object or no points" /* ERROR: Memory (already reported) */ } } } else { $? "! mouse position" /* ERROR: Mouse position unknown */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftSplineFurther" } void WxdkdrawFrame::SetBoxDetails(bool bUpdateRadius) { int32_t h; int32_t w; int32_t m; if (NULL != m_pCurrent) { if (m_ptMousePosGrid.x >= m_ptMouseMoveStart.x) { (m_pCurrent->det).b.b.xl = m_ptMouseMoveStart.x; (m_pCurrent->det).b.b.xr = m_ptMousePosGrid.x; } else { (m_pCurrent->det).b.b.xl = m_ptMousePosGrid.x; (m_pCurrent->det).b.b.xr = m_ptMouseMoveStart.x; } if (m_ptMousePosGrid.y >= m_ptMouseMoveStart.y) { (m_pCurrent->det).b.b.yb = m_ptMouseMoveStart.y; (m_pCurrent->det).b.b.yt = m_ptMousePosGrid.y; } else { (m_pCurrent->det).b.b.yb = m_ptMousePosGrid.y; (m_pCurrent->det).b.b.yt = m_ptMouseMoveStart.y; } if (bUpdateRadius && m_bSplineInterpolated) { w = (m_pCurrent->det).b.b.xr - (m_pCurrent->det).b.b.xl; h = (m_pCurrent->det).b.b.yt - (m_pCurrent->det).b.b.yb; m = ((w < h) ? (w) : (h)); (m_pCurrent->det).b.r = (uint32_t)(m / (int32_t)4UL); } } } void WxdkdrawFrame::MouseMoveBoxFirst(void) { $? "+ MouseMoveBoxFirst" $? "- MouseMoveBoxFirst" } void WxdkdrawFrame::MouseLeftBoxFirst(void) { $? "+ MouseLeftBoxFirst" if (m_bMousePos) { m_bAcceptablePoint = false; wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = wxdobj_add_box(m_pDrw, NULL, &m_oStyle); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; m_iState = S_BOX_OPPOSITE; (m_pCurrent->det).b.r = (uint32_t)0UL; (m_pCurrent->det).b.b.xl = m_ptMousePosGrid.x; (m_pCurrent->det).b.b.xr = m_ptMousePosGrid.x; (m_pCurrent->det).b.b.yb = m_ptMousePosGrid.y; (m_pCurrent->det).b.b.yt = m_ptMousePosGrid.y; m_bAcceptablePoint = false; DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); SetMouseAndStatusTexts(m_iState); if (WXD_FS_PURE < m_pCurrent->fs) { UpdateStipples(); } wxdobj_bb_simple_object(m_pDrw, m_pCurrent); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { } $? "- MouseLeftBoxFirst" } void WxdkdrawFrame::MouseMoveBoxOpposite(void) { bool bOldAcceptablePoint; $? "+ MouseMoveBoxOpposite" if (m_bMousePos) { if (NULL != m_pCurrent) { SetBoxDetails(true); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); bOldAcceptablePoint = m_bAcceptablePoint; m_bAcceptablePoint = IsAcceptablePoint(); if (bOldAcceptablePoint != m_bAcceptablePoint) { SetMouseAndStatusTexts(m_iState); } } else { /* ERROR: Memory (already reported) */ } } else { /* ERROR: No mouse position available */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseMoveBoxOpposite" } void WxdkdrawFrame::MouseLeftBoxOpposite(void) { $? "+ MouseLeftBoxOpposite" if (m_bMousePos) { if (NULL != m_pCurrent) { if (IsAcceptablePoint()) { m_iState = S_BOX_FIRST; SetBoxDetails(true); m_pCurrent->mark &= (~(OBJ_MARKER_1)); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); m_pCurrent = NULL; SetModified(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetMouseAndStatusTexts(m_iState); } } else { /* ERROR: Memory (already reported) */ } } else { /* ERROR: Mouse position unknown */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftBoxOpposite" } void WxdkdrawFrame::MouseMoveCircleCenter(void) { $? "+ MouseMoveCircleCenter" $? "- MouseMoveCircleCenter" } void WxdkdrawFrame::CalculateCircleRadius(uint32_t & rx, dk4_er_t *erp) { dk4_er_t er; double dx; double dy; int32_t xdiff = (int32_t)0L; int32_t ydiff = (int32_t)0L; dk4error_init(&er); xdiff = dk4ma_int32_t_abs( dk4ma_int32_t_sub( m_ptMousePosGrid.x, m_ptMouseMoveStart.x, &er ), &er ); ydiff = dk4ma_int32_t_abs( dk4ma_int32_t_sub( m_ptMousePosGrid.y, m_ptMouseMoveStart.y, &er ), &er ); if ((int32_t)0L == xdiff) { rx = (uint32_t)ydiff; } else { if ((int32_t)0L == ydiff) { rx = (uint32_t)xdiff; } else { dx = (double)xdiff; dy = (double)ydiff; dx = dk4ma_rint(sqrt(dx * dx + dy * dy)); rx = dk4ma_uint32_from_double(dx, &er); } } if (DK4_E_NONE != er.ec) { rx = (uint32_t)0UL; dk4error_copy(erp, &er); } } void WxdkdrawFrame::MouseLeftCircleCenter(void) { $? "+ MouseLeftCircleCenter" if (m_bMousePos) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = wxdobj_add_circle(m_pDrw, NULL, &m_oStyle); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; m_iState = S_CIRCLE_RADIUS; m_bAcceptablePoint = false; DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); SetMouseAndStatusTexts(m_iState); (m_pCurrent->det).e.x = m_ptMousePosGrid.x; (m_pCurrent->det).e.y = m_ptMousePosGrid.y; (m_pCurrent->det).e.rx = 0UL; (m_pCurrent->det).e.ry = 0UL; (m_pCurrent->det).e.a = 0; if (WXD_FS_PURE < m_pCurrent->fs) { UpdateStipples(); } wxdobj_bb_simple_object(m_pDrw, m_pCurrent); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { } $? "- MouseLeftCircleCenter" } void WxdkdrawFrame::MouseMoveCircleRadius(void) { dk4_er_t er; uint32_t rx = 0UL; bool bOldAcceptable; $? "+ MouseMoveCircleRadius" if (m_bMousePos) { if (NULL != m_pCurrent) { dk4error_init(&er); CalculateCircleRadius(rx, &er); if (DK4_E_NONE == er.ec) { (m_pCurrent->det).e.rx = rx; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); bOldAcceptable = m_bAcceptablePoint; m_bAcceptablePoint = IsAcceptablePoint(); if (bOldAcceptable != m_bAcceptablePoint) { SetMouseAndStatusTexts(m_iState); } } else { dk4error_copy(&m_oErrorReport, &er); } } else { /* ERROR: Memory (already reported) */ } } else { /* ERROR: No mouse position available */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseMoveCircleRadius" } void WxdkdrawFrame::MouseLeftCircleRadius(void) { dk4_er_t er; uint32_t rx = 0UL; $? "+ MouseLeftCircleRadius" if (m_bMousePos) { if (IsAcceptablePoint()) { if (NULL != m_pCurrent) { dk4error_init(&er); CalculateCircleRadius(rx, &er); if (DK4_E_NONE == er.ec) { (m_pCurrent->det).e.rx = rx; m_pCurrent->mark &= (~(OBJ_MARKER_1)); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); m_pCurrent = NULL; SetModified(); m_iState = S_CIRCLE_CENTER; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetMouseAndStatusTexts(m_iState); } else { dk4error_copy(&m_oErrorReport, &er); } } else { /* ERROR: Memory (already reported) */ } } } else { /* ERROR: No mouse position available */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftCircleRadius" } void WxdkdrawFrame::CalculateEllipseRadii(uint32_t & rx,uint32_t & ry,dk4_er_t *erp) { dk4_er_t er; dk4error_init(&er); rx = (uint32_t)dk4ma_int32_t_abs( dk4ma_int32_t_sub( m_ptMousePosGrid.x, m_ptMouseMoveStart.x, &er ), &er ); ry = (uint32_t)dk4ma_int32_t_abs( dk4ma_int32_t_sub( m_ptMousePosGrid.y, m_ptMouseMoveStart.y, &er ), &er ); if (DK4_E_NONE != er.ec) { rx = ry = (uint32_t)0UL; dk4error_copy(erp, &er); } } void WxdkdrawFrame::MouseMoveEllipseCenter(void) { $? "+ MouseMoveEllipseCenter" $? "- MouseMoveEllipseCenter" } void WxdkdrawFrame::MouseLeftEllipseCenter(void) { $? "+ MouseLeftEllipseCenter" if (m_bMousePos) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = wxdobj_add_ellipse(m_pDrw, NULL, &m_oStyle); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; m_iState = S_ELLIPSE_CORNER; m_bAcceptablePoint = false; DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); SetMouseAndStatusTexts(m_iState); (m_pCurrent->det).e.x = m_ptMousePosGrid.x; (m_pCurrent->det).e.y = m_ptMousePosGrid.y; (m_pCurrent->det).e.rx = 0UL; (m_pCurrent->det).e.ry = 0UL; (m_pCurrent->det).e.a = 0; if (WXD_FS_PURE < m_pCurrent->fs) { UpdateStipples(); } wxdobj_bb_simple_object(m_pDrw, m_pCurrent); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { /* ERROR: Mouse position not known */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftEllipseCenter" } void WxdkdrawFrame::MouseMoveEllipseCorner(void) { dk4_er_t er; uint32_t rx = 0UL; uint32_t ry = 0UL; bool bOldAcceptable; $? "+ MouseMoveEllipseCorner" if (m_bMousePos) { if (NULL != m_pCurrent) { dk4error_init(&er); CalculateEllipseRadii(rx, ry, &er); if (DK4_E_NONE == er.ec) { (m_pCurrent->det).e.rx = rx; (m_pCurrent->det).e.ry = ry; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); bOldAcceptable = m_bAcceptablePoint; m_bAcceptablePoint = IsAcceptablePoint(); if (bOldAcceptable != m_bAcceptablePoint) { SetMouseAndStatusTexts(m_iState); } } else { dk4error_copy(&m_oErrorReport, &er); } } else { /* ERROR: Memory (already reported) */ } } else { /* ERROR: No mouse position */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseMoveEllipseCorner" } void WxdkdrawFrame::MouseLeftEllipseCorner(void) { dk4_er_t er; uint32_t rx = 0UL; uint32_t ry = 0UL; $? "+ MouseLeftEllipseCorner" if (m_bMousePos) { if (IsAcceptablePoint()) { if (NULL != m_pCurrent) { dk4error_init(&er); CalculateEllipseRadii(rx, ry, &er); if (DK4_E_NONE == er.ec) { (m_pCurrent->det).e.rx = rx; (m_pCurrent->det).e.ry = ry; m_pCurrent->mark &= (~(OBJ_MARKER_1)); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); m_pCurrent = NULL; SetModified(); m_iState = S_ELLIPSE_CENTER; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetMouseAndStatusTexts(m_iState); } else { dk4error_copy(&m_oErrorReport, &er); } } else { /* ERROR: Memory (already reported). */ } } } else { /* ERROR: Mouse position unknown */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftEllipseCorner" } void WxdkdrawFrame::MouseMoveArc1(void) { $? "+ MouseMoveArc1" $? "- MouseMoveArc1" } void WxdkdrawFrame::MouseLeftArc1(void) { $? "+ MouseLeftArc1" if (m_bMousePos) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = wxdobj_add_arc( m_pDrw, NULL, ((WXD_OT_C_ARC == m_iObjToCreate) ? 1 : 0), &m_oStyle ); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; m_iState = S_ARC_2; m_bAcceptablePoint = false; (m_pCurrent->det).a.x1 = (m_pCurrent->det).a.x2 = (m_pCurrent->det).a.x3 = m_ptMousePosGrid.x; (m_pCurrent->det).a.y1 = (m_pCurrent->det).a.y2 = (m_pCurrent->det).a.y3 = m_ptMousePosGrid.y; (m_pCurrent->det).a.x = (double)(m_ptMousePosGrid.x); (m_pCurrent->det).a.y = (double)(m_ptMousePosGrid.y); (m_pCurrent->det).a.r = 0.0; (m_pCurrent->det).a.a = 0.0; (m_pCurrent->det).a.b = 2.0 * M_PI; (m_pCurrent->det).a.d = (int8_t)0; wxdobj_bb_simple_object(m_pDrw, m_pCurrent); SetMouseAndStatusTexts(m_iState); if (WXD_OT_C_ARC == m_iObjToCreate) { if (WXD_FS_PURE < m_pCurrent->fs) { UpdateStipples(); } } } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { /* ERROR: Unknown mouse position */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftArc1" } void WxdkdrawFrame::MouseMoveArc2(void) { bool bOldAcceptable; $? "+ MouseMoveArc2" if (m_bMousePos) { if (NULL != m_pCurrent) { (m_pCurrent->det).a.x2 = (m_pCurrent->det).a.x3 = m_ptMousePosGrid.x; (m_pCurrent->det).a.y2 = (m_pCurrent->det).a.y3 = m_ptMousePosGrid.y; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); bOldAcceptable = m_bAcceptablePoint; m_bAcceptablePoint = IsAcceptablePoint(); if (bOldAcceptable != m_bAcceptablePoint) { SetMouseAndStatusTexts(m_iState); } } else { /* ERROR: Memory (already reported) */ } } else { /* ERROR: Unknown mouse position */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseMoveArc2" } void WxdkdrawFrame::MouseLeftArc2(void) { $? "+ MouseLeftArc2" if (m_bMousePos) { if (IsAcceptablePoint()) { if (NULL != m_pCurrent) { (m_pCurrent->det).a.x2 = (m_pCurrent->det).a.x3 = m_ptMousePosGrid.x; (m_pCurrent->det).a.y2 = (m_pCurrent->det).a.y3 = m_ptMousePosGrid.y; m_iState = S_ARC_3; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); SetMouseAndStatusTexts(m_iState); } else { /* ERROR: Memory (already reported) */ } } } else { /* RROR: Mouse position unknown */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftArc2" } void WxdkdrawFrame::MouseMoveArc3(void) { bool bOldAcceptable; $? "+ MouseMoveArc3" if (m_bMousePos) { if (NULL != m_pCurrent) { (m_pCurrent->det).a.x3 = m_ptMousePosGrid.x; (m_pCurrent->det).a.y3 = m_ptMousePosGrid.y; wxdarc_calculation( &((m_pCurrent->det).a.x), &((m_pCurrent->det).a.y), &((m_pCurrent->det).a.r), &((m_pCurrent->det).a.a), &((m_pCurrent->det).a.b), &((m_pCurrent->det).a.d), (m_pCurrent->det).a.x1, (m_pCurrent->det).a.y1, (m_pCurrent->det).a.x2, (m_pCurrent->det).a.y2, (m_pCurrent->det).a.x3, (m_pCurrent->det).a.y3 ); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); bOldAcceptable = m_bAcceptablePoint; m_bAcceptablePoint = IsAcceptablePoint(); if (bOldAcceptable != m_bAcceptablePoint) { SetMouseAndStatusTexts(m_iState); } } else { /* ERROR: Memory (already reported) */ } } else { /* ERROR: Unknown mouse position */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseMoveArc3" } void WxdkdrawFrame::MouseLeftArc3(void) { $? "+ MouseLeftArc3" if (m_bMousePos) { if (IsAcceptablePoint()) { if (NULL != m_pCurrent) { (m_pCurrent->det).a.x3 = m_ptMousePosGrid.x; (m_pCurrent->det).a.y3 = m_ptMousePosGrid.y; wxdarc_calculation( &((m_pCurrent->det).a.x), &((m_pCurrent->det).a.y), &((m_pCurrent->det).a.r), &((m_pCurrent->det).a.a), &((m_pCurrent->det).a.b), &((m_pCurrent->det).a.d), (m_pCurrent->det).a.x1, (m_pCurrent->det).a.y1, (m_pCurrent->det).a.x2, (m_pCurrent->det).a.y2, (m_pCurrent->det).a.x3, (m_pCurrent->det).a.y3 ); m_pCurrent->mark &= (~(OBJ_MARKER_1)); wxdobj_bb_simple_object(m_pDrw, m_pCurrent); m_pCurrent = NULL; m_iState = S_ARC_1; SetModified(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetMouseAndStatusTexts(m_iState); } else { /* ERROR: Memory (already reported). */ } } } else { /* ERROR: Mouse position unknown */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftArc3" } void WxdkdrawFrame::MouseMoveDot(void) { $? "+ MouseMoveDot" $? "- MouseMoveDot" } void WxdkdrawFrame::MouseLeftDot(void) { $? "+ MouseLeftDot" if (m_bMousePos) { m_pCurrent = wxdobj_add_dot( m_pDrw, NULL, ((WXD_OT_DOT_WHITE == m_iObjToCreate) ? (1) : (0)), &m_oStyle ); if (NULL != m_pCurrent) { $? ". stroke red %d", (int)(m_pCurrent->sc[0]) $? ". stroke green %d", (int)(m_pCurrent->sc[1]) $? ". stroke blue %d", (int)(m_pCurrent->sc[2]) $? ". fill red %d", (int)(m_pCurrent->fc[0]) $? ". fill green %d", (int)(m_pCurrent->fc[1]) $? ". fill blue %d", (int)(m_pCurrent->fc[2]) (m_pCurrent->det).d.x = m_ptMousePosGrid.x; (m_pCurrent->det).d.y = m_ptMousePosGrid.y; (m_pCurrent->det).d.d = ( (WXD_OT_DOT_WHITE == m_iObjToCreate) ? (m_iv[IVI_DOT_DIAMETER_WHITE]) : (m_iv[IVI_DOT_DIAMETER_FILLED]) ); m_pCurrent->mark &= (~(OBJ_MARKER_1)); if (DK4_I16_MAX > m_pCurrent->lay) { m_pCurrent->lay += (int16_t)1; } wxdobj_bb_simple_object(m_pDrw, m_pCurrent); m_pCurrent = NULL; SetModified(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { /* ERROR: Mouse position unknown */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftDot" } void WxdkdrawFrame::MouseMoveText(void) { $? "+ MouseMoveText" $? "- MouseMoveText" } void WxdkdrawFrame::MouseLeftText(void) { Wxd_object_t *pObject = NULL; #if 0 wxChar const *ptrExportText = NULL; wxChar const *ptrScreenText = NULL; #endif wxChar *ptrExportText = NULL; wxChar *ptrScreenText = NULL; int32_t x; int32_t y; bool bLaTeX; $? "+ MouseLeftText" x = m_ptMousePosGrid.x; y = m_ptMousePosGrid.y; bLaTeX = cbStyleTextLaTeX->GetValue(); m_pCurrent = NULL; if (m_bMousePos) { WxdkdrawDlgTextInput tid( this, sTexts, sNlWx, &ptrExportText, &ptrScreenText, bLaTeX, &m_oErrorReport ); Dk4WxApplicationHelper::ChooseChildPosition(*drawco, tid); if (wxID_OK == tid.ShowModal()) { if (NULL != ptrExportText) { pObject = wxdobj_add_textlabel( m_pDrw, NULL, ptrExportText, &m_oStyle ); if (NULL != pObject) { (pObject->det).t.a = 0; (pObject->det).t.x = x; (pObject->det).t.y = y; (pObject->det).t.tsc = ptrScreenText; UpdateFonts(); SetModified(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); wxdobj_bb_simple_object(m_pDrw, pObject); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } } #if 0 WxdkdrawDlgTextInput tid(this, sTexts, sNlWx, bLaTeX); Dk4WxApplicationHelper::ChooseChildPosition(*drawco, tid); if (wxID_OK == tid.ShowModal()) { wxTextCtrl *pExportText = tid.GetExportTextCtrl(); wxTextCtrl *pScreenText = tid.GetScreenTextCtrl(); wxString stringExp = pExportText->GetValue(); wxString stringScr = pScreenText->GetValue(); wxCStrData sExportText = stringExp.c_str(); wxCStrData sScreenText = stringScr.c_str(); ptrExportText = (wxChar const *)sExportText; ptrScreenText = (wxChar const *)sScreenText; if ((NULL != ptrExportText)) { if (0 < dk4strx_len(ptrExportText)) { pObject = wxdobj_add_textlabel( m_pDrw, NULL, ptrExportText, &m_oStyle ); if (NULL != pObject) { (pObject->det).t.a = 0; (pObject->det).t.x = m_ptMousePosGrid.x; (pObject->det).t.y = m_ptMousePosGrid.y; UpdateFonts(); SetModified(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); wxdobj_bb_simple_object(m_pDrw, pObject); if ( bLaTeX && (NULL != ptrScreenText) && (0 < dk4strx_len(ptrScreenText)) ) { (pObject->det).t.tsc = dk4strx_dup(ptrScreenText, NULL); if (NULL == (pObject->det).t.tsc) { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } UpdateFonts(); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { /* ERROR: No input for export text */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_NO_EXPORT_TEXT ); } } else { /* ERROR: No export text (memory) */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_NO_EXPORT_TEXT ); } } else { /* Aborted by user */ } #endif } else { /* ERROR: Mouse position outside coordinates */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOUSE_POS_NOT_AVAILABLE ); } $? "- MouseLeftText" } void WxdkdrawFrame::MouseMoveImage1(void) { $? "+ MouseMoveImage1" $? "- MouseMoveImage1" } void WxdkdrawFrame::MouseMoveImage2(void) { bool bOldAcceptable; $? "+ MouseMoveImage2" if (m_bMousePos) { wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); bOldAcceptable = m_bAcceptablePoint; m_bAcceptablePoint = IsAcceptablePoint(); if (bOldAcceptable != m_bAcceptablePoint) { SetMouseAndStatusTexts(m_iState); } } $? "- MouseMoveImage2" } void WxdkdrawFrame::MouseLeftImage1(void) { $? "+ MouseLeftImage1" if (m_bMousePos) { DK4_MEMCPY(&m_ptMouseMoveStart,&m_ptMousePosGrid,sizeof(Wxd_point_t)); m_iState = S_IMG_2; m_bAcceptablePoint = false; SetMouseAndStatusTexts(m_iState); } $? "- MouseLeftImage1" } void WxdkdrawFrame::MouseLeftImage2(void) { wxString sDialogTitle(sTexts[409]); wxString sFileTypes(image_files_to_open); wxChar const *vptr; Wxd_object_t *pobj; $? "+ MouseLeftImage2" if (m_bMousePos) { if (IsAcceptablePoint()) { if ( (m_ptMouseMoveStart.x != m_ptMousePosGrid.x) && (m_ptMouseMoveStart.y != m_ptMousePosGrid.y) ) { #if wxCHECK_VERSION(2, 9, 0) wxFileDialog dlg( this, sDialogTitle, m_sImageDir, wxEmptyString, sFileTypes, (wxFD_OPEN | wxFD_FILE_MUST_EXIST) ); #else wxFileDialog dlg( this, sDialogTitle, m_sImageDir, wxEmptyString, sFileTypes, wxOPEN ); #endif if(wxID_OK == dlg.ShowModal()) { wxString pa = dlg.GetPath(); m_sImageDir = dlg.GetDirectory(); { wxCStrData vstrdata = pa.c_str(); vptr = (wxChar const *)vstrdata; if (NULL != vptr) { pobj = wxdobj_add_image(m_pDrw,NULL,vptr,&m_oStyle); if (NULL != pobj) { (pobj->det).i.br.xl = m_ptMouseMoveStart.x; (pobj->det).i.br.yb = m_ptMouseMoveStart.y; (pobj->det).i.br.xr = m_ptMousePosGrid.x; (pobj->det).i.br.yt = m_ptMousePosGrid.y; wxdobj_bb_correct(&((pobj->det).i.br)); wxdobj_load_image( pobj, pAppHelp->GetDkEncoding(), pAppHelp->GetWxEncoding() ); SetModified(); wxdobj_bb_simple_object(m_pDrw, pobj); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { /* ERROR: No string data */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_NO_FILENAME ); } } } else { } m_iState = S_IMG_1; SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } } } $? "- MouseLeftImage2" } void WxdkdrawFrame::MouseMoveLibelemPlace(void) { $? "+ MouseMoveLibelemPlace" /* Reaction is same as placing an element to move */ MouseMoveMovePlace(); if (NULL != m_pCurrent) { wxdobj_bb_modified_object(m_pDrw, m_pCurrent); } $? "- MouseMoveLibelemPlace" } void WxdkdrawFrame::MouseLeftLibelemPlace(void) { $? "+ MouseLeftLibelemPlace" if ((m_bMousePos) && (m_bMouseDiff)) { if (0 != wxdobj_shift_marked(m_pDrw, &m_ptMouseMoveDiff, 0)) { wxdobj_shift_marked(m_pDrw, &m_ptMouseMoveDiff, 1); m_iState = S_NOOP; SetModified(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); if (NULL != m_pCurrent) { wxdobj_bb_modified_object(m_pDrw, m_pCurrent); } AddLibelem(); } } $? "- MouseLeftLibelemPlace" } void WxdkdrawFrame::MouseMovePointMoveSelect(void) { Wxd_object_t *prevobj; uint16_t prevpoint; $? "+ MouseMovePointMoveSelect" if (m_bMousePos) { /* Save previous candidate object and point */ prevobj = m_pCurrent; prevpoint = m_uCurrent; /* Check for new candicate */ if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = wxdobj_point_move_find_object( m_pDrw, &m_ptMousePosRaw, &m_uCurrent, (2.0 * (double)(drawco->m_uGridSnap)) ); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; $!trace-code wxdobj_report_object(m_pCurrent); } /* On object or point change redraw the markup */ if ( ((NULL != m_pCurrent) && (NULL == prevobj)) || ((NULL == m_pCurrent) && (NULL != prevobj)) ) { SetMouseAndStatusTexts(m_iState); } if ((prevobj != m_pCurrent) || (prevpoint != m_uCurrent)) { wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } } $? "- MouseMovePointMoveSelect" } void WxdkdrawFrame::MouseLeftPointMoveSelect(void) { $? "+ MouseLeftPointMoveSelect" if (m_bMousePos) { $? ". have mouse position" if (NULL != m_pCurrent) { $? ". have old current object" m_pCurrent->mark &= (~(OBJ_MARKER_1)); } $? ". do object search" m_pCurrent = wxdobj_point_move_find_object( m_pDrw, &m_ptMousePosRaw, &m_uCurrent, (2.0 * (double)(drawco->m_uGridSnap)) ); $? ". did object search" if (NULL != m_pCurrent) { $? ". have new current object" $? ". 1 %d", m_oErrorReport.ec $!trace-code wxdobj_report_object(m_pCurrent); m_pCurrent->mark |= OBJ_MARKER_1; m_bSnap = ( (0 == cbPointMoveMode->GetSelection()) ? (true) : (false) ); $? ". 2 %d", m_oErrorReport.ec $!trace-code wxdobj_report_object(m_pCurrent); DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); $? ". 3 %d", m_oErrorReport.ec $!trace-code wxdobj_report_object(m_pCurrent); m_ptMouseMoveDiff.x = (int32_t)0L; m_ptMouseMoveDiff.y = (int32_t)0L; m_bMouseDiff = true; $? ". 4 %d", m_oErrorReport.ec $!trace-code wxdobj_report_object(m_pCurrent); if ( wxdobj_get_control_point( &m_ptPointMoveOri, m_pCurrent, m_uCurrent ) ) { $? ". 5 %d", m_oErrorReport.ec $!trace-code wxdobj_report_object(m_pCurrent); switch ( (int)(m_pCurrent->ot) ) { case WXD_OT_ELLIPSE : case WXD_OT_CIRCLE : { $? ". 6 %d", m_oErrorReport.ec $!trace-code wxdobj_report_object(m_pCurrent); DK4_MEMCPY(\ &m_ellPointMoveOri,\ &((m_pCurrent->det).e),\ sizeof(Wxd_det_ellipse_t)\ ); $? ". 7 %d", m_oErrorReport.ec $!trace-code wxdobj_report_object(m_pCurrent); } break; } if (m_bSnap) { $? ". 8 %d", m_oErrorReport.ec $!trace-code wxdobj_report_object(m_pCurrent); wxdobj_set_control_point( m_pCurrent, &m_ptMousePosGrid, m_uCurrent ); $? ". 9 %d", m_oErrorReport.ec $!trace-code wxdobj_report_object(m_pCurrent); } $? ". 10 %d", m_oErrorReport.ec m_iState = S_MOVEPT_PLACE; SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } else { $? "! failed to get control point" /* ERROR: Failed to get control point */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_GET_CONTROL_POINT ); } } } $? "- MouseLeftPointMoveSelect" } void WxdkdrawFrame::MouseMovePointMovePlace(void) { dk4_er_t er; Wxd_point_t pt; $? "+ MouseMovePointMovePlace" $? ". m_bMouseDiff = %d", (m_bMouseDiff ? 1 : 0) if (m_bMousePos && (NULL != m_pCurrent)) { $? ". mouse pos, object ok" if (m_bSnap || m_bMouseDiff) { $? ". snap or mouse diff" if (m_bSnap) { $? ". snap" if ( wxdobj_set_control_point( m_pCurrent, &m_ptMousePosGrid, m_uCurrent ) ) { $? ". set control point" switch ( (int)(m_pCurrent->ot) ) { case WXD_OT_BOX : { wxdobj_bb_correct( &((m_pCurrent->det).b.b), &m_uCurrent ); } break; case WXD_OT_IMAGE : { wxdobj_bb_correct( &((m_pCurrent->det).i.br), &m_uCurrent ); } break; } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_modified_object(m_pDrw, m_pCurrent); } else { $? "! failed to set control point" /* ERROR: Failed to set control point */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_SET_CONTROL_POINT ); } } else { $? ". mouse diff" dk4error_init(&er); pt.x = dk4ma_int32_t_add( m_ptPointMoveOri.x, m_ptMouseMoveDiff.x, &er ); pt.y = dk4ma_int32_t_add( m_ptPointMoveOri.y, m_ptMouseMoveDiff.y, &er ); if (DK4_E_NONE == er.ec) { $? ". x, y ok" if ( wxdobj_set_control_point(m_pCurrent, &pt, m_uCurrent) ) { $? ". control point set ok" switch ( (int)(m_pCurrent->ot) ) { case WXD_OT_BOX : { wxdobj_bb_correct( &((m_pCurrent->det).b.b), &m_uCurrent ); } break; case WXD_OT_IMAGE : { wxdobj_bb_correct( &((m_pCurrent->det).i.br), &m_uCurrent ); } break; } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_modified_object(m_pDrw, m_pCurrent); } else { $? "! failed to set control point" /* ERROR: Failed to set control point */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_SET_CONTROL_POINT ); } } else { $? "! math overflow" /* ERROR: Math overflow */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_OVERFLOW_COORDINATES ); } } } else { $? "! failed to calculate mouse diff" /* ERROR: Failed to calculate mouse difference */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_OVERFLOW_COORDINATES ); } } #if TRACE_DEBUG else { if (!(m_bMousePos)) { $? "! no mouse pos" } if (NULL == m_pCurrent) { $? "! no object" } } #endif $? "- MouseMovePointMovePlace" } void WxdkdrawFrame::ModifySplineValue(Wxd_object_t *pCurrent, uint16_t uCurrent) { double olds; if ( (NULL != pCurrent) && ( (WXD_OT_O_SPLINE == pCurrent->ot) || (WXD_OT_C_SPLINE == pCurrent->ot) ) && (uCurrent < (pCurrent->det).s.n) ) { WxdkdrawDlgSplineValue dlg( this, drawco, m_pDrw, sTexts, &(((pCurrent->det).s.p)[uCurrent].s) ); Dk4WxApplicationHelper::ChooseChildPosition(*drawco, dlg); olds = ((pCurrent->det).s.p)[uCurrent].s; dlg.ShowModal(); wxdobj_bb_modified_object(m_pDrw, pCurrent); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); m_bUpdate = true; if (olds != ((pCurrent->det).s.p)[uCurrent].s) { SetModified(); } } } void WxdkdrawFrame::MouseLeftPointMovePlace(void) { dk4_er_t er; Wxd_point_t pt; $? "+ MouseLeftPointMovePlace" if (m_bMousePos && (NULL != m_pCurrent)) { $? ". m_bMouseDiff = %d", (m_bMouseDiff ? 1 : 0) if (m_bSnap || m_bMouseDiff) { if (m_bSnap) { if ( wxdobj_set_control_point( m_pCurrent, &m_ptMousePosGrid, m_uCurrent ) ) { switch ( (int)(m_pCurrent->ot) ) { case WXD_OT_BOX : { wxdobj_bb_correct( &((m_pCurrent->det).b.b), &m_uCurrent ); } break; case WXD_OT_IMAGE : { wxdobj_bb_correct( &((m_pCurrent->det).i.br), &m_uCurrent ); /* 2020-03-24 Bugfix After changing the available space we must re-calculate the used space */ wxdobj_image_placement(m_pCurrent); } break; } m_pCurrent->mark &= (~(OBJ_MARKER_1)); if ( (NULL != m_pCurrent) && ( (WXD_OT_O_SPLINE == m_pCurrent->ot) || (WXD_OT_C_SPLINE == m_pCurrent->ot) ) && (m_uCurrent < (m_pCurrent->det).s.n) ) { #if 0 /* 2020-03-22 Modification Changing spline s value is now decoupled from moving spline points. */ ModifySplineValue(m_pCurrent, m_uCurrent); #endif } m_pCurrent = NULL; m_uCurrent = (uint16_t)0U; m_iState = S_MOVEPT_SELECT; SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetModified(); } else { /* ERROR: Failed to set control point */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_SET_CONTROL_POINT ); } } else { dk4error_init(&er); pt.x = dk4ma_int32_t_add( m_ptPointMoveOri.x, m_ptMouseMoveDiff.x, &er ); pt.y = dk4ma_int32_t_add( m_ptPointMoveOri.y, m_ptMouseMoveDiff.y, &er ); if (DK4_E_NONE == er.ec) { if ( wxdobj_set_control_point(m_pCurrent, &pt, m_uCurrent) ) { switch ( (int)(m_pCurrent->ot) ) { case WXD_OT_BOX : { wxdobj_bb_correct( &((m_pCurrent->det).b.b), &m_uCurrent ); } break; case WXD_OT_IMAGE : { wxdobj_bb_correct( &((m_pCurrent->det).i.br), &m_uCurrent ); } break; } m_pCurrent->mark &= (~(OBJ_MARKER_1)); if ( (NULL != m_pCurrent) && ( (WXD_OT_O_SPLINE == m_pCurrent->ot) || (WXD_OT_C_SPLINE == m_pCurrent->ot) ) && (m_uCurrent < (m_pCurrent->det).s.n) ) { #if 0 ModifySplineValue(m_pCurrent, m_uCurrent); #endif } m_pCurrent = NULL; m_uCurrent = (uint16_t)0U; m_iState = S_MOVEPT_SELECT; SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetModified(); } else { /* ERROR: Failed to set control point */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_SET_CONTROL_POINT ); } } else { /* ERROR: Math overflow */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_OVERFLOW_COORDINATES ); } } } else { /* ERROR: Failed to calculate mouse difference */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_OVERFLOW_COORDINATES ); } } $? "- MouseLeftPointMovePlace" } void WxdkdrawFrame::MouseMovePointDelete(void) { Wxd_object_t *prevobj; uint16_t prevpoint; $? "+ MouseMovePointDelete" if (m_bMousePos) { prevobj = m_pCurrent; prevpoint = m_uCurrent; if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = wxdobj_point_del_find_object( m_pDrw, &m_ptMousePosRaw, &m_uCurrent, (2.0 * (double)(drawco->m_uGridSnap)) ); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; $!trace-code wxdobj_report_object(m_pCurrent); } if ( ((NULL != m_pCurrent) && (NULL == prevobj)) || ((NULL == m_pCurrent) && (NULL != prevobj)) ) { SetMouseAndStatusTexts(m_iState); } if ((prevobj != m_pCurrent) || (prevpoint != m_uCurrent)) { wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } } $? "- MouseMovePointDelete" } void WxdkdrawFrame::MouseLeftPointDelete(void) { Wxd_object_t *prevobj; #if 0 uint16_t prevpoint; #endif $? "+ MouseLeftPointDelete" if (m_bMousePos) { prevobj = m_pCurrent; #if 0 prevpoint = m_uCurrent; #endif if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = wxdobj_point_del_find_object( m_pDrw, &m_ptMousePosRaw, &m_uCurrent, (2.0 * (double)(drawco->m_uGridSnap)) ); if (NULL != m_pCurrent) { wxdobj_delete_control_point(m_pCurrent, m_uCurrent); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); wxdobj_bb_modified_object(m_pDrw, m_pCurrent); m_pCurrent = NULL; SetMouseAndStatusTexts(m_iState); SetModified(); } else { if (NULL != prevobj) { SetMouseAndStatusTexts(m_iState); } } } $? "- MouseLeftPointDelete" } void WxdkdrawFrame::MouseMovePointAddSelect(void) { Wxd_object_t *prevobj; uint16_t prevpoint; bool prevappend; $? "+ MouseMovePointAddSelect" if (m_bMousePos) { prevobj = m_pCurrent; prevpoint = m_uCurrent; prevappend = m_bAppendPoint; if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = wxdobj_point_add_find_object( m_pDrw, &m_ptMousePosRaw, &m_uCurrent, &m_bAppendPoint, (2.0 * (double)(drawco->m_uGridSnap)) ); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; } if ( (prevobj != m_pCurrent) || (prevpoint != m_uCurrent) || (prevappend != m_bAppendPoint) ) { wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } if ( ((NULL == m_pCurrent) && (NULL != prevobj)) || ((NULL != m_pCurrent) && (NULL == prevobj)) ) { SetMouseAndStatusTexts(m_iState); } } $? "- MouseMovePointAddSelect" } void WxdkdrawFrame::MouseLeftPointAddSelect(void) { bool bres = false; $? "+ MouseLeftPointAddSelect" if (m_bMousePos) { if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = wxdobj_point_add_find_object( m_pDrw, &m_ptMousePosRaw, &m_uCurrent, &m_bAppendPoint, (2.0 * (double)(drawco->m_uGridSnap)) ); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; if (m_bAppendPoint) { bres = wxdobj_add_control_point( m_pCurrent, (m_uCurrent + (uint16_t)1U), &m_ptMousePosGrid ); if (bres) { m_uCurrent++; } } else { bres = wxdobj_add_control_point( m_pCurrent, m_uCurrent, &m_ptMousePosGrid ); } if (bres) { wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); wxdobj_bb_modified_object(m_pDrw, m_pCurrent); m_iState = S_ADDPT_PLACE; SetMouseAndStatusTexts(m_iState); } } } $? "- MouseLeftPointAddSelect" } void WxdkdrawFrame::MouseMovePointAddPlace(void) { $? "+ MouseMovePointAddPlace" if (m_bMousePos) { if (NULL != m_pCurrent) { wxdobj_set_control_point(m_pCurrent,&m_ptMousePosGrid,m_uCurrent); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); wxdobj_bb_modified_object(m_pDrw, m_pCurrent); } } $? "- MouseMovePointAddPlace" } void WxdkdrawFrame::MouseLeftPointAddPlace(void) { $? "+ MouseLeftPointAddPlace" if (m_bMousePos) { if (NULL != m_pCurrent) { wxdobj_set_control_point(m_pCurrent,&m_ptMousePosGrid,m_uCurrent); m_iState = S_ADDPT_SELECT; m_pCurrent->mark &= (~(OBJ_MARKER_1)); wxdobj_bb_modified_object(m_pDrw, m_pCurrent); m_pCurrent = NULL; SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetModified(); } } $? "- MouseLeftPointAddPlace" } void WxdkdrawFrame::MouseMoveDrawingSizeSelect(void) { dk4_gra_point_t ppt; double dlim; double d; uint16_t prevSelected; uint16_t newSelected; bool prevHavePoint; $? "+ MouseMoveDrawingSizeSelect" if (m_bMousePos) { prevSelected = m_uCurrent; prevHavePoint = m_bHaveCornerPoint; newSelected = (uint16_t)0U; dlim = 2.0 * (double)(drawco->m_uGridSnap); ppt.x = (double)(m_ptMousePosRaw.x); ppt.y = (double)(m_ptMousePosRaw.y); d = wxdobj_dist_box( &(m_pDrw->bb), (uint32_t)0UL, &ppt, true, &newSelected ); if (dlim >= d) { m_uCurrent = newSelected; m_bHaveCornerPoint = true; } else { m_uCurrent = (uint16_t)0U; m_bHaveCornerPoint = false; } if ( (prevSelected != m_uCurrent) || (prevHavePoint != m_bHaveCornerPoint) ) { wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } if (prevHavePoint != m_bHaveCornerPoint) { SetMouseAndStatusTexts(m_iState); } } $? "- MouseMoveDrawingSizeSelect" } void WxdkdrawFrame::MouseLeftDrawingSizeSelect(void) { dk4_gra_point_t ppt; double dlim; double d; uint16_t newSelected; $? "+ MouseLeftDrawingSizeSelect" if (m_bMousePos) { newSelected = (uint16_t)0U; dlim = 2.0 * (double)(drawco->m_uGridSnap); ppt.x = (double)(m_ptMousePosRaw.x); ppt.y = (double)(m_ptMousePosRaw.y); d = wxdobj_dist_box( &(m_pDrw->bb), (uint32_t)0UL, &ppt, true, &newSelected ); if (dlim >= d) { m_uCurrent = newSelected; m_bHaveCornerPoint = true; m_bSnap = ( (0 == cbPointMoveMode->GetSelection()) ? (true) : (false) ); DK4_MEMCPY(\ &m_ptMouseMoveStart,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); DK4_MEMCPY(\ &m_ptPointMoveOri,\ &m_ptMousePosGrid,\ sizeof(Wxd_point_t)\ ); m_ptMouseMoveDiff.x = (int32_t)0L; m_ptMouseMoveDiff.y = (int32_t)0L; m_bMouseDiff = true; switch ( (int)m_uCurrent ) { case 3 : { m_ptPointMoveOri.x = m_oBorder.det.b.b.xl; m_ptPointMoveOri.y = m_oBorder.det.b.b.yt; } break; case 2 : { m_ptPointMoveOri.x = m_oBorder.det.b.b.xr; m_ptPointMoveOri.y = m_oBorder.det.b.b.yt; } break; case 1 : { m_ptPointMoveOri.x = m_oBorder.det.b.b.xr; m_ptPointMoveOri.y = m_oBorder.det.b.b.yb; } break; default : { m_ptPointMoveOri.x = m_oBorder.det.b.b.xl; m_ptPointMoveOri.y = m_oBorder.det.b.b.yb; } break; } if (m_bSnap) { wxdobj_set_control_point( &m_oBorder, &m_ptMousePosGrid, m_uCurrent ); wxdobj_bb_correct( &(m_oBorder.det.b.b), &m_uCurrent ); DK4_MEMCPY(\ &(m_pDrw->bb),&(m_oBorder.det.b.b),sizeof(Wxd_bb_t)\ ); } else { } m_iState = S_DRWSZ_PLACE; SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } } $? "- MouseLeftDrawingSizeSelect" } void WxdkdrawFrame::MouseMoveDrawingSizePlace(void) { dk4_er_t er; Wxd_point_t pt; $? "+ MouseMoveDrawingSizePlace" if (m_bMousePos) { if (m_bSnap) { wxdobj_set_control_point( &m_oBorder, &m_ptMousePosGrid, m_uCurrent ); wxdobj_bb_correct( &(m_oBorder.det.b.b), &m_uCurrent ); DK4_MEMCPY(\ &(m_pDrw->bb),&(m_oBorder.det.b.b),sizeof(Wxd_bb_t)\ ); } else { if (m_bMouseDiff) { $? ". m_bMouseDiff true" dk4error_init(&er); pt.x = dk4ma_int32_t_add( m_ptPointMoveOri.x, m_ptMouseMoveDiff.x, &er ); pt.y = dk4ma_int32_t_add( m_ptPointMoveOri.y, m_ptMouseMoveDiff.y, &er ); if (DK4_E_NONE == er.ec) { wxdobj_set_control_point( &m_oBorder, &pt, m_uCurrent ); wxdobj_bb_correct( &(m_oBorder.det.b.b), &m_uCurrent ); DK4_MEMCPY(\ &(m_pDrw->bb),&(m_oBorder.det.b.b),sizeof(Wxd_bb_t)\ ); } } } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } $? "- MouseMoveDrawingSizePlace" } void WxdkdrawFrame::MouseLeftDrawingSizePlace(void) { dk4_er_t er; Wxd_point_t pt; bool bEqual = false;; $? "+ MouseLeftDrawingSizePlace" if (m_bMousePos) { if (m_bSnap) { $? ". snap" wxdobj_set_control_point( &m_oBorder, &m_ptMousePosGrid, m_uCurrent ); wxdobj_bb_correct( &(m_oBorder.det.b.b), &m_uCurrent ); #if 0 bEqual = wxdobj_bb_equal(&(m_pDrw->bb), &(m_oBorder.det.b.b)); #endif bEqual = wxdobj_bb_equal(&(m_pDrw->bb), &m_oOldSize); $? ". bEqual = %d", (bEqual ? 1 : 0) DK4_MEMCPY(\ &(m_pDrw->bb),&(m_oBorder.det.b.b),sizeof(Wxd_bb_t)\ ); } else { if (m_bMouseDiff) { $? ". relative" dk4error_init(&er); pt.x = dk4ma_int32_t_add( m_ptPointMoveOri.x, m_ptMouseMoveDiff.x, &er ); pt.y = dk4ma_int32_t_add( m_ptPointMoveOri.y, m_ptMouseMoveDiff.y, &er ); if (DK4_E_NONE == er.ec) { wxdobj_set_control_point( &m_oBorder, &pt, m_uCurrent ); wxdobj_bb_correct( &(m_oBorder.det.b.b), &m_uCurrent ); #if 0 bEqual = wxdobj_bb_equal( &(m_pDrw->bb), &(m_oBorder.det.b.b) ); #endif bEqual = wxdobj_bb_equal(&(m_pDrw->bb), &m_oOldSize); $? ". bEqual = %d", (bEqual ? 1 : 0) DK4_MEMCPY(\ &(m_pDrw->bb),&(m_oBorder.det.b.b),sizeof(Wxd_bb_t)\ ); } } } if ((!(bEqual)) && (0 != m_iv[IVI_C_COR_POSITION])) { OnCenterViewFunction(); $? ". center view" } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_GRID); m_iState = S_DRWSZ_SELECT; SetMouseAndStatusTexts(m_iState); if (0 != DK4_MEMCMP(&m_oOldSize,&(m_pDrw->bb),sizeof(Wxd_bb_t))) { SetModified(); } DK4_MEMCPY(&m_oOldSize,&(m_pDrw->bb),sizeof(Wxd_bb_t)); } $? "- MouseLeftDrawingSizePlace" } void WxdkdrawFrame::MouseMoveFlip(void) { Wxd_object_t *pOldCurrent; $? "+ MouseMoveFlip" if (m_bMousePos) { pOldCurrent = m_pCurrent; m_pCurrent = FindNearestObject(true); if (m_pCurrent != pOldCurrent) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); if (NULL != m_pCurrent) { wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_1); } if ( ((NULL != m_pCurrent) && (NULL == pOldCurrent)) || ((NULL == m_pCurrent) && (NULL != pOldCurrent)) ) { SetMouseAndStatusTexts(m_iState); } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } } else { } $? "- MouseMoveFlip" } void WxdkdrawFrame::MouseLeftFlip(void) { Wxd_bb_t bball; Wxd_bb_t bbobj; bool bFirst; bool bSuccess; Wxd_object_t *pobj; $? "+ MouseLeftFlip" if (m_bMousePos) { m_pCurrent = FindNearestObject(true); if (NULL != m_pCurrent) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); switch ( (int)(m_pCurrent->ot) ) { case WXD_OT_GROUP_BEGIN : { wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_1); /* Gather bounding box information */ wxdobj_det_init_bb(&bball); bFirst = true; dk4sto_it_reset(m_pDrw->i_flat); do { pobj = (Wxd_object_t *)dk4sto_it_next(m_pDrw->i_flat); if ( (NULL != pobj) && (wxdobj_is_marked(pobj, OBJ_MARKER_1)) ) { if (wxdobj_control_pt_to_bb(&bbobj, pobj)) { if (bFirst) { DK4_MEMCPY(&bball,&bbobj,sizeof(Wxd_bb_t)); bFirst = false; } else { wxdobj_bb_add_bb(&bball, &bbobj); } } } } while (NULL != pobj); /* Run test */ bSuccess = true; dk4sto_it_reset(m_pDrw->i_flat); do { pobj = (Wxd_object_t *)dk4sto_it_next(m_pDrw->i_flat); if ( (NULL != pobj) && (wxdobj_is_marked(pobj, OBJ_MARKER_1)) ) { bFirst = wxdobj_flip_object( pobj, &bball, m_bVerticalFlip, false ); if (!(bFirst)) { bSuccess = false; } } } while (NULL != pobj); /* Real run */ if (bSuccess) { bSuccess = false; dk4sto_it_reset(m_pDrw->i_flat); do { pobj = (Wxd_object_t *)dk4sto_it_next(m_pDrw->i_flat); if ( (NULL != pobj) && (wxdobj_is_marked(pobj, OBJ_MARKER_1)) ) { wxdobj_flip_object( pobj, &bball, m_bVerticalFlip, true ); bSuccess = true; } } while (NULL != pobj); wxdobj_bb_modified_object(m_pDrw, m_pCurrent); if (bSuccess) { SetModified(); } } wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); } break; case WXD_OT_TEXT : case WXD_OT_POLYLINE : case WXD_OT_O_SPLINE : case WXD_OT_O_ARC : case WXD_OT_POLYGON : case WXD_OT_C_SPLINE : case WXD_OT_C_ARC : case WXD_OT_ELLIPSE : { if (wxdobj_control_pt_to_bb(&bbobj, m_pCurrent)) { if ( wxdobj_flip_object( m_pCurrent, &bbobj, m_bVerticalFlip, false ) ) { wxdobj_flip_object( m_pCurrent, &bbobj, m_bVerticalFlip, true ); wxdobj_bb_modified_object(m_pDrw, m_pCurrent); SetModified(); } } } break; case WXD_OT_CIRCLE : case WXD_OT_BOX : case WXD_OT_IMAGE : case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { /* Intentionally empty */ } break; } m_pCurrent = NULL; SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } } $? "- MouseLeftFlip" } void WxdkdrawFrame::MouseMoveGroupOne(void) { Wxd_object_t *pOldCurrent; $? "+ MouseMoveGroupOne" if (m_bMousePos) { pOldCurrent = m_pCurrent; m_pCurrent = FindNearestObject(true); if (m_pCurrent != pOldCurrent) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); if (NULL != m_pCurrent) { wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_1); } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); SetMouseAndStatusTexts(m_iState); } } $? "- MouseMoveGroupOne" } void WxdkdrawFrame::GroupNewForMarkedObjects(void) { dk4_er_t er; Wxd_object_t *pobj; Wxd_object_t *pngrp; int res; bool bFoundObject; bool bError; pngrp = wxdobj_drw_add_group(m_pDrw, NULL); if (NULL != pngrp) { bError = false; do { bFoundObject = false; dk4sto_it_reset(m_pDrw->i_stru); do { pobj = (Wxd_object_t *)dk4sto_it_next(m_pDrw->i_stru); if (NULL != pobj) { if (wxdobj_is_marked(pobj, OBJ_MARKER_2)) { bFoundObject = true; dk4error_init(&er); res = dk4sto_add((pngrp->det).g.s_e, pobj, &er); if (0 != res) { dk4error_init(&er); res = dk4sto_remove(m_pDrw->s_stru, pobj, &er); if (0 != res) { pobj->pa = pngrp; } else { bError = true; (void)dk4sto_remove( (pngrp->det).g.s_e, pobj, NULL ); /* ERROR: Failed to delete */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_MOVE_TO_GROUP ); } } else { bError = true; /* ERROR: Failed to insert (memory) */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } } } while ((NULL != pobj) && (!(bFoundObject)) && (!(bError))); } while ((bFoundObject) && (!(bError))); wxdobj_bb_group_structural(m_pDrw, pngrp); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } void WxdkdrawFrame::UngroupObjects(Wxd_object_t *pgrp) { Wxd_object_t *pobj; /* Current object */ int res; /* Storage operation result */ bool bFound; /* Found an object in current pass */ bool bError; /* Error occured, stop */ $? "+ UngroupObjects" bError = false; do { bFound = false; dk4sto_it_reset((pgrp->det).g.i_e); do { pobj = (Wxd_object_t *)dk4sto_it_next((pgrp->det).g.i_e); if (NULL != pobj) { bFound = true; res = dk4sto_add(m_pDrw->s_stru, pobj, NULL); if (0 != res) { res = dk4sto_remove((pgrp->det).g.s_e, pobj, NULL); if (0 != res) { $? ". object removed from group" dk4sto_it_reset((pgrp->det).g.i_e); pobj->pa = NULL; } else { $? "! failed to remove object from group" (void)dk4sto_remove(m_pDrw->s_stru, pobj, NULL); dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_UNGROUP_OBJECT ); } } else { $? "! failed to move object" /* ERROR: Failed to add */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_UNGROUP_OBJECT ); } } } while ((NULL != pobj) && (!(bFound)) && (!(bError))); } while (bFound && (!(bError))); if (!(bError)) { $? ". contents moved successfully" res = dk4sto_remove(m_pDrw->s_stru, pgrp, NULL); if (0 != res) { $? ". group removed successfully" if (NULL != (pgrp->det).g.i_e) { dk4sto_it_close((pgrp->det).g.i_e); (pgrp->det).g.i_e = NULL; } if (NULL != (pgrp->det).g.s_e) { dk4sto_close((pgrp->det).g.s_e); (pgrp->det).g.s_e = NULL; } pgrp->pa = NULL; pgrp->psti = NULL; pgrp->play = NULL; dk4mem_free(pgrp); } else { /* ERROR: Failed to remove */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_UNGROUP_OBJECT ); } } $? "- UngroupObjects" } void WxdkdrawFrame::MouseLeftGroupOne(void) { $? "+ MouseLeftGroupOne" if (m_bMousePos) { m_pCurrent = FindNearestObject(true); if (NULL != m_pCurrent) { if (wxdobj_is_marked(m_pCurrent, OBJ_MARKER_2)) { wxdobj_unmark_recursively(m_pCurrent, OBJ_MARKER_2); } else { wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_2); } wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = NULL; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); SetMouseAndStatusTexts(m_iState); } else { if (2 <= wxdobj_num_marked_2(m_pDrw)) { GroupNewForMarkedObjects(); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_2); m_pCurrent = NULL; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); SetMouseAndStatusTexts(m_iState); SetModified(); } else { /* Intentionally empty, do not group a single element */ } } } $? "- MouseLeftGroupOne" } void WxdkdrawFrame::MouseMoveUngroup(void) { Wxd_object_t *pOldCurrent; $? "+ MouseMoveUngroup" if (m_bMousePos) { pOldCurrent = m_pCurrent; m_pCurrent = FindNearestObject(true); if (NULL != m_pCurrent) { if (WXD_OT_GROUP_BEGIN != m_pCurrent->ot) { m_pCurrent = NULL; } } if (m_pCurrent != pOldCurrent) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); if (NULL != m_pCurrent) { wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_1); } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); SetMouseAndStatusTexts(m_iState); } } $? "- MouseMoveUngroup" } void WxdkdrawFrame::MouseLeftUngroup(void) { Wxd_object_t *pobj; $? "+ MouseLeftUngroup" if (m_bMousePos) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = NULL; pobj = FindNearestObject(true); if (NULL != pobj) { UngroupObjects(pobj); SetModified(); } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetMouseAndStatusTexts(m_iState); } $? "- MouseLeftUngroup" } void WxdkdrawFrame::MarkObjectsForRectangleGrouping(void) { Wxd_bb_t ibb; /* Bounding box using int values */ dk4_bb_t bbdbl; /* Bounding box using double values */ Wxd_object_t *pobj; /* Current object to check */ /* Initialize ibb with mouse coordinates */ ibb.xl = m_ptMouseMoveStart.x; ibb.xr = m_ptMousePosGrid.x; ibb.yb = m_ptMouseMoveStart.y; ibb.yt = m_ptMousePosGrid.y; wxdobj_bb_correct(&ibb); /* Unmark all objects */ wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_2); /* Convert mouse coordinates to double coordinates */ bbdbl.xmin = (double)(ibb.xl); bbdbl.xmax = (double)(ibb.xr); bbdbl.ymin = (double)(ibb.yb); bbdbl.ymax = (double)(ibb.yt); bbdbl.fl = ((unsigned char)3U); /* Check all objects in structural storage */ dk4sto_it_reset(m_pDrw->i_stru); do { pobj = (Wxd_object_t *)dk4sto_it_next(m_pDrw->i_stru); if (NULL != pobj) { if (0 != dk4bb_contains_bb(&bbdbl, &(pobj->bb), 1)) { wxdobj_mark_recursively(pobj, OBJ_MARKER_2); } } } while (NULL != pobj); } void WxdkdrawFrame::MouseMoveGroupRect1(void) { $? "+ MouseMoveGroupRect1" $? "- MouseMoveGroupRect1" } void WxdkdrawFrame::MouseLeftGroupRect1(void) { $? "+ MouseLeftGroupRect1" if (m_bMousePos) { DK4_MEMCPY(&m_ptMouseMoveStart,&m_ptMousePosGrid,sizeof(Wxd_point_t)); m_iState = S_GROUP_RECT_2; SetMouseAndStatusTexts(m_iState); } $? "- MouseLeftGroupRect1" } void WxdkdrawFrame::MouseMoveGroupRect2(void) { $? "+ MouseMoveGroupRect2" if (m_bMousePos) { MarkObjectsForRectangleGrouping(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } $? "- MouseMoveGroupRect2" } void WxdkdrawFrame::MouseLeftGroupRect2(void) { $? "+ MouseLeftGroupRect2" if (m_bMousePos) { MarkObjectsForRectangleGrouping(); if (2 <= wxdobj_num_marked_2(m_pDrw)) { GroupNewForMarkedObjects(); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_2); m_pCurrent = NULL; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); m_iState = S_GROUP_RECT_1; SetMouseAndStatusTexts(m_iState); SetModified(); } else { /* Intentionally empty, do not group a single element */ wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); } } $? "- MouseLeftGroupRect2" } void WxdkdrawFrame::MouseMoveDetails(void) { Wxd_object_t *pOldCurrent; $? "+ MouseMoveDetails" if (m_bMousePos) { pOldCurrent = m_pCurrent; m_pCurrent = FindNearestObject(); if (m_pCurrent != pOldCurrent) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; } if ( ((NULL != m_pCurrent) && (NULL == pOldCurrent)) || ((NULL == m_pCurrent) && (NULL != pOldCurrent)) ) { SetMouseAndStatusTexts(m_iState); } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } } $? "- MouseMoveDetails" } void WxdkdrawFrame::ChangeOneLabelText( wxChar **ptxt, wxTextCtrl *ptc, bool bKeepOld ) { wxString str = ptc->GetValue(); { wxCStrData strd = str.c_str(); { wxChar const *pstr = (wxChar const *)strd; if (NULL != pstr) { if (0 < dk4strx_len(pstr)) { wxChar *pnstr = dk4strx_dup(pstr, NULL); if (NULL != pnstr) { if (NULL != *ptxt) { dk4mem_free(*ptxt); } *ptxt = pnstr; } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { if (!(bKeepOld)) { if (NULL != *ptxt) { dk4mem_free(*ptxt); *ptxt = NULL; } } } } else { if (!(bKeepOld)) { if (NULL != *ptxt) { dk4mem_free(*ptxt); *ptxt = NULL; } } } } } } void WxdkdrawFrame::RetrieveTextDetails( wxTextCtrl *ptce, wxTextCtrl *ptcs, bool bLaTeX ) { if (bLaTeX) { ChangeOneLabelText(&((m_pCurrent->det).t.t), ptce); ChangeOneLabelText(&((m_pCurrent->det).t.tsc), ptcs, false); } else { ChangeOneLabelText(&((m_pCurrent->det).t.t), ptce); if (NULL != (m_pCurrent->det).t.tsc) { dk4mem_free((m_pCurrent->det).t.tsc); (m_pCurrent->det).t.tsc = NULL; } } } void WxdkdrawFrame::ModifyDetailsText(void) { bool bLaTeX = false; $? "+ ModifyDetailsText" bLaTeX = wxdobj_text_is_latex(m_pCurrent); WxdkdrawDlgTextInput tid( this, sTexts, sNlWx, &((m_pCurrent->det).t.t), &((m_pCurrent->det).t.tsc), bLaTeX, &m_oErrorReport ); Dk4WxApplicationHelper::ChooseChildPosition(*drawco, tid); if (wxID_OK == tid.ShowModal()) { wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetModified(); } #if 0 if (NULL != (m_pCurrent->det).t.t) { /* Export text available */ wxString te((m_pCurrent->det).t.t); if (bLaTeX && (NULL != (m_pCurrent->det).t.tsc)) { /* Screen text available and in use */ wxString ts((m_pCurrent->det).t.tsc); { WxdkdrawDlgTextInput tid(this, sTexts, sNlWx, bLaTeX); Dk4WxApplicationHelper::ChooseChildPosition(*drawco, tid); wxTextCtrl *ptce = tid.GetExportTextCtrl(); wxTextCtrl *ptcs = tid.GetScreenTextCtrl(); ptce->SetValue(te); ptcs->SetValue(ts); if (wxID_OK == tid.ShowModal()) { RetrieveTextDetails(ptce, ptcs, bLaTeX); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetModified(); } } } else { /* No screen text */ WxdkdrawDlgTextInput tid(this, sTexts, sNlWx, bLaTeX); Dk4WxApplicationHelper::ChooseChildPosition(*drawco, tid); wxTextCtrl *ptce = tid.GetExportTextCtrl(); wxTextCtrl *ptcs = tid.GetScreenTextCtrl(); ptce->SetValue(te); if (wxID_OK == tid.ShowModal()) { RetrieveTextDetails(ptce, ptcs, bLaTeX); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetModified(); } } } else { /* No export text (yet) */ WxdkdrawDlgTextInput tid(this, sTexts, sNlWx, bLaTeX); Dk4WxApplicationHelper::ChooseChildPosition(*drawco, tid); wxTextCtrl *ptce = tid.GetExportTextCtrl(); wxTextCtrl *ptcs = tid.GetScreenTextCtrl(); if (wxID_OK == tid.ShowModal()) { RetrieveTextDetails(ptce, ptcs, bLaTeX); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetModified(); } } #endif $? "- ModifyDetailsText" } /** Find the exponent of powers of 2 contained in a number. @param x Number to inspect. @return Exponent of powers of 2 contained in product on success, 0 on error. */ static uint32_t powers_of_two_in_product(uint32_t x) { uint32_t back = (uint32_t)0UL; $? "+ powers_of_two_in_product %lu", (unsigned long)x while ((uint32_t)0UL == (x % ((uint32_t)2UL))) { back++; x = x / ((uint32_t)2UL); } $? "- powers_of_two_in_product %lu", (unsigned long)back return back; } /** Find a suitable scroll step to scroll through a given length. @param snap Grid distance, result should be a product or an 1/x fraction of this. @param lgt Length to scroll through. @param mins Minimum number of scroll steps. @return Positive step width on success, 0 on error. */ static uint32_t step_length(uint32_t snap, uint32_t lgt, uint32_t mins) { dk4_er_t er; double d_l; double d_s; double d_m; double c; uint32_t back = (uint32_t)0UL; uint32_t maxe; uint32_t expo = (uint32_t)0UL; $? "+ step_length %lu %lu %lu", (unsigned long)snap, (unsigned long)lgt, (unsigned long)mins #if 0 /* 2020-03-24 Modification Turned to initialization due to complaints by clang static analyzer. */ expo = (uint32_t)0UL; #endif d_l = (double)lgt; d_s = (double)snap; d_m = (double)mins; back = snap; if (snap > (lgt / mins)) { dk4error_init(&er); maxe = powers_of_two_in_product(snap); $? ". maxe = %lu", (unsigned long)maxe c = ceil(0.0 - ((log(d_l/(d_s*d_m)))/ log(2.0))); if (0.0 < c) { expo = dk4ma_uint32_from_double(c, &er); $? ". expo = %lu", (unsigned long)expo if (DK4_E_NONE == er.ec) { if ((uint32_t)0UL < expo) { if (expo > maxe) { expo = maxe; } while((int32_t)0L < expo--) { back = back / ((uint32_t)2UL); } } } } } $? "- step_length %lu", (unsigned long)back return back; } void WxdkdrawFrame::ModifyDetailsBox(void) { dk4_er_t er; size_t ui; uint32_t w; uint32_t h; uint32_t s; uint32_t m; $? "+ ModifyDetailsBox" ui = ((0 != cbGridUnit->GetSelection()) ? (501) : (500)); dk4error_init(&er); w = (uint32_t)dk4ma_int32_t_abs( dk4ma_int32_t_sub( (m_pCurrent->det).b.b.xr, (m_pCurrent->det).b.b.xl, &er ), &er ); h = (uint32_t)dk4ma_int32_t_abs( dk4ma_int32_t_sub( (m_pCurrent->det).b.b.yt, (m_pCurrent->det).b.b.yb, &er ), &er ); $? ". w = %lu h = %lu", (unsigned long)w, (unsigned long)h if (DK4_E_NONE == er.ec) { if (h < w) { w = h; } $? ". w = %lu", (unsigned long)w w = w / (uint32_t)2UL; /* Have half of minimum side length */ $? ". w = %lu", (unsigned long)w s = step_length(drawco->m_uGridSnap, w, (uint32_t)8UL); $? ". s = %lu", (unsigned long)s if ((uint32_t)0UL < s) { $? ". s ok" m = (w / s); if (w == m * s) { m--; } $? ". m = %lu", (unsigned long)m if (((uint32_t)0UL) < m) { $? ". m ok" WxdkdrawDlgBoxRadius dlg( this, drawco, m_pDrw, m_pCurrent, sTexts, sNlWx, s, m, ui ); m_iState = S_DETAILS_2; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); if (wxID_OK == dlg.ShowModal()) { SetModified(); } m_iState = S_DETAILS; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } else { $? "! box too small" /* ERROR: Box too small */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_BOX_TOO_SMALL ); } } else { $? "! box too small" /* ERROR: Box too small */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_BOX_TOO_SMALL ); } } else { $? "! overflow" /* ERROR: Overflow */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_OVERFLOW_COORDINATES ); } $? "- ModifyDetailsBox" } void WxdkdrawFrame::ChangeImageFile(wxString & pa) { wxChar const *vptr; wxChar *nptr; wxCStrData vstrdata = pa.c_str(); vptr = (wxChar const *)vstrdata; if (NULL != vptr) { if (0 < dk4strx_len(vptr)) { nptr = dk4strx_dup(vptr, NULL); if (NULL != nptr) { if (NULL != (m_pCurrent->det).i.fn) { dk4mem_free((m_pCurrent->det).i.fn); } (m_pCurrent->det).i.fn = nptr; if (NULL != (m_pCurrent->det).i.bm) { delete((m_pCurrent->det).i.bm); (m_pCurrent->det).i.bm = NULL; } (m_pCurrent->det).i.t = wxBITMAP_TYPE_INVALID; wxdobj_load_image( m_pCurrent, pAppHelp->GetDkEncoding(), pAppHelp->GetWxEncoding() ); SetModified(); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { /* ERROR: Empty name */ dk4error_set_simple_error_code(&m_oErrorReport, WXD_E_NO_FILENAME); } } } static wxChar const * final_path_component(wxChar const *fn) { wxChar const *back = NULL; wxChar const *rptr = NULL; wxChar const *ptr; if (NULL != fn) { ptr = fn; while (wxT('\0') != *ptr) { #if DK4_HAVE_BACKSLASH_AS_SEP if (wxT('\\') == *ptr) { rptr = ptr; } #else if (wxT('/') == *ptr) { rptr = ptr; } #endif ptr++; } if (NULL != rptr) { back = ++rptr; } else { back = fn; } } return back; } void WxdkdrawFrame::ModifyDetailsImage(void) { wxString sDialogTitle(sTexts[409]); wxString sFileTypes(image_files_to_open); wxString sCurrentFileName(final_path_component((m_pCurrent->det).i.fn)); #if wxCHECK_VERSION(2, 9, 0) wxFileDialog dlg( this, sDialogTitle, m_sImageDir, sCurrentFileName, sFileTypes, (wxFD_OPEN | wxFD_FILE_MUST_EXIST) ); #else wxFileDialog dlg( this, sDialogTitle, m_sImageDir, sCurrentFileName, sFileTypes, wxOPEN ); #endif $? "+ ModifyDetailsImage" if(wxID_OK == dlg.ShowModal()) { wxString pa = dlg.GetPath(); m_sImageDir = dlg.GetDirectory(); ChangeImageFile(pa); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetModified(); } { WxdkdrawDlgImageOptions iodlg(this, m_pCurrent, sTexts); if (wxID_OK == iodlg.ShowModal()) { SetModified(); } } m_bUpdate = true; $? "- ModifyDetailsImage" } void WxdkdrawFrame::ModifyDetailsDotFilled(void) { $? "+ ModifyDetailsDotFilled" m_iState = S_DETAILS_2; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); m_pCurrent->mark |= OBJ_MARKER_1; { WxdkdrawDlgDotFilled dlg(this, drawco, m_pDrw, m_pCurrent, sTexts); Dk4WxApplicationHelper::ChooseChildPosition(*drawco, dlg); if (wxID_OK == dlg.ShowModal()) { SetModified(); } } wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_iState = S_DETAILS; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); $? "- ModifyDetailsDotFilled" } void WxdkdrawFrame::ModifyDetailsDotWhite(void) { $? "+ ModifyDetailsDotWhite" ModifyDetailsDotFilled(); $? "- ModifyDetailsDotWhite" } void WxdkdrawFrame::MouseLeftDetails(void) { $? "+ MouseLeftDetails" if (m_bMousePos) { m_pCurrent = FindNearestObject(); if (NULL != m_pCurrent) { switch ( (int)(m_pCurrent->ot) ) { case WXD_OT_TEXT : { ModifyDetailsText(); } break; case WXD_OT_BOX : { ModifyDetailsBox(); } break; case WXD_OT_IMAGE : { ModifyDetailsImage(); } break; case WXD_OT_DOT_FILLED : { ModifyDetailsDotFilled(); } break; case WXD_OT_DOT_WHITE : { ModifyDetailsDotWhite(); } break; } m_pCurrent = NULL; wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } } $? "- MouseLeftDetails" } void WxdkdrawFrame::MouseMiddleDelete(void) { $? "+ MouseMiddleDelete" if (m_bMousePos) { DK4_MEMCPY(&m_ptMouseMoveStart,&m_ptMousePosGrid,sizeof(Wxd_point_t)); m_iState = S_REGION_DELETE; SetMouseAndStatusTexts(m_iState); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_2); } $? "- MouseMiddleDelete" } void WxdkdrawFrame::MarkObjectsForRectangleDeletion(void) { Wxd_bb_t ibb; /* Bounding box using int values */ dk4_bb_t bbdbl; /* Bounding box using double values */ Wxd_object_t *pobj; /* Current object to check */ /* Initialize ibb with mouse coordinates */ ibb.xl = m_ptMouseMoveStart.x; ibb.xr = m_ptMousePosGrid.x; ibb.yb = m_ptMouseMoveStart.y; ibb.yt = m_ptMousePosGrid.y; wxdobj_bb_correct(&ibb); /* Unmark all objects */ wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_2); /* Convert mouse coordinates to double coordinates */ bbdbl.xmin = (double)(ibb.xl); bbdbl.xmax = (double)(ibb.xr); bbdbl.ymin = (double)(ibb.yb); bbdbl.ymax = (double)(ibb.yt); bbdbl.fl = ((unsigned char)3U); /* Check all objects in structural storage */ dk4sto_it_reset(m_pDrw->i_stru); do { pobj = (Wxd_object_t *)dk4sto_it_next(m_pDrw->i_stru); if (NULL != pobj) { if (0 != dk4bb_contains_bb(&bbdbl, &(pobj->bb), 1)) { wxdobj_mark_recursively(pobj, OBJ_MARKER_1); } } } while (NULL != pobj); } void WxdkdrawFrame::MouseMoveRegionDelete(void) { $? "+ MouseMoveRegionDelete" if (m_bMousePos) { MarkObjectsForRectangleDeletion(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } $? "- MouseMoveRegionDelete" } void WxdkdrawFrame::MouseLeftRegionDelete(void) { Wxd_object_t *pobj; bool bModified; bool bFoundChange; $? "+ MouseLeftRegionDelete" if (m_bMousePos) { /* Find objects to delete */ MarkObjectsForRectangleDeletion(); /* Delete marked elements */ bModified = false; do { bFoundChange = false; dk4sto_it_reset(m_pDrw->i_stru); do { pobj = (Wxd_object_t *)dk4sto_it_next(m_pDrw->i_stru); if (NULL != pobj) { if (wxdobj_is_marked(pobj, OBJ_MARKER_1)) { bModified = true; bFoundChange = true; wxdobj_obj_delete_from_drawing(m_pDrw, pobj); } } } while ((NULL != pobj) && (!(bFoundChange))); } while (bFoundChange); /* Go back to S_DELETE state */ wxdobj_drw_require_redraw( m_pDrw, ((bModified) ? (WXD_REFRESH_DRAWING) : (WXD_REFRESH_MARKUP)) ); m_iState = S_DELETE; wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_2); m_pCurrent = NULL; SetMouseAndStatusTexts(m_iState); if (bModified) { SetModified(); } } $? "- MouseLeftRegionDelete" } void WxdkdrawFrame::MouseMoveConvert(void) { Wxd_object_t *pOldCurrent; $? "+ MouseMoveConvert" if (m_bMousePos) { pOldCurrent = m_pCurrent; m_pCurrent = FindNearestObject(); if (m_pCurrent != pOldCurrent) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); SetMouseAndStatusTexts(m_iState); } } $? "- MouseMoveConvert" } void WxdkdrawFrame::ConvertSplineToPoly(Wxd_object_t *pobj) { Wxd_det_t nd; /* New details */ $? "+ ConvertSplineToPoly" if ((uint16_t)0U < (pobj->det).s.n) { if (NULL != (pobj->det).s.p) { DK4_MEMRES(&nd,sizeof(Wxd_det_t)); nd.p.n = (pobj->det).s.n; nd.p.p = dk4mem_new(Wxd_point_t,(size_t)(nd.p.n),NULL); if (NULL != nd.p.p) { for (uint16_t i = 0; i < nd.p.n; i++) { (nd.p.p)[i].x = ((pobj->det).s.p)[i].x; (nd.p.p)[i].y = ((pobj->det).s.p)[i].y; } dk4mem_free((pobj->det).s.p); DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } } $? "- ConvertSplineToPoly" } void WxdkdrawFrame::ConvertArcToPoly(Wxd_object_t *pobj) { dk4_er_t er; Wxd_det_t nd; /* New details */ $? "+ ConvertArcToPoly" DK4_MEMRES(&nd,sizeof(Wxd_det_t)); if ( (WXD_OT_POLYGON == m_iObjToCreate) && (WXD_OT_C_ARC == pobj->ot) && (0 != (pobj->det).a.d) ) { nd.p.n = 4U; nd.p.p = dk4mem_new(Wxd_point_t,(size_t)4,NULL); if (NULL != nd.p.p) { dk4error_init(&er); (nd.p.p)[0].x = (pobj->det).a.x1; (nd.p.p)[0].y = (pobj->det).a.y1; (nd.p.p)[1].x = (pobj->det).a.x2; (nd.p.p)[1].y = (pobj->det).a.y2; (nd.p.p)[2].x = (pobj->det).a.x3; (nd.p.p)[2].y = (pobj->det).a.y3; (nd.p.p)[3].x = dk4ma_int32_from_double((pobj->det).a.x, &er); (nd.p.p)[3].y = dk4ma_int32_from_double((pobj->det).a.y, &er); if (DK4_E_NONE == er.ec) { DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { dk4mem_free(nd.p.p); /* ERROR: Numeric overflow */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_OVERFLOW_COORDINATES ); } } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { nd.p.n = 3U; nd.p.p = dk4mem_new(Wxd_point_t,(size_t)3,NULL); if (NULL != nd.p.p) { (nd.p.p)[0].x = (pobj->det).a.x1; (nd.p.p)[0].y = (pobj->det).a.y1; (nd.p.p)[1].x = (pobj->det).a.x2; (nd.p.p)[1].y = (pobj->det).a.y2; (nd.p.p)[2].x = (pobj->det).a.x3; (nd.p.p)[2].y = (pobj->det).a.y3; DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } $? "- ConvertArcToPoly" } void WxdkdrawFrame::ConvertBoxToPoly(Wxd_object_t *pobj) { Wxd_det_t nd; /* New details */ $? "+ ConvertBoxToPoly" DK4_MEMRES(&nd,sizeof(Wxd_det_t)); nd.p.n = 4; nd.p.p = dk4mem_new(Wxd_point_t,(size_t)4,NULL); if (NULL != nd.p.p) { (nd.p.p)[0].x = (pobj->det).b.b.xl; (nd.p.p)[0].y = (pobj->det).b.b.yb; (nd.p.p)[1].x = (pobj->det).b.b.xr; (nd.p.p)[1].y = (pobj->det).b.b.yb; (nd.p.p)[2].x = (pobj->det).b.b.xr; (nd.p.p)[2].y = (pobj->det).b.b.yt; (nd.p.p)[2].x = (pobj->det).b.b.xl; (nd.p.p)[2].y = (pobj->det).b.b.yt; DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } $? "- ConvertBoxToPoly" } void WxdkdrawFrame::ConvertPolyToSpline(Wxd_object_t *pobj) { Wxd_det_t nd; /* New details */ double s; /* Spline value */ $? "+ ConvertPolyToSpline" DK4_MEMRES(&nd,sizeof(Wxd_det_t)); if (((uint16_t)0U < (pobj->det).p.n) && (NULL != (pobj->det).p.p)) { nd.s.n = (pobj->det).p.n; nd.s.p = dk4mem_new(Wxd_spline_point_t,(size_t)(nd.s.n),NULL); if (NULL != nd.s.p) { s = ((m_bSplineInterpolated) ? (-1.0) : (1.0)); for (uint16_t i = (uint16_t)0U; i < nd.s.n; i++) { (nd.s.p)[i].x = ((pobj->det).p.p)[i].x; (nd.s.p)[i].y = ((pobj->det).p.p)[i].y; (nd.s.p)[i].s = s; } if (WXD_OT_O_SPLINE == m_iObjToCreate) { (nd.s.p)[0].s = 0.0; (nd.s.p)[(size_t)(nd.s.n - (uint16_t)1U)].s = 0.0; } DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { /* ERROR: Bad original object */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_CANNOT_CONVERT ); } $? "- ConvertPolyToSpline" } void WxdkdrawFrame::ConvertSplineToSpline(Wxd_object_t *pobj) { double s; /* Spline value */ $? "+ ConvertSplineToSpline" if (((uint16_t)0U < (pobj->det).s.n) && (NULL != (pobj->det).s.p)) { s = ((m_bSplineInterpolated) ? (-1.0) : (1.0)); for (uint16_t i = (uint16_t)0U; i < (pobj->det).s.n; i++) { ((pobj->det).s.p)[i].s = s; } if (WXD_OT_O_SPLINE == m_iObjToCreate) { ((pobj->det).s.p)[0].s = 0.0; ((pobj->det).s.p)[(size_t)((pobj->det).s.n - (uint16_t)1U)].s = 0.0; } pobj->ot = m_iObjToCreate; SetModified(); } else { /* ERROR: Bad original object */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_CANNOT_CONVERT ); } $? "- ConvertSplineToSpline" } void WxdkdrawFrame::ConvertArcToSpline(Wxd_object_t *pobj) { dk4_er_t er; /* For double to int32_t conversion */ Wxd_det_t nd; /* New details */ double s; /* Spline value */ $? "+ ConvertArcToSpline" DK4_MEMRES(&nd,sizeof(Wxd_det_t)); s = ((m_bSplineInterpolated) ? (-1.0) : (1.0)); if ( (WXD_OT_C_SPLINE == m_iObjToCreate) && (WXD_OT_C_ARC == pobj->ot) && ((int8_t)0 != (pobj->det).a.d) ) { nd.s.n = 4U; nd.s.p = dk4mem_new(Wxd_spline_point_t,(size_t)4,NULL); if (NULL != nd.s.p) { dk4error_init(&er); (nd.s.p)[0].x = (pobj->det).a.x1; (nd.s.p)[0].y = (pobj->det).a.y1; (nd.s.p)[0].s = 0.0; (nd.s.p)[1].x = (pobj->det).a.x2; (nd.s.p)[1].y = (pobj->det).a.y2; (nd.s.p)[1].s = s; (nd.s.p)[2].x = (pobj->det).a.x3; (nd.s.p)[2].y = (pobj->det).a.y3; (nd.s.p)[2].s = 0.0; (nd.s.p)[3].x = dk4ma_int32_from_double((pobj->det).a.x, &er); (nd.s.p)[3].y = dk4ma_int32_from_double((pobj->det).a.y, &er); (nd.s.p)[3].s = 0.0; if (DK4_E_NONE == er.ec) { DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { dk4mem_free(nd.s.p); /* ERROR: Numeric overflow */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_OVERFLOW_COORDINATES ); } } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { nd.s.n = 3U; nd.s.p = dk4mem_new(Wxd_spline_point_t,(size_t)3,NULL); if (NULL != nd.s.p) { (nd.s.p)[0].x = (pobj->det).a.x1; (nd.s.p)[0].y = (pobj->det).a.y1; (nd.s.p)[0].s = 0.0; (nd.s.p)[1].x = (pobj->det).a.x2; (nd.s.p)[1].y = (pobj->det).a.y2; (nd.s.p)[1].s = s; (nd.s.p)[2].x = (pobj->det).a.x3; (nd.s.p)[2].y = (pobj->det).a.y3; (nd.s.p)[2].s = 0.0; DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } $? "- ConvertArcToSpline" } void WxdkdrawFrame::ConvertBoxToSpline(Wxd_object_t *pobj) { dk4_er_t er; /* For double to int32_t conversion */ Wxd_det_t nd; /* New details */ double s; /* Spline value */ int32_t r; int32_t w; int32_t h; $? "+ ConvertBoxToSpline" DK4_MEMRES(&nd,sizeof(Wxd_det_t)); s = ((m_bSplineInterpolated) ? (-1.0) : (1.0)); dk4error_init(&er); if ( (WXD_OT_C_SPLINE == m_iObjToCreate) && (!(m_bSplineInterpolated)) && ((uint32_t)0UL < (pobj->det).b.r) ) { w = dk4ma_int32_t_sub((pobj->det).b.b.xr, (pobj->det).b.b.xl, &er); w = dk4ma_int32_t_abs(w, &er); h = dk4ma_int32_t_sub((pobj->det).b.b.yt, (pobj->det).b.b.yb, &er); h = dk4ma_int32_t_abs(h, &er); if (w > h) w = h; r = w / (int32_t)2L; if ((uint32_t)r > (pobj->det).b.r) { r = (int32_t)((pobj->det).b.r); } } if ( (WXD_OT_C_SPLINE == m_iObjToCreate) && (!(m_bSplineInterpolated)) && ((uint32_t)0UL < (pobj->det).b.r) && (DK4_E_NONE == er.ec) ) { nd.s.n = 12; nd.s.p = dk4mem_new(Wxd_spline_point_t,(size_t)12,NULL); if (NULL != nd.s.p) { (nd.s.p)[0].x = (pobj->det).b.b.xl + r; (nd.s.p)[0].y = (pobj->det).b.b.yb; (nd.s.p)[0].s = 0.0; (nd.s.p)[1].x = (pobj->det).b.b.xr - r; (nd.s.p)[1].y = (pobj->det).b.b.yb; (nd.s.p)[1].s = 0.0; (nd.s.p)[2].x = (pobj->det).b.b.xr; (nd.s.p)[2].y = (pobj->det).b.b.yb; (nd.s.p)[2].s = 1.0; (nd.s.p)[3].x = (pobj->det).b.b.xr; (nd.s.p)[3].y = (pobj->det).b.b.yb + r; (nd.s.p)[3].s = 0.0; (nd.s.p)[4].x = (pobj->det).b.b.xr; (nd.s.p)[4].y = (pobj->det).b.b.yt - r; (nd.s.p)[4].s = 0.0; (nd.s.p)[5].x = (pobj->det).b.b.xr; (nd.s.p)[5].y = (pobj->det).b.b.yt; (nd.s.p)[5].s = 1.0; (nd.s.p)[6].x = (pobj->det).b.b.xr - r; (nd.s.p)[6].y = (pobj->det).b.b.yt; (nd.s.p)[6].s = 0.0; (nd.s.p)[7].x = (pobj->det).b.b.xl + r; (nd.s.p)[7].y = (pobj->det).b.b.yt; (nd.s.p)[7].s = 0.0; (nd.s.p)[8].x = (pobj->det).b.b.xl; (nd.s.p)[8].y = (pobj->det).b.b.yt; (nd.s.p)[8].s = 1.0; (nd.s.p)[9].x = (pobj->det).b.b.xl; (nd.s.p)[9].y = (pobj->det).b.b.yt - r; (nd.s.p)[9].s = 0.0; (nd.s.p)[10].x = (pobj->det).b.b.xl; (nd.s.p)[10].y = (pobj->det).b.b.yb + r; (nd.s.p)[10].s = 0.0; (nd.s.p)[11].x = (pobj->det).b.b.xl; (nd.s.p)[11].y = (pobj->det).b.b.yb; (nd.s.p)[11].s = 1.0; DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } else { nd.s.n = 4; nd.s.p = dk4mem_new(Wxd_spline_point_t,(size_t)4,NULL); if (NULL != nd.s.p) { (nd.s.p)[0].x = (pobj->det).b.b.xl; (nd.s.p)[0].y = (pobj->det).b.b.yb; (nd.s.p)[0].s = s; (nd.s.p)[1].x = (pobj->det).b.b.xr; (nd.s.p)[1].y = (pobj->det).b.b.yb; (nd.s.p)[1].s = s; (nd.s.p)[2].x = (pobj->det).b.b.xr; (nd.s.p)[2].y = (pobj->det).b.b.yt; (nd.s.p)[2].s = s; (nd.s.p)[3].x = (pobj->det).b.b.xl; (nd.s.p)[3].y = (pobj->det).b.b.yt; (nd.s.p)[3].s = s; DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; if (WXD_OT_C_SPLINE != pobj->ot) { ((pobj->det).s.p)[0].s = 0.0; ((pobj->det).s.p)[(size_t)((pobj->det).s.n-(uint16_t)1U)].s=0.0; } SetModified(); } else { /* ERROR: Memory */ dk4error_set_simple_error_code( &m_oErrorReport, DK4_E_MEMORY_ALLOCATION_FAILED ); } } $? "- ConvertBoxToSpline" } void WxdkdrawFrame::ConvertPolyToArc(Wxd_object_t *pobj) { Wxd_det_t nd; $? "+ ConvertPolyToArc" DK4_MEMRES(&nd,sizeof(Wxd_det_t)); if (((uint16_t)2U < (pobj->det).p.n) && (NULL != (pobj->det).p.p)) { nd.a.x1 = ((pobj->det).p.p)[0].x; nd.a.y1 = ((pobj->det).p.p)[0].y; nd.a.x2 = ((pobj->det).p.p)[1].x; nd.a.y2 = ((pobj->det).p.p)[1].y; nd.a.x3 = ((pobj->det).p.p)[2].x; nd.a.y3 = ((pobj->det).p.p)[2].y; wxdarc_calculation( &(nd.a.x), &(nd.a.y), &(nd.a.r), &(nd.a.a), &(nd.a.b), &(nd.a.d), nd.a.x1, nd.a.y1, nd.a.x2, nd.a.y2, nd.a.x3, nd.a.y3 ); dk4mem_free((pobj->det).p.p); DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { /* ERROR: Bad original object */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_CANNOT_CONVERT ); } $? "- ConvertPolyToArc" } void WxdkdrawFrame::ConvertSplineToArc(Wxd_object_t *pobj) { Wxd_det_t nd; $? "+ ConvertSplineToArc" DK4_MEMRES(&nd,sizeof(Wxd_det_t)); if (((uint16_t)2U < (pobj->det).s.n) && (NULL != (pobj->det).s.p)) { nd.a.x1 = ((pobj->det).s.p)[0].x; nd.a.y1 = ((pobj->det).s.p)[0].y; nd.a.x2 = ((pobj->det).s.p)[1].x; nd.a.y2 = ((pobj->det).s.p)[1].y; nd.a.x3 = ((pobj->det).s.p)[2].x; nd.a.y3 = ((pobj->det).s.p)[2].y; wxdarc_calculation( &(nd.a.x), &(nd.a.y), &(nd.a.r), &(nd.a.a), &(nd.a.b), &(nd.a.d), nd.a.x1, nd.a.y1, nd.a.x2, nd.a.y2, nd.a.x3, nd.a.y3 ); dk4mem_free((pobj->det).s.p); DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { /* ERROR: Bad original object */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_CANNOT_CONVERT ); } $? "- ConvertSplineToArc" } void WxdkdrawFrame::ConvertCircleToDot(Wxd_object_t *pobj) { dk4_er_t er; Wxd_det_t nd; uint16_t d; /* New diameter */ $? "+ ConvertCircleToDot" DK4_MEMRES(&nd,sizeof(Wxd_det_t)); dk4error_init(&er); d = dk4ma_uint16_from( (dk4_um_t)dk4ma_uint32_t_div( dk4ma_uint32_t_mul((pobj->det).e.rx, (uint32_t)2UL, &er), m_pDrw->baselw, &er ), &er ); if (DK4_E_NONE == er.ec) { nd.d.x = (pobj->det).e.x; nd.d.y = (pobj->det).e.y; nd.d.d = d; DK4_MEMCPY(&(pobj->det),&nd,sizeof(Wxd_det_t)); pobj->ot = m_iObjToCreate; SetModified(); } else { /* ERROR: Numeric overflow */ dk4error_set_simple_error_code( &m_oErrorReport, WXD_E_OVERFLOW_COORDINATES ); } $? "- ConvertCircleToDot" } void WxdkdrawFrame::ObjectTypeConversion(Wxd_object_t *pobj) { if (NULL != pobj) { if (wxdobj_can_convert(m_iObjToCreate, pobj)) { switch ( (int)m_iObjToCreate ) { case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { switch ( (int)(pobj->ot) ) { case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { pobj->ot = m_iObjToCreate; } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { ConvertSplineToPoly(pobj); } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { ConvertArcToPoly(pobj); } break; case WXD_OT_BOX : { ConvertBoxToPoly(pobj); } break; } } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { switch ( (int)(pobj->ot) ) { case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { ConvertPolyToSpline(pobj); } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { ConvertSplineToSpline(pobj); } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { ConvertArcToSpline(pobj); } break; case WXD_OT_BOX : { ConvertBoxToSpline(pobj); } break; } } break; case WXD_OT_O_ARC : case WXD_OT_C_ARC : { switch ( (int)(pobj->ot) ) { case WXD_OT_C_ARC : case WXD_OT_O_ARC : { pobj->ot = m_iObjToCreate; } break; case WXD_OT_POLYLINE : case WXD_OT_POLYGON : { ConvertPolyToArc(pobj); } break; case WXD_OT_O_SPLINE : case WXD_OT_C_SPLINE : { ConvertSplineToArc(pobj); } break; } } break; case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { switch ( (int)(pobj->ot) ) { case WXD_OT_DOT_FILLED : case WXD_OT_DOT_WHITE : { pobj->ot = m_iObjToCreate; } break; case WXD_OT_CIRCLE : { ConvertCircleToDot(pobj); } break; } } break; } wxdobj_bb_simple_object(m_pDrw, pobj); } } } void WxdkdrawFrame::MouseLeftConvert(void) { $? "+ MouseLeftConvert" if (m_bMousePos) { m_pCurrent = FindNearestObject(); if (NULL != m_pCurrent) { ObjectTypeConversion(m_pCurrent); wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = NULL; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); SetMouseAndStatusTexts(m_iState); } } $? "- MouseLeftConvert" } void WxdkdrawFrame::MouseMoveRotate(void) { Wxd_point_t center; Wxd_object_t *prevobj; $? "+ MouseMoveRotate" if (m_bMousePos) { prevobj = m_pCurrent; wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = wxdobj_rotate_find_object( m_pDrw, &m_ptMousePosRaw, &m_uCurrent, (2.0 * (double)(drawco->m_uGridSnap)) ); if (NULL != m_pCurrent) { if (wxdobj_get_control_point(¢er, m_pCurrent, m_uCurrent)) { while (NULL != m_pCurrent->pa) { m_pCurrent = m_pCurrent->pa; } if ( wxdobj_rotate_object( m_pCurrent, center.x, center.y, m_bSplineInterpolated, false ) ) { wxdobj_mark_recursively(m_pCurrent, OBJ_MARKER_1); } else { $? "! rotation test failed" m_pCurrent = NULL; } } else { $? "! failed to retrieve control point" m_pCurrent = NULL; } } else { $? "! no current object" } if ( ((NULL != m_pCurrent) && (NULL == prevobj)) || ((NULL == m_pCurrent) && (NULL != prevobj)) ) { SetMouseAndStatusTexts(m_iState); } wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } $? "- MouseMoveRotate" } void WxdkdrawFrame::MouseLeftRotate(void) { Wxd_point_t center; $? "+ MouseLeftRotate" if (m_bMousePos) { wxdobj_unmark_all(m_pDrw, OBJ_MARKER_1); m_pCurrent = wxdobj_rotate_find_object( m_pDrw, &m_ptMousePosRaw, &m_uCurrent, (2.0 * (double)(drawco->m_uGridSnap)) ); if (NULL != m_pCurrent) { if (wxdobj_get_control_point(¢er, m_pCurrent, m_uCurrent)) { while (NULL != m_pCurrent->pa) { m_pCurrent = m_pCurrent->pa; } if ( wxdobj_rotate_object( m_pCurrent, center.x, center.y, m_bSplineInterpolated, false ) ) { wxdobj_rotate_object( m_pCurrent, center.x, center.y, m_bSplineInterpolated, true ); SetModified(); } else { m_pCurrent = NULL; } } else { m_pCurrent = NULL; } } SetMouseAndStatusTexts(m_iState); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_DRAWING); } $? "- MouseLeftRotate" } void WxdkdrawFrame::MouseMoveModspline(void) { Wxd_object_t *prevobj; uint16_t prevpoint; $? "+ MouseMoveModspline" if (m_bMousePos) { /* Save previous candidate object and point */ prevobj = m_pCurrent; prevpoint = m_uCurrent; /* Check for new candicate */ if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = wxdobj_modify_spline_find_object( m_pDrw, &m_ptMousePosRaw, &m_uCurrent, (2.0 * (double)(drawco->m_uGridSnap)) ); if (NULL != m_pCurrent) { m_pCurrent->mark |= OBJ_MARKER_1; $!trace-code wxdobj_report_object(m_pCurrent); } /* On object or point change redraw the markup */ if ( ((NULL != m_pCurrent) && (NULL == prevobj)) || ((NULL == m_pCurrent) && (NULL != prevobj)) ) { SetMouseAndStatusTexts(m_iState); } if ((prevobj != m_pCurrent) || (prevpoint != m_uCurrent)) { wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); } } $? "- MouseMoveModspline" } void WxdkdrawFrame::MouseLeftModspline(void) { $? "+ MouseLeftModspline" if (m_bMousePos) { if (NULL != m_pCurrent) { m_pCurrent->mark &= (~(OBJ_MARKER_1)); } m_pCurrent = wxdobj_modify_spline_find_object( m_pDrw, &m_ptMousePosRaw, &m_uCurrent, (2.0 * (double)(drawco->m_uGridSnap)) ); if (NULL != m_pCurrent) { ModifySplineValue(m_pCurrent, m_uCurrent); m_pCurrent = NULL; m_uCurrent = (uint16_t)0U; SetMouseAndStatusTexts(m_iState); } } $? "- MouseLeftModspline" } /* vim: set ai sw=4 ts=4 : */