Ok, here's a diff that adds defaults dialogs for the various line tools,
arrowheads, middle button menus, polyline, this time with save/load working
properly.
There's a few bugs I know of:
The arrowheads for arcs don't point the right way.  Still have to sit down
and figure out the right way to do this.
Lines still have the crashbug we've been talking about.
There's no way to change the size of the arrowheads.
There's no default middle button menu.
There's no defaults dialog for boxes or text.

These things are all on my TODO list, though I'd like any clues about the
crashbug. 

After the diffs is a uuencoded tarball of the new files needed (polyline,
defaults).  Is there a way I can force them into the diff?

-Lars

? TODO.lrclause
? install
? make.log
? test.dia
? defaults.diff
? app/defaults.c
? app/defaults.h
? lib/poly_conn.h
? lib/bez_conn.c
? lib/bez_conn.h
? lib/poly_conn.c
? objects/standard/bezierline.c
? objects/standard/polyline.lo
? objects/standard/polyline.c
? objects/standard/pixmaps/bezier.xpm
? objects/standard/pixmaps/polyline.xpm
Index: app/Makefile.am
===================================================================
RCS file: /cvs/gnome/dia/app/Makefile.am,v
retrieving revision 1.10
diff -u -r1.10 Makefile.am
--- Makefile.am 1999/01/25 13:18:36     1.10
+++ Makefile.am 1999/01/28 03:54:36
@@ -41,6 +41,8 @@
            scroll_tool.h \
            properties.c \
            properties.h \
+           defaults.c \
+           defaults.h \
            create_object.c \
            create_object.h \
            magnify.c \
Index: app/app_procs.c
===================================================================
RCS file: /cvs/gnome/dia/app/app_procs.c,v
retrieving revision 1.10
diff -u -r1.10 app_procs.c
--- app_procs.c 1999/01/25 13:24:07     1.10
+++ app_procs.c 1999/01/28 03:54:36
@@ -196,7 +196,7 @@
            "object-libs, exiting...\n"));
     exit(1);
   }
-    
+
   active_tool = create_modify_tool();
 
   create_toolbox();
@@ -440,6 +440,7 @@
 
     if ((error = dlerror()) != NULL)  {
       message_warning(_("Unable to find register_sheets in library:\n%s"), error);
+      list = g_list_next(list);
       continue;
     }
 
Index: app/create_object.c
===================================================================
RCS file: /cvs/gnome/dia/app/create_object.c,v
retrieving revision 1.4
diff -u -r1.4 create_object.c
--- create_object.c     1999/01/21 18:35:44     1.4
+++ create_object.c     1999/01/28 03:54:36
@@ -110,7 +110,7 @@
     tool->obj = NULL;
   }
   diagram_update_extents(ddisp->diagram);
-  /*  tool_reset(); */
+  /*  tool_reset();*/
 }
 static void
 create_object_motion(CreateObjectTool *tool, GdkEventMotion *event,
Index: app/disp_callbacks.c
===================================================================
RCS file: /cvs/gnome/dia/app/disp_callbacks.c,v
retrieving revision 1.5
diff -u -r1.5 disp_callbacks.c
--- disp_callbacks.c    1999/01/16 16:52:34     1.5
+++ disp_callbacks.c    1999/01/28 03:54:36
@@ -117,6 +117,7 @@
          break;
 
        case 2:
+         popup_object_menu(bevent, ddisp);
          break;
 
        case 3:
Index: app/interface.c
===================================================================
RCS file: /cvs/gnome/dia/app/interface.c,v
retrieving revision 1.7
diff -u -r1.7 interface.c
--- interface.c 1999/01/25 13:43:50     1.7
+++ interface.c 1999/01/28 03:54:36
@@ -86,6 +86,10 @@
   { NULL,
     N_("Create Zigzagline"),
     { CREATE_OBJECT_TOOL, "Standard - ZigZagLine", NULL }
+  },
+  { NULL,
+    "Create Polyline",
+    { CREATE_OBJECT_TOOL, "Standard - PolyLine", NULL }
   }
 };
 
@@ -236,12 +240,14 @@
                    GdkEventButton *event,
                    gpointer        data)
 {
-  /*
+  ToolButtonData *tooldata = (ToolButtonData *) data;
+
   if ((event->type == GDK_2BUTTON_PRESS) &&
-      (event->button == 1))
-    tools_options_dialog_show ();
-  */
-  
+      (event->button == 1)) {
+    tool_options_dialog_show (tooldata->type, tooldata->extra_data, 
+tooldata->user_data);
+    return TRUE;
+  }
+
   return FALSE;
 }
 
Index: app/menus.c
===================================================================
RCS file: /cvs/gnome/dia/app/menus.c,v
retrieving revision 1.11
diff -u -r1.11 menus.c
--- menus.c     1999/01/25 13:24:17     1.11
+++ menus.c     1999/01/28 03:54:36
@@ -26,6 +26,8 @@
 #include "menus.h"
 #include "commands.h"
 #include "message.h"
+#include "display.h"
+#include "interface.h"
 
 static GtkItemFactoryEntry toolbox_menu_items[] =
 {
@@ -255,4 +257,73 @@
   }  else {
     message_error(_("Unable to set state for menu which doesn't exist: %s"), path);
   }
+}
+
+/* This contains the point that was clicked to get this menu */
+static Point object_menu_clicked_point;
+
+void
+object_menu_proxy(GtkWidget *widget, gpointer data)
+{
+  ObjectMenuData *omd = (ObjectMenuData *)data;
+  DDisplay *ddisp = ddisplay_active();
+  int changed;
+  Object *obj = (Object *)diagram_get_sorted_selected(ddisp->diagram)->data;
+
+  object_add_updates(obj, ddisp->diagram);
+  (omd->callback)(obj, omd->data, &object_menu_clicked_point);
+  object_add_updates(obj, ddisp->diagram);
+  diagram_flush(ddisp->diagram);
+}
+
+void
+object_menu_proxify(GtkItemFactoryEntry *menu_items, int nmenu_items)
+{
+  int i;
+  ObjectMenuData *omd;
+
+  for (i = 0; i < nmenu_items; i++) {
+    if (menu_items[i].callback != NULL) {
+      omd = g_malloc(sizeof(*omd));
+      omd->callback = menu_items[i].callback;
+      /* Is the data really put into a *guint* ? */
+      omd->data = (gpointer)menu_items[i].callback_action;
+      menu_items[i].callback = object_menu_proxy;
+      menu_items[i].callback_action = (guint)omd;
+    }
+  }
+}
+
+void
+popup_object_menu(GdkEventButton *bevent, DDisplay *ddisp)
+{
+  Diagram *diagram;
+  real click_distance;
+  Object *obj;
+  Point clickedpoint;
+  GtkMenu *menu = NULL;
+  GList *selected_list;
+
+  diagram = ddisp->diagram;
+  if (diagram->data->selected_count != 1) return;
+  selected_list = diagram_get_sorted_selected(diagram);
+  /* Have to have exactly one selected object */
+  if (selected_list == NULL || g_list_next(selected_list) != NULL) {
+    message_error("Selected list is %s while selected_count is %d\n",
+                 (selected_list?"long":"empty"), diagram->data->selected_count);
+    return;
+  }
+  obj = (Object *)g_list_first(selected_list)->data;
+  if (obj->ops->get_object_menu == NULL)
+    return;
+  ddisplay_untransform_coords(ddisp,
+                             (int)bevent->x, (int)bevent->y,
+                             &clickedpoint.x, &clickedpoint.y);
+  /* Possibly react differently at a handle? */
+  /* Get its menu, if it has registered any */
+  menu = (obj->ops->get_object_menu)(obj, &clickedpoint);
+  if (menu == NULL) return;
+  object_menu_clicked_point = clickedpoint;
+  popup_shell = ddisp->shell;
+  gtk_menu_popup(menu, NULL, NULL, NULL, NULL, 0, 0);
 }
Index: app/menus.h
===================================================================
RCS file: /cvs/gnome/dia/app/menus.h,v
retrieving revision 1.3
diff -u -r1.3 menus.h
--- menus.h     1999/01/14 14:35:00     1.3
+++ menus.h     1999/01/28 03:54:36
@@ -20,6 +20,8 @@
 
 #include <gtk/gtk.h>
 
+#include <object.h>
+
 extern void menus_get_toolbox_menubar (GtkWidget         **menubar,
                                       GtkAccelGroup **accel);
 extern void menus_get_image_menu (GtkWidget         **menu,
@@ -29,6 +31,34 @@
                                       int                   sensitive);
 
 extern void menus_set_state (char *path, int   state);
+
+typedef struct _ObjectMenu ObjectMenu;
+
+struct _ObjectMenu {
+  GtkWidget *menu;
+  GtkAccelGroup *accel_group;
+  GtkItemFactory *item_factory;
+  GtkItemFactoryEntry *menu_items;
+  int nmenu_items;
+  void (*menu_modify_callback)(Object *, ObjectMenu *, Point *);
+};
+
+typedef struct _ObjectMenuData ObjectMenuData;
+
+struct _ObjectMenuData {
+  GtkItemFactoryCallback callback;
+  gpointer data;
+};
+
+extern void object_menu_registry_init(void);
+
+extern void object_register_menu(ObjectType *objtype,
+                                GtkItemFactoryEntry *menu_items[],
+                                int nmenu_items);
+
+extern void menus_get_object_menu (ObjectType *objtype,
+                                  GtkWidget **menu,
+                                  GtkAccelGroup **accel_group);
 
 #endif /* MENUS_H */
 
Index: app/properties.c
===================================================================
RCS file: /cvs/gnome/dia/app/properties.c,v
retrieving revision 1.6
diff -u -r1.6 properties.c
--- properties.c        1999/01/16 13:20:12     1.6
+++ properties.c        1999/01/28 03:54:36
@@ -126,6 +126,3 @@
   current_dia = dia;
 }
 
