www.pudn.com > drawpad.zip > DrawPadDoc.cpp


// DrawPadDoc.cpp : implementation of the CDrawPadDoc class 
// 
 
#include "stdafx.h" 
#include "DrawPad.h" 
 
#include "DrawPadDoc.h" 
#include "DrawPadView.h" 
#include "pickevent.h" 
#include "entity.h" 
#include "eselection.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawPadDoc 
 
IMPLEMENT_DYNCREATE(CDrawPadDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CDrawPadDoc, CDocument) 
	//{{AFX_MSG_MAP(CDrawPadDoc) 
	ON_COMMAND(ID_COLOR, OnColor) 
	ON_COMMAND(ID_C_BLUE, OnCBlue) 
	ON_UPDATE_COMMAND_UI(ID_C_BLUE, OnUpdateCBlue) 
	ON_COMMAND(ID_C_GREEN, OnCGreen) 
	ON_UPDATE_COMMAND_UI(ID_C_GREEN, OnUpdateCGreen) 
	ON_COMMAND(ID_C_RED, OnCRed) 
	ON_UPDATE_COMMAND_UI(ID_C_RED, OnUpdateCRed) 
	ON_COMMAND(ID_C_YELLOW, OnCYellow) 
	ON_UPDATE_COMMAND_UI(ID_C_YELLOW, OnUpdateCYellow) 
	ON_COMMAND(ID_LINE_1, OnLine1) 
	ON_UPDATE_COMMAND_UI(ID_LINE_1, OnUpdateLine1) 
	ON_COMMAND(ID_LINE_2, OnLine2) 
	ON_UPDATE_COMMAND_UI(ID_LINE_2, OnUpdateLine2) 
	ON_COMMAND(ID_LINE_3, OnLine3) 
	ON_UPDATE_COMMAND_UI(ID_LINE_3, OnUpdateLine3) 
	ON_COMMAND(ID_EDIT_REDO, OnEditRedo) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo) 
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo) 
	ON_COMMAND(ID_PS_DASH, OnPsDash) 
	ON_UPDATE_COMMAND_UI(ID_PS_DASH, OnUpdatePsDash) 
	ON_COMMAND(ID_PS_DASHDOT, OnPsDashdot) 
	ON_UPDATE_COMMAND_UI(ID_PS_DASHDOT, OnUpdatePsDashdot) 
	ON_COMMAND(ID_PS_DASHDOTDOT, OnPsDashdotdot) 
	ON_UPDATE_COMMAND_UI(ID_PS_DASHDOTDOT, OnUpdatePsDashdotdot) 
	ON_COMMAND(ID_PS_DOT, OnPsDot) 
	ON_UPDATE_COMMAND_UI(ID_PS_DOT, OnUpdatePsDot) 
	ON_COMMAND(ID_PS_SOLID, OnPsSolid) 
	ON_UPDATE_COMMAND_UI(ID_PS_SOLID, OnUpdatePsSolid) 
	ON_COMMAND(ID_HS_BDIAGONAL, OnHsBdiagonal) 
	ON_UPDATE_COMMAND_UI(ID_HS_BDIAGONAL, OnUpdateHsBdiagonal) 
	ON_COMMAND(ID_HS_CROSS, OnHsCross) 
	ON_UPDATE_COMMAND_UI(ID_HS_CROSS, OnUpdateHsCross) 
	ON_COMMAND(ID_HS_DIAGCROSS, OnHsDiagcross) 
	ON_UPDATE_COMMAND_UI(ID_HS_DIAGCROSS, OnUpdateHsDiagcross) 
	ON_COMMAND(ID_HS_FDIAGONAL, OnHsFdiagonal) 
	ON_UPDATE_COMMAND_UI(ID_HS_FDIAGONAL, OnUpdateHsFdiagonal) 
	ON_COMMAND(ID_HS_HORIZONTAL, OnHsHorizontal) 
	ON_UPDATE_COMMAND_UI(ID_HS_HORIZONTAL, OnUpdateHsHorizontal) 
	ON_COMMAND(ID_HS_SOLID, OnHsSolid) 
	ON_UPDATE_COMMAND_UI(ID_HS_SOLID, OnUpdateHsSolid) 
	ON_COMMAND(ID_HS_VERTICAL, OnHsVertical) 
	ON_UPDATE_COMMAND_UI(ID_HS_VERTICAL, OnUpdateHsVertical) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawPadDoc construction/destruction 
 
