1 /* Dia -- an diagram creation/manipulation program -*- c -*-
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 #ifndef ORTH_CONN_H
19 #define ORTH_CONN_H
20 
21 #include "diatypes.h"
22 #include "object.h"
23 #include "boundingbox.h"
24 
25 typedef enum {
26   HORIZONTAL,
27   VERTICAL
28 } Orientation;
29 
30 #define FLIP_ORIENT(x) (((x)==HORIZONTAL)?VERTICAL:HORIZONTAL)
31 
32 #define HANDLE_MIDPOINT (HANDLE_CUSTOM1)
33 
34 /* This is a subclass of DiaObject used to help implementing objects
35  * that connect points with orthogonal line-segments.
36  */
37 struct _OrthConn {
38   /* DiaObject must be first because this is a 'subclass' of it. */
39   DiaObject object; /*!< inheritance */
40 
41   int numpoints; /* >= 3 */
42   Point *points; /* [numpoints] */
43 
44   int numorient; /* always numpoints-1 */
45   Orientation *orientation; /*[numpoints - 1]*/
46 
47   int numhandles; /* should be == numorient */
48   Handle **handles; /*[numpoints - 1] */
49   /* Each line segment has one handle. The first and last handles
50    * are placed in the end of their segment, the other in the middle.
51    * The end handles are connectable, the others not. (That would be
52    * problematic, as they can only move freely in one direction.)
53    * The array of pointers is ordered in segment order.
54    */
55   PolyBBExtras extra_spacing;
56   gboolean autorouting; /* True if this line is autorouted. */
57 };
58 
59 void orthconn_update_data(OrthConn *orth);
60 void orthconn_update_boundingbox(OrthConn *orth);
61 void orthconn_simple_draw(OrthConn *orth, DiaRenderer *renderer,
62 			  real width);
63 void orthconn_init(OrthConn *orth, Point *startpoint);
64 void orthconn_destroy(OrthConn *orth);
65 void orthconn_set_points(OrthConn *orth, int num_points, Point *points);
66 void orthconn_copy(OrthConn *from, OrthConn *to);
67 void orthconn_save(OrthConn *orth, ObjectNode obj_node);
68 void orthconn_load(OrthConn *orth, ObjectNode obj_node);  /* NOTE: Does object_init() */
69 ObjectChange* orthconn_move_handle(OrthConn *orth, Handle *id,
70 				   Point *to, ConnectionPoint *cp,
71 				   HandleMoveReason reason,
72 				   ModifierKeys modifiers);
73 ObjectChange* orthconn_move(OrthConn *orth, Point *to);
74 real orthconn_distance_from(OrthConn *orth, Point *point,
75 			    real line_width);
76 Handle* orthconn_get_middle_handle(OrthConn *orth);
77 
78 int orthconn_can_delete_segment(OrthConn *orth, Point *clickedpoint);
79 int orthconn_can_add_segment(OrthConn *orth, Point *clickedpoint);
80 ObjectChange *orthconn_delete_segment(OrthConn *orth, Point *clickedpoint);
81 ObjectChange *orthconn_add_segment(OrthConn *orth, Point *clickedpoint);
82 ObjectChange *orthconn_toggle_autorouting_callback(DiaObject *orth,
83 						   Point *clicked,
84 						   gpointer data);
85 void orthconn_update_object_menu(OrthConn *orth, Point *clicked,
86 				 DiaMenuItem *object_menu_items);
87 /* base property stuff... */
88 #define ORTHCONN_COMMON_PROPERTIES \
89   OBJECT_COMMON_PROPERTIES, \
90   { "orth_points", PROP_TYPE_POINTARRAY, 0, "orthconn points", NULL}, \
91   { "orth_orient", PROP_TYPE_ENUMARRAY, PROP_FLAG_OPTIONAL, "orthconn orientations", NULL}, \
92   { "orth_autoroute", PROP_TYPE_BOOL, PROP_FLAG_VISIBLE|PROP_FLAG_OPTIONAL, N_("Autoroute"), NULL} \
93 
94 #define ORTHCONN_COMMON_PROPERTIES_OFFSETS \
95   OBJECT_COMMON_PROPERTIES_OFFSETS, \
96   { "orth_points", PROP_TYPE_POINTARRAY, \
97      offsetof(OrthConn,points), offsetof(OrthConn,numpoints)}, \
98   { "orth_orient", PROP_TYPE_ENUMARRAY, \
99      offsetof(OrthConn,orientation), offsetof(OrthConn,numorient)}, \
100   { "orth_autoroute", PROP_TYPE_BOOL, offsetof(OrthConn,autorouting)} \
101 
102 #define ORTHCONN_COMMON_MENUS \
103   { N_("Autorouting"), orthconn_toggle_autorouting_callback, NULL, \
104     DIAMENU_ACTIVE|DIAMENU_TOGGLE}
105 
106 #endif /* ORTH_CONN_H */
107 
108 
109