1 /* AADL plugin for DIA
2 *
3 * Copyright (C) 2005 Laboratoire d'Informatique de Paris 6
4 * Author: Pierre Duquesne
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20 
21 
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 
26 #include <assert.h>
27 #include <math.h>
28 #include <string.h>
29 
30 #include "intl.h"
31 #include "object.h"
32 #include "element.h"
33 #include "diarenderer.h"
34 #include "attributes.h"
35 #include "text.h"
36 #include "properties.h"
37 
38 #undef min
39 #define min(a,b) (a<b?a:b)
40 #undef max
41 #define max(a,b) (a>b?a:b)
42 
43 #define L1 printf("%d\n", __LINE__);
44 
45 
46 /***********************************************
47  **              CONSTANTS                    **
48  ***********************************************/
49 
50 static const double AADLBOX_BORDERWIDTH = 0.1;
51 static const double AADLBOX_FONTHEIGHT = 0.8;
52 static const double AADLBOX_TEXT_MARGIN = 0.5;
53 
54 #define AADL_PORT_MAX_OUT 1.0  /* Maximum size out of the box */
55 
56 #define AADL_MEMORY_FACTOR 0.1
57 #define AADLBOX_INCLINE_FACTOR 0.2
58 #define AADLBOX_DASH_LENGTH 0.3
59 #define AADL_BUS_ARROW_SIZE_FACTOR 0.16
60 #define AADL_BUS_HEIGHT_FACTOR 0.3
61 #define AADL_ROUNDEDBOX_CORNER_SIZE_FACTOR 0.25
62 
63 /***********************************************
64  **                  TYPES                    **
65  ***********************************************/
66 
67 typedef struct _Aadlport Aadlport;
68 typedef struct _Aadlbox Aadlbox;
69 
70 typedef struct _Aadlbox_specific Aadlbox_specific;
71 
72 
73 struct _Aadlbox
74 {
75   Element element;
76 
77   gchar *declaration;
78 
79   Text *name;
80   TextAttributes attrs;
81 
82   int num_ports;
83   Aadlport **ports;
84 
85   int num_connections;
86   ConnectionPoint **connections;
87 
88   Color line_color;
89   Color fill_color;
90 
91   Aadlbox_specific *specific;
92 };
93 
94 
95 typedef enum {
96   BUS,
97   DEVICE,
98   MEMORY,
99   PROCESSOR,
100   PROCESS,
101   SUBPROGRAM,
102   SYSTEM,
103   THREAD,
104   THREAD_GROUP,
105 
106   ACCESS_PROVIDER,
107   ACCESS_REQUIRER,
108   IN_DATA_PORT,
109   IN_EVENT_PORT,
110   IN_EVENT_DATA_PORT,
111   OUT_DATA_PORT,
112   OUT_EVENT_PORT,
113   OUT_EVENT_DATA_PORT,
114   IN_OUT_DATA_PORT,
115   IN_OUT_EVENT_PORT,
116   IN_OUT_EVENT_DATA_PORT,
117 
118   PORT_GROUP
119 } Aadl_type;
120 
121 
122 struct _Aadlport {
123   Aadl_type type;
124   Handle *handle;
125   real angle;
126 
127   ConnectionPoint in;
128   ConnectionPoint out;
129 
130   gchar *declaration;
131 };
132 
133 typedef void (*AadlProjectionFunc) (Aadlbox *aadlbox,Point *p,real *angle);
134 typedef void (*AadlDrawFunc) (Aadlbox* obj, DiaRenderer* ddisp);
135 typedef void (*AadlTextPosFunc) (Aadlbox* obj, Point *p);
136 typedef void (*AadlSizeFunc) (Aadlbox* obj, Point *size);
137 
138 /* In the abstract class system (see aadlbox.c), these are the
139    functions an inherited class *must* define, because they are
140    used by aadlbox_ functions   */
141 
142 struct _Aadlbox_specific
143 {
144   AadlProjectionFunc project_point_on_nearest_border;
145   AadlTextPosFunc text_position;
146   AadlSizeFunc min_size;
147 };
148 
149 
150 /***********************************************
151  **                 FUNCTIONS                 **
152  ***********************************************/
153 
154 
155 /* aadltext.c */
156 void aadldata_text_position(Aadlbox *aadlbox, Point *p);
157 void aadldata_minsize(Aadlbox *aadlbox, Point *size);
158 
159 void aadlprocess_text_position(Aadlbox *aadlbox, Point *p);
160 void aadlprocess_minsize(Aadlbox *aadlbox, Point *size);
161 
162 void aadlbus_text_position(Aadlbox *aadlbox, Point *p);
163 void aadlbus_minsize(Aadlbox *aadlbox, Point *size);
164 
165 void aadlsystem_text_position(Aadlbox *aadlbox, Point *p);
166 void aadlsystem_minsize(Aadlbox *aadlbox, Point *size);
167 
168 void aadlsubprogram_text_position(Aadlbox *aadlbox, Point *p);
169 void aadlsubprogram_minsize(Aadlbox *aadlbox, Point *size);
170 
171 void aadlmemory_text_position(Aadlbox *aadlbox, Point *p);
172 void aadlmemory_minsize(Aadlbox *aadlbox, Point *size);
173 
174 /* aadlport.c */
175 void rotate_around_origin (Point *p, real angle);
176 void aadlbox_draw_port(Aadlport *port, DiaRenderer *renderer);
177 void aadlbox_update_port(Aadlbox *aadlbox, Aadlport *port);
178 void aadlbox_update_ports(Aadlbox *aadlbox);
179 
180 /* aadlbox.c */
181 real aadlbox_distance_from(Aadlbox *aadlbox, Point *point);
182 void aadlbox_select(Aadlbox *aadlbox, Point *clicked_point,
183 		    DiaRenderer *interactive_renderer);
184 ObjectChange* aadlbox_move_handle(Aadlbox *aadlbox, Handle *handle,
185 				  Point *to, ConnectionPoint *cp,
186 				  HandleMoveReason reason,
187 				  ModifierKeys modifiers);
188 ObjectChange* aadlbox_move(Aadlbox *aadlbox, Point *to);
189 void aadlbox_draw(Aadlbox *aadlbox, DiaRenderer *renderer);
190 DiaObject *aadlbox_create(Point *startpoint, void *user_data,
191 			  Handle **handle1, Handle **handle2);
192 void aadlbox_destroy(Aadlbox *aadlbox);
193 PropDescription *aadlbox_describe_props(Aadlbox *aadlbox);
194 void aadlbox_get_props(Aadlbox *aadlbox, GPtrArray *props);
195 void aadlbox_set_props(Aadlbox *aadlbox, GPtrArray *props);
196 DiaObject *aadlbox_copy(DiaObject *obj);
197 DiaMenu * aadlbox_get_object_menu(Aadlbox *aadlbox, Point *clickedpoint);
198 void aadlbox_save(Aadlbox *aadlbox, ObjectNode obj_node, const char *filename);
199 void aadlbox_load(ObjectNode obj_node, int version, const char *filename,
200 			Aadlbox *aadlbox);
201 
202 /* aadldata.c */
203 void aadlbox_project_point_on_rectangle(Rectangle *rectangle,
204 					Point *p,real *angle);
205  void aadldata_project_point_on_nearest_border(Aadlbox *aadlbox,
206  					 Point *p,real *angle);
207 
208 /* aadlprocess.c */
209 
210 void
211 aadlbox_inclined_project_point_on_nearest_border(Aadlbox *aadlbox,Point *p,
212 						 real *angle);
213 void aadlprocess_text_position(Aadlbox *aadlbox, Point *p);
214 real aadlprocess_blank_space_height(Aadlbox *aadlbox);
215 real aadlprocess_blank_space_width(Aadlbox *aadlbox);
216 
217 /* aadlthread.c */
218 void aadlbox_draw_inclined_box(Aadlbox *aadlbox, DiaRenderer *renderer,
219 				      LineStyle linestyle);
220 /* aadlsubprogram.c */
221 void
222 aadlsubprogram_project_point_on_nearest_border(Aadlbox *aadlbox,Point *p,
223 					       real *angle);
224 /* aadlsystem.c */
225 void aadlbox_draw_rounded_box (Aadlbox *aadlbox, DiaRenderer *renderer,
226 			       LineStyle linestyle);
227 
228 
229