CDrawPadDoc::CDrawPadDoc() 
{ 
	// TODO: add one-time construction code here 
	m_nColor = RGB(0,192,192); 
	m_nWidth = 1; 
	UndoNestLevel = 0; 
	m_line=PS_SOLID; 
	m_brush=HS_SOLID; 
	m_String=""; 
//	m_Font={-12,8,0,0,0,0,0,0,0,0,0,0,0,"Arial"} 
} 
 
CDrawPadDoc::~CDrawPadDoc() 
{ 
	for( POSITION pos = entities.GetHeadPosition(); pos != NULL; ) { 
		delete entities.GetNext(pos); 
	} 
} 
 
BOOL CDrawPadDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
 
	return TRUE; 
} 
int CDrawPadDoc::Insert(ENTITY *ent) 
{ 
	if( !ent || entities.Find(ent) ) return FALSE; 
	entities.AddTail(ent); 
    ent->SetDocument(this); 
    DrawEntity(ent, DRAWNORM); 
    SetModifiedFlag(); 
	return TRUE; 
} 
int CDrawPadDoc::Remove(ENTITY *ent) 
{ 
	POSITION pos; 
	if( !ent || (pos = entities.Find(ent)) == NULL ) return FALSE; 
	DrawEntity(ent, DRAWDEL); 
	entities.RemoveAt(pos); 
	SetModifiedFlag(); 
	return TRUE; 
} 
 
void CDrawPadDoc::AddEntity(ENTITY *ent) 
{ 
/*	((ENTITY*)object)->set_line_width(m_nWidth); 
	((ENTITY*)object)->set_color(m_nColor); 
	entities.Add((CObject *)object);*/ 
/*	entities.AddTail(ent); 
	DrawEntity(ent, DRAWNORM);*/ 
	if( Insert(ent) ) 
		undoBuf.insertObject(ent); 
	 
} 
void CDrawPadDoc::RemoveEntity(ENTITY *ent) 
{ 
	if( Remove(ent) ) 
		undoBuf.deleteObject(ent); 
} 
 
void CDrawPadDoc::Draw(CDC *pDC) 
{ 
/*	for( int i = 0; i < entities.GetSize(); i ++ ) 
	{ 
		((ENTITY *)entities[i])->Draw(pDC, DRAWNORM); 
		 
	}*/ 
	for( POSITION pos = entities.GetHeadPosition(); pos != NULL; ) { 
		ENTITY *ent = (ENTITY *)entities.GetNext(pos); 
		ent->Draw(pDC, DRAWNORM); 
	} 
} 
 
void CDrawPadDoc::DrawEntity(ENTITY * ent, int method) 
{ 
	for( POSITION pos = GetFirstViewPosition(); pos != NULL; ) { 
		CDrawPadView *view = (CDrawPadView *)GetNextView(pos); 
		ASSERT(view->IsKindOf(RUNTIME_CLASS(CDrawPadView))); 
		view->DrawEntity(ent, method); 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawPadDoc serialization 
int CDrawPadDoc::PickEntity(const PICK_EVENT &pe, ENTITY *&ent) 
{ 
	ent = NULL; 
	int success = 0; 
	for( POSITION pos = entities.GetHeadPosition(); pos != NULL; ) { 
		ENTITY *anent = (ENTITY *)entities.GetNext(pos); 
		if( anent->HitTest(0, pe) ) { 
			success = 1; 
			ent = anent; 
			break; 
		} 
	} 
	return success; 
} 
 
void CDrawPadDoc::Serialize(CArchive& ar) 
{ 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here 
		ar << entities.GetCount(); 
		for( POSITION pos = entities.GetHeadPosition(); pos != NULL; ) { 
			ENTITY *ent = (ENTITY *)entities.GetNext(pos); 
			ar << ent; 
		} 
	} 
	else 
	{ 
		// TODO: add loading code here 
		int count; 
		ar >> count; 
		for( ; count > 0; count -- ) { 
			ENTITY *ent = NULL; 
			ar >> ent; 
			AddEntity(ent); 
		} 
 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawPadDoc diagnostics 
 
#ifdef _DEBUG 
void CDrawPadDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CDrawPadDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
CDrawPadDoc *CDrawPadDoc::CurrentDoc() 
{ 
	CDrawPadView *view = CDrawPadView::CurrentView(); 
	if( !view ) return 0; 
	return view->GetDocument(); 
} 
void CDrawPadDoc::ClearSelection() 
{ 
	for( POSITION pos = GetFirstViewPosition(); pos != NULL; ) { 
		CDrawPadView *view = (CDrawPadView *)GetNextView(pos); 
		view->GetSelection()->Clear(TRUE); 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawPadDoc commands 
 
void CDrawPadDoc::OnColor()  
{ 
	// TODO: Add your command handler code here 
	CColorDialog dlg; 
	int answer = dlg.DoModal(); 
	if (answer == IDOK) 
	{ 
		m_nColor = dlg.GetColor(); 
	} 
} 
 
 
void CDrawPadDoc::OnCBlue()  
{ 
	// TODO: Add your command handler code here 
	m_nColor=RGB(0,0,255); 
} 
 
void CDrawPadDoc::OnUpdateCBlue(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_nColor==RGB(0,0,255)?TRUE:FALSE); 
} 
 
void CDrawPadDoc::OnCGreen()  
{ 
	// TODO: Add your command handler code here 
	m_nColor=RGB(0,255,0); 
} 
 
void CDrawPadDoc::OnUpdateCGreen(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_nColor==RGB(0,255,0)?TRUE:FALSE);	 
} 
 
void CDrawPadDoc::OnCRed()  
{ 
	// TODO: Add your command handler code here 
	m_nColor=RGB(255,0,0); 
} 
 
void CDrawPadDoc::OnUpdateCRed(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_nColor==RGB(255,0,0)?TRUE:FALSE);	 
} 
 
void CDrawPadDoc::OnCYellow()  
{ 
	// TODO: Add your command handler code here 
	m_nColor=RGB(255,255,0); 
} 
 
void CDrawPadDoc::OnUpdateCYellow(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_nColor==RGB(255,255,0)?TRUE:FALSE);	 
} 
 
void CDrawPadDoc::OnLine1()  
{ 
	// TODO: Add your command handler code here 
	m_nWidth=1; 
} 
 
void CDrawPadDoc::OnUpdateLine1(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_nWidth==1?TRUE:FALSE);		 
} 
 
