20#include "tool_connector.h"
24#include <kiconloader.h>
25#include <kstandarddirs.h>
27#include <KoZoomHandler.h>
31#include "kivio_view.h"
32#include "kivio_canvas.h"
33#include "kivio_page.h"
35#include "kivio_factory.h"
37#include "kivio_stencil_spawner_set.h"
38#include "kivio_stencil_spawner.h"
39#include "kivio_custom_drag_data.h"
40#include "kivio_layer.h"
41#include "kivio_point.h"
42#include "kivio_stencil.h"
43#include "straight_connector.h"
44#include "kivio_pluginmanager.h"
45#include "kivio_1d_stencil.h"
46#include "kiviopolylineconnector.h"
47#include "polylineconnectorspawner.h"
48#include "mousetoolaction.h"
50ConnectorTool::ConnectorTool( KivioView* parent ) : Kivio::
MouseTool(parent,
"Connector Mouse Tool")
52 m_connectorAction =
new Kivio::MouseToolAction(i18n(
"Straight Connector"),
"kivio_connector", 0,
53 actionCollection(),
"connector");
54 connect(m_connectorAction, TQ_SIGNAL(toggled(
bool)),
this, TQ_SLOT(setActivated(
bool)));
55 connect(m_connectorAction, TQ_SIGNAL(activated()),
this, TQ_SLOT(activateStraight()));
56 connect(m_connectorAction, TQ_SIGNAL(doubleClicked()),
this, TQ_SLOT(makePermanent()));
57 m_connectorAction->setExclusiveGroup(
"ConnectorTool");
59 m_polyLineAction =
new Kivio::MouseToolAction(i18n(
"Polyline Connector"),
"kivio_connector", 0,
60 actionCollection(),
"polyLineConnector");
61 connect(m_polyLineAction, TQ_SIGNAL(toggled(
bool)),
this, TQ_SLOT(setActivated(
bool)));
62 connect(m_polyLineAction, TQ_SIGNAL(activated()),
this, TQ_SLOT(activatePolyline()));
63 connect(m_connectorAction, TQ_SIGNAL(doubleClicked()),
this, TQ_SLOT(makePermanent()));
64 m_polyLineAction->setExclusiveGroup(
"ConnectorTool");
68 m_type = StraightConnector;
72 m_pConnectorCursor1 =
new TQCursor(BarIcon(
"kivio_connector_cursor1",KivioFactory::global()),2,2);
73 m_pConnectorCursor2 =
new TQCursor(BarIcon(
"kivio_connector_cursor2",KivioFactory::global()),2,2);
76ConnectorTool::~ConnectorTool()
78 delete m_pConnectorCursor1;
79 delete m_pConnectorCursor2;
91bool ConnectorTool::processEvent(TQEvent* e)
95 case TQEvent::MouseButtonPress:
96 mousePress(
static_cast<TQMouseEvent*
>(e) );
100 case TQEvent::MouseButtonRelease:
101 mouseRelease(
static_cast<TQMouseEvent*
>(e) );
105 case TQEvent::MouseMove:
106 mouseMove(
static_cast<TQMouseEvent*
>(e) );
117void ConnectorTool::setActivated(
bool a)
120 view()->canvasWidget()->setCursor(*m_pConnectorCursor1);
124 view()->canvasWidget()->setShowConnectorTargets(
true);
125 view()->canvasWidget()->repaint();
126 emit activated(
this);
128 if(m_pStencil && (m_mode == stmDrawRubber) && (m_type == PolyLineConnector)) {
129 Kivio::PolyLineConnector* polyconnector =
static_cast<Kivio::PolyLineConnector*
>(m_pStencil);
130 polyconnector->removeLastPoint();
132 if(polyconnector->pointCount() > 1) {
133 connector(view()->canvasWidget()->rect());
135 view()->activePage()->unselectStencil(polyconnector);
136 view()->activePage()->curLayer()->takeStencil(polyconnector);
137 delete polyconnector;
141 view()->canvasWidget()->guideLines().repaintAfterSnapping();
147 m_type = StraightConnector;
148 m_connectorAction->setChecked(
false);
149 m_polyLineAction->setChecked(
false);
151 view()->setStatusBarInfo(
"");
152 view()->canvasWidget()->setShowConnectorTargets(
false);
153 view()->canvasWidget()->repaint();
157void ConnectorTool::connector(TQRect)
165 KivioDoc* doc = view()->doc();
166 KivioPage* page = view()->activePage();
168 m_pStencil->searchForConnections(page, view()->zoomHandler()->unzoomItY(4));
169 doc->updateView(page);
172void ConnectorTool::mousePress( TQMouseEvent *e )
174 if(e->button() == TQt::LeftButton) {
176 if(!m_pStencil || (m_type == StraightConnector)) {
177 ok = startRubberBanding(e);
180 Kivio::PolyLineConnector* connector =
static_cast<Kivio::PolyLineConnector*
>(m_pStencil);
181 KivioCanvas* canvas = view()->canvasWidget();
182 KivioPage* pPage = canvas->activePage();
184 KoPoint point = pPage->snapToTarget(canvas->mapFromScreen(e->pos()), 8.0, hit);
187 point = canvas->snapToGrid(startPoint);
190 if((m_mode == stmDrawRubber) && hit) {
193 connector->addPoint(point);
199 m_mode = stmDrawRubber;
203 }
else if(e->button() == TQt::RightButton) {
204 if(m_type == PolyLineConnector) {
205 if(m_mode == stmDrawRubber) {
209 view()->canvasWidget()->setCursor(*m_pConnectorCursor1);
219bool ConnectorTool::startRubberBanding( TQMouseEvent *e )
221 KivioCanvas* canvas = view()->canvasWidget();
222 KivioDoc* doc = view()->doc();
223 KivioPage* pPage = canvas->activePage();
226 if(m_type == StraightConnector) {
227 spawnerId =
"Dave Marotti - Straight Connector";
229 spawnerId =
"Internal - PolyLine Connector";
232 KivioStencilSpawner* ss = doc->findInternalStencilSpawner(spawnerId);
235 kdDebug(43000) <<
"ConnectorTool: Failed to find StencilSpawner!" << endl;
240 m_pStencil =
static_cast<Kivio1DStencil*
>(ss->newStencil());
243 startPoint = pPage->snapToTarget(canvas->mapFromScreen(e->pos()), 8.0, hit);
246 startPoint = canvas->snapToGrid(startPoint);
254 m_pStencil->setTextFont(doc->defaultFont());
257 pPage->unselectAllStencils();
258 pPage->addStencil(m_pStencil);
259 pPage->selectStencil(m_pStencil);
261 m_pDragData =
new KivioCustomDragData();
262 m_pDragData->page = pPage;
263 m_pDragData->x = startPoint.x();
264 m_pDragData->y = startPoint.y();
266 if(m_type == StraightConnector) {
267 KivioStraightConnector* connector =
static_cast<KivioStraightConnector*
>(m_pStencil);
268 m_pDragData->id = kctCustom + 2;
270 connector->setStartPoint(startPoint.x(), startPoint.y());
271 connector->setEndPoint(startPoint.x() + 10.0, startPoint.y() + 10.0);
273 Kivio::PolyLineConnector* connector =
static_cast<Kivio::PolyLineConnector*
>(m_pStencil);
274 m_pDragData->id = kctCustom + 1;
275 connector->addPoint(startPoint);
276 connector->addPoint(startPoint);
279 m_pStencil->customDrag(m_pDragData);
282 canvas->setCursor(*m_pConnectorCursor2);
286void ConnectorTool::mouseMove( TQMouseEvent * e )
291 continueRubberBanding(e);
299void ConnectorTool::continueRubberBanding( TQMouseEvent *e )
301 KivioCanvas* canvas = view()->canvasWidget();
302 KivioPage* pPage = view()->activePage();
304 KoPoint endPoint = pPage->snapToTarget(canvas->mapFromScreen(e->pos()), 8.0, hit);
307 endPoint = canvas->snapToGridAndGuides(endPoint);
310 m_pDragData->x = endPoint.x();
311 m_pDragData->y = endPoint.y();
313 if(m_type == StraightConnector) {
314 KivioStraightConnector* connector =
static_cast<KivioStraightConnector*
>(m_pStencil);
315 connector->setEndPoint(endPoint.x(), endPoint.y());
317 m_pDragData->id = kctCustom + 2;
319 Kivio::PolyLineConnector* connector =
static_cast<Kivio::PolyLineConnector*
>(m_pStencil);
320 m_pDragData->id = kctCustom + connector->pointCount();
323 m_pStencil->customDrag(m_pDragData);
324 m_pStencil->updateGeometry();
328void ConnectorTool::mouseRelease( TQMouseEvent *e )
330 if(m_type == StraightConnector) {
338 view()->canvasWidget()->setCursor(*m_pConnectorCursor1);
343void ConnectorTool::endRubberBanding(TQMouseEvent *)
345 connector(view()->canvasWidget()->rect());
348 view()->canvasWidget()->guideLines().repaintAfterSnapping();
351 view()->pluginManager()->activateDefaultTool();
355void ConnectorTool::activateStraight()
357 m_type = StraightConnector;
358 m_connectorAction->setChecked(
true);
359 m_polyLineAction->setChecked(
false);
362void ConnectorTool::activatePolyline()
364 m_type = PolyLineConnector;
365 m_connectorAction->setChecked(
false);
366 m_polyLineAction->setChecked(
true);
367 view()->setStatusBarInfo(i18n(
"Left mouse button to start drawing, right to end drawing."));
370void ConnectorTool::makePermanent()
375#include "tool_connector.moc"