-
-
-
Index: app/tool.c
===================================================================
RCS file: /cvs/gnome/dia/app/tool.c,v
retrieving revision 1.2
diff -u -r1.2 tool.c
--- tool.c      1999/01/14 14:35:22     1.2
+++ tool.c      1999/01/28 03:54:36
@@ -60,9 +60,64 @@
 }
 
 void
+tool_options_dialog_show(ToolType type, gpointer extra_data, 
+                        gpointer user_data) 
+{
+  ObjectType *objtype;
+ 
+  if (active_tool->type != type) {
+    switch(active_tool->type) {
+    case MODIFY_TOOL:
+      free_modify_tool(active_tool);
+      break;
+    case CREATE_OBJECT_TOOL:
+      free_create_object_tool(active_tool);
+      break;
+    case MAGNIFY_TOOL:
+      free_magnify_tool(active_tool);
+      break;
+    case SCROLL_TOOL:
+      free_scroll_tool(active_tool);
+      break;
+    }
+    switch(type) {
+    case MODIFY_TOOL:
+      active_tool = create_modify_tool();
+      break;
+    case CREATE_OBJECT_TOOL:
+      active_tool =
+       create_create_object_tool(object_get_type((char *)extra_data),
+                                 (void *) user_data);
+      break;
+    case MAGNIFY_TOOL:
+      active_tool = create_magnify_tool();
+      break;
+    case SCROLL_TOOL:
+      active_tool = create_scroll_tool();
+      break;
+    }
+  }
+  switch(type) {
+  case MODIFY_TOOL:
+      break;
+  case CREATE_OBJECT_TOOL:
+    objtype = object_get_type((char *)extra_data);
+    if (objtype->ops->get_defaults) {
+      defaults_show(objtype);
+    }
+    break;
+  case MAGNIFY_TOOL:
+    break;
+  case SCROLL_TOOL:
+    break;
+  }
+}
+
+void
 tool_reset(void)
 {
   tool_select(MODIFY_TOOL, NULL, NULL); 
   gtk_signal_emit_by_name(GTK_OBJECT(modify_tool_button), "clicked",
                          GTK_BUTTON(modify_tool_button), NULL);
 }
+
Index: app/tool.h
===================================================================
RCS file: /cvs/gnome/dia/app/tool.h,v
retrieving revision 1.2
diff -u -r1.2 tool.h
--- tool.h      1999/01/14 14:35:23     1.2
+++ tool.h      1999/01/28 03:54:36
@@ -58,6 +58,8 @@
 
 extern void tool_select(ToolType type, gpointer extra_data, gpointer user_date);
 extern void tool_reset();
+extern void tool_options_dialog_show(ToolType type, gpointer extra_data, 
+                                    gpointer user_data);
 
 #endif /* TOOL_H */
 
Index: lib/Makefile.am
===================================================================
RCS file: /cvs/gnome/dia/lib/Makefile.am,v
retrieving revision 1.6
diff -u -r1.6 Makefile.am
--- Makefile.am 1998/12/17 04:09:53     1.6
+++ Makefile.am 1999/01/28 03:54:37
@@ -39,6 +39,8 @@
                connection.h \
                orth_conn.c \
                orth_conn.h \
+               poly_conn.c \
+               poly_conn.h \
                connection.h \
                element.c \
                element.h \
Index: lib/arrows.h
===================================================================
RCS file: /cvs/gnome/dia/lib/arrows.h,v
retrieving revision 1.2
diff -u -r1.2 arrows.h
--- arrows.h    1999/01/14 14:36:04     1.2
+++ arrows.h    1999/01/28 03:54:37
@@ -21,14 +21,6 @@
 #include "geometry.h"
 #include "render.h"
 
-typedef enum {
-  ARROW_LINES,
-  ARROW_HOLLOW_TRIANGLE,
-  ARROW_FILLED_TRIANGLE,
-  ARROW_HOLLOW_DIAMOND,
-  ARROW_FILLED_DIAMOND
-} ArrowType;
-
 
 extern void arrow_draw(Renderer *renderer, ArrowType type,
                       Point *to, Point *from,
Index: lib/message.c
===================================================================
RCS file: /cvs/gnome/dia/lib/message.c,v
retrieving revision 1.4
diff -u -r1.4 message.c
--- message.c   1999/01/16 13:20:15     1.4
+++ message.c   1999/01/28 03:54:37
@@ -32,8 +32,11 @@
   GtkWidget *dialog_window = NULL;
   GtkWidget *label;
   GtkWidget *button;
+  gint len;
 
-  gint len = format_string_length_upper_bound (fmt, args);
+  vfprintf(stderr, fmt, args);
+
+  len = format_string_length_upper_bound (fmt, args);
 
   if (len >= alloc) {
     if (buf)
Index: lib/object.h
===================================================================
RCS file: /cvs/gnome/dia/lib/object.h,v
retrieving revision 1.8
diff -u -r1.8 object.h
--- object.h    1999/01/12 23:03:36     1.8
+++ object.h    1999/01/28 03:54:37
@@ -172,6 +172,23 @@
 typedef void (*ApplyPropertiesFunc) (Object* obj);
 
 /*
+  Function called when the user has double clicked on an Tool.
+  This function should return a dialog to edit the defaults
+  of the tool.
+  When this function is called and the dialog already is created,
+  make sure to update the values in the widgets so that it
+  accurately describes the current state of the tool.
+  Remember to destroy this dialog when the object is destroyed!
+*/
+typedef GtkWidget *(*GetDefaultsFunc) ();
+
+/*
+  Thiss function is called when the user clicks on
+  the "Apply" button.
+*/
+typedef void (*ApplyDefaultsFunc) ();
+
+/*
   Return TRUE if object does not contain anything
   (i.e. is empty on the screen)
   Then it will be removed, because the user cannot select it to
@@ -180,8 +197,11 @@
   This is mainly used by TextObj.
 */
 typedef int  (*IsEmptyFunc) (Object* obj);
-
 
+/*
+  Return an object-specific menu with toggles etc. properly set.
+*/
+typedef GtkMenu *(*ObjectMenuFunc) (Object* obj, Point *position);
 
 /*************************************
  **  The functions provided in object.c
@@ -232,14 +252,14 @@
   GetPropertiesFunc   get_properties;
   ApplyPropertiesFunc apply_properties;
   IsEmptyFunc         is_empty;
-  
+  ObjectMenuFunc      get_object_menu;
   /*
     Unused places (for extension).
     These should be NULL for now. In the future they might be used.
     Then an older object will be binary compatible, because all new code
     checks if new ops are supported (!= NULL)
   */
-  void      (*(unused[10]))(Object *obj,...); 
+  void      (*(unused[9]))(Object *obj,...); 
 };
 
 /*
@@ -268,9 +288,11 @@
 };
 
 struct _ObjectTypeOps {
-   CreateFunc create;
-   LoadFunc   load;
-   SaveFunc   save;
+  CreateFunc create;
+  LoadFunc   load;
+  SaveFunc   save;
+  GetDefaultsFunc   get_defaults;
+  ApplyDefaultsFunc apply_defaults;
 };
 
 /*
Index: lib/render.h
===================================================================
RCS file: /cvs/gnome/dia/lib/render.h,v
retrieving revision 1.4
diff -u -r1.4 render.h
--- render.h    1999/01/14 14:36:31     1.4
+++ render.h    1999/01/28 03:54:37
@@ -46,6 +46,15 @@
 } LineStyle;
 
 typedef enum {
+  ARROW_NONE,
+  ARROW_LINES,
+  ARROW_HOLLOW_TRIANGLE,
+  ARROW_FILLED_TRIANGLE,
+  ARROW_HOLLOW_DIAMOND,
+  ARROW_FILLED_DIAMOND
+} ArrowType;
+
+typedef enum {
   FILLSTYLE_SOLID
 } FillStyle;
 
Index: lib/widgets.c
===================================================================
RCS file: /cvs/gnome/dia/lib/widgets.c,v
retrieving revision 1.5
diff -u -r1.5 widgets.c
--- widgets.c   1999/01/14 14:36:43     1.5
+++ widgets.c   1999/01/28 03:54:37
@@ -533,5 +533,113 @@
 }
 
 
+/************* DiaArrowTypeSelector: ***************/
+static void
+dia_arrow_type_selector_class_init (DiaArrowTypeSelectorClass *class)
+{
+  GtkObjectClass *object_class;
+  
+  object_class = (GtkObjectClass*) class;
+}
 
+static void
+dia_arrow_type_selector_init (DiaArrowTypeSelector *fs)
+{
+  GtkWidget *menu;
+  GtkWidget *submenu;
+  GtkWidget *menuitem;
+  GSList *group;
+  
+  menu = gtk_menu_new ();
+  fs->arrow_type_menu = GTK_MENU(menu);
+  submenu = NULL;
+  group = NULL;
 
+  menuitem = gtk_radio_menu_item_new_with_label (group, "None");
+  gtk_object_set_user_data(GTK_OBJECT(menuitem), GINT_TO_POINTER(ARROW_NONE));
+  group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
+  gtk_menu_append (GTK_MENU (menu), menuitem);
+  gtk_widget_show (menuitem);
+
+  menuitem = gtk_radio_menu_item_new_with_label (group, "Lines");
+  gtk_object_set_user_data(GTK_OBJECT(menuitem), GINT_TO_POINTER(ARROW_LINES));
+  group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
+  gtk_menu_append (GTK_MENU (menu), menuitem);
+  gtk_widget_show (menuitem);
+
+  menuitem = gtk_radio_menu_item_new_with_label (group, "Hollow Triangle");
+  gtk_object_set_user_data(GTK_OBJECT(menuitem), 
+GINT_TO_POINTER(ARROW_HOLLOW_TRIANGLE));
+  group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
+  gtk_menu_append (GTK_MENU (menu), menuitem);
+  gtk_widget_show (menuitem);
+
+  menuitem = gtk_radio_menu_item_new_with_label (group, "Filled Triangle");
+  gtk_object_set_user_data(GTK_OBJECT(menuitem), 
+GINT_TO_POINTER(ARROW_FILLED_TRIANGLE));
+  group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
+  gtk_menu_append (GTK_MENU (menu), menuitem);
+  gtk_widget_show (menuitem);
+  
+  menuitem = gtk_radio_menu_item_new_with_label (group, "Hollow Diamond");
+  gtk_object_set_user_data(GTK_OBJECT(menuitem), 
+GINT_TO_POINTER(ARROW_HOLLOW_DIAMOND));
+  group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
+  gtk_menu_append (GTK_MENU (menu), menuitem);
+  gtk_widget_show (menuitem);
+
+  menuitem = gtk_radio_menu_item_new_with_label (group, "Filled Diamond");
+  gtk_object_set_user_data(GTK_OBJECT(menuitem), 
+GINT_TO_POINTER(ARROW_FILLED_DIAMOND));
+  group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
+  gtk_menu_append (GTK_MENU (menu), menuitem);
+  gtk_widget_show (menuitem);
+  
+  gtk_menu_set_active(GTK_MENU (menu), 0);
+  gtk_option_menu_set_menu (GTK_OPTION_MENU (fs), menu);
+}
+
+guint
+dia_arrow_type_selector_get_type        (void)
+{
+  static guint dfs_type = 0;
+
+  if (!dfs_type) {
+    GtkTypeInfo dfs_info = {
+      "DiaArrowTypeSelector",
+      sizeof (DiaArrowTypeSelector),
+      sizeof (DiaArrowTypeSelectorClass),
+      (GtkClassInitFunc) dia_arrow_type_selector_class_init,
+      (GtkObjectInitFunc) dia_arrow_type_selector_init,
+      (GtkArgSetFunc) NULL,
+      (GtkArgGetFunc) NULL
+    };
+    
+    dfs_type = gtk_type_unique (gtk_option_menu_get_type (), &dfs_info);
+  }
+  
+  return dfs_type;
+}
+
+GtkWidget *
+dia_arrow_type_selector_new ()
+{
+  return GTK_WIDGET ( gtk_type_new (dia_arrow_type_selector_get_type ()));
+}
+
+
+ArrowType 
+dia_arrow_type_selector_get_arrow_type(DiaArrowTypeSelector *fs)
+{
+  GtkWidget *menuitem;
+  void *align;
+  
+  menuitem = gtk_menu_get_active(fs->arrow_type_menu);
+  align = gtk_object_get_user_data(GTK_OBJECT(menuitem));
+
+  return GPOINTER_TO_INT(align);
+}
+
+void
+dia_arrow_type_selector_set_arrow_type (DiaArrowTypeSelector *as,
+                                      ArrowType arrow)
+{
+  gtk_menu_set_active(GTK_MENU (as->arrow_type_menu), arrow);
+  gtk_option_menu_set_history (GTK_OPTION_MENU(as), arrow);
+}
Index: lib/widgets.h
===================================================================
RCS file: /cvs/gnome/dia/lib/widgets.h,v
retrieving revision 1.4
diff -u -r1.4 widgets.h
--- widgets.h   1999/01/14 14:36:45     1.4
+++ widgets.h   1999/01/28 03:54:37
@@ -136,12 +136,31 @@
 void       dia_color_selector_set_color (DiaColorSelector *cs,
                                         Color *color);
 
+/* DiaArrowTypeSelector */
+#define DIAARROWTYPESELECTOR(obj)          GTK_CHECK_CAST (obj, 
+dia_arrow_type_selector_get_type (), DiaArrowTypeSelector)
+#define DIAARROWTYPESELECTOR_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, 
+dia_arrow_type_selector_get_type (), DiaArrowTypeSelectorClass)
+#define IS_DIAARROWTYPESELECTOR(obj)       GTK_CHECK_TYPE (obj, 
+dia_arrow_type_selector_get_type ())
+
+typedef struct _DiaArrowTypeSelector       DiaArrowTypeSelector;
+typedef struct _DiaArrowTypeSelectorClass  DiaArrowTypeSelectorClass;
+
+struct _DiaArrowTypeSelector
+{
+  GtkOptionMenu omenu;
+
+  GtkMenu *arrow_type_menu;
+};
+
+struct _DiaArrowTypeSelectorClass
+{
+  GtkOptionMenuClass parent_class;
+};
+
+guint      dia_arrow_type_selector_get_type      (void);
+GtkWidget* dia_arrow_type_selector_new           (void);
+ArrowType  dia_arrow_type_selector_get_arrow_type (DiaArrowTypeSelector *as);
+void       dia_arrow_type_selector_set_arrow_type (DiaArrowTypeSelector *as,
+                                                  ArrowType arrow);
 
