?? diagramentitycontainer.cpp
字號:
/* ==========================================================================
Class : CDiagramEntityContainer
Author : Johan Rosengren, Abstrakt Mekanik AB
Date : 2004-03-29
Purpose : "CDiagramEntityContainer" contains the data for a
"CDiagramEditor". It manages mass operations such as
copying, pasting and undo. It is completely separated
from "CDiagramEditor" to allow the package to be used
in a doc/view app. This is also the reason why some
functionality is accessible in both this class and 飊
"CDiagramEditor".
Description : The class contains a "CObArray" with the instances of
"CDiagramEntity"-derived classes that is the current data
for an editor. It also contains a pointer to a
"CDiagramClipboardHandler"-instance that works as the
'clipboard' for an editor. Furthermore, It contains an
"CObArray" of "CObArray"s that is the undo stack.
The Undo-functionality is implemented as a simple FILO-stack
of "CObArray" pointers. Before any change that should be
undoable, "Snapshot" is called to add new entries to
the Undo-stack. This is normally managed by the editor,
and need only be done manually for added functionality.
Note that the "CDiagramEntityContainer" should normally
not call "Snapshot" itself - in the case of, for example,
additions to "m_objs", the container can not and should
not know if it is an undoable operation.
Usage : Normally, this class need not be derived from. A
"CDiagramEditor" needs an instance of
"CDiagramEntityContainer" to hold the object data. This
instance can either be external, as for a doc/view app
where the container belongs to the document, or
internal, as for a dialog application where the editor
will manage all of the data. In the first case, a
"CDiagramEntityContainer" member should be declared in
the document class, and a pointer to it submitted to
the "Create"-call of the "CDiagramEditor" (or by calling
"CDiagramEditor::SetCDiagramEntityContainer"). In the
second case, nothing special need to be done - the
"CDiagramEntityContainer" will be created during the
"CDiagramEditor::Create" call automatically if no pointer
is submitted.
The container is not using the Windows clipboard
(because of instantiation questions on derived
entities), but rather an external clipboard handler
derived from "CDiagramClipboardHandler". This handler is
set calling "SetClipboardHandler", and several containers
can share the same handler. If no clipboard handler is
set, a default internal one will be used.
"CDiagramEntityContainer" manages all data internally,
all internal objects are deleted in the class "dtor".
========================================================================
Changes : 19/4 2004 Made RemoveAt virtual.
20/4 2004 Made several Undo- and Copy/Paste functions
virtual. Added array accessors for derived
classes. Moved the member function Find to
protected.
30/4 2004 Copy/paste-handling removed to a separate
class to allow several containers to share
the same clipboard.
30/4 2004 Changed c-style casts to static_cast
========================================================================
20/5 2004 Made GetAt virtual
30/5 2004 RemoveAll, added check to see if there are
any items in the object array.
30/5 2004 Made RemoveAll access data container objects
directly, to avoid chained deletes in
derived classes.
========================================================================
26/6 2004 Added group handling (Unruled Boy).
3/7 2004 Made Add and Remove virtual
3/7 2004 Added a GetSelectCount
========================================================================
4/8 2004 Added SelectAll and UnselectAll
========================================================================
11/12 2004 Made UnselectAll virtual (Grisha Vinevich)
========================================================================
22/1 2005 Added PopUndo function to pop the latest
undo item from the stack
Made IsUndoPossible const.
========================================================================*/
#include "stdafx.h"
#include "DiagramEntityContainer.h"
#include "DiagramEntity.h"
#include "Tokenizer.h"
#include "GroupFactory.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma warning( disable : 4706 )
/////////////////////////////////////////////////////////////////////////////
// CDiagramEntityContainer construction/destruction/initialization
CDiagramEntityContainer::CDiagramEntityContainer( CDiagramClipboardHandler* clip )
/* ============================================================
Function : CDiagramEntityContainer::CDiagramEntityContainer
Description : Constructor
Access : Public
Return : void
Parameters : none
Usage :
============================================================*/
{
m_clip = clip;
SetUndoStackSize( 0 );
Clear();
SetVirtualSize( CSize( 0, 0 ) );
}
CDiagramEntityContainer::~CDiagramEntityContainer()
/* ============================================================
Function : CDiagramEntityContainer::~CDiagramEntityContainer
Description : Destructor
Access : Public
Return : void
Parameters : none
Usage :
============================================================*/
{
Clear();
}
void CDiagramEntityContainer::Clear()
/* ============================================================
Function : CDiagramEntityContainer::Clear
Description : Removes all data from the data and undo.
Access : Public
Return : void
Parameters : none
Usage : Call to remove data from the container. The
Paste-array will be kept.
============================================================*/
{
RemoveAll();
ClearUndo();
SetModified( FALSE );
}
CString CDiagramEntityContainer::GetString() const
/* ============================================================
Function : CDiagramEntityContainer::GetString
Description : Returns a string representation of the
virtual paper size
Access : Public
Return : CString - Resulting string
Parameters : none
Usage : Call to get a string representing the paper
size of the container. The format is
"paper:x,y;" where "x" and "y" are the
horisontal and vertical sizes.
============================================================*/
{
CString str;
str.Format( _T( "paper:%i,%i;" ), GetVirtualSize().cx, GetVirtualSize().cy );
return str;
}
BOOL CDiagramEntityContainer::FromString( const CString& str )
/* ============================================================
Function : CDiagramEntityContainer::FromString
Description : Sets the virtual paper size from a string.
Access : Public
Return : BOOL - "TRUE" if the string
represented a
paper.
Parameters : const CString& str - The string
representation.
Usage : Call to set the paper size of the container
from a string. The format is "paper:x,y;"
where "x" and "y" are the horisontal and
vertical sizes.
============================================================*/
{
BOOL result = FALSE;
CTokenizer main( str, _T( ":" ) );
CString header;
CString data;
if( main.GetSize() == 2 )
{
main.GetAt( 0, header );
main.GetAt( 1, data );
header.TrimLeft();
header.TrimRight();
data.TrimLeft();
data.TrimRight();
if( header == _T( "paper" ) )
{
CTokenizer tok( data.Left( data.GetLength() - 1 ) );
int size = tok.GetSize();
if( size == 2 )
{
int right;
int bottom;
tok.GetAt(0, right );
tok.GetAt(1, bottom );
SetVirtualSize( CSize( right, bottom ) );
result = TRUE;
}
}
}
return result;
}
void CDiagramEntityContainer::Export( CStringArray& stra, UINT format ) const
/* ============================================================
Function : CDiagramEntityContainer::Export
Description : Exports all objects to format format.
Access : Public
Return : void
Parameters : CStringArray& stra - "CStingArray" that
will be filled with
data on return.
UINT format - Format to save to.
Usage : Call to export the contents of the container
to a "CStringArray". "Export" will - of course -
have to be defined for the derived objects.
============================================================*/
{
int max = GetSize();
for( int t = 0 ; t < max ; t++ )
{
CDiagramEntity* obj = GetAt( t );
stra.Add( obj->Export( format ) );
}
}
/////////////////////////////////////////////////////////////////////////////
// CDiagramEntityContainer data access
int CDiagramEntityContainer::GetSize() const
/* ============================================================
Function : CDiagramEntityContainer::GetSize
Description : Returns the number of objects in the data
container.
Access : Public
Return : int - The number of objects.
Parameters : none
Usage : Call to get the number of objects currently
in the data array of the container.
============================================================*/
{
return m_objs.GetSize();
}
void CDiagramEntityContainer::Add( CDiagramEntity* obj )
/* ============================================================
Function : CDiagramEntityContainer::Add
Description : Add an object to the data.
Access : Public
Return : void
Parameters : CDiagramEntity* obj - The object to add.
Usage : Call to add a new object to the container.
============================================================*/
{
obj->SetParent( this );
m_objs.Add( obj );
SetModified( TRUE );
}
CDiagramEntity* CDiagramEntityContainer::GetAt( int index ) const
/* ============================================================
Function : CDiagramEntityContainer::GetAt
Description : Gets the object at position "index".
Access : Public
Return : CDiagramEntity* - The object or "NULL" if
out of range.
Parameters : int index - The index to get data
from
Usage : Call to get a specific object from the
container.
============================================================*/
{
CDiagramEntity* result = NULL;
if( index < m_objs.GetSize() && index >= 0 )
result = static_cast< CDiagramEntity* >( m_objs.GetAt( index ) );
return result;
}
void CDiagramEntityContainer::SetAt( int index, CDiagramEntity* obj )
/* ============================================================
Function : CDiagramEntityContainer::SetAt
Description : Sets an object at position "index".
Access : Public
Return : void
Parameters : int index - Index to set data
at.
CDiagramEntity* obj - Object to set.
Usage : Internal function. Used by "Swap".
============================================================*/
{
m_objs.SetAt( index, obj );
SetModified( TRUE );
}
void CDiagramEntityContainer::RemoveAt( int index )
/* ============================================================
Function : CDiagramEntityContainer::RemoveAt
Description : Removes the object at index.
Access : Public
Return : void
Parameters : int index - The index of the object
to remove.
Usage : Call to remove a specific object. Memory is
freed.
============================================================*/
{
CDiagramEntity* obj = GetAt( index );
if( obj )
{
delete obj;
m_objs.RemoveAt( index );
SetModified( TRUE );
}
}
void CDiagramEntityContainer::RemoveAll()
/* ============================================================
Function : CDiagramEntityContainer::RemoveAll
Description : Removes all data objects
Access : Public
Return : void
Parameters : none
Usage : Call to remove all data objects in the
container. Undo- and paste arrays are not
emptied.
Allocated memory is released. Undo and
paste not deleted.
============================================================*/
{
int max = m_objs.GetSize();
if( max )
{
for( int t = 0 ; t < max ; t++ )
{
CDiagramEntity* obj = static_cast< CDiagramEntity* >( m_objs.GetAt( t ) );
delete obj;
}
m_objs.RemoveAll();
SetModified( TRUE );
}
}
void CDiagramEntityContainer::RemoveAllSelected()
/* ============================================================
Function : CDiagramEntityContainer::RemoveAllSelected
Description : Removes all selected objects
Access : Public
Return : void
Parameters : none
Usage : Call to remove all selected objects from the
container. Releases allocated data
============================================================*/
{
int max = m_objs.GetSize() - 1;
for( int t = max ; t >= 0 ; t-- )
if( GetAt( t )->IsSelected() )
RemoveAt( t );
}
/////////////////////////////////////////////////////////////////////////////
// CDiagramEntityContainer property access
void CDiagramEntityContainer::SetVirtualSize( CSize size )
/* ============================================================
Function : CDiagramEntityContainer::SetVirtualSize
Description : Sets the current virtual paper size.
Access : Public
Return : void
Parameters : CSize size - The size to set
Usage : Call to set the paper size. Note that
"SetModified( TRUE )" might have to be called
as well.
============================================================*/
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -