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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2014, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// hdSelectAreaTool.cpp - Tool to allow selection of figures inside a rectangle
//
//////////////////////////////////////////////////////////////////////////
#include "pgAdmin3.h"
// wxWindows headers
#include <wx/wx.h>
#include <wx/scrolwin.h>
#include <wx/pen.h>
// App headers
#include "hotdraw/tools/hdSelectAreaTool.h"
#include "hotdraw/tools/hdAbstractTool.h"
#include "hotdraw/utilities/hdGeometry.h"
hdSelectAreaTool::hdSelectAreaTool(hdDrawingView *view)
: hdAbstractTool(view)
{
}
hdSelectAreaTool::~hdSelectAreaTool()
{
}
void hdSelectAreaTool::mouseDown(hdMouseEvent &event)
{
hdAbstractTool::mouseDown(event);
if(!event.ShiftDown())
{
event.getView()->getDrawing()->clearSelection();
}
if(event.LeftDown())
{
int x = event.GetPosition().x, y = event.GetPosition().y;
selectionRect.x = x;
selectionRect.y = y;
selectionRect.width = 0;
selectionRect.height = 0;
drawSelectionRect(event.getView());
}
}
void hdSelectAreaTool::mouseUp(hdMouseEvent &event)
{
hdAbstractTool::mouseUp(event);
hdGeometry g;
//hack-fix for bug when selecting figures from right to left
if(event.LeftUp())
{
if( selectionRect.width < 0 )
{
int tmp;
tmp = selectionRect.width;
selectionRect.x += tmp;
selectionRect.width = g.ddabs(tmp);
}
if( selectionRect.height < 0 )
{
int tmp;
tmp = selectionRect.height;
selectionRect.y += tmp;
selectionRect.height = g.ddabs(tmp);
}
//end hack-fix
drawSelectionRect(event.getView());
selectFiguresOnRect(event.ShiftDown(), event.getView());
event.getView()->disableSelRectDraw();
}
}
void hdSelectAreaTool::mouseDrag(hdMouseEvent &event)
{
hdAbstractTool::mouseDrag(event);
if(event.LeftIsDown())
{
drawSelectionRect(event.getView());
int x = event.GetPosition().x, y = event.GetPosition().y;
selectionRect.x = anchorX;
selectionRect.y = anchorY;
selectionRect.SetBottomRight(wxPoint(x, y));
drawSelectionRect(event.getView());
event.getView()->ScrollToMakeVisible(event.GetPosition());
}
}
void hdSelectAreaTool::selectFiguresOnRect(bool shiftPressed, hdDrawingView *view)
{
hdIFigure *figure;
hdIteratorBase *iterator = view->getDrawing()->figuresInverseEnumerator();
while(iterator->HasNext())
{
figure = (hdIFigure *)iterator->Next();
if(selectionRect.Contains(figure->displayBox().gethdRect(view->getIdx())))
{
if(shiftPressed)
{
view->getDrawing()->toggleSelection(figure);
}
else
{
view->getDrawing()->addToSelection(figure);
}
}
}
delete iterator;
}
void hdSelectAreaTool::drawSelectionRect(hdDrawingView *view)
{
view->setSelRect(selectionRect);
}
|