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.
296 lines
5.7 KiB
C++
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;
|
|
} |