%% options copyright owner = Dirk Krause copyright year = 2019-xxxx SPDX-License-Identifier: BSD-3-Clause # vim: set ai sw=4 ts=4 : %% module #include "wxdkdraw.h" #ifndef WXDKDRAWAPPH_INCLUDED #include "WxdkdrawApp.h" #endif #ifndef WXDKDRAWFRAME_H_INCLUDED #include "WxdkdrawFrame.h" #endif $!trace-include #if wxCHECK_VERSION(3,0,0) wxBEGIN_EVENT_TABLE(WxdkdrawFrame::Control,wxControl) #else BEGIN_EVENT_TABLE(WxdkdrawFrame::Control,wxControl) #endif EVT_ERASE_BACKGROUND(WxdkdrawFrame::Control::OnErase) EVT_PAINT(WxdkdrawFrame::Control::OnPaint) EVT_SIZE(WxdkdrawFrame::Control::OnSize) EVT_ENTER_WINDOW(WxdkdrawFrame::Control::OnMouseEnter) EVT_LEAVE_WINDOW(WxdkdrawFrame::Control::OnMouseLeave) EVT_MOTION(WxdkdrawFrame::Control::OnMouseMove) EVT_LEFT_DOWN(WxdkdrawFrame::Control::OnLeftMouseButtonDown) EVT_MIDDLE_DOWN(WxdkdrawFrame::Control::OnMiddleMouseButtonDown) EVT_RIGHT_DOWN(WxdkdrawFrame::Control::OnRightMouseButtonDown) EVT_MOUSEWHEEL(WxdkdrawFrame::Control::OnMouseWheel) #if wxCHECK_VERSION(3,0,0) wxEND_EVENT_TABLE() #else END_EVENT_TABLE() #endif #if wxCHECK_VERSION(3,0,0) wxIMPLEMENT_DYNAMIC_CLASS(WxdkdrawFrame::Control,wxControl); #else IMPLEMENT_DYNAMIC_CLASS(WxdkdrawFrame::Control,wxControl) #endif wxChar const WxdkdrawFrame::Control::ms_controlname[] = { wxT("WxdkdrawControl") } ; bool WxdkdrawFrame::Control::CanHandleEvents(void) { bool back = false; if (m_bCanAllocate && (NULL != m_pParent)) { if (NULL != m_pParent->m_pDrw) { back = m_pParent->m_bActive; } } return back; } void WxdkdrawFrame::Control::OnErase(wxEraseEvent & WXUNUSED(event)) { $? "+ OnErase" /* Intentionally empty. We must overwrite the method to avoid background erasing, but we do nothing here as we do not want to erase something. */ $? "- OnErase" } void WxdkdrawFrame::Control::OnPaint(wxPaintEvent & WXUNUSED(event)) { $? "+ OnPaint" m_szDrawco = GetClientSize(); if (CanHandleEvents()) { /* Calculate coordinates conversion coefficients */ CalculateConversionCoefficients(); /* Destroy old bitmaps if size does not match */ if (NULL != m_pB3) { wxSize bmsz = m_pB3->GetSize(); if (m_szDrawco != bmsz) { delete m_pB3; m_pB3 = NULL; } } if (NULL != m_pB2) { wxSize bmsz = m_pB2->GetSize(); if (m_szDrawco != bmsz) { delete m_pB2; m_pB2 = NULL; } } if (NULL != m_pB1) { wxSize bmsz = m_pB1->GetSize(); if (m_szDrawco != bmsz) { delete m_pB1; m_pB1 = NULL; } } /* Allocate new bitmaps */ if (NULL == m_pB1) { m_pB1 = new wxBitmap(m_szDrawco.GetWidth(), m_szDrawco.GetHeight()); if (NULL != m_pB1) { wxdobj_drw_require_redraw(m_pParent->m_pDrw,WXD_REFRESH_GRID); } } if (NULL == m_pB2) { m_pB2 = new wxBitmap(m_szDrawco.GetWidth(), m_szDrawco.GetHeight()); if (NULL != m_pB2) { wxdobj_drw_require_redraw( m_pParent->m_pDrw,WXD_REFRESH_DRAWING ); } } if (NULL == m_pB3) { m_pB3 = new wxBitmap(m_szDrawco.GetWidth(), m_szDrawco.GetHeight()); if (NULL != m_pB3) { wxdobj_drw_require_redraw(m_pParent->m_pDrw,WXD_REFRESH_MARKUP); } } /* Draw either buffered or unbuffered */ if ((NULL != m_pB1) && (NULL != m_pB2) && (NULL != m_pB3)) { /* All bitmaps available, buffered drawing */ wxPaintDC paintDC(this); int rl; rl = wxdobj_drw_get_required_redraw_level(m_pParent->m_pDrw); if (WXD_REFRESH_GRID <= rl) { $? ". draw grid" wxMemoryDC mdc; mdc.SelectObject(*m_pB1); PaintOperation0(mdc); wxGraphicsContext *gc = wxGraphicsContext::Create(mdc); if (NULL != gc) { PaintOperation1(gc); delete gc; } mdc.SelectObject(wxNullBitmap); } if (WXD_REFRESH_DRAWING <= rl) { $? ". draw elements" wxMemoryDC mdc; mdc.SelectObject(*m_pB2); mdc.DrawBitmap(*m_pB1, 0, 0, false); wxGraphicsContext *gc = wxGraphicsContext::Create(mdc); if (NULL != gc) { PaintOperation2(gc); delete gc; } mdc.SelectObject(wxNullBitmap); } if (WXD_REFRESH_MARKUP <= rl) { $? ". draw markup" wxMemoryDC mdc; mdc.SelectObject(*m_pB3); mdc.DrawBitmap(*m_pB2, 0, 0, false); wxGraphicsContext *gc = wxGraphicsContext::Create(mdc); if (NULL != gc) { PaintOperation3(gc); delete gc; } mdc.SelectObject(wxNullBitmap); } $? ". use cached bitmap" paintDC.DrawBitmap(*m_pB3, 0, 0, false); } else { /* At least one bitmap not allocated, unbuffered drawing */ wxBufferedPaintDC paintDC(this); wxGraphicsContext *gc = wxGraphicsContext::Create(paintDC); if (NULL != gc) { PaintOperation0(paintDC); PaintOperation1(gc); PaintOperation2(gc); PaintOperation3(gc); delete gc; } } /* Reset the redraw level to mark that the produced bitmap 3 (if any) can be re-used without drawing operations. */ wxdobj_drw_reset_required_redraw_level(m_pParent->m_pDrw); } else { /* Draw control not yet or no longer ready for normal use. Simply draw placeholder for draw control. */ wxBufferedPaintDC paintDC(this); PaintOperation0(paintDC); } $? "- OnPaint" } void WxdkdrawFrame::Control::OnSize(wxSizeEvent & WXUNUSED(event)) { int oldw; int oldh; bool bEnlarged = false; $? "+ OnSize" if (CanHandleEvents()) { oldw = m_szDrawco.GetWidth(); oldh = m_szDrawco.GetHeight(); m_szDrawco = GetClientSize(); if (m_szDrawco.GetWidth() > oldw) { bEnlarged = true; } if (m_szDrawco.GetHeight() > oldh) { bEnlarged = true; } if (bEnlarged && (0 != m_pParent->m_iv[IVI_C_COR_POSITION])) { m_pParent->CorrectCenterPointIfNecessary(); } m_pParent->AdjustScrollbars(); wxdobj_drw_require_redraw(m_pParent->m_pDrw, WXD_REFRESH_GRID); Refresh(); m_pParent->Update(); } $? "- OnSize" } void WxdkdrawFrame::Control::OnMouseEnter(wxMouseEvent & event) { $? "+ OnMouseEnter" if (CanHandleEvents()) { m_pParent->ControlMouseEnter(event); } #ifndef __WXGTK__ SetFocus(); #endif $? "- OnMouseEnter" } void WxdkdrawFrame::Control::OnMouseLeave(wxMouseEvent & event) { $? "+ OnMouseLeave" if (CanHandleEvents()) { m_pParent->ControlMouseLeave(event); } $? "- OnMouseLeave" } void WxdkdrawFrame::Control::OnMouseMove(wxMouseEvent & event) { $? "+ OnMouseMove" if (CanHandleEvents()) { m_pParent->ControlMouseMove(event); } $? "- OnMouseMove" } void WxdkdrawFrame::Control::OnLeftMouseButtonDown(wxMouseEvent & event) { $? "+ OnLeftMouseButtonDown" if (CanHandleEvents()) { m_pParent->ControlLeftMouseButton(event); } #ifndef __WXGTK__ SetFocus(); #endif #if 0 event.Skip(); #endif $? "- OnLeftMouseButtonDown" } void WxdkdrawFrame::Control::OnRightMouseButtonDown(wxMouseEvent & event) { $? "+ OnRightMouseButtonDown" if (CanHandleEvents()) { m_pParent->ControlRightMouseButton(event); } #ifndef __WXGTK__ SetFocus(); #endif #if 0 event.Skip(); #endif $? "- OnRightMouseButtonDown" } void WxdkdrawFrame::Control::OnMiddleMouseButtonDown(wxMouseEvent & event) { $? "+ OnMiddleMouseButtonDown" if (CanHandleEvents()) { m_pParent->ControlMiddleMouseButton(event); } #ifndef __WXGTK__ SetFocus(); #endif #if 0 event.Skip(); #endif $? "- OnMiddleMouseButtonDown" } void WxdkdrawFrame::Control::OnMouseWheel(wxMouseEvent & event) { $? "+ OnMouseWheel" if (CanHandleEvents()) { m_pParent->ControlMouseWheel(event); } $? "- OnMouseWheel" } /* vim: set ai sw=4 ts=4 : */