-#endif /* WIDGETS_H */
-
-
-
 
-
-
-
+#endif /* WIDGETS_H */
Index: objects/standard/Makefile.am
===================================================================
RCS file: /cvs/gnome/dia/objects/standard/Makefile.am,v
retrieving revision 1.3
diff -u -r1.3 Makefile.am
--- Makefile.am 1998/10/12 18:18:46     1.3
+++ Makefile.am 1999/01/28 03:54:41
@@ -9,6 +9,7 @@
                        textobj.c \
                        line.c \
                        zigzagline.c \
+                       polyline.c \
                        standard.c 
 
 libstandard_objects_la_LDFLAGS = -export-dynamic -version-info 0:0:0
Index: objects/standard/arc.c
===================================================================
RCS file: /cvs/gnome/dia/objects/standard/arc.c,v
retrieving revision 1.6
diff -u -r1.6 arc.c
--- arc.c       1998/12/05 17:01:43     1.6
+++ arc.c       1999/01/28 03:54:41
@@ -25,6 +25,7 @@
 #include "render.h"
 #include "attributes.h"
 #include "widgets.h"
+#include "arrows.h"
 
 #include "pixmaps/arc.xpm"
 
@@ -33,7 +34,9 @@
 #define HANDLE_MIDDLE HANDLE_CUSTOM1
 
 typedef struct _ArcPropertiesDialog ArcPropertiesDialog;
+typedef struct _ArcDefaultsDialog ArcDefaultsDialog;
 
+
 typedef struct _Arc {
   Connection connection;
 
@@ -43,6 +46,7 @@
   real curve_distance;
   real line_width;
   LineStyle line_style;
+  ArrowType start_arrow, end_arrow;
 
   /* Calculated parameters: */
   real radius;
@@ -53,14 +57,36 @@
 
 } Arc;
 
+typedef struct _ArcProperties {
+  Color line_color;
+  real line_width;
+  LineStyle line_style;
+  ArrowType start_arrow, end_arrow;
+} ArcProperties;
+
+
 struct _ArcPropertiesDialog {
   GtkWidget *vbox;
 
   GtkSpinButton *line_width;
   DiaColorSelector *color;
   DiaLineStyleSelector *line_style;
+  DiaArrowTypeSelector *start_arrow;
+  DiaArrowTypeSelector *end_arrow;
+};
+
+struct _ArcDefaultsDialog {
+  GtkWidget *vbox;
+
+  DiaLineStyleSelector *line_style;
+  DiaArrowTypeSelector *start_arrow;
+  DiaArrowTypeSelector *end_arrow;
 };
 
+static ArcDefaultsDialog *arc_defaults_dialog;
+static ArcProperties default_properties;
+
+
 static void arc_move_handle(Arc *arc, Handle *handle,
                            Point *to, HandleMoveReason reason);
 static void arc_move(Arc *arc, Point *to);
@@ -81,12 +107,16 @@
 
 static void arc_save(Arc *arc, ObjectNode obj_node);
 static Object *arc_load(ObjectNode obj_node, int version);
+static GtkWidget *arc_get_defaults();
+static void arc_apply_defaults();
 
 static ObjectTypeOps arc_type_ops =
 {
   (CreateFunc) arc_create,
   (LoadFunc)   arc_load,
-  (SaveFunc)   arc_save
+  (SaveFunc)   arc_save,
+  (GetDefaultsFunc)   arc_get_defaults,
+  (ApplyDefaultsFunc) arc_apply_defaults
 };
 
 ObjectType arc_type =
@@ -123,6 +153,9 @@
   arc->line_width = gtk_spin_button_get_value_as_float(prop_dialog->line_width);
   dia_color_selector_get_color(prop_dialog->color, &arc->arc_color);
   arc->line_style = dia_line_style_selector_get_linestyle(prop_dialog->line_style);
+  arc->start_arrow = dia_arrow_type_selector_get_arrow_type(prop_dialog->start_arrow);
+  arc->end_arrow = dia_arrow_type_selector_get_arrow_type(prop_dialog->end_arrow);
+  
   
   arc_update_data(arc);
 }
@@ -136,6 +169,7 @@
   GtkWidget *label;
   GtkWidget *color;
   GtkWidget *linestyle;
+  GtkWidget *arrow;
   GtkWidget *line_width;
   GtkAdjustment *adj;
 
@@ -183,6 +217,29 @@
     gtk_widget_show(hbox);
     gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
 
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("Start arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    prop_dialog->start_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("End arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    prop_dialog->end_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+
     gtk_widget_show (vbox);
   }
 
@@ -192,10 +249,85 @@
   dia_color_selector_set_color(prop_dialog->color, &arc->arc_color);
   dia_line_style_selector_set_linestyle(prop_dialog->line_style,
                                        arc->line_style);
+  dia_arrow_type_selector_set_arrow_type(prop_dialog->start_arrow,
+                              arc->start_arrow);
+  dia_arrow_type_selector_set_arrow_type(prop_dialog->end_arrow,
+                              arc->end_arrow);
   
   return prop_dialog->vbox;
 }
 