void CDrawPadDoc::OnLine2()  
{ 
	// TODO: Add your command handler code here 
	m_nWidth=2;	 
} 
 
void CDrawPadDoc::OnUpdateLine2(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_nWidth==2?TRUE:FALSE);			 
} 
 
void CDrawPadDoc::OnLine3()  
{ 
	// TODO: Add your command handler code here 
	m_nWidth=3;	 
} 
 
void CDrawPadDoc::OnUpdateLine3(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_nWidth==3?TRUE:FALSE);			 
} 
 
 
void CDrawPadDoc::OnEditRedo()  
{ 
	// TODO: Add your command handler code here 
	if( !redoBuf.readyUndo() ) return ; 
	ClearSelection(); 
	undoBuf.startRecord(); 
	EventItem *event; 
	if( RBD_DRIVER::CurrentRBD ) 
		RBD_DRIVER::CurrentRBD->Stop(); 
	while( (event = redoBuf.popEventItem()) != NULL ) { 
		switch (event->type) { 
		case EventItem::INSOBJ: 
			RemoveEntity((ENTITY *)event->obj); 
			break; 
		case EventItem::MODOBJ: 
			undoBuf.modifyObject(event->obj); 
			DrawEntity((ENTITY *)event->obj, DRAWDEL); 
			event->obj->CopyData(event->clone); 
			DrawEntity((ENTITY *)event->obj, DRAWAUTO); 
			delete event->clone; 
			break; 
		case EventItem::DELOBJ: 
			AddEntity((ENTITY *)event->obj); 
			break; 
		} 
		delete event; 
	} 
	if( RBD_DRIVER::CurrentRBD ) 
//		RBD_DRIVER::CurrentRBD->Start(); 
	redoBuf.popEventGroup();	 
} 
 
void CDrawPadDoc::OnUpdateEditRedo(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(redoBuf.readyUndo()); 
	 
} 
 
