You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/Module/GeoSigmaDraw/ItemSelectElement.cpp

296 lines
5.7 KiB
C++

#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 && nIndex<SelectList.GetCount());
POSITION pos=SelectList.FindIndex(nIndex);
if(pos==NULL) return;
SelectList.RemoveAt(pos);
}
void CItemSelectElement::SetNumber(int nNum)
{
num=nNum;
}
int CItemSelectElement::GetSelectCount(void)
{
return (int)SelectList.GetCount();
}
void CItemSelectElement::OnLButtonDown(CDC* pDC, UINT nFlags, CPoint point, int vk)
{
GetDC()->Create(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;
}