+static void
+arc_apply_defaults()
+{
+  default_properties.line_style = 
+dia_line_style_selector_get_linestyle(arc_defaults_dialog->line_style);
+  default_properties.start_arrow = 
+dia_arrow_type_selector_get_arrow_type(arc_defaults_dialog->start_arrow);
+  default_properties.end_arrow = 
+dia_arrow_type_selector_get_arrow_type(arc_defaults_dialog->end_arrow);
+}
+
+static GtkWidget *
+arc_get_defaults()
+{
+  GtkWidget *vbox;
+  GtkWidget *hbox;
+  GtkWidget *label;
+  GtkWidget *arrow;
+  GtkWidget *linestyle;
+  GtkAdjustment *adj;
+
+  if (arc_defaults_dialog == NULL) {
+  
+    arc_defaults_dialog = g_new(ArcDefaultsDialog, 1);
+
+    vbox = gtk_vbox_new(FALSE, 5);
+    arc_defaults_dialog->vbox = vbox;
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("Line style:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    linestyle = dia_line_style_selector_new();
+    arc_defaults_dialog->line_style = DIALINESTYLESELECTOR(linestyle);
+    gtk_box_pack_start (GTK_BOX (hbox), linestyle, TRUE, TRUE, 0);
+    gtk_widget_show (linestyle);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("Start arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    arc_defaults_dialog->start_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("End arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    arc_defaults_dialog->end_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    gtk_widget_show (vbox);
+  }
+
+  dia_line_style_selector_set_linestyle(arc_defaults_dialog->line_style,
+                                       default_properties.line_style);
+  dia_arrow_type_selector_set_arrow_type(arc_defaults_dialog->start_arrow,
+                                        default_properties.start_arrow);
+  dia_arrow_type_selector_set_arrow_type(arc_defaults_dialog->end_arrow,
+                                        default_properties.end_arrow);
+
+  return arc_defaults_dialog->vbox;
+}
+
 
 static int
 in_angle(real angle, real startangle, real endangle)
@@ -329,6 +461,20 @@
 
   endpoints = &arc->connection.endpoints[0];
 
+  /* FIXME:  Maybe these should consider angles? */
+  if (arc->start_arrow != ARROW_NONE) {
+    arrow_draw(renderer, arc->start_arrow,
+              &endpoints[0], &endpoints[1],
+              0.8, 0.8, arc->line_width,
+              &arc->arc_color, &color_white);
+  }
+  if (arc->end_arrow != ARROW_NONE) {
+    arrow_draw(renderer, arc->end_arrow,
+              &endpoints[1], &endpoints[0],
+              0.8, 0.8, arc->line_width,
+              &arc->arc_color, &color_white);
+  }
+
   renderer->ops->set_linewidth(renderer, arc->line_width);
   renderer->ops->set_linestyle(renderer, arc->line_style);
   renderer->ops->set_linecaps(renderer, LINECAPS_BUTT);
@@ -337,7 +483,7 @@
   if (fabs(arc->curve_distance) <= 0.0001) {
     renderer->ops->draw_line(renderer,
                             &endpoints[0], &endpoints[1],
-                            &color_black);
+                            &arc->arc_color);
     return;
   }
   
@@ -367,8 +513,10 @@
   arc->line_width =  attributes_get_default_linewidth();
   arc->curve_distance = 1.0;
   arc->arc_color = attributes_get_foreground(); 
-  arc->line_style = LINESTYLE_SOLID;
-  
+  arc->line_style = default_properties.line_style;
+  arc->start_arrow = default_properties.start_arrow;
+  arc->end_arrow = default_properties.end_arrow;
+
   arc->properties_dialog = NULL;
 
   conn = &arc->connection;
@@ -425,6 +573,8 @@
   newarc->curve_distance = arc->curve_distance;
   newarc->line_width = arc->line_width;
   newarc->line_style = arc->line_style;
+  newarc->start_arrow = arc->start_arrow;
+  newarc->end_arrow = arc->end_arrow;
   newarc->radius = arc->radius;
   newarc->center = arc->center;
   newarc->angle1 = arc->angle1;
@@ -498,6 +648,14 @@
     obj->bounding_box.bottom = arc->center.y + arc->radius;
   }
   
+  /* Fix boundingbox for arrowheads */
+  if (arc->start_arrow != ARROW_NONE ||
+      arc->end_arrow != ARROW_NONE) {
+    obj->bounding_box.top -= 0.8+arc->line_width/2;
+    obj->bounding_box.left -= 0.8+arc->line_width/2;
+    obj->bounding_box.bottom += 0.8+arc->line_width/2;
+    obj->bounding_box.right += 0.8+arc->line_width/2;
+  }
   obj->bounding_box.top -= arc->line_width/2;
   obj->bounding_box.left -= arc->line_width/2;
   obj->bounding_box.bottom += arc->line_width/2;
@@ -521,6 +679,10 @@
                arc->line_width);
   data_add_enum(new_attribute(obj_node, "line_style"),
                arc->line_style);
+  data_add_enum(new_attribute(obj_node, "start_arrow"),
+               arc->start_arrow);
+  data_add_enum(new_attribute(obj_node, "end_arrow"),
+               arc->end_arrow);
 }
 
 static Object *
@@ -560,6 +722,16 @@
   attr = object_find_attribute(obj_node, "line_style");
   if (attr != NULL)
     arc->line_style = data_enum(attribute_first_data(attr));
+
+  arc->start_arrow = ARROW_NONE;
+  attr = object_find_attribute(obj_node, "start_arrow");
+  if (attr != NULL)
+    arc->start_arrow = data_enum(attribute_first_data(attr));
+
+  arc->end_arrow = ARROW_NONE;
+  attr = object_find_attribute(obj_node, "end_arrow");
+  if (attr != NULL)
+    arc->end_arrow = data_enum(attribute_first_data(attr));
 
   arc->properties_dialog = NULL;
 
Index: objects/standard/line.c
===================================================================
RCS file: /cvs/gnome/dia/objects/standard/line.c,v
retrieving revision 1.6
diff -u -r1.6 line.c
--- line.c      1999/01/14 14:37:02     1.6
+++ line.c      1999/01/28 03:54:41
@@ -25,13 +25,22 @@
 #include "render.h"
 #include "attributes.h"
 #include "widgets.h"
+#include "arrows.h"
 
 #include "pixmaps/line.xpm"
 
 #define DEFAULT_WIDTH 0.25
 
 typedef struct _LinePropertiesDialog LinePropertiesDialog;
+typedef struct _LineDefaultsDialog LineDefaultsDialog;
 
+typedef struct _LineProperties {
+  Color line_color;
+  real line_width;
+  LineStyle line_style;
+  ArrowType start_arrow, end_arrow;
+} LineProperties;
+
 typedef struct _Line {
   Connection connection;
 
@@ -40,8 +49,7 @@
   Color line_color;
   real line_width;
   LineStyle line_style;
-
-  LinePropertiesDialog *properties_dialog;
+  ArrowType start_arrow, end_arrow;
 } Line;
 
 struct _LinePropertiesDialog {
@@ -50,8 +58,25 @@
   GtkSpinButton *line_width;
   DiaColorSelector *color;
   DiaLineStyleSelector *line_style;
+
+  DiaArrowTypeSelector *start_arrow;
+  DiaArrowTypeSelector *end_arrow;
+
+  Line *line;
 };
 
+struct _LineDefaultsDialog {
+  GtkWidget *vbox;
+
+  DiaLineStyleSelector *line_style;
+  DiaArrowTypeSelector *start_arrow;
+  DiaArrowTypeSelector *end_arrow;
+};
+
+static LinePropertiesDialog *line_properties_dialog;
+static LineDefaultsDialog *line_defaults_dialog;
+static LineProperties default_properties;
+
 static void line_move_handle(Line *line, Handle *handle,
                             Point *to, HandleMoveReason reason);
 static void line_move(Line *line, Point *to);
@@ -68,6 +93,8 @@
 static Object *line_copy(Line *line);
 static GtkWidget *line_get_properties(Line *line);
 static void line_apply_properties(Line *line);
+static GtkWidget *line_get_defaults();
+static void line_apply_defaults();
 
 static void line_save(Line *line, ObjectNode obj_node);
 static Object *line_load(ObjectNode obj_node, int version);
@@ -76,7 +103,9 @@
 {
   (CreateFunc) line_create,
   (LoadFunc)   line_load,
-  (SaveFunc)   line_save
+  (SaveFunc)   line_save,
+  (GetDefaultsFunc)   line_get_defaults,
+  (ApplyDefaultsFunc) line_apply_defaults
 };
 
 ObjectType line_type =
@@ -105,13 +134,17 @@
 static void
 line_apply_properties(Line *line)
 {
-  LinePropertiesDialog *prop_dialog;
+  if (line != line_properties_dialog->line) {
+    printf("Dialog problem:  %p != %p\n", line, line_properties_dialog->line);
+    line = line_properties_dialog->line;
+  }
 
-  prop_dialog = line->properties_dialog;
+  line->line_width = 
+gtk_spin_button_get_value_as_float(line_properties_dialog->line_width);
+  dia_color_selector_get_color(line_properties_dialog->color, &line->line_color);
+  line->line_style = 
+dia_line_style_selector_get_linestyle(line_properties_dialog->line_style);
 
-  line->line_width = gtk_spin_button_get_value_as_float(prop_dialog->line_width);
-  dia_color_selector_get_color(prop_dialog->color, &line->line_color);
-  line->line_style = dia_line_style_selector_get_linestyle(prop_dialog->line_style);
+  line->start_arrow = 
+dia_arrow_type_selector_get_arrow_type(line_properties_dialog->start_arrow);
+  line->end_arrow = 
+dia_arrow_type_selector_get_arrow_type(line_properties_dialog->end_arrow);
   
   line_update_data(line);
 }
