1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2014, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// hdDragTrackerTool.cpp - A Tool that allow to drag and drop figures at the view
//
//////////////////////////////////////////////////////////////////////////
#include "pgAdmin3.h"
// wxWindows headers
#include <wx/wx.h>
// App headers
#include "hotdraw/tools/hdDragTrackerTool.h"
#include "hotdraw/tools/hdAbstractTool.h"
hdDragTrackerTool::hdDragTrackerTool(hdDrawingView *view, hdIFigure *anchor)
: hdAbstractTool(view)
{
hasMovedValue = false;
anchorFigure = anchor;
}
hdDragTrackerTool::~hdDragTrackerTool()
{
}
void hdDragTrackerTool::setLastCoords(int x, int y)
{
lastX = x;
lastY = y;
}
void hdDragTrackerTool::mouseDown(hdMouseEvent &event)
{
hdAbstractTool::mouseDown(event);
if(event.LeftDown())
{
int x = event.GetPosition().x, y = event.GetPosition().y;
setLastCoords(x, y);
if(event.m_shiftDown)
{
event.getView()->getDrawing()->toggleSelection(anchorFigure);
}
else if(!event.getView()->getDrawing()->isFigureSelected(anchorFigure))
{
event.getView()->getDrawing()->clearSelection();
event.getView()->getDrawing()->addToSelection(anchorFigure);
}
}
}
void hdDragTrackerTool::mouseUp(hdMouseEvent &event)
{
hdAbstractTool::mouseUp(event);
}
void hdDragTrackerTool::mouseDrag(hdMouseEvent &event)
{
hdAbstractTool::mouseDrag(event);
if(event.LeftIsDown())
{
int x = event.GetPosition().x, y = event.GetPosition().y;
//Hack to avoid a weird bug that ocurrs when use double click very fast over figure and drag a same time, lastX
//and lastY values becomes big negatives numbers, if this happens, then reset it to click point
if(lastX < 0)
lastX = x;
if(lastY < 0)
lastY = y;
hasMovedValue = (abs (x - anchorX) > 4 || abs (y - anchorX) > 4);
if (hasMoved())
{
hdIFigure *tmp = NULL;
hdIteratorBase *iterator = event.getView()->getDrawing()->selectionFigures();
while(iterator->HasNext())
{
tmp = (hdIFigure *)iterator->Next();
tmp->moveBy(event.getView()->getIdx(), x - lastX, y - lastY);
event.getView()->notifyChanged();
}
delete iterator;
}
setLastCoords (x, y);
}
}
bool hdDragTrackerTool::hasMoved()
{
return hasMovedValue;
}
|