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(®ion); 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