@@ -119,22 +152,21 @@
 static GtkWidget *
 line_get_properties(Line *line)
 {
-  LinePropertiesDialog *prop_dialog;
   GtkWidget *vbox;
   GtkWidget *hbox;
   GtkWidget *label;
   GtkWidget *color;
   GtkWidget *linestyle;
+  GtkWidget *arrow;
   GtkWidget *line_width;
   GtkAdjustment *adj;
 
-  if (line->properties_dialog == NULL) {
+  if (line_properties_dialog == NULL) {
   
-    prop_dialog = g_new(LinePropertiesDialog, 1);
-    line->properties_dialog = prop_dialog;
+    line_properties_dialog = g_new(LinePropertiesDialog, 1);
 
     vbox = gtk_vbox_new(FALSE, 5);
-    prop_dialog->vbox = vbox;
+    line_properties_dialog->vbox = vbox;
 
     hbox = gtk_hbox_new(FALSE, 5);
     label = gtk_label_new("Line width:");
@@ -144,7 +176,7 @@
     line_width = gtk_spin_button_new(adj, 1.0, 2);
     gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(line_width), TRUE);
     gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(line_width), TRUE);
-    prop_dialog->line_width = GTK_SPIN_BUTTON(line_width);
+    line_properties_dialog->line_width = GTK_SPIN_BUTTON(line_width);
     gtk_box_pack_start(GTK_BOX (hbox), line_width, TRUE, TRUE, 0);
     gtk_widget_show (line_width);
     gtk_widget_show(hbox);
@@ -155,7 +187,7 @@
     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
     gtk_widget_show (label);
     color = dia_color_selector_new();
-    prop_dialog->color = DIACOLORSELECTOR(color);
+    line_properties_dialog->color = DIACOLORSELECTOR(color);
     gtk_box_pack_start (GTK_BOX (hbox), color, TRUE, TRUE, 0);
     gtk_widget_show (color);
     gtk_widget_show(hbox);
@@ -166,23 +198,120 @@
     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
     gtk_widget_show (label);
     linestyle = dia_line_style_selector_new();
-    prop_dialog->line_style = DIALINESTYLESELECTOR(linestyle);
+    line_properties_dialog->line_style = DIALINESTYLESELECTOR(linestyle);
     gtk_box_pack_start (GTK_BOX (hbox), linestyle, TRUE, TRUE, 0);
     gtk_widget_show (linestyle);
     gtk_widget_show(hbox);
     gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
 
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("Start arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    line_properties_dialog->start_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("End arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    line_properties_dialog->end_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
     gtk_widget_show (vbox);
   }
 
-  prop_dialog = line->properties_dialog;
-    
-  gtk_spin_button_set_value(prop_dialog->line_width, line->line_width);
-  dia_color_selector_set_color(prop_dialog->color, &line->line_color);
-  dia_line_style_selector_set_linestyle(prop_dialog->line_style,
+  line_properties_dialog->line = line;
+
+  gtk_spin_button_set_value(line_properties_dialog->line_width, line->line_width);
+  dia_color_selector_set_color(line_properties_dialog->color, &line->line_color);
+  dia_line_style_selector_set_linestyle(line_properties_dialog->line_style,
                                        line->line_style);
+  dia_arrow_type_selector_set_arrow_type(line_properties_dialog->start_arrow,
+                              line->start_arrow);
+  dia_arrow_type_selector_set_arrow_type(line_properties_dialog->end_arrow,
+                              line->end_arrow);
+  
+  return line_properties_dialog->vbox;
+}
+
+static void
+line_apply_defaults()
+{
+  default_properties.line_style = 
+dia_line_style_selector_get_linestyle(line_defaults_dialog->line_style);
+  default_properties.start_arrow = 
+dia_arrow_type_selector_get_arrow_type(line_defaults_dialog->start_arrow);
+  default_properties.end_arrow = 
+dia_arrow_type_selector_get_arrow_type(line_defaults_dialog->end_arrow);
+}
+
+static GtkWidget *
+line_get_defaults()
+{
+  GtkWidget *vbox;
+  GtkWidget *hbox;
+  GtkWidget *label;
+  GtkWidget *arrow;
+  GtkWidget *linestyle;
+  GtkAdjustment *adj;
+
+  if (line_defaults_dialog == NULL) {
   
-  return prop_dialog->vbox;
+    line_defaults_dialog = g_new(LineDefaultsDialog, 1);
+
+    vbox = gtk_vbox_new(FALSE, 5);
+    line_defaults_dialog->vbox = vbox;
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("Line style:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    linestyle = dia_line_style_selector_new();
+    line_defaults_dialog->line_style = DIALINESTYLESELECTOR(linestyle);
+    gtk_box_pack_start (GTK_BOX (hbox), linestyle, TRUE, TRUE, 0);
+    gtk_widget_show (linestyle);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("Start arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    line_defaults_dialog->start_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("End arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    line_defaults_dialog->end_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    gtk_widget_show (vbox);
+  }
+
+  dia_line_style_selector_set_linestyle(line_defaults_dialog->line_style,
+                                       default_properties.line_style);
+  dia_arrow_type_selector_set_arrow_type(line_defaults_dialog->start_arrow,
+                                        default_properties.start_arrow);
+  dia_arrow_type_selector_set_arrow_type(line_defaults_dialog->end_arrow,
+                                        default_properties.end_arrow);
+
+  return line_defaults_dialog->vbox;
 }
 
 static real
@@ -240,6 +369,19 @@
 
   endpoints = &line->connection.endpoints[0];
   
+  if (line->start_arrow != ARROW_NONE) {
+    arrow_draw(renderer, line->start_arrow,
+              &endpoints[0], &endpoints[1],
+              0.8, 0.8, line->line_width,
+              &line->line_color, &color_white);
+  }
+  if (line->end_arrow != ARROW_NONE) {
+    arrow_draw(renderer, line->end_arrow,
+              &endpoints[1], &endpoints[0],
+              0.8, 0.8, line->line_width,
+              &line->line_color, &color_white);
+  }
+
   renderer->ops->set_linewidth(renderer, line->line_width);
   renderer->ops->set_linestyle(renderer, line->line_style);
   renderer->ops->set_linecaps(renderer, LINECAPS_BUTT);
@@ -275,14 +417,14 @@
   obj->type = &line_type;
   obj->ops = &line_ops;
 
-  line->properties_dialog = NULL;
-  
   connection_init(conn, 2, 1);
 
   obj->connections[0] = &line->middle_point;
   line->middle_point.object = obj;
   line->middle_point.connected = NULL;
-  line->line_style = LINESTYLE_SOLID;
+  line->line_style = default_properties.line_style;
+  line->start_arrow = default_properties.start_arrow;
+  line->end_arrow = default_properties.end_arrow;
   line_update_data(line);
 
   *handle1 = obj->handles[0];
@@ -293,10 +435,6 @@
 static void
 line_destroy(Line *line)
 {
-  if (line->properties_dialog != NULL) {
-    gtk_widget_destroy(line->properties_dialog->vbox);
-    g_free(line->properties_dialog);
-  }
   connection_destroy(&line->connection);
 }
 
@@ -324,8 +462,8 @@
   newline->line_color = line->line_color;
   newline->line_width = line->line_width;
   newline->line_style = line->line_style;
-
-  newline->properties_dialog = NULL;
+  newline->start_arrow = line->start_arrow;
+  newline->end_arrow = line->end_arrow;
 
   return (Object *)newline;
 }
@@ -349,6 +487,15 @@
   obj->bounding_box.bottom += line->line_width/2;
   obj->bounding_box.right += line->line_width/2;
 
+  /* Fix boundingbox for arrowheads */
+  if (line->start_arrow != ARROW_NONE ||
+      line->end_arrow != ARROW_NONE) {
+    obj->bounding_box.top -= 0.8+line->line_width/2;
+    obj->bounding_box.left -= 0.8+line->line_width/2;
+    obj->bounding_box.bottom += 0.8+line->line_width/2;
+    obj->bounding_box.right += 0.8+line->line_width/2;
+  }
+
   obj->position = conn->endpoints[0];
   
   connection_update_handles(conn);
@@ -366,6 +513,10 @@
                line->line_width);
   data_add_enum(new_attribute(obj_node, "line_style"),
                line->line_style);
+  data_add_enum(new_attribute(obj_node, "start_arrow"),
+               line->start_arrow);
+  data_add_enum(new_attribute(obj_node, "end_arrow"),
+               line->end_arrow);
 }
 
 static Object *
@@ -401,7 +552,15 @@
   if (attr != NULL)
     line->line_style = data_enum(attribute_first_data(attr));
 
-  line->properties_dialog = NULL;
+  line->start_arrow = ARROW_NONE;
+  attr = object_find_attribute(obj_node, "start_arrow");
+  if (attr != NULL)
+    line->start_arrow = data_enum(attribute_first_data(attr));
+
+  line->end_arrow = ARROW_NONE;
+  attr = object_find_attribute(obj_node, "end_arrow");
+  if (attr != NULL)
+    line->end_arrow = data_enum(attribute_first_data(attr));
 
   connection_init(conn, 2, 1);
 
Index: objects/standard/standard.c
===================================================================
RCS file: /cvs/gnome/dia/objects/standard/standard.c,v
retrieving revision 1.3
diff -u -r1.3 standard.c
--- standard.c  1999/01/21 18:35:50     1.3
+++ standard.c  1999/01/28 03:54:41
@@ -23,6 +23,7 @@
 extern ObjectType *_ellipse_type;
 extern ObjectType *_line_type;
 extern ObjectType *_zigzagline_type;
+extern ObjectType *_polyline_type;
 extern ObjectType *_textobj_type;
 
 int get_version(void) {
@@ -34,6 +35,7 @@
   object_register_type(_box_type);
   object_register_type(_ellipse_type);
   object_register_type(_line_type);
+  object_register_type(_polyline_type);
   object_register_type(_zigzagline_type);
   object_register_type(_textobj_type);
 }
Index: objects/standard/zigzagline.c
===================================================================
RCS file: /cvs/gnome/dia/objects/standard/zigzagline.c,v
retrieving revision 1.7
diff -u -r1.7 zigzagline.c
--- zigzagline.c        1998/12/05 17:01:49     1.7
+++ zigzagline.c        1999/01/28 03:54:41
@@ -33,6 +33,7 @@
 #define HANDLE_MIDDLE HANDLE_CUSTOM1
 
 typedef struct _ZigzaglinePropertiesDialog ZigzaglinePropertiesDialog;
