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