#include "StdAfx.h" #include "itemselectelement.h" #include "SigmaDoc.h" CItemSelectElement::CItemSelectElement(CSigmaDoc * ppDoc) : CItem(ppDoc) , num(1) , m_nCompareIdea(0) , m_SelectType(0) , m_SelectID(0) , m_countSelected(0) { m_bRedraw=TRUE; this->SetType(ITEM_SELECT_ELEMENT); } CItemSelectElement::~CItemSelectElement(void) { RemoveAllSelect(); } void CItemSelectElement::InvalidateSelect(void) { if(SelectList.IsEmpty()) return; SELECT_ITEM item; POSITION pos=SelectList.GetHeadPosition(); while(pos) { item=SelectList.GetNext(pos); // 指针是否有效 if(!::AfxIsValidAddress(item.pos,sizeof(POSITION))) continue; //GetDoc()->Invalidate(item.pos); if(m_pDoc) m_pDoc->Invalidate(item.pos); } } void CItemSelectElement::RemoveAllSelect() { if(m_bRedraw) InvalidateSelect(); if(!SelectList.IsEmpty()) SelectList.RemoveAll(); if(!RedoList.IsEmpty()) RedoList.RemoveAll(); } void CItemSelectElement::OnDraw(CXyDC* pDC) { SELECT_ITEM item; POSITION p=SelectList.GetHeadPosition(); while(p) { item=SelectList.GetNext(p); DrawSelectItem(item.pos); DrawSelectItem(item); } } void CItemSelectElement::OnDraw(CXyDC* pXyDC, CDC* pDC) { this->OnDraw(pXyDC); } BOOL CItemSelectElement::DoSelectEnd(void) { RemoveAllSelect(); return TRUE; } void CItemSelectElement::DrawSelectItem(SELECT_ITEM& item) { } void CItemSelectElement::DrawSelectItem(POSITION pos) { if(!m_bRedraw) return; if(pos==NULL) return; COne* pOne=(COne*)GetDoc()->GetDraw()->GetAt(pos); CRect8 range=pOne->GetRect(); CRect rt=GetDC()->GetScreen(range); GetDoc()->m_itemTracker.SetRect(rt); GetDoc()->m_itemTracker.DrawHandle(GetDC()->GetDC(),TRACKER_NO_EDIT); } BOOL CItemSelectElement::IsMoveSelect(void) { //return GetDoc()->IsMoveSelect(); 函数中就一句代码。就是下面这一行代码。 //return ::GetPreferences().WorkaroundDisplay.m_bMoveSelect; return TRUE; } BOOL NItem::CItemSelectElement::IsElementType(POSITION pos, int type) { int typeEle = GetDoc()->GetDraw()->GetElementType(pos); if(typeEle != type) return FALSE; return TRUE; } BOOL CItemSelectElement::IsSelectItem(POSITION pos) { ASSERT(pos); if(pos==NULL) return FALSE; int type=m_SelectType; UINT nTypeID=m_SelectID; if(type!=0 && !IsElementType(pos, type)) { //TODO:AfxMessageBox ::AfxMessageBox(nTypeID); return FALSE; } return IsCanSelected(pos); } BOOL CItemSelectElement::IsCanSelected(POSITION pos) { if(SelectList.GetCount()==0) return TRUE; POSITION p; SELECT_ITEM item; switch(m_nCompareIdea) { case 0://仅与首尾元素相比较 item=SelectList.GetTail(); if(item.pos==pos) { //if(AfxMessageBox(IDS_STRING_SOLID_SAME_1)) return FALSE; } item=SelectList.GetHead(); if(item.pos==pos) { //if(AfxMessageBox(IDS_STRING_SOLID_SAME_2)) return FALSE; } break; case 1://与所有无素相比较 p=SelectList.GetHeadPosition(); while(p) { item=SelectList.GetNext(p); if(item.pos==pos) { //if(AfxMessageBox(IDS_STRING_SELECT_AGAIN,MB_YESNO|MB_ICONQUESTION)!=IDYES) return FALSE; //else break; } } break; default: break; } return TRUE; } BOOL CItemSelectElement::IsCanRedo(void) { return (RedoList.GetCount()>0)?TRUE:FALSE; } BOOL CItemSelectElement::IsCanUndo(void) { return (SelectList.GetCount()>0)?TRUE:FALSE; } POSITION CItemSelectElement::GetSelectItem(int nIndex) { POSITION pos=SelectList.FindIndex(nIndex); if(pos==NULL) return NULL; SELECT_ITEM item=SelectList.GetAt(pos); return item.pos; } void CItemSelectElement::RemoveAt(int nIndex) { if(SelectList.GetCount()==0) return; ASSERT(nIndex>=0 && nIndexCreate(pDC); CPoint2D rp=GetDC()->GetReal(point); POSITION pos=NULL; //if(IsMoveSelect() && GetDoc()->MoveSelect!=NULL) // pos=GetDoc()->MoveSelect; //else pos=GetDoc()->GetSelectedItem(rp); if(pos==NULL) { //::AfxMessageBox(IDS_STRING_NOT_ELEMENT); return; } else if(IsSelectItem(pos)) { if(SelectItem(pos,rp)) { RedoList.RemoveAll(); Select(pos,rp); m_countSelected = SelectList.GetCount(); if(SelectList.GetCount()==num) { DoSelectEnd(); } } } } BOOL CItemSelectElement::SelectItem(POSITION pos,CPoint2D point) { return TRUE; } int CItemSelectElement::OnMouseMove(CDC* pDC, UINT nFlags, CPoint point) { CPoint2D rp=GetDC()->GetReal(point); //if(IsMoveSelect()) // GetView()->DrawMoveSelectItem(rp); return 1; } BOOL CItemSelectElement::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { //GetDoc()->GetCursor().SetCursor(CursorSelectItem); //return GetDoc()->GetCursor().SetCursor(); return TRUE; } BOOL CItemSelectElement::Select(POSITION pos, CPoint2D point) { DrawSelectItem(pos); SELECT_ITEM item; item.pos=pos; item.point=point; SelectList.AddTail(item); DrawSelectItem(item); return TRUE; } void CItemSelectElement::Redo(void) { SELECT_ITEM item; item=RedoList.RemoveHead(); if(!IsSelectItem(item.pos))return; if(SelectItem(item.pos,item.point)) Select(item.pos,item.point); } void CItemSelectElement::Undo(void) { SELECT_ITEM item=SelectList.RemoveTail(); RedoList.AddHead(item); GetDoc()->Invalidate(item.pos); } void CItemSelectElement::SetSelectInfo(int nType,UINT nInfoID) { m_SelectType=nType; m_SelectID=nInfoID; } void CItemSelectElement::SetCompareIdea(int nIdea) { m_nCompareIdea=nIdea; } void NItem::CItemSelectElement::EnableDraw(BOOL bEnable) { m_bRedraw=bEnable; } int NItem::CItemSelectElement::GetCountSelected() { return m_countSelected; }