+typedef struct _ZigzaglineDefaultsDialog ZigzaglineDefaultsDialog;
 
 typedef struct _Zigzagline {
   OrthConn orth;
@@ -40,6 +41,7 @@
   Color line_color;
   LineStyle line_style;
   real line_width;
+  ArrowType start_arrow, end_arrow;
 
   ZigzaglinePropertiesDialog *properties_dialog;
 
@@ -51,8 +53,30 @@
   GtkSpinButton *line_width;
   DiaColorSelector *color;
   DiaLineStyleSelector *line_style;
+
+  DiaArrowTypeSelector *start_arrow;
+  DiaArrowTypeSelector *end_arrow;
 };
 
+typedef struct _ZigzaglineProperties {
+  Color line_color;
+  real line_width;
+  LineStyle line_style;
+  ArrowType start_arrow, end_arrow;
+} ZigzaglineProperties;
+
+struct _ZigzaglineDefaultsDialog {
+  GtkWidget *vbox;
+
+  DiaLineStyleSelector *line_style;
+  DiaArrowTypeSelector *start_arrow;
+  DiaArrowTypeSelector *end_arrow;
+};
+
+static ZigzaglineDefaultsDialog *zigzagline_defaults_dialog;
+static ZigzaglineProperties default_properties;
+
+
 static void zigzagline_move_handle(Zigzagline *zigzagline, Handle *handle,
                                   Point *to, HandleMoveReason reason);
 static void zigzagline_move(Zigzagline *zigzagline, Point *to);
@@ -72,12 +96,16 @@
 
 static void zigzagline_save(Zigzagline *zigzagline, ObjectNode obj_node);
 static Object *zigzagline_load(ObjectNode obj_node, int version);
+static GtkWidget *zigzagline_get_defaults();
+static void zigzagline_apply_defaults();
 
 static ObjectTypeOps zigzagline_type_ops =
 {
   (CreateFunc)zigzagline_create,   /* create */
   (LoadFunc)  zigzagline_load,     /* load */
-  (SaveFunc)  zigzagline_save      /* save */
+  (SaveFunc)  zigzagline_save,      /* save */
+  (GetDefaultsFunc)   zigzagline_get_defaults,
+  (ApplyDefaultsFunc) zigzagline_apply_defaults
 };
 
 static ObjectType zigzagline_type =
@@ -115,6 +143,9 @@
   zigzagline->line_width = 
gtk_spin_button_get_value_as_float(prop_dialog->line_width);
   dia_color_selector_get_color(prop_dialog->color, &zigzagline->line_color);
   zigzagline->line_style = 
dia_line_style_selector_get_linestyle(prop_dialog->line_style);
+
+  zigzagline->start_arrow = 
+dia_arrow_type_selector_get_arrow_type(prop_dialog->start_arrow);
+  zigzagline->end_arrow = 
+dia_arrow_type_selector_get_arrow_type(prop_dialog->end_arrow);
   
   zigzagline_update_data(zigzagline);
 }
@@ -128,6 +159,7 @@
   GtkWidget *label;
   GtkWidget *color;
   GtkWidget *linestyle;
+  GtkWidget *arrow;
   GtkWidget *line_width;
   GtkAdjustment *adj;
 
@@ -175,6 +207,28 @@
     gtk_widget_show(hbox);
     gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
 
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("Start arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    prop_dialog->start_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("End arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    prop_dialog->end_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
     gtk_widget_show (vbox);
   }
 
@@ -184,11 +238,85 @@
   dia_color_selector_set_color(prop_dialog->color, &zigzagline->line_color);
   dia_line_style_selector_set_linestyle(prop_dialog->line_style,
                                        zigzagline->line_style);
+  dia_arrow_type_selector_set_arrow_type(prop_dialog->start_arrow,
+                                        zigzagline->start_arrow);
+  dia_arrow_type_selector_set_arrow_type(prop_dialog->end_arrow,
+                                        zigzagline->end_arrow);
   
   return prop_dialog->vbox;
 }
+static void
+zigzagline_apply_defaults()
+{
+  default_properties.line_style = 
+dia_line_style_selector_get_linestyle(zigzagline_defaults_dialog->line_style);
+  default_properties.start_arrow = 
+dia_arrow_type_selector_get_arrow_type(zigzagline_defaults_dialog->start_arrow);
+  default_properties.end_arrow = 
+dia_arrow_type_selector_get_arrow_type(zigzagline_defaults_dialog->end_arrow);
+}
+
+static GtkWidget *
+zigzagline_get_defaults()
+{
+  GtkWidget *vbox;
+  GtkWidget *hbox;
+  GtkWidget *label;
+  GtkWidget *arrow;
+  GtkWidget *linestyle;
+  GtkAdjustment *adj;
 
+  if (zigzagline_defaults_dialog == NULL) {
+  
+    zigzagline_defaults_dialog = g_new(ZigzaglineDefaultsDialog, 1);
+
+    vbox = gtk_vbox_new(FALSE, 5);
+    zigzagline_defaults_dialog->vbox = vbox;
 
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("Line style:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    linestyle = dia_line_style_selector_new();
+    zigzagline_defaults_dialog->line_style = DIALINESTYLESELECTOR(linestyle);
+    gtk_box_pack_start (GTK_BOX (hbox), linestyle, TRUE, TRUE, 0);
+    gtk_widget_show (linestyle);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("Start arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    zigzagline_defaults_dialog->start_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    hbox = gtk_hbox_new(FALSE, 5);
+    label = gtk_label_new("End arrow:");
+    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+    gtk_widget_show (label);
+    arrow = dia_arrow_type_selector_new();
+    zigzagline_defaults_dialog->end_arrow = DIAARROWTYPESELECTOR(arrow);
+    gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, TRUE, 0);
+    gtk_widget_show (arrow);
+    gtk_widget_show(hbox);
+    gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+    gtk_widget_show (vbox);
+  }
+
+  dia_line_style_selector_set_linestyle(zigzagline_defaults_dialog->line_style,
+                                       default_properties.line_style);
+  dia_arrow_type_selector_set_arrow_type(zigzagline_defaults_dialog->start_arrow,
+                                        default_properties.start_arrow);
+  dia_arrow_type_selector_set_arrow_type(zigzagline_defaults_dialog->end_arrow,
+                                        default_properties.end_arrow);
+
+  return zigzagline_defaults_dialog->vbox;
+}
+
+
 static real
 zigzagline_distance_from(Zigzagline *zigzagline, Point *point)
 {
@@ -233,6 +361,18 @@
   points = &orth->points[0];
   n = orth->numpoints;
   
+  if (zigzagline->start_arrow != ARROW_NONE) {
+    arrow_draw(renderer, zigzagline->start_arrow,
+              &points[0], &points[1],
+              0.8, 0.8, zigzagline->line_width,
+              &zigzagline->line_color, &color_white);
+  }
+  if (zigzagline->end_arrow != ARROW_NONE) {
+    arrow_draw(renderer, zigzagline->end_arrow,
+              &points[n-1], &points[n-2],
+              0.8, 0.8, zigzagline->line_width,
+              &zigzagline->line_color, &color_white);
+  }
   renderer->ops->set_linewidth(renderer, zigzagline->line_width);
   renderer->ops->set_linestyle(renderer, zigzagline->line_style);
   renderer->ops->set_linejoin(renderer, LINEJOIN_MITER);
@@ -264,7 +404,9 @@
 
   zigzagline->line_width =  attributes_get_default_linewidth();
   zigzagline->line_color = attributes_get_foreground();
-  zigzagline->line_style = LINESTYLE_SOLID;
+  zigzagline->line_style = default_properties.line_style;
+  zigzagline->start_arrow = default_properties.start_arrow;
+  zigzagline->end_arrow = default_properties.end_arrow;
   
   zigzagline->properties_dialog = NULL;
   
@@ -301,6 +443,8 @@
   newzigzagline->line_color = zigzagline->line_color;
   newzigzagline->line_width = zigzagline->line_width;
   newzigzagline->line_style = zigzagline->line_style;
+  newzigzagline->start_arrow = zigzagline->start_arrow;
+  newzigzagline->end_arrow = zigzagline->end_arrow;
 
   newzigzagline->properties_dialog = NULL;
 
@@ -322,6 +466,15 @@
   obj->bounding_box.bottom += zigzagline->line_width/2;
   obj->bounding_box.right += zigzagline->line_width/2;
 
+  /* Fix boundingbox for arrowheads */
+  if (zigzagline->start_arrow != ARROW_NONE ||
+      zigzagline->end_arrow != ARROW_NONE) {
+    obj->bounding_box.top -= 0.8+zigzagline->line_width/2;
+    obj->bounding_box.left -= 0.8+zigzagline->line_width/2;
+    obj->bounding_box.bottom += 0.8+zigzagline->line_width/2;
+    obj->bounding_box.right += 0.8+zigzagline->line_width/2;
+  }
+
   obj->position = orth->points[0];
 }
 
@@ -336,6 +489,10 @@
                zigzagline->line_width);
   data_add_enum(new_attribute(obj_node, "line_style"),
                zigzagline->line_style);
+  data_add_enum(new_attribute(obj_node, "start_arrow"),
+               zigzagline->start_arrow);
+  data_add_enum(new_attribute(obj_node, "end_arrow"),
+               zigzagline->end_arrow);
 }
 
 static Object *
@@ -373,11 +530,17 @@
   if (attr != NULL)
     zigzagline->line_style = data_enum(attribute_first_data(attr));
 
+  zigzagline->start_arrow = ARROW_NONE;
+  attr = object_find_attribute(obj_node, "start_arrow");
+  if (attr != NULL)
+    zigzagline->start_arrow = data_enum(attribute_first_data(attr));
+
+  zigzagline->end_arrow = ARROW_NONE;
+  attr = object_find_attribute(obj_node, "end_arrow");
+  if (attr != NULL)
+    zigzagline->end_arrow = data_enum(attribute_first_data(attr));
+
   zigzagline_update_data(zigzagline);
 
   return (Object *)zigzagline;
 }
