1289848Sjkim/*
2289848Sjkim * Copyright (c) 1999-2000, Eric Moon.
3289848Sjkim * All rights reserved.
4289848Sjkim *
5289848Sjkim * Redistribution and use in source and binary forms, with or without
6289848Sjkim * modification, are permitted provided that the following conditions
7289848Sjkim * are met:
8289848Sjkim *
9289848Sjkim * 1. Redistributions of source code must retain the above copyright
10289848Sjkim *    notice, this list of conditions, and the following disclaimer.
11289848Sjkim *
12289848Sjkim * 2. Redistributions in binary form must reproduce the above copyright
13289848Sjkim *    notice, this list of conditions, and the following disclaimer in the
14289848Sjkim *    documentation and/or other materials provided with the distribution.
15289848Sjkim *
16289848Sjkim * 3. The name of the author may not be used to endorse or promote products
17289848Sjkim *    derived from this software without specific prior written permission.
18289848Sjkim *
19289848Sjkim * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20289848Sjkim * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21289848Sjkim * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22289848Sjkim * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23289848Sjkim * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24289848Sjkim * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25289848Sjkim * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26289848Sjkim * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27289848Sjkim * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28289848Sjkim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29289848Sjkim */
30289848Sjkim
31289848Sjkim
32289848Sjkim// DiagramWire.cpp
33289848Sjkim
34289848Sjkim#include "DiagramWire.h"
35289848Sjkim#include "DiagramDefs.h"
36289848Sjkim#include "DiagramEndPoint.h"
37289848Sjkim#include "DiagramView.h"
38289848Sjkim
39289848Sjkim#include <Message.h>
40289848Sjkim#include <Messenger.h>
41289848Sjkim
42289848Sjkim__USE_CORTEX_NAMESPACE
43289848Sjkim
44289848Sjkim#include <Debug.h>
45289848Sjkim#define D_METHOD(x) //PRINT (x)
46289848Sjkim#define D_MESSAGE(x) //PRINT (x)
47289848Sjkim
48289848Sjkim// -------------------------------------------------------- //
49289848Sjkim// *** ctor/dtor
50289848Sjkim// -------------------------------------------------------- //
51289848Sjkim
52289848SjkimDiagramWire::DiagramWire(
53289848Sjkim	DiagramEndPoint *fromWhich,
54289848Sjkim	DiagramEndPoint *toWhich)
55289848Sjkim	: DiagramItem(DiagramItem::M_WIRE),
56289848Sjkim	  m_fromEndPoint(fromWhich),
57289848Sjkim	  m_toEndPoint(toWhich),
58289848Sjkim	  m_temporary(false)
59289848Sjkim{
60289848Sjkim	D_METHOD(("DiagramWire::DiagramWire()\n"));
61295009Sjkim	makeDraggable(false);
62289848Sjkim	ASSERT(m_fromEndPoint);
63289848Sjkim	m_fromEndPoint->connect(this);
64289848Sjkim	ASSERT(m_toEndPoint);
65289848Sjkim	m_toEndPoint->connect(this);
66289848Sjkim}
67289848Sjkim
68289848SjkimDiagramWire::DiagramWire(
69289848Sjkim	DiagramEndPoint *fromWhich,
70289848Sjkim	bool isStartPoint)
71289848Sjkim	: DiagramItem(DiagramItem::M_WIRE),
72289848Sjkim	  m_fromEndPoint(isStartPoint ? fromWhich : 0),
73289848Sjkim	  m_toEndPoint(isStartPoint ? 0 : fromWhich),
74289848Sjkim	  m_temporary(true),
75289848Sjkim	  m_dragEndPoint(fromWhich->connectionPoint())
76289848Sjkim{
77289848Sjkim	D_METHOD(("DiagramWire::DiagramWire(temp)\n"));
78289848Sjkim	makeDraggable(false);
79289848Sjkim	ASSERT(fromWhich);
80289848Sjkim	if (m_fromEndPoint)
81289848Sjkim	{
82289848Sjkim		m_fromEndPoint->connect(this);
83289848Sjkim	}
84289848Sjkim	else if (m_toEndPoint)
85289848Sjkim	{
86289848Sjkim		m_toEndPoint->connect(this);
87289848Sjkim	}
88289848Sjkim}
89289848Sjkim
90289848SjkimDiagramWire::~DiagramWire()
91289848Sjkim{
92289848Sjkim	D_METHOD(("DiagramWire::~DiagramWire()\n"));
93289848Sjkim	if (m_fromEndPoint)
94289848Sjkim	{
95289848Sjkim		m_fromEndPoint->disconnect();
96289848Sjkim	}
97289848Sjkim	if (m_toEndPoint)
98289848Sjkim	{
99289848Sjkim		m_toEndPoint->disconnect();
100289848Sjkim	}
101289848Sjkim}
102289848Sjkim
103289848Sjkim// -------------------------------------------------------- //
104289848Sjkim// *** accessors
105289848Sjkim// -------------------------------------------------------- //
106289848Sjkim
107289848SjkimBPoint DiagramWire::startConnectionPoint() const
108289848Sjkim{
109289848Sjkim	D_METHOD(("DiagramWire::startConnectionPoint()\n"));
110289848Sjkim	if (m_fromEndPoint)
111289848Sjkim	{
112289848Sjkim		return m_fromEndPoint->connectionPoint();
113289848Sjkim	}
114289848Sjkim	else if (m_temporary)
115289848Sjkim	{
116289848Sjkim		return m_dragEndPoint;
117289848Sjkim	}
118289848Sjkim	return BPoint(-1.0, -1.0);
119289848Sjkim}
120289848Sjkim
121289848SjkimBPoint DiagramWire::endConnectionPoint() const
122289848Sjkim{
123289848Sjkim	D_METHOD(("DiagramWire::endConnectionPoint()\n"));
124289848Sjkim	if (m_toEndPoint)
125289848Sjkim	{
126289848Sjkim		return m_toEndPoint->connectionPoint();
127289848Sjkim	}
128289848Sjkim	else if (m_temporary)
129289848Sjkim	{
130289848Sjkim		return m_dragEndPoint;
131289848Sjkim	}
132289848Sjkim	return BPoint(-1.0, -1.0);
133289848Sjkim}
134289848Sjkim
135289848Sjkim// -------------------------------------------------------- //
136289848Sjkim// *** derived from DiagramItem
137289848Sjkim// -------------------------------------------------------- //
138289848Sjkim
139289848Sjkimfloat DiagramWire::howCloseTo(
140289848Sjkim	BPoint point) const
141289848Sjkim{
142289848Sjkim	D_METHOD(("DiagramWire::howCloseTo()\n"));
143289848Sjkim	BPoint a = startConnectionPoint();
144289848Sjkim	BPoint b = endConnectionPoint();
145289848Sjkim	float length, result;
146289848Sjkim	length = sqrt(pow(b.x - a.x, 2) + pow(b.y - a.y, 2));
147289848Sjkim	result = ((a.y - point.y) * (b.x - a.x)) - ((a.x - point.x) * (b.y - a.y));
148289848Sjkim	result = 3.0 - fabs(result / length);
149289848Sjkim	return result;
150289848Sjkim}
151289848Sjkim
152289848Sjkimvoid DiagramWire::Draw(
153289848Sjkim	BRect updateRect)
154289848Sjkim{
155289848Sjkim	D_METHOD(("DiagramWire::Draw()\n"));
156289848Sjkim	if (view())
157289848Sjkim	{
158289848Sjkim		view()->PushState();
159289848Sjkim		{
160289848Sjkim			BRegion region, clipping;
161289848Sjkim			region.Include(Frame() & updateRect);
162289848Sjkim			if (view()->GetClippingAbove(this, &clipping))
163289848Sjkim				region.Exclude(&clipping);
164289848Sjkim			view()->ConstrainClippingRegion(&region);
165289848Sjkim			drawWire();
166289848Sjkim		}
167289848Sjkim		view()->PopState();
168289848Sjkim	}
169289848Sjkim}
170289848Sjkim
171289848Sjkimvoid DiagramWire::MouseDown(
172289848Sjkim	BPoint point,
173289848Sjkim	uint32 buttons,
174289848Sjkim	uint32 clicks)
175289848Sjkim{
176289848Sjkim	D_METHOD(("DiagramWire::MouseDown()\n"));
177289848Sjkim	if (clicks == 1)
178289848Sjkim	{
179289848Sjkim		if (isSelectable())
180289848Sjkim		{
181289848Sjkim			BMessage selectMsg(M_SELECTION_CHANGED);
182289848Sjkim			if (modifiers() & B_SHIFT_KEY)
183289848Sjkim			{
184289848Sjkim				selectMsg.AddBool("replace", false);
185289848Sjkim			}
186289848Sjkim			else
187289848Sjkim			{
188289848Sjkim				selectMsg.AddBool("replace", true);
189289848Sjkim			}
190289848Sjkim			selectMsg.AddPointer("item", reinterpret_cast<void *>(this));
191289848Sjkim			DiagramView* v = view();
192289848Sjkim			BMessenger(v).SendMessage(&selectMsg);
193289848Sjkim		}
194289848Sjkim	}
195289848Sjkim}
196289848Sjkim
197289848Sjkimvoid DiagramWire::MessageDragged(
198289848Sjkim	BPoint point,
199289848Sjkim	uint32 transit,
200289848Sjkim	const BMessage *message)
201289848Sjkim{
202289848Sjkim	D_METHOD(("DiagramWire::MessageDragged()\n"));
203289848Sjkim	switch (message->what)
204289848Sjkim	{
205289848Sjkim		case M_WIRE_DRAGGED:
206289848Sjkim		{
207289848Sjkim			view()->trackWire(point);
208289848Sjkim			break;
209289848Sjkim		}
210289848Sjkim		default:
211289848Sjkim		{
212289848Sjkim			DiagramItem::MessageDragged(point, transit, message);
213289848Sjkim		}
214289848Sjkim	}
215289848Sjkim}
216289848Sjkim
217289848Sjkim// END -- DiagramWire.cpp --
218289848Sjkim