mirror of
https://github.com/levinsv/pgadmin3.git
synced 2026-05-16 14:15:50 -06:00
116 lines
3 KiB
C++
116 lines
3 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// pgAdmin III - PostgreSQL Tools
|
|
//
|
|
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
|
|
// This software is released under the PostgreSQL Licence
|
|
//
|
|
// hdChangeConnectionHandle.cpp - Base Handle to allow change connected figures at connection figures
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "pgAdmin3.h"
|
|
|
|
// wxWindows headers
|
|
#include <wx/wx.h>
|
|
#include <wx/dcbuffer.h>
|
|
|
|
// App headers
|
|
#include "hotdraw/handles/hdChangeConnectionHandle.h"
|
|
#include "hotdraw/figures/hdLineConnection.h"
|
|
#include "hotdraw/utilities/hdPoint.h"
|
|
#include "hotdraw/main/hdDrawingView.h"
|
|
|
|
|
|
hdChangeConnectionHandle::hdChangeConnectionHandle(hdLineConnection *owner):
|
|
hdIHandle(owner)
|
|
{
|
|
connection = owner;
|
|
targetFigure = NULL;
|
|
originalTarget = NULL;
|
|
}
|
|
|
|
hdChangeConnectionHandle::~hdChangeConnectionHandle()
|
|
{
|
|
|
|
}
|
|
|
|
void hdChangeConnectionHandle::draw(wxBufferedDC &context, hdDrawingView *view)
|
|
{
|
|
|
|
hdRect copy = getDisplayBox(view->getIdx());
|
|
view->CalcScrolledPosition(copy.x, copy.y, ©.x, ©.y);
|
|
|
|
copy.Deflate(2, 2);
|
|
context.SetPen(*wxGREEN_PEN);
|
|
context.SetBrush(*wxGREEN_BRUSH);
|
|
context.DrawRectangle(copy);
|
|
}
|
|
|
|
wxCursor hdChangeConnectionHandle::createCursor()
|
|
{
|
|
return wxCursor(wxCURSOR_CROSS);
|
|
}
|
|
|
|
void hdChangeConnectionHandle::invokeStart(hdMouseEvent &event, hdDrawingView *view)
|
|
{
|
|
originalTarget = target();
|
|
disconnect(view);
|
|
}
|
|
|
|
void hdChangeConnectionHandle::invokeStep(hdMouseEvent &event, hdDrawingView *view)
|
|
{
|
|
int x = event.GetPosition().x, y = event.GetPosition().y;
|
|
hdPoint p = hdPoint(x, y);
|
|
hdIFigure *figure = findConnectableFigure(view->getIdx(), x, y, view->getDrawing());
|
|
targetFigure = figure;
|
|
hdIConnector *target = findConnectionTarget(view->getIdx(), x, y, view->getDrawing());
|
|
if(target)
|
|
{
|
|
p = target->getDisplayBox().center(view->getIdx());
|
|
}
|
|
setPoint(view->getIdx(), p);
|
|
connection->updateConnection(view->getIdx());
|
|
if(view)
|
|
view->Refresh();
|
|
}
|
|
|
|
void hdChangeConnectionHandle::invokeEnd(hdMouseEvent &event, hdDrawingView *view)
|
|
{
|
|
int x = event.GetPosition().x, y = event.GetPosition().y;
|
|
hdIConnector *target = findConnectionTarget(view->getIdx(), x, y, view->getDrawing());
|
|
if(!target)
|
|
{
|
|
target = originalTarget;
|
|
}
|
|
connect(target, view);
|
|
connection->updateConnection(view->getIdx());
|
|
if(view)
|
|
view->Refresh();
|
|
}
|
|
|
|
|
|
hdIFigure *hdChangeConnectionHandle::findConnectableFigure (int posIdx, int x, int y, hdDrawing *drawing)
|
|
{
|
|
hdIFigure *out = NULL;
|
|
hdIteratorBase *iterator = drawing->figuresInverseEnumerator();
|
|
while(iterator->HasNext())
|
|
{
|
|
hdIFigure *figure = (hdIFigure *) iterator->Next();
|
|
if(figure->containsPoint(posIdx, x, y) && isConnectionPossible(figure))
|
|
{
|
|
out = figure;
|
|
break;
|
|
}
|
|
}
|
|
delete iterator;
|
|
return out;
|
|
}
|
|
hdIConnector *hdChangeConnectionHandle::findConnectionTarget(int posIdx, int x, int y, hdDrawing *drawing)
|
|
{
|
|
hdIFigure *target = findConnectableFigure(posIdx, x, y, drawing);
|
|
if(target)
|
|
return target->connectorAt(posIdx, x, y);
|
|
else
|
|
return NULL;
|
|
}
|