pgadmin3/hotdraw/main/hdDrawing.cpp
2020-07-07 22:19:12 +05:00

245 lines
5 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// hdDrawing.cpp - Main storage class for all objects of the diagram,
// their functions are used by model and shouldn't be called directly
//////////////////////////////////////////////////////////////////////////
#include "pgAdmin3.h"
// wxWindows headers
#include <wx/wx.h>
// App headers
#include "hotdraw/main/hdDrawing.h"
#include "hotdraw/main/hdDrawingView.h"
#include "hotdraw/main/hdDrawingEditor.h"
#include "hotdraw/utilities/hdArrayCollection.h"
#include "hotdraw/utilities/hdRect.h"
#include "hotdraw/figures/hdIFigure.h"
hdDrawing::hdDrawing(hdDrawingEditor *owner)
{
figures = new hdCollection(new hdArrayCollection());
selection = new hdCollection(new hdArrayCollection());
usedView = NULL;
ownerEditor = owner;
drawingName = wxEmptyString;
}
hdDrawing::~hdDrawing()
{
//clear selection
if(selection)
{
selection->removeAll();
delete selection;
}
//Cannot delete figures, because they belong to model not to diagram
hdIFigure *tmp;
while(figures->count() > 0)
{
tmp = (hdIFigure *) figures->getItemAt(0);
figures->removeItemAt(0);
}
if(figures)
delete figures;
}
void hdDrawing::add(hdIFigure *figure)
{
if(figures)
figures->addItem(figure);
}
void hdDrawing::remove(hdIFigure *figure)
{
if(figures)
{
figures->removeItem(figure);
if(usedView)
figure->moveTo(usedView->getIdx(), -1, -1);
}
}
bool hdDrawing::includes(hdIFigure *figure)
{
if(figures)
return figures->existsObject(figure);
return false;
}
hdIFigure *hdDrawing::findFigure(int posIdx, int x, int y)
{
hdIFigure *tmp = NULL, *out = NULL;
hdIteratorBase *iterator = figures->createIterator();
while(iterator->HasNext())
{
tmp = (hdIFigure *)iterator->Next();
if(tmp->containsPoint(posIdx, x, y))
{
out = tmp;
break;
}
}
delete iterator;;
return out;
}
void hdDrawing::recalculateDisplayBox(int posIdx)
{
bool first = true;
hdIFigure *figure = NULL;
hdIteratorBase *iterator = figures->createIterator();
while(iterator->HasNext())
{
figure = (hdIFigure *)iterator->Next();
if(first)
{
displayBox = figure->displayBox().gethdRect(posIdx);
first = false;
}
else
{
displayBox.add(figure->displayBox().gethdRect(posIdx));
}
}
delete iterator;
}
void hdDrawing::bringToFront(hdIFigure *figure)
{
//To bring to front this figure need to be at last position when is draw
//because this reason sendToBack (last position) is used.
figures->sendToBack(figure);
}
void hdDrawing::sendToBack(hdIFigure *figure)
{
//To send to back this figure need to be at first position when is draw
//because this reason bringToFront (1st position) is used.
figures->bringToFront(figure);
}
hdRect &hdDrawing::DisplayBox()
{
return displayBox;
}
hdIteratorBase *hdDrawing::figuresEnumerator()
{
return figures->createIterator();
}
hdIteratorBase *hdDrawing::figuresInverseEnumerator()
{
return figures->createDownIterator();
}
void hdDrawing::deleteAllFigures()
{
selection->removeAll();
hdIFigure *tmp;
while(figures->count() > 0)
{
tmp = (hdIFigure *) figures->getItemAt(0);
figures->removeItemAt(0);
delete tmp;
}
//handles delete it together with figures
}
void hdDrawing::removeAllFigures()
{
selection->removeAll();
hdIFigure *tmp;
while(figures->count() > 0)
{
tmp = (hdIFigure *) figures->getItemAt(0);
figures->removeItemAt(0);
if(usedView)
tmp->moveTo(usedView->getIdx(), -1, -1);
}
}
void hdDrawing::deleteSelectedFigures()
{
//Allow to customize delete dialog at Editor
ownerEditor->remOrDelSelFigures(usedView->getIdx());
}
void hdDrawing::addToSelection(hdIFigure *figure)
{
if(!selection)
{
selection = new hdCollection(new hdArrayCollection());
}
if(figure)
{
figure->setSelected(usedView->getIdx(), true);
selection->addItem(figure);
}
}
void hdDrawing::addToSelection(hdCollection *figures)
{
}
void hdDrawing::removeFromSelection(hdIFigure *figure)
{
figure->setSelected(usedView->getIdx(), false);
if(selection)
selection->removeItem(figure);
}
void hdDrawing::toggleSelection(hdIFigure *figure)
{
if(figure->isSelected(usedView->getIdx()) && selection->existsObject(figure))
selection->removeItem(figure);
else if(!figure->isSelected(usedView->getIdx()) && this->includes(figure))
selection->addItem(figure);
figure->setSelected(usedView->getIdx(), !figure->isSelected(usedView->getIdx()));
}
void hdDrawing::clearSelection()
{
hdIFigure *tmp = NULL;
hdIteratorBase *iterator = selection->createIterator();
while(iterator->HasNext())
{
tmp = (hdIFigure *)iterator->Next();
tmp->setSelected(usedView->getIdx(), false);
}
selection->removeAll();
delete iterator;
}
bool hdDrawing::isFigureSelected(hdIFigure *figure)
{
return selection->existsObject(figure);
}
hdIteratorBase *hdDrawing::selectionFigures()
{
return selection->createIterator();
}
int hdDrawing::countSelectedFigures()
{
return selection->count();
}