1 /* Dia -- an diagram creation/manipulation program 2 * Copyright (C) 1998 Alexander Larsson 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 */ 18 /*! \file connectionpoint.h -- Connection Points together with Handles allow to connect objects */ 19 #ifndef CONNECTIONPOINT_H 20 #define CONNECTIONPOINT_H 21 22 #include "diatypes.h" 23 #include <glib.h> 24 #include "geometry.h" 25 26 #define CONNECTIONPOINT_SIZE 5 27 #define CHANGED_TRESHOLD 0.001 28 29 /*! \brief Connections directions, used as hints to e.g. zigzaglines 30 * Ordered this way to let *2 be rotate clockwise, /2 rotate counterclockwise. 31 * Used as bits */ 32 typedef enum { 33 DIR_NONE = 0, 34 DIR_NORTH = (1<<0), 35 DIR_EAST = (1<<1), 36 DIR_SOUTH = (1<<2), 37 DIR_WEST = (1<<3), 38 /* Convenience directions */ 39 DIR_NORTHEAST = (DIR_NORTH|DIR_EAST), 40 DIR_SOUTHEAST = (DIR_SOUTH|DIR_EAST), 41 DIR_NORTHWEST = (DIR_NORTH|DIR_WEST), 42 DIR_SOUTHWEST = (DIR_SOUTH|DIR_WEST), 43 DIR_ALL = (DIR_NORTH|DIR_SOUTH|DIR_EAST|DIR_WEST) 44 } ConnectionPointDirection; 45 46 /*! \brief Additional behaviour flags for connection points */ 47 typedef enum { 48 CP_FLAG_ANYPLACE = (1<<0), /*!< Set if this connpoint is the one that 49 is connected to when a connection is 50 dropped on an object. */ 51 CP_FLAG_AUTOGAP = (1<<1), /*!< Set if this connpoint is internal 52 and so should force a gap on the lines. */ 53 54 /*! Most non-connection objects want exactly one CP with this, in the middle. */ 55 CP_FLAGS_MAIN = (CP_FLAG_ANYPLACE|CP_FLAG_AUTOGAP) /*!< Use this for the central CP that 56 takes connections from all over the 57 object and has autogap. */ 58 } ConnectionPointFlags; 59 60 /*! 61 * \brief To connect object with other objects handles 62 */ 63 struct _ConnectionPoint { 64 Point pos; /*!< position of this connection point */ 65 Point last_pos; /*!< Used by update_connections_xxx only. */ 66 DiaObject *object; /*!< pointer to the object having this point */ 67 GList *connected; /*!< list of 'DiaObject *' connected to this point*/ 68 gchar directions; /*!< Directions that this connection point is open to */ 69 gchar *name; /*!< Name of this connpoint, NULL means uses number only.*/ 70 guint8 flags; /*!< Flags set for this connpoint. See CP_FLAGS_* above. */ 71 }; 72 73 /** 74 * Returns the available directions on a slope. 75 * The right-hand side of the line is assumed to be within the object, 76 * and thus not available. 77 */ 78 gint find_slope_directions(Point from, Point to); 79 /** Update the object-settable parts of a connectionpoints. 80 * p: A ConnectionPoint pointer (non-NULL). 81 * x: The x coordinate of the connectionpoint. 82 * y: The y coordinate of the connectionpoint. 83 * dirs: The directions that are open for connections on this point. 84 */ 85 void connpoint_update(ConnectionPoint *p, real x, real y, gint dirs); 86 87 gboolean connpoint_is_autogap(ConnectionPoint *cp); 88 89 90 #endif /* CONNECTIONPOINT_H */ 91