-
-
-
-
Index: objects/standard/pixmaps/Makefile.am
===================================================================
RCS file: /cvs/gnome/dia/objects/standard/pixmaps/Makefile.am,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 Makefile.am
--- Makefile.am 1998/08/31 18:33:59     1.1.1.1
+++ Makefile.am 1999/01/28 03:54:42
@@ -1,3 +1,3 @@
 ## Process this file with automake to produce Makefile.in
 
-EXTRA_DIST = arc.xpm box.xpm ellipse.xpm line.xpm text.xpm zigzag.xpm
+EXTRA_DIST = arc.xpm box.xpm ellipse.xpm line.xpm text.xpm zigzag.xpm polyline.xpm

begin 664 new.tar.gz
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
M#WX[Z4F)$"PR*4C#-V2SZ67SR:[EMAIL PROTECTED]@M6M%BS>!2CCI@D^>HL=
M%L/#L+`:'86%LUQ2Q3=0`M5&F1BS,3@H?"M/TP$\-@Q/T2"1=!#`Q:Y>1K$R
M^"^(A^&`H!#89HD<-H&Z;\7>)5Y%]VT^9!J9Z,I210Z*@>K0:$8HX\Z50$^H
MG1I81B4LHY4"3S>2G'E5=S]0/Q(512+YO">*BZ%%O`AG4:E"16.86:GERM/K
M48OZ[[EMAIL PROTECTED]/V+A!SZO/.VYYCWCF7"I(*MGHB("$I>?"U'L<;L\=IH\UE
M=9?69#[*_'B6-3EKQA*FSQN.HY@SA?=5FMP^GD!^?AFL*W0"#;!KFO@3X++'
M$+NOW9C9>V2<'O=D?>^,T'^@>N#.L0R\G3Q'\UNH0R0E^`(?P#Z83/D3M(&!
M`T0CM+6_I9_?@A?41OY!RZHM?;';:$2"LVXM*J"EQ?@JC$R7?/(2G%@J-%8<
M*:7(H,+08<MA/%(U"Q=``$[&(VFW%&>'M+5(3>#*2L]:H&`"$8MQ,FSJQ6V[
MY7(6_6^87#5/B\G@%B`BL&5N=JEAK>')#P/N+X(F;]<^KKC*@0G6/K;6-WH6
MH#L_H#LOH#L!Z)Z%8S"%+.1P758DI3T\P?AEI@?;>%O.)MRLKNJ&B<;32G?(
M$C#-)-M*O$HSH$8BID+AM"["!/#G?Z91^NZ.789#C#6Q0XR-?(MGB";`%PQ,
M*/#WTE`Q-><%:,A56Q2CTT61!>$2BPICE&#:^I3LY=-^-DTV:%Q.O@,0$IKI
MKO2T?GRN4_%\AO-4ZJ+:?7)C)!THTJJ%N*$G,+CE0B'8GLMD2]\U1-D7Z[&(
MRRZWN.P7D+C;X'`JK2I*H7#O>H![^,3NK=X#)H<SG9O4AF]12?&=?WX>BGN4
M5<E@%W:^7[UJZE2JS`)V6]>?2KU"PY%81(NJ?K)"&R(E$;!H@!35&$$@*F;V
MB0ZKK;7BN]$##'0VC5(NZORX$$FGT,PDF-;<*ER+DE76[>G**R(=!5:/;7$Q
MP\FH5EPKA>)ZI-6BFL5Q+4$J6RJA)5;[POO&:C7=;D.@*TS;^E[X;(AN49SE
M4'\(TAB,DN92/T^#^%KI9Q*POY."1\!H%($WC4S<D@NDI,Z]H<%F"K->M98X
MZPU('%`$N/5U1OR?88@;;"_4FW*QRQ#SRR2_85DT"BDR+\TT8&XM\%9(?=T`
MGB;\W'@.8W4LJ"0S6VRCI=,+Y6TW(`.,PIT8IJ=@-8D<E\?](!U'82J'\CU_
MIFR>[8X4)>@9R'$57&:F@<*U']HS(*+E)VCGL!7A>U2TOO.TON.:@Z,$./S0
M6>M\5S@Y;C7*Z:=[LB+>L+K:LQLZY=1D.ND-/0;=.=6/:+/$0_.R3EO=J#4+
MOCG@UN:L6?#-`3<Q'VT6JLE^WW!&M?3:IIA8/B0G[P55%^HE$_2M%^_U.,7D
MZY>6C[>>()Q`]U)LCUPF'YU8GT$?M.7!EB\O>\I=6A986>/B>PI$+'7LCF;E
M\A(0,];C-=GS0)P\5\N:[3<+`*O;?#]SBWZ/PRMNA(E*:P0#G^3)1-0!=9<G
MMT:MN_JA$,7K2$3@VA]4OS*47L8C$GB46V\7(]";RR'-:'\G>H>QZ:WY4+5J
M[K;;&C7TYC9])`0'MV2X;PG,G08?2FO`68B[OJ`KEE/Q2T11M`!*B6N\S*+*
M)3"3D2JXA(#*5N)D*[XJ@6LUH=(L\..H]?P-LOP.+,BBP='A\7[__`VLQOV3
MH\.]JJ:_`DI6RW^"X3(X.[DXKFPX#":9U7!WY[0_>'EQ?LY';S7$Z1A(<T1K
MZ3$%M7`3>S),QDDZN!P'PW?\R+@UXU$<V;8^GTKQT@P>>B&<X'];MF4YFC($
M!WZWV88\)>JTI3=*`7O=]]LHF;$-CQZD*'^5S^ALU:UNQ8>SNEUT4M-6\[4R
M-PT=]688C:7Z)<>R,,&EEZ4WZ3YH`-V:`^C..8"N:P"%9SS#92DI*SR]H+$N
M!GTQ\"?OY1:36K@D1^<)\2DU(.YV!0`)':J)7)\G!<_#PL(;X@/\Z1('PDW4
M:W,X+0'2E`<.H%B99)VR;#2-IBV7I&AVA5%97^\*X-P+Y0A89H1`PBUS^!(+
M)UB[2Z*V[*N[K)/'\@&UU=G`U8QX.R!'LR3?'?]Q0E(A;L=3"ZLYQNYHZ::$
M7=$O`\#,#@D0)_RK[-#9UB913$1)/"9G2V=MV:FQ%/`:!A3!IZY%)PL<.\-<
M/(^348@]#6+X80GP3BY.;%&E`.YTO`BH'0N2@*@BMA#;4($$U915VN(,#$=[
M2:Y@]4QUG"-M:P*A>W;*'$;7.`E&M:A![].<G.]_S_;P@).^\K;0L9A)+,;V
M`%$J0(Q]FH\&KJW_5>L^(4]*SDEK4>LJBD>U:"Z<3VIMO-14MB04N`&4<BG!
M(AZ_'>.Q-6>SCMMJL6THLF$:?&:-SJZB-,NM[GSFS.P8W1SLQ5D+?WHW806R
M5#T./_+:+:72+6MB=M#]+V0)E<.$\PR_W/HAY*B`4DD>5[MYR.5J7VV'U=V0
M-KIYX,)LP2C8M=H8_*//:S_V99[__SPO@,UX_^O9T\U-.O^_\:+[[,4&Y?]Y
MT=U<G/__$M?B_/_B_/_B_/]\[W^=GAR]H157>P%,+W.^`:9J&ON>K"EO+_KG
M)Z^[K48#EUCL!?AD"I;P0)GH\D>/-N/DB9&`9=-+GD0&2"K,9^">$5+E)AQ/
MB"E"W&;!XU`<H8Q+0H!O%/`7P(452:3&]>`ZB<5)M56Y/<>)4$+K-[[C('J^
M!7V*_$OVJCK'DBMDOY78?HOH1OD:WYH0K35#'ST*;4L;>MC>`GFDVE:\][YG
MO$E79\^DND7%MH6GX9P1;'[\30MC>\"ZPJ2>JAZGW%-[=A#+-]"Z/K2G?6VO
ML\=F^9U.^`\YJ.=!M>:Y%$_K.F\W1"/!"0*=JO<:*KJI..VN6A&O%<Q2_\BJ
M/*EIGUQ5D.5@"MZ:XPRS@L+I^9!#[NHH:1G#XHU933TCZ_S15M>?YQ+KP3KR
MPRA(1^MRP^<1WP6NMO^?;7:Z+\3[OYO/GE/^A\V-9PO[_XM<"_M_8?\O[/^Z
M]G_5VZU:2M#*5UY=22&T"$Q%?E#S(3<FS3(5+[82C?*\2#RYJ-9K]/$VF&2%
MRO\XN=4<%9%E`A,!GO_$.FO=YV[G!)N>JLRG>SRME^]!SPMB3R3`L`"8Q9@'
MPP>`\:,@PE3`09$CL8M'$;A=0*<2,-!W!'=]/(/!R^DX!C\Z89@0M*&1ILD'
M2L1!::L&`=ZW\=0S_TE]>,FP7*2$5<G%&O>J?J\.16E<KE$XL/4-;/8H[AV#
MH)>F9TPT(J?EBN.9/GE9?Q+%+WGFR64336A+`^J'8^!O&-BR&A0\4H,H'NNC
MX974B(I*VM!ZWDKZD!WCL[C0-[K96#XNDG2`UH/CLI3?<AX[JZ'&4Z+J8*)/
M=NE5>X)J>S(D:ZI3U[O:9(_7\FF\'3I[TOT:9\N,*%C55J0&'12^`[=""R<]
MPK>=,3DIC%HZ[+[^E+]O]U;V^5M6IF5MVGC6PZ;`D!A$=VVHRV4P"%(*98A2
M275!]JZ[>*/H5GF`'/.2!^@AF/33G..W(RPF#"_5M%"%KT692#)BX6NAB:EJ
MA._Y%QP^!XH\;^>LIAXF##SLZPZ3^`9,D1)'$QY[$&:F,?S783RU!B^")N!%
M3YO:UKHM#M8D^TBI9_&L()N1[+.47OQDDA4-</7#M.=LBXX1-'=)%`ZF\;!E
MB4>;44"(W_`P8/,(2$1U&3/(UB:1AMIX(^KV85;LNCA3O"Y6QCM1^5682R4K
MVC`G(=I8F?(FF]4]!-&5N9;ARZ"&H,127SCD8*(B+^%JLR1H$`>W`M&.P-YQ
M03WIQ?`Q#6_`SUU>UI`#<Z\8/3<&U8L13\I3I*KB#=3#P>AYR@;6.)B1Q:QE
M@=26&U[-X`MB"5I]FWM<6\AYX)>M2V@B]D`;F]6,FO"45Q.JSZCJ5HQ4GR_+
M%F!KR:&*Z!7[^T<%1M5P'?17P\5/5>/:7*OL6I3;@F.+U=W)LX4R*[C6;N+5
M?]3D,-N_G>36$-6[<?CBQ^`J&&<<(3ZIJ))<Z%NZ21<,=4JIMB)N2,/?;X(7
MQC=CVKUXGX&V.;9=ICK3GA<FK$BNG8%]*[.IXX#>!^,I8)P-KD#OY$VM'[TQ
MG32`8F['"_Z!'PB!BLR&5-0NA$>`HF)U"DA[0.8G)0T(!D6!V4UQ!+V,(Y5;
M@#6;54"FWUPU&)"+<A.T!L&"K4S=!T)6[5O&=)5.;X@E^][U$8N&1U`^E=D<
MOH-1=%,NHH3M5IGRC?1Z<@JM<N586'4+WPL>[(Q^G68Y)4Q8#D:_&N_3>63!
M?/6?'W(SY(@?4O41ILVZXBQ.91_,EE7&Q&<E4-[P)_5RL'/4W^??G[`0X9^:
M@/K*4V/LIH!PXX'`/X%02IF/BR[?H/M>IC:J_,[!#<]A31#:3/2A9[!V9*FF
MRN(AS`4NF]8,M:A1H$H(M\Y:%X"N=<`"Z,)_])N7T#]R7%4J"\$`5`"`C38T
M!/5:])62-)C0*/NGA\?TPLC)<5/3:-JW1-P`XNEMF$;#VC`\JI/QSXMX(/@F
MJ#P_JHTKR[AKCER=:#4XX)D,TA0YSK%VN>=/Y%6*IWP9-B5])-2UM8BI;^58
M<RB;[!WN[)X<G9SU]X_V=\]/SIK%.E8/:;$<UIHV&_:?;,9(NY`._S+3II:,
M"NO`-W^&:8&?<I$OK*F)5-#G&8IL,X<<VGW\R2:U3UW1*OR%UHP9MI-O1DV;
M#J9TY^SLY.?S-Z?%E!;F6KTQB*!RK:FT8?_)IG$_'OTG3*)N//\UI[#4ZWL)
M^7Y.7PZA-=SF"3EN/G^M[70!?5Y<]D`OSJ>0LSKN&H_]?NWR!!5P%UME]3PV
M`=[M$#ZX`\6[9?"Z3R?>NZ94<"5#7_?G7'&#(A));EMYTV/M(3ZS9[NE3/9R
M=P_SI+T=EN:AW.-#_&MO?_K$U/"D+?(_BC/L<W!U9WB6?UO^6%K9N?56M3Q=
M<S..^[FU'5<OH1_=B_T3VYDUQ&EA=/[G&IUUE-=?UGSY2UJ@LY>'O^Q\SC!'
M:UIQ-32>,(HJ+9:Y3*\Z8B@ML6K#Y7&Z+9E_5;9+2^2GX59@Y:II?"1!)6HN
M;^W-/O.@(OW%T7/Y2KIP,NB(F8&7XW0]%HND.5Y7HK"E]-/TW$4HGZ:OQ)I,
M&!LC"X@UAB)%V;WQ>8D2#OIY_-E(/(1T=D_S$<]T`1YP&&CF.2#B"86MOL=D
M#:X"K_G/4S%^U3A11?AIJ:\0XM^V[.17''*Y/$]4F3[,4M93G75D%E;$2AWK
MJK4/YZ?.C,-?YB10@Q):=$9LGNU`$XMY#G;5UA/.Y':Q<'$K4X_%Y72PHIFY
M;:>;5'_;8K0`#XY/CO?EF_-<-=/H](1>CO9%EO<G"I6V^DTIW,7SSMIW;?Z/
M2T`-..7@1UOF"OMP$^6A6$GM815VQ4,&I:\TUI#BU:XVJ'AUXS,/JV;^.&_`
MJ68Z.6\@:,Z<<J\/S_?/JAH^>DZYV!\CNV_81^4*<:TZ0<E<!RB9\_QDJ73#
MW.XO%$&O)/)88B2OD_(NK!2>M_0WOMD*_[![X[R"(X>%[+5(+.=6*SQ5CCK>
M5YSB$2J",EV((UGV&2SQE!^W*A["O;D$T%N78EUK.+]\4Q"]9U?H.BM$SH_?
MD#P6)*MWJ*-1.@4CMXN+##J9'I'2I,YUAD;N5EJ-KY(TO$[QG1)G*Q7SJ++9
MS796.+#2[#9;&F&]"LO9(H[KS(5,_@)_I#"PRCS:4CA\M7@N;&':%7Q9L*5W
MU?4?#.99IF:<4?%_BUU"KFC-W0?I)18IQ3S5E4XOS'X]0YG'$G2H+L^Y9DOQ
M`+OZ=4];/=>U$!0)152E/AJ4\KNV&A)U$936K%!&O%-3'QFXZQ2CL?,!B#I<
MF`W(AD2ZBGO.%E(#N(K=+:3\NHI++4S)=9:7VN@RZR@M#]TOK2[Y,LCL$[$9
M)_9KV[)FGC;GXE/?4Q);<W9M/0V#JKF^S*ZBCTQ[1J\@%I,KDEW3NJ9G@5[#
M?,:K;H;@GX\I-Z'\RW.V$7F/5^9KQ=^FK6C$AW[@&#HQSTT8C#(]C?I,EX#]
M_GN#6["U#6TO3<%,7O&/MHJR\[<LZ#M_6T7EZJ9%VKI)DD7B6S<EM\P;=YCG
M_0_3ERV22>J^K)GB4"5]Y-O,WK22A8)<:I%Q6['Y+$%BO&P&1"(3A^AU4Q2\
M$-S5&?!(O3KA:3'.>O`T5K<!EL*7]2`J>;#AN3="RZM[O9=X/L7)\&0GK;F@
M_Y&.18TU3@D&T=$E#1X[0<L_3O&MFFE!=9GI-7Q)08EYN/3Y$W3Z'5F_M])9
MZ\Z-K9!'/[:>OF@0)._^,3B1E6:2E;-^;L2%X-=&7+E7B#B);7W$36NM6-CF
M0=K0+G6PMIR[!Z"M&XP/0UI38'50-KS*N1&N<,\?X`SR)8Y2=JIOF)OO,%[3
M8ARFC&>G-8/Z+J6*VDR6@#H3&E1+#$6XRF])%K:89UM"]M33-561@$H%-K"N
MRCQE-W(2KBHR39\/^W3*F+L,D@[JZ\IMGLYY-OT:\LO:+GJ)30.;7`V9ZI42
M(],WS&BUP(S*(HA@?,0,V59VLF5G?VV9GYM6(V#B^[MJ9HQ\7L;DJ#9SS,JK
M_-UA'MX>!+CM>;<?Y^F=]G8>R,T@@L?9+V_%"YV_+:WCUTMW:=[H34[QY=$J
MAK]O\Y9[_)MQJK'5TLT3]_I;=2:ZVOXB8CFXXL5&=?XVL7F@:Z[7B>69+PX(
MV_1XP<YP&(Y?I<ETPI8#_#W`J-JDS&_"@-&,Z9;D.>,XESX&^QNE6@?BD(56
M@L<:6.E<@PF.VNA%O!&>&<"S#8/7^\<7H&E_0"2/H/DVS(_8TM8[;RF?1%(0
MXW4?HZLB**6Q#6V*"WO-\;BUKCUW<*),?%Q"G0?*.1`/`54"AUG=:W5<*"@X
MKN$5W^-!F<4'XMT>I&:SA#;R'H_D>7`VZ-^2@8)^F#-0NBDFO,C"&%VY]^$Z
MWQ<.1RS,AXP^ITINLWZT@_Z*^I^(C2[U+?D:W.?JR]03+7TG"'^M%1GIM\4+
M7V)AYM+YUTMOO;AF7.7\?XZD4)_8QXS\W]V-YR+_=W?CQ=/GSQG;Z&QL/E_D
M__L2%VC)?Y^^UK[2R=-$&$DBT(:!U71I8X/!GV>LN]1N++&OA^PXP:04C:4U
M^/U-IW.PV^G@[0J_Q0MO?\3;@^^^ZW3IECFOF4_6UN9_PE96'O[DQQ]+N/%'
M*_XG!53S"?RC'A4CQ2+O$_'0\T0]TNBV(I$H/?GQ1_^3`A7FG`5!W;F>E+!^
ME"=@S?[1TK*X%M?B6ER+:W$MKL6UN!;7XEI<BVMQ+:[%M;@6U^):7(MK<2VN
8Q;6X%M?B6ER+:W'].:__`[I,504`R```
`
end


-- 
Lars R. Clausen ([EMAIL PROTECTED])
A *real* smart bomb would call in sick, perhaps move to another country,
changing its name in the process, open a beach bar maybe and live out its
days in safe anonymity.                          -- Barry O'Neill in rhod

Reply via email to