[Date Prev ][Date Next ] [Thread Prev ][Thread Next ]
[Thread Index ]
[Date Index ]
[Author Index ]
Re: Patch: New UML/CCM elements facet, receptacle, event source/sink
From : debacle <debacle knorke in-berlin de>
To : dia-list gnome org
Cc : lrclause cs uiuc edu
Subject : Re: Patch: New UML/CCM elements facet, receptacle, event source/sink
Date : Mon, 18 Aug 2003 22:55:11 +0000
On Mon, Aug 18, 2003 at 01:29:13AM -0500, Lars Clausen wrote:
> Why can't you just do orthconn_init() and then object_add_connectionpoint()?
OK, I rewrote the code to use object_add_connectionpoint().
I hope, you did not yet apply my patch, because I took the
chance to rename 'conn' to 'orth', as in all other dia files
I saw. I also renamed 'compprop' (= component property)
into 'compfeat' (= component feature), with the source file
component_feature.c instead of compprop.c, but that's only
a small change.
object_add_connectionpoint() is nice, because I can use the
connection point for facet and event source, while using
only a handle for receptacle and event sink - this is much
more usable. Why is this function not used by others? :-)
Cheers,
--
W. Borgert <debacle@debian.org>, Linux User #7456 http://counter.li.org/
diff -uraN dia.cvs/objects/UML/component_feature.c dia.facet/objects/UML/component_feature.c
--- dia.cvs/objects/UML/component_feature.c 1970-01-01 00:00:00.000000000 +0000
+++ dia.facet/objects/UML/component_feature.c 2003-08-18 22:45:46.000000000 +0000
@@ -0,0 +1,511 @@
+/* Dia -- an diagram creation/manipulation program
+ * Copyright (C) 1998 Alexander Larsson
+ * Copyright (C) 2003 W. Borgert <debacle@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * Derived from association.c and implements.c
+ * 2003-08-13, 2003-08-15: W. Borgert <debacle@debian.org>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <assert.h>
+#include <math.h>
+#include <string.h>
+
+#include "intl.h"
+#include "object.h"
+#include "orth_conn.h"
+#include "connectionpoint.h"
+#include "diarenderer.h"
+#include "handle.h"
+#include "properties.h"
+#include "text.h"
+
+#include "pixmaps/facet.xpm"
+
+typedef struct _Compfeat Compfeat;
+
+typedef enum {
+ COMPPROP_FACET,
+ COMPPROP_RECEPTACLE,
+ COMPPROP_EVENTSOURCE,
+ COMPPROP_EVENTSINK,
+} CompRole;
+
+struct _Compfeat {
+ OrthConn orth;
+
+ ConnectionPoint cp;
+
+ CompRole role;
+ CompRole roletmp;
+
+ Text *text;
+ TextAttributes attrs;
+};
+
+#define COMPPROP_WIDTH 0.1
+#define COMPPROP_FONTHEIGHT 0.8
+#define COMPPROP_DIAMETER 0.8
+#define COMPPROP_DEFAULTLEN 2.0
+#define COMPPROP_TEXTOFFSET 0.8
+
+static ObjectChange* compfeat_move_handle(Compfeat *compfeat,
+ Handle *handle,
+ Point *to,
+ HandleMoveReason reason,
+ ModifierKeys modifiers);
+static ObjectChange* compfeat_move(Compfeat *compfeat, Point *to);
+static void compfeat_select(Compfeat *compfeat, Point *clicked_point,
+ DiaRenderer *interactive_renderer);
+static void compfeat_draw(Compfeat *compfeat, DiaRenderer *renderer);
+static Object *compfeat_create(Point *startpoint,
+ void *user_data,
+ Handle **handle1,
+ Handle **handle2);
+static real compfeat_distance_from(Compfeat *compfeat, Point *point);
+static void compfeat_update_data(Compfeat *compfeat);
+static void compfeat_destroy(Compfeat *compfeat);
+static DiaMenu *compfeat_get_object_menu(Compfeat *compfeat,
+ Point *clickedpoint);
+static PropDescription *compfeat_describe_props(Compfeat *compfeat);
+static void compfeat_get_props(Compfeat * compfeat, GPtrArray *props);
+static void compfeat_set_props(Compfeat * compfeat, GPtrArray *props);
+static Object *compfeat_load(ObjectNode obj_node, int version,
+ const char *filename);
+
+
+static ObjectTypeOps compfeat_type_ops =
+{
+ (CreateFunc) compfeat_create,
+ (LoadFunc) compfeat_load,
+ (SaveFunc) object_save_using_properties,
+ (GetDefaultsFunc) NULL,
+ (ApplyDefaultsFunc) NULL
+};
+
+ObjectType compfeat_type =
+{
+ "UML - Component Feature", /* name */
+ 0, /* version */
+ (char **) facet_xpm, /* pixmap */
+ &compfeat_type_ops, /* ops */
+ NULL, /* pixmap file */
+ 0 /* default user data */
+};
+
+static ObjectOps compfeat_ops = {
+ (DestroyFunc) compfeat_destroy,
+ (DrawFunc) compfeat_draw,
+ (DistanceFunc) compfeat_distance_from,
+ (SelectFunc) compfeat_select,
+ (CopyFunc) object_copy_using_properties,
+ (MoveFunc) compfeat_move,
+ (MoveHandleFunc) compfeat_move_handle,
+ (GetPropertiesFunc) object_create_props_dialog,
+ (ApplyPropertiesFunc) object_apply_props_from_dialog,
+ (ObjectMenuFunc) compfeat_get_object_menu,
+ (DescribePropsFunc) compfeat_describe_props,
+ (GetPropsFunc) compfeat_get_props,
+ (SetPropsFunc) compfeat_set_props
+};
+
+static PropEnumData prop_compfeat_type_data[] = {
+ { N_("Facet"), COMPPROP_FACET },
+ { N_("Receptacle"), COMPPROP_RECEPTACLE },
+ { N_("Event Source"), COMPPROP_EVENTSOURCE },
+ { N_("Event Sink"), COMPPROP_EVENTSINK },
+ { NULL, 0}
+};
+
+static PropDescription compfeat_props[] = {
+ ORTHCONN_COMMON_PROPERTIES,
+ { "role", PROP_TYPE_ENUM, 0, NULL, NULL, prop_compfeat_type_data },
+ PROP_STD_TEXT_FONT,
+ PROP_STD_TEXT_HEIGHT,
+ PROP_STD_TEXT_COLOUR,
+ { "text", PROP_TYPE_TEXT, 0, N_("Text"), NULL, NULL },
+ PROP_DESC_END
+};
+
+static ObjectChange *
+compfeat_add_segment_callback(Object *obj, Point *clicked, gpointer data)
+{
+ ObjectChange *change;
+ change = orthconn_add_segment((OrthConn *)obj, clicked);
+ compfeat_update_data((Compfeat *)obj);
+ return change;
+}
+
+static ObjectChange *
+compfeat_delete_segment_callback(Object *obj, Point *clicked, gpointer data)
+{
+ ObjectChange *change;
+ change = orthconn_delete_segment((OrthConn *)obj, clicked);
+ compfeat_update_data((Compfeat *)obj);
+ return change;
+}
+
+static DiaMenuItem object_menu_items[] = {
+ { N_("Add segment"), compfeat_add_segment_callback, NULL, 1 },
+ { N_("Delete segment"), compfeat_delete_segment_callback, NULL, 1 },
+ ORTHCONN_COMMON_MENUS,
+};
+
+static DiaMenu object_menu = {
+ "Association",
+ sizeof(object_menu_items)/sizeof(DiaMenuItem),
+ object_menu_items,
+ NULL
+};
+
+static DiaMenu *
+compfeat_get_object_menu(Compfeat *compfeat, Point *clickedpoint)
+{
+ OrthConn *orth;
+
+ orth = &compfeat->orth;
+ /* Set entries sensitive/selected etc here */
+ object_menu_items[0].active =
+ orthconn_can_add_segment(orth, clickedpoint);
+ object_menu_items[1].active =
+ orthconn_can_delete_segment(orth, clickedpoint);
+ orthconn_update_object_menu(orth, clickedpoint, &object_menu_items[2]);
+ return &object_menu;
+}
+
+static PropDescription *
+compfeat_describe_props(Compfeat *compfeat)
+{
+ if (compfeat_props[0].quark == 0)
+ prop_desc_list_calculate_quarks(compfeat_props);
+ return compfeat_props;
+}
+
+static PropOffset compfeat_offsets[] = {
+ ORTHCONN_COMMON_PROPERTIES_OFFSETS,
+ { "role", PROP_TYPE_ENUM, offsetof(Compfeat, role) },
+ { "text", PROP_TYPE_TEXT, offsetof(Compfeat, text) },
+ { "text_font", PROP_TYPE_FONT, offsetof(Compfeat, attrs.font) },
+ { "text_height", PROP_TYPE_REAL, offsetof(Compfeat, attrs.height) },
+ { "text_colour", PROP_TYPE_COLOUR, offsetof(Compfeat, attrs.color) },
+ { NULL, 0, 0 }
+};
+
+static void
+compfeat_get_props(Compfeat *compfeat, GPtrArray *props)
+{
+ if (compfeat->roletmp)
+ compfeat->role = compfeat->roletmp;
+ text_get_attributes(compfeat->text, &compfeat->attrs);
+ object_get_props_from_offsets(&compfeat->orth.object,
+ compfeat_offsets, props);
+}
+
+static void
+compfeat_set_props(Compfeat *compfeat, GPtrArray *props)
+{
+ object_set_props_from_offsets(&compfeat->orth.object,
+ compfeat_offsets, props);
+ apply_textattr_properties(props, compfeat->text, "text", &compfeat->attrs);
+ compfeat_update_data(compfeat);
+}
+
+static real
+compfeat_distance_from(Compfeat *compfeat, Point *point)
+{
+ OrthConn *orth = &compfeat->orth;
+ return orthconn_distance_from(orth, point, COMPPROP_WIDTH);
+}
+
+static void
+compfeat_select(Compfeat *compfeat, Point *clicked_point,
+ DiaRenderer *interactive_renderer)
+{
+ text_set_cursor(compfeat->text, clicked_point, interactive_renderer);
+ text_grab_focus(compfeat->text, &compfeat->orth.object);
+ orthconn_update_data(&compfeat->orth);
+}
+
+static ObjectChange*
+compfeat_move_handle(Compfeat *compfeat, Handle *handle,
+ Point *to, HandleMoveReason reason,
+ ModifierKeys modifiers)
+{
+ ObjectChange *change;
+
+ assert(compfeat!=NULL);
+ assert(handle!=NULL);
+ assert(to!=NULL);
+
+ change = orthconn_move_handle(&compfeat->orth, handle, to, reason);
+ compfeat_update_data(compfeat);
+
+ return change;
+}
+
+static ObjectChange*
+compfeat_move(Compfeat *compfeat, Point *to)
+{
+ ObjectChange *change;
+
+ change = orthconn_move(&compfeat->orth, to);
+ compfeat_update_data(compfeat);
+
+ return change;
+}
+
+static void
+compfeat_draw(Compfeat *compfeat, DiaRenderer *renderer)
+{
+ DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer);
+ Point *points;
+ Point p;
+ Point save0;
+ OrthConn *orth = &compfeat->orth;
+ int n;
+ gchar directions;
+
+ assert(compfeat != NULL);
+ assert(renderer != NULL);
+
+ points = &orth->points[0];
+ n = orth->numpoints;
+
+ renderer_ops->set_linewidth(renderer, COMPPROP_WIDTH);
+ renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID);
+ renderer_ops->set_linecaps(renderer, LINECAPS_BUTT);
+
+ save0 = points[0];
+ if (compfeat->orth.orientation[0] == HORIZONTAL) {
+ directions = (save0.x > points[1].x)? DIR_EAST: DIR_WEST;
+ } else {
+ directions = (save0.y > points[1].y)? DIR_SOUTH: DIR_NORTH;
+ }
+
+ if (compfeat->role == COMPPROP_FACET
+ || compfeat->role == COMPPROP_EVENTSOURCE)
+ compfeat->cp.directions = directions;
+
+ switch (directions) {
+ case DIR_EAST:
+ points[0].x -= COMPPROP_DIAMETER;
+ p = save0;
+ p.x -= COMPPROP_DIAMETER/2.0;
+ break;
+ case DIR_WEST:
+ points[0].x += COMPPROP_DIAMETER;
+ p = save0;
+ p.x += COMPPROP_DIAMETER/2.0;
+ break;
+ case DIR_SOUTH:
+ points[0].y -= COMPPROP_DIAMETER;
+ p = save0;
+ p.y -= COMPPROP_DIAMETER/2.0;
+ break;
+ case DIR_NORTH:
+ points[0].y += COMPPROP_DIAMETER;
+ p = save0;
+ p.y += COMPPROP_DIAMETER/2.0;
+ break;
+ }
+
+ renderer_ops->draw_polyline(renderer, points, n, &color_black);
+
+ if (compfeat->role == COMPPROP_FACET) {
+ renderer_ops->fill_ellipse(renderer, &p,
+ COMPPROP_DIAMETER, COMPPROP_DIAMETER,
+ &color_white);
+ renderer_ops->draw_ellipse(renderer, &p,
+ COMPPROP_DIAMETER, COMPPROP_DIAMETER,
+ &color_black);
+ } else if (compfeat->role == COMPPROP_RECEPTACLE) {
+ real start = 90.0, end = 270.0;
+
+ switch (directions) {
+ case DIR_WEST:
+ start = 270.0;
+ end = 90.0;
+ break;
+ case DIR_SOUTH:
+ start = 0.0;
+ end = 180.0;
+ break;
+ case DIR_NORTH:
+ start = 180.0;
+ end = 0.0;
+ break;
+ }
+ renderer_ops->draw_arc(renderer, &p,
+ COMPPROP_DIAMETER, COMPPROP_DIAMETER,
+ start, end, &color_black);
+ } else if (compfeat->role == COMPPROP_EVENTSOURCE) {
+ Point poly[4];
+
+ poly[0].x = p.x + COMPPROP_DIAMETER/2.0;
+ poly[0].y = p.y;
+ poly[1].x = p.x;
+ poly[1].y = p.y - COMPPROP_DIAMETER/2.0;
+ poly[2].x = p.x - COMPPROP_DIAMETER/2.0;
+ poly[2].y = p.y;
+ poly[3].x = p.x;
+ poly[3].y = p.y + COMPPROP_DIAMETER/2.0;
+ renderer_ops->fill_polygon(renderer, poly, 4, &color_white);
+ renderer_ops->draw_polygon(renderer, poly, 4, &color_black);
+ } else if (compfeat->role == COMPPROP_EVENTSINK) {
+ Point poly[3];
+
+ poly[0] = poly[2] = p;
+ poly[1] = points[0];
+ switch (directions) {
+ case DIR_EAST:
+ poly[0].y -= COMPPROP_DIAMETER/2.0;
+ poly[2].y += COMPPROP_DIAMETER/2.0;
+ break;
+ case DIR_WEST:
+ poly[0].y += COMPPROP_DIAMETER/2.0;
+ poly[2].y -= COMPPROP_DIAMETER/2.0;
+ break;
+ case DIR_SOUTH:
+ poly[0].x += COMPPROP_DIAMETER/2.0;
+ poly[2].x -= COMPPROP_DIAMETER/2.0;
+ break;
+ case DIR_NORTH:
+ poly[0].x -= COMPPROP_DIAMETER/2.0;
+ poly[2].x += COMPPROP_DIAMETER/2.0;
+ break;
+ }
+ renderer_ops->draw_polyline(renderer, poly, 3, &color_black);
+ }
+
+ text_draw(compfeat->text, renderer);
+
+ /* restore old value */
+ points[0] = save0;
+}
+
+static Object *
+compfeat_create(Point *startpoint,
+ void *user_data,
+ Handle **handle1,
+ Handle **handle2)
+{
+ Compfeat *compfeat;
+ OrthConn *orth;
+ Object *obj;
+ Point p;
+ DiaFont *font;
+
+ font = dia_font_new_from_style(DIA_FONT_MONOSPACE, 0.8);
+
+ compfeat = g_new0(Compfeat, 1);
+ compfeat->role = compfeat->roletmp = GPOINTER_TO_INT(user_data);
+
+ orth = &compfeat->orth;
+ obj = &orth->object;
+
+ obj->type = &compfeat_type;
+ obj->ops = &compfeat_ops;
+
+ orthconn_init(orth, startpoint);
+
+ p = *startpoint;
+
+ compfeat->text = new_text("", font,
+ COMPPROP_FONTHEIGHT, &p, &color_black,
+ ALIGN_CENTER);
+ dia_font_unref(font);
+ text_get_attributes(compfeat->text, &compfeat->attrs);
+
+ if (compfeat->role == COMPPROP_FACET
+ || compfeat->role == COMPPROP_EVENTSOURCE) {
+ object_add_connectionpoint(&orth->object, &compfeat->cp);
+ obj->connections[0] = &compfeat->cp;
+ compfeat->cp.object = obj;
+ compfeat->cp.connected = NULL;
+ }
+
+ compfeat_update_data(compfeat);
+
+ *handle1 = orth->handles[0];
+ *handle2 = orth->handles[orth->numpoints-2];
+
+ return &compfeat->orth.object;
+}
+
+
+static void
+compfeat_destroy(Compfeat *compfeat)
+{
+ text_destroy(compfeat->text);
+ orthconn_destroy(&compfeat->orth);
+}
+
+static void
+compfeat_update_data(Compfeat *compfeat)
+{
+ OrthConn *orth = &compfeat->orth;
+ PolyBBExtras *extra = &orth->extra_spacing;
+ int n;
+ Object *obj = &orth->object;
+ Rectangle rect;
+ Point p;
+ Point *points;
+
+ points = &orth->points[0];
+ n = orth->numpoints;
+
+ obj->position = points[0];
+
+ if (compfeat->role == COMPPROP_FACET
+ || compfeat->role == COMPPROP_EVENTSOURCE)
+ compfeat->cp.pos = points[0];
+
+ orthconn_update_data(orth);
+
+ /* Boundingbox: */
+ extra->start_long =
+ extra->start_trans =
+ extra->end_long = COMPPROP_WIDTH + COMPPROP_DIAMETER;
+ extra->end_trans = COMPPROP_WIDTH + COMPPROP_DIAMETER;
+
+ orthconn_update_boundingbox(orth);
+
+ /* Add boundingbox for text: */
+ p.x = (points[0].x < points[1].x)?
+ points[0].x + COMPPROP_TEXTOFFSET:
+ points[0].x - COMPPROP_TEXTOFFSET;
+ p.y = points[0].y
+ - (compfeat->text->height * compfeat->text->numlines);
+ text_set_alignment(compfeat->text,
+ (points[0].x < points[1].x)?
+ ALIGN_LEFT: ALIGN_RIGHT);
+ text_set_position(compfeat->text, &p);
+ text_calc_boundingbox(compfeat->text, &rect);
+ rectangle_union(&obj->bounding_box, &rect);
+}
+
+static Object *
+compfeat_load(ObjectNode obj_node, int version, const char *filename)
+{
+ return object_load_using_properties(&compfeat_type,
+ obj_node, version, filename);
+}
diff -uraN dia.cvs/objects/UML/Makefile.am dia.facet/objects/UML/Makefile.am
--- dia.cvs/objects/UML/Makefile.am 2002-09-09 12:35:23.000000000 +0000
+++ dia.facet/objects/UML/Makefile.am 2003-08-18 22:46:09.000000000 +0000
@@ -22,6 +22,7 @@
object.c \
lifeline.c \
component.c \
+ component_feature.c \
classicon.c \
state.c \
activity.c \
@@ -45,6 +46,7 @@
pixmaps/constraint.xpm \
pixmaps/dependency.xpm \
pixmaps/generalization.xpm \
+ pixmaps/facet.xpm \
pixmaps/implements.xpm \
pixmaps/largepackage.xpm \
pixmaps/lifeline.xpm \
diff -uraN dia.cvs/objects/UML/pixmaps/facet.xpm dia.facet/objects/UML/pixmaps/facet.xpm
--- dia.cvs/objects/UML/pixmaps/facet.xpm 1970-01-01 00:00:00.000000000 +0000
+++ dia.facet/objects/UML/pixmaps/facet.xpm 2003-08-18 22:46:31.000000000 +0000
@@ -0,0 +1,28 @@
+/* XPM */
+static char * facet_xpm[] = {
+"22 22 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ... ",
+" .+++. ",
+" .+++++. ",
+" .+++++............ ",
+" .+++++. ",
+" .+++. ",
+" ... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff -uraN dia.cvs/sheets/UML/eventsink.xpm dia.facet/sheets/UML/eventsink.xpm
--- dia.cvs/sheets/UML/eventsink.xpm 1970-01-01 00:00:00.000000000 +0000
+++ dia.facet/sheets/UML/eventsink.xpm 2003-08-18 22:45:18.000000000 +0000
@@ -0,0 +1,27 @@
+/* XPM */
+static char * eventsink_xpm[] = {
+"22 22 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" . ",
+" . ",
+" . ",
+" . ",
+" .............. ",
+" . ",
+" . ",
+" . ",
+" . ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff -uraN dia.cvs/sheets/UML/eventsource.xpm dia.facet/sheets/UML/eventsource.xpm
--- dia.cvs/sheets/UML/eventsource.xpm 1970-01-01 00:00:00.000000000 +0000
+++ dia.facet/sheets/UML/eventsource.xpm 2003-08-18 22:45:18.000000000 +0000
@@ -0,0 +1,28 @@
+/* XPM */
+static char * eventsource_xpm[] = {
+"22 22 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" . ",
+" .+. ",
+" .+++. ",
+" .+++++. ",
+" .+++++++.......... ",
+" .+++++. ",
+" .+++. ",
+" .+. ",
+" . ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff -uraN dia.cvs/sheets/UML/Makefile.am dia.facet/sheets/UML/Makefile.am
--- dia.cvs/sheets/UML/Makefile.am 1999-12-06 16:08:12.000000000 +0000
+++ dia.facet/sheets/UML/Makefile.am 2003-08-18 22:44:32.000000000 +0000
@@ -3,7 +3,10 @@
PIX = \
umlclass_template.xpm \
- aggregation.xpm
+ aggregation.xpm \
+ receptacle.xpm \
+ eventsource.xpm \
+ eventsink.xpm
UMLsheet_DATA = $(PIX)
EXTRA_DIST = $(PIX)
diff -uraN dia.cvs/sheets/UML/receptacle.xpm dia.facet/sheets/UML/receptacle.xpm
--- dia.cvs/sheets/UML/receptacle.xpm 1970-01-01 00:00:00.000000000 +0000
+++ dia.facet/sheets/UML/receptacle.xpm 2003-08-18 22:45:18.000000000 +0000
@@ -0,0 +1,27 @@
+/* XPM */
+static char * receptacle_xpm[] = {
+"22 22 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .. ",
+" . ",
+" . ",
+" ............... ",
+" . ",
+" . ",
+" .. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff -uraN dia.cvs/sheets/UML.sheet.in dia.facet/sheets/UML.sheet.in
--- dia.cvs/sheets/UML.sheet.in 2003-04-30 21:03:38.000000000 +0000
+++ dia.facet/sheets/UML.sheet.in 2003-08-18 22:44:53.000000000 +0000
@@ -59,6 +59,21 @@
<object name="UML - Component">
<_description>Component</_description>
</object>
+ <object name="UML - Component Feature" intdata="0">
+ <_description>Facet</_description>
+ </object>
+ <object name="UML - Component Feature" intdata="1">
+ <_description>Receptacle</_description>
+ <icon>UML/receptacle.xpm</icon>
+ </object>
+ <object name="UML - Component Feature" intdata="2">
+ <_description>Event Source</_description>
+ <icon>UML/eventsource.xpm</icon>
+ </object>
+ <object name="UML - Component Feature" intdata="3">
+ <_description>Event Sink</_description>
+ <icon>UML/eventsink.xpm</icon>
+ </object>
<object name="UML - Node">
<_description>Node</_description>
</object>
[Date Prev ][Date Next ] [Thread Prev ][Thread Next ]
[Thread Index ]
[Date Index ]
[Author Index ]
Mail converted by Mofo Magic and the Flying D
All trademarks and copyrights are the property of
their respective owners.
Other Directory Sites:
SeekWonder |
Directory Owners Forum
GuideSMACK