📄 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".
========================================================================*/
#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();
ClearRedo();
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.
============================================================*/
{
m_virtualSize = size;
}
CSize CDiagramEntityContainer::GetVirtualSize() const
/* ============================================================
Function : CDiagramEntityContainer::GetVirtualSize
Description : Gets the virtual paper size.
Access : Public
Return : CSize - The current size
Parameters : none
Usage : Call to get the current paper size.
============================================================*/
{
return m_virtualSize;
}
BOOL CDiagramEntityContainer::IsModified() const
/* ============================================================
Function : CDiagramEntityContainer::IsModified
Description : Returns the state of the modified-flag.
Access : Public
Return : BOOL - "TRUE" if data is changed
Parameters : none
Usage : Call to see if data is modified.
============================================================*/
{
return m_dirty;
}
void CDiagramEntityContainer::SetModified( BOOL dirty )
/* ============================================================
Function : CDiagramEntityContainer::SetModified
Description : Sets the state of the modified flag
Access : Public
Return : void
Parameters : BOOL dirty - "TRUE" if data is changed.
Usage : Call to mark the data as modified.
============================================================*/
{
m_dirty = dirty;
}
/////////////////////////////////////////////////////////////////////////////
// CDiagramEntityContainer single object handlers
void CDiagramEntityContainer::Remove( CDiagramEntity* obj )
/* ============================================================
Function : CDiagramEntityContainer::Remove
Description : Removes the object.
Access : Public
Return : void
Parameters : CDiagramEntity* obj - The object to
remove.
Usage : Call to remove "obj" - if it exists - from the
container. Allocated memory is released.
============================================================*/
{
int index = Find( obj );
if( index != -1 )
RemoveAt( index );
}
void CDiagramEntityContainer::Duplicate( CDiagramEntity* obj )
/* ============================================================
Function : CDiagramEntityContainer::Duplicate
Description : Duplicates the object and adds the new
one 10 pixels offset down and right.
Access : Public
Return : void
Parameters : CDiagramEntity* obj - The object to
duplicate.
Usage : Call to create a copy of the selected
element.
============================================================*/
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -