# include "StdAfx.h"
# include ".\itemcurveedit.h"
# include "SigmaDoc.h"
# include "SigmaView.h"
# include ".\actionmodifieditem.h"
# include "ActionBackupItem.h"
# include "DrawOperator/TypeDefine.h"
# include "ActionCurveEdit.h"
# include "ActionCurveEditAddPoint.h"
# include "ActionCurveEditDeletePoint.h"
# include "HandleDrawer.h"
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ı ༭<C4B1> <E0BCAD> ʵ<EFBFBD> <CAB5>
# include "CurveEditorDefault.h"
# include "CurveEditorSpline.h"
namespace NItem
{
# define TRACKER_SOLID 1
# define TRACKER_RECT 2
# define TRACKER_CIRCLE 4
# define TRACKER_NO_EDIT TRACKER_SOLID | TRACKER_CIRCLE
// ========== <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> ʵ<EFBFBD> <CAB5> ==========
CItemCurveEdit : : CItemCurveEdit ( CSigmaDoc * pDoc )
: CItemCurve ( pDoc )
, m_pDoc ( pDoc )
{
this - > SetType ( ITEM_CURVE_EDIT ) ;
// Ĭ<> <C4AC> ʹ <EFBFBD> <CAB9> Default ģʽ <C4A3> ༭<EFBFBD> <E0BCAD>
m_currentEditor = CreateEditor ( DRAG_NODE_DEFAULT ) ;
}
CItemCurveEdit : : ~ CItemCurveEdit ( void )
{
}
int CItemCurveEdit : : GetCurrentEditMode ( ) const
{
if ( std : : dynamic_pointer_cast < CurveEditorDefault > ( m_currentEditor ) )
{
return DRAG_NODE_DEFAULT ;
}
if ( std : : dynamic_pointer_cast < CurveEditorSpline > ( m_currentEditor ) )
{
return DRAG_NODE_SPLINE ;
}
return - 1 ;
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ༭<EFBFBD> <E0BCAD> <EFBFBD> ĸ<EFBFBD> <C4B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
std : : shared_ptr < CurveEditorBase > CItemCurveEdit : : CreateEditor ( int mode )
{
switch ( mode )
{
case DRAG_NODE_DEFAULT :
return std : : make_shared < CurveEditorDefault > ( m_pDoc ) ;
case DRAG_NODE_SPLINE :
return std : : make_shared < CurveEditorSpline > ( m_pDoc ) ;
default :
return std : : make_shared < CurveEditorDefault > ( m_pDoc ) ;
}
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬<D7B4> л<EFBFBD> <D0BB> ༭<EFBFBD> <E0BCAD>
void CItemCurveEdit : : SetCurveState ( int state , CDC * pDC )
{
// <20> <> <EFBFBD> <EFBFBD> ״̬ӳ<CCAC> 䵽<EFBFBD> ༭ģʽ
int mode = DRAG_NODE_DEFAULT ;
switch ( state )
{
case CURVE_STATE_LINE :
mode = DRAG_NODE_DEFAULT ;
break ;
case CURVE_STATE_ARC :
mode = DRAG_NODE_COS ;
break ;
case CURVE_STATE_SPLINE :
mode = DRAG_NODE_SPLINE ;
break ;
default :
// WARNING:
// <20> <> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> л<EFBFBD> Ϊ DRAG_NODE_DEFAULT
// ԭ<> <D4AD> : state <20> <> ģʽ <C4A3> л<EFBFBD> <D0BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ָ<EFBFBD> <D6B8> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> <CFB4> <EFBFBD> <EFBFBD> <EFBFBD>
// <20> <> <EFBFBD> ڴ˴ <DAB4> <CBB4> л<EFBFBD> <D0BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ı ༭״̬
return ;
}
SwitchEditMode ( mode ) ;
CItemCurve : : SetCurveState ( state , pDC ) ;
}
// <20> <> ʽ <EFBFBD> л<EFBFBD> <D0BB> ༭ģʽ
void CItemCurveEdit : : SwitchEditMode ( int mode )
{
// ģʽ <C4A3> <CABD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> أ<EFBFBD>
// 1. <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ഥ<EFBFBD> <E0B4A5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϲ <EFBFBD> ״̬ͬ<CCAC> <CDAC> Bug <20> <> <EFBFBD> µĵ<C2B5> <C4B5> <EFBFBD> ʱ<EFBFBD> ظ<EFBFBD> <D8B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˺<EFBFBD> <CBBA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ⣬<EFBFBD> <E2A3AC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> ״̬<D7B4> <CCAC> <EFBFBD> <EFBFBD> ʧ<EFBFBD> <CAA7>
// 2. <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڹ<EFBFBD> <DAB9> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģʽ <C4A3> <CABD> <EFBFBD> <EFBFBD> <EFBFBD> 仯ʱ<E4BBAF> <CAB1> <EFBFBD> ٲ<EFBFBD> <D9B2> ؽ<EFBFBD> Editor<6F> <72>
// 3. ״̬<D7B4> <CCAC> <EFBFBD> 룺<EFBFBD> <EBA3BA> <EFBFBD> <EFBFBD> <EFBFBD> л<EFBFBD> ģʽ ʱ<CABD> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <CDB8> <EFBFBD> <EFBFBD> <EFBFBD> Ƶ<EFBFBD> <C6B5> ±꣨HandleIndex<65> <78> <EFBFBD> <EFBFBD> ȷ<EFBFBD> <C8B7> <EFBFBD> <EFBFBD> ģʽ <C4A3> <EFBFBD> <DFBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ұ<EFBFBD> ȫ<EFBFBD> <C8AB>
if ( GetCurrentEditMode ( ) = = mode )
{
return ;
}
// <20> <> <EFBFBD> 浱ǰ״̬
POSITION oldPos = GetPos ( ) ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ±༭<C2B1> <E0BCAD>
m_currentEditor = CreateEditor ( mode ) ;
// ͬ<> <CDAC> ״̬
if ( oldPos & & m_currentEditor )
{
m_currentEditor - > SetPos ( oldPos ) ;
}
}
// ========== <20> <> <EFBFBD> з<EFBFBD> <D0B7> <EFBFBD> ת<EFBFBD> <D7AA> <EFBFBD> <EFBFBD> m_currentEditor ==========
void CItemCurveEdit : : OnDraw ( CXyDC * pDC )
{
if ( m_currentEditor )
m_currentEditor - > OnDraw ( pDC ) ;
}
void CItemCurveEdit : : OnLButtonDblClk ( UINT nFlags , CPoint point )
{
if ( m_currentEditor )
m_currentEditor - > OnLButtonDblClk ( nFlags , point ) ;
}
void CItemCurveEdit : : OnLButtonDown ( CDC * pDC , UINT nFlags , CPoint point , int vk )
{
if ( m_currentEditor )
m_currentEditor - > OnLButtonDown ( pDC , nFlags , point , vk ) ;
}
int CItemCurveEdit : : OnMouseMove ( CDC * pDC , UINT nFlags , CPoint point )
{
if ( m_currentEditor )
return m_currentEditor - > OnMouseMove ( pDC , nFlags , point ) ;
return 0 ;
}
void CItemCurveEdit : : OnLButtonUp ( CDC * pDC , UINT nFlags , CPoint point , int vk )
{
if ( m_currentEditor )
m_currentEditor - > OnLButtonUp ( pDC , nFlags , point , vk ) ;
}
BOOL CItemCurveEdit : : OnSetCursor ( CWnd * pWnd , UINT nHitTest , UINT message )
{
if ( m_currentEditor )
return m_currentEditor - > OnSetCursor ( pWnd , nHitTest , message ) ;
return TRUE ;
}
BOOL CItemCurveEdit : : OnKeyDown ( UINT nChar , UINT nRepCnt , UINT nFlags )
{
if ( m_currentEditor )
return m_currentEditor - > OnKeyDown ( nChar , nRepCnt , nFlags ) ;
return FALSE ;
}
BOOL CItemCurveEdit : : OnKeyUp ( UINT nChar , UINT nRepCnt , UINT nFlags )
{
if ( m_currentEditor )
return m_currentEditor - > OnKeyUp ( nChar , nRepCnt , nFlags ) ;
return FALSE ;
}
int CItemCurveEdit : : GetSubMenu ( )
{
if ( m_currentEditor )
return m_currentEditor - > GetSubMenu ( ) ;
return 6 ;
}
void CItemCurveEdit : : SetPos ( POSITION pos )
{
CItem : : SetPos ( pos ) ;
if ( m_currentEditor )
m_currentEditor - > SetPos ( pos ) ;
}
void CItemCurveEdit : : Clear ( void )
{
if ( m_currentEditor )
m_currentEditor - > Clear ( ) ;
}
void CItemCurveEdit : : Draw ( CDC * pDC )
{
if ( m_currentEditor )
m_currentEditor - > Draw ( pDC ) ;
}
void CItemCurveEdit : : DrawAssistant ( CDC * pDC , int mouseX , int mouseY )
{
if ( m_currentEditor )
m_currentEditor - > DrawAssistant ( pDC , mouseX , mouseY ) ;
}
int CItemCurveEdit : : GetNumberOfNode ( )
{
if ( m_currentEditor )
return m_currentEditor - > GetNumberOfNode ( ) ;
return - 1 ;
}
void CItemCurveEdit : : EreaseHandles ( CDC * pDC )
{
if ( m_currentEditor )
m_currentEditor - > EreaseHandles ( pDC ) ;
}
void CItemCurveEdit : : EndEdit ( void )
{
if ( m_currentEditor )
m_currentEditor - > EndEdit ( ) ;
}
void CItemCurveEdit : : CancelAll ( void )
{
if ( m_currentEditor )
m_currentEditor - > CancelAll ( ) ;
}
BOOL CItemCurveEdit : : IsCanCancelAll ( void )
{
if ( m_currentEditor )
return m_currentEditor - > IsCanCancelAll ( ) ;
return FALSE ;
}
int CItemCurveEdit : : HitTestHandle ( CPoint point )
{
if ( m_currentEditor )
return m_currentEditor - > HitTestHandle ( point ) ;
return - 1 ;
}
void CItemCurveEdit : : DeleteHandle ( int nIndex )
{
if ( m_currentEditor )
m_currentEditor - > DeleteHandle ( nIndex ) ;
}
int CItemCurveEdit : : AddHandle ( CPoint point )
{
if ( m_currentEditor )
return m_currentEditor - > AddHandle ( point ) ;
return - 1 ;
}
CCurveEx * CItemCurveEdit : : GetCurCurve ( void )
{
if ( m_currentEditor )
return m_currentEditor - > GetControlCurve ( ) ;
return nullptr ;
}
void CItemCurveEdit : : AttachProcess ( CPointList & oldPoints , CPointList & newPoints )
{
if ( m_currentEditor )
m_currentEditor - > AttachProcess ( oldPoints , newPoints ) ;
}
void CItemCurveEdit : : DrawMoveLine ( void )
{
if ( m_currentEditor )
m_currentEditor - > DrawMoveLine ( ) ;
}
void CItemCurveEdit : : GetMarkCurve ( void )
{
if ( m_currentEditor )
m_currentEditor - > GetMarkCurve ( ) ;
}
BOOL CItemCurveEdit : : IsCanAddHandle ( CPoint point , double * pl0 )
{
if ( m_currentEditor )
return m_currentEditor - > IsCanAddHandle ( point , pl0 ) ;
return FALSE ;
}
void CItemCurveEdit : : GetXY ( CCurveEx * pValue , int nIndex , dfPoint & point )
{
if ( m_currentEditor )
return m_currentEditor - > GetXY ( pValue , nIndex , point ) ;
}
CPoint2D CItemCurveEdit : : GetCDown ( ) const
{
if ( m_currentEditor )
return m_currentEditor - > GetCDown ( ) ;
return CPoint2D { 0.0 , 0.0 } ;
}
CPoint2D CItemCurveEdit : : GetCLast ( ) const
{
if ( m_currentEditor )
return m_currentEditor - > GetCDown ( ) ;
return CPoint2D { 0.0 , 0.0 } ;
}
} //namespace