void CDrawPadDoc::OnEditUndo()  
{ 
	// TODO: Add your command handler code here 
	if ( !undoBuf.readyUndo() ) return ; 
	ClearSelection(); 
	undoBuf.stopRecord(); 
	redoBuf.startRecord(); 
	EventItem *event; 
	if( RBD_DRIVER::CurrentRBD ) 
		RBD_DRIVER::CurrentRBD->Stop(); 
	while( (event = undoBuf.popEventItem()) != NULL ) { 
		switch (event->type) { 
		case EventItem::INSOBJ: 
			redoBuf.deleteObject(event->obj); 
			RemoveEntity((ENTITY *)event->obj); 
			break; 
		case EventItem::MODOBJ: 
			redoBuf.modifyObject(event->obj); 
			DrawEntity((ENTITY *)event->obj, DRAWDEL); 
			event->obj->CopyData(event->clone); 
			delete event->clone; 
			DrawEntity((ENTITY *)event->obj, DRAWAUTO); 
			break; 
		case EventItem::DELOBJ: 
			redoBuf.insertObject(event->obj); 
			AddEntity((ENTITY *)event->obj); 
			break; 
		} 
		delete event; 
	} 
	if( RBD_DRIVER::CurrentRBD ) 
//		RBD_DRIVER::CurrentRBD->Start(); 
	undoBuf.popEventGroup();	 
} 
 
void CDrawPadDoc::OnUpdateEditUndo(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(undoBuf.readyUndo()); 
	 
} 
 
void CDrawPadDoc::OnPsDash()  
{ 
	// TODO: Add your command handler code here 
	m_line=PS_DASH; 
} 
 
void CDrawPadDoc::OnUpdatePsDash(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_line==PS_DASH?TRUE:FALSE);			 
} 
 
void CDrawPadDoc::OnPsDashdot()  
{ 
	// TODO: Add your command handler code here 
	m_line=PS_DASHDOT;	 
} 
 
void CDrawPadDoc::OnUpdatePsDashdot(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_line==PS_DASHDOT?TRUE:FALSE);				 
} 
 
void CDrawPadDoc::OnPsDashdotdot()  
{ 
	// TODO: Add your command handler code here 
	m_line=PS_DASHDOTDOT;	 
} 
 
void CDrawPadDoc::OnUpdatePsDashdotdot(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_line==PS_DASHDOTDOT?TRUE:FALSE);				 
} 
 
void CDrawPadDoc::OnPsDot()  
{ 
	// TODO: Add your command handler code here 
	m_line=PS_DOT;	 
} 
 
void CDrawPadDoc::OnUpdatePsDot(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_line==PS_DOT?TRUE:FALSE);				 
} 
 
void CDrawPadDoc::OnPsSolid()  
{ 
	// TODO: Add your command handler code here 
	m_line=PS_SOLID;	 
} 
 
void CDrawPadDoc::OnUpdatePsSolid(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_line==PS_SOLID?TRUE:FALSE);				 
} 
 
void CDrawPadDoc::OnHsBdiagonal()  
{ 
	// TODO: Add your command handler code here 
	m_brush=HS_BDIAGONAL; 
} 
 
void CDrawPadDoc::OnUpdateHsBdiagonal(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_brush==HS_BDIAGONAL?TRUE:FALSE);					 
} 
 
void CDrawPadDoc::OnHsCross()  
{ 
	// TODO: Add your command handler code here 
	m_brush=HS_CROSS;	 
} 
 
void CDrawPadDoc::OnUpdateHsCross(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_brush==HS_CROSS?TRUE:FALSE);						 
} 
 
void CDrawPadDoc::OnHsDiagcross()  
{ 
	// TODO: Add your command handler code here 
	m_brush=HS_DIAGCROSS;	 
} 
 
void CDrawPadDoc::OnUpdateHsDiagcross(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_brush==HS_DIAGCROSS?TRUE:FALSE);						 
} 
 
void CDrawPadDoc::OnHsFdiagonal()  
{ 
	// TODO: Add your command handler code here 
	m_brush=HS_FDIAGONAL;	 
} 
 
void CDrawPadDoc::OnUpdateHsFdiagonal(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_brush==HS_FDIAGONAL?TRUE:FALSE);						 
} 
 
void CDrawPadDoc::OnHsHorizontal()  
{ 
	// TODO: Add your command handler code here 
	m_brush=HS_HORIZONTAL;	 
} 
 
void CDrawPadDoc::OnUpdateHsHorizontal(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_brush==HS_HORIZONTAL?TRUE:FALSE);						 
} 
 
void CDrawPadDoc::OnHsSolid()  
{ 
	// TODO: Add your command handler code here 
	m_brush=HS_SOLID;	 
} 
 
void CDrawPadDoc::OnUpdateHsSolid(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_brush==HS_SOLID?TRUE:FALSE);						 
} 
 
void CDrawPadDoc::OnHsVertical()  
{ 
	// TODO: Add your command handler code here 
	m_brush=HS_VERTICAL;	 
} 
 
void CDrawPadDoc::OnUpdateHsVertical(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_brush==HS_VERTICAL?TRUE:FALSE);						 
}