Only in .: Makefile
diff -u -r /usr/src/dia-0.88.1/objects/UML/class.c ./class.c
--- /usr/src/dia-0.88.1/objects/UML/class.c	Tue May  1 02:56:00 2001
+++ ./class.c	Mon Jan 28 16:46:57 2002
@@ -326,7 +326,8 @@
       list = umlclass->operations;
       while (list != NULL) {
 	UMLOperation *op = (UMLOperation *)list->data;
-	if (op->abstract) 
+	/* Must add a new font for virtual yet not abstract methods. Bold Italic for abstract? */
+	if (op->inheritance_type != UML_FINAL)
 	  font = umlclass->abstract_font;
 	else
 	  font = umlclass->normal_font;
@@ -586,7 +587,7 @@
       op = (UMLOperation *) list->data;
       umlclass->operations_strings[i] = uml_get_operation_string(op);
       
-      if (op->abstract)
+      if (op->inheritance_type != UML_FINAL)
 	width = font_string_width(umlclass->operations_strings[i], umlclass->abstract_font, font_height);
       else
 	width = font_string_width(umlclass->operations_strings[i], umlclass->normal_font, font_height);
diff -u -r /usr/src/dia-0.88.1/objects/UML/class.h ./class.h
--- /usr/src/dia-0.88.1/objects/UML/class.h	Fri Feb  2 15:44:22 2001
+++ ./class.h	Mon Jan 28 15:30:13 2002
@@ -117,8 +117,10 @@
   GtkMenu *op_visible;
   GtkOptionMenu *op_visible_button;
   GtkToggleButton *op_class_scope;
-  GtkToggleButton *op_abstract;
-  
+  GtkMenu *op_inheritance_type;
+  GtkOptionMenu *op_inheritance_type_button;
+  GtkToggleButton *op_constant;  
+
   GtkList *parameters_list;
   GtkListItem *current_param;
   GtkEntry *param_name;
diff -u -r /usr/src/dia-0.88.1/objects/UML/class_dialog.c ./class_dialog.c
--- /usr/src/dia-0.88.1/objects/UML/class_dialog.c	Tue May  1 02:56:00 2001
+++ ./class_dialog.c	Mon Jan 28 16:48:34 2002
@@ -1113,7 +1113,9 @@
   gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_visible_button), val);
   gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_visible), val);
   gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_class_scope), val);
-  gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_abstract), val);
+  gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_inheritance_type), val);
+  gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_inheritance_type_button), val);
+  gtk_widget_set_sensitive(GTK_WIDGET(prop_dialog->op_constant), val);
 
   gtk_widget_set_sensitive(prop_dialog->param_new_button, val);
   gtk_widget_set_sensitive(prop_dialog->param_delete_button, val);
@@ -1128,7 +1130,7 @@
   UMLParameter *param;
   GtkWidget *list_item;
   char *str;
-  
+
   gtk_entry_set_text(prop_dialog->op_name, op->name);
   if (op->type != NULL)
     gtk_entry_set_text(prop_dialog->op_type, op->type);
@@ -1138,7 +1140,11 @@
   gtk_option_menu_set_history(prop_dialog->op_visible_button,
 			      (gint)op->visibility);
   gtk_toggle_button_set_active(prop_dialog->op_class_scope, op->class_scope);
-  gtk_toggle_button_set_active(prop_dialog->op_abstract, op->abstract);
+
+  gtk_option_menu_set_history(prop_dialog->op_inheritance_type_button,
+			      (gint)op->inheritance_type);
+
+  gtk_toggle_button_set_active(prop_dialog->op_constant, op->constant);
 
   gtk_list_clear_items(prop_dialog->parameters_list, 0, -1);
   prop_dialog->current_param = NULL;
@@ -1165,7 +1171,7 @@
   gtk_entry_set_text(prop_dialog->op_name, "");
   gtk_entry_set_text(prop_dialog->op_type, "");
   gtk_toggle_button_set_active(prop_dialog->op_class_scope, FALSE);
-  gtk_toggle_button_set_active(prop_dialog->op_abstract, FALSE);
+  gtk_toggle_button_set_active(prop_dialog->op_constant, FALSE);
 
   gtk_list_clear_items(prop_dialog->parameters_list, 0, -1);
   prop_dialog->current_param = NULL;
@@ -1193,7 +1199,11 @@
     GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(gtk_menu_get_active(prop_dialog->op_visible))));
     
   op->class_scope = prop_dialog->op_class_scope->active;
-  op->abstract = prop_dialog->op_abstract->active;
+
+  op->inheritance_type = (UMLInheritanceType)
+    GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(gtk_menu_get_active(prop_dialog->op_inheritance_type))));
+
+  op->constant = prop_dialog->op_constant->active;
 }
 
 static void
@@ -1686,11 +1696,53 @@
   gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, TRUE, 0);
 
   hbox2 = gtk_hbox_new(FALSE, 5);
-  checkbox = gtk_check_button_new_with_label(_("abstract"));
-  prop_dialog->op_abstract = GTK_TOGGLE_BUTTON(checkbox);
-  gtk_box_pack_start (GTK_BOX (hbox2), checkbox, TRUE, TRUE, 0);
+  label = gtk_label_new(_("Inheritance type:"));
+
+  omenu = gtk_option_menu_new ();
+  menu = gtk_menu_new ();
+  prop_dialog->op_inheritance_type = GTK_MENU(menu);
+  prop_dialog->op_inheritance_type_button = GTK_OPTION_MENU(omenu);
+  submenu = NULL;
+  group = NULL;
+    
+  menuitem = gtk_radio_menu_item_new_with_label (group, _("Abstract"));
+  gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+		      GTK_SIGNAL_FUNC (operations_update), umlclass);
+  gtk_object_set_user_data(GTK_OBJECT(menuitem),
+			   GINT_TO_POINTER(UML_ABSTRACT) );
+  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, _("Virtual"));
+  gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+		      GTK_SIGNAL_FUNC (operations_update), umlclass);
+  gtk_object_set_user_data(GTK_OBJECT(menuitem),
+			   GINT_TO_POINTER(UML_VIRTUAL) );
+  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, _("Final"));
+  gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
+		      GTK_SIGNAL_FUNC (operations_update), umlclass);
+  gtk_object_set_user_data(GTK_OBJECT(menuitem),
+			   GINT_TO_POINTER(UML_FINAL) );
+  group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
+  gtk_menu_append (GTK_MENU (menu), menuitem);
+  gtk_widget_show (menuitem);
+
+  gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
+
+  gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox2), omenu, FALSE, TRUE, 0);
   gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, TRUE, 0);
 
+  hbox2 = gtk_hbox_new(FALSE, 5);
+
+  checkbox = gtk_check_button_new_with_label(_("Constant"));
+  prop_dialog->op_constant = GTK_TOGGLE_BUTTON(checkbox);
+
+  gtk_box_pack_start (GTK_BOX (hbox2), checkbox, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, TRUE, 0);
   
   gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 0);
 
diff -u -r /usr/src/dia-0.88.1/objects/UML/uml.c ./uml.c
--- /usr/src/dia-0.88.1/objects/UML/uml.c	Tue May  1 02:56:00 2001
+++ ./uml.c	Mon Jan 28 17:00:31 2002
@@ -154,6 +154,8 @@
   if (operation->type != NULL) {
     len += 2 + strlen(operation->type);
   }
+  if(operation->constant != 0)
+    len += 6;
   
   /* generate string: */
   str = g_malloc(sizeof(char)*(len+1));
@@ -191,8 +193,11 @@
     strcat(str, operation->type);
   }
 
+  if (operation->constant != 0) {
+    strcat(str, " const");
+  }
+
   assert(strlen(str)==len);
-  
   return str;
 }
 
@@ -290,8 +295,9 @@
     newop->type = NULL;
   }
   newop->visibility = op->visibility;
-  newop->abstract = op->abstract;
+  newop->inheritance_type = op->inheritance_type;
   newop->class_scope = op->class_scope;
+  newop->constant = op->constant;
 
   newop->left_connection = op->left_connection;
   newop->right_connection = op->right_connection;
@@ -410,7 +416,9 @@
   op->name = g_strdup("");
   op->type = NULL;
   op->visibility = UML_PUBLIC;
-  op->abstract = FALSE;
+  op->inheritance_type = UML_VIRTUAL;
+  op->constant = FALSE;
+
   op->class_scope = FALSE;
   op->parameters = NULL;
 
@@ -484,7 +492,11 @@
   data_add_enum(composite_add_attribute(composite, "visibility"),
 		op->visibility);
   data_add_boolean(composite_add_attribute(composite, "abstract"),
-		   op->abstract);
+		   op->inheritance_type == UML_ABSTRACT);
+  data_add_enum(composite_add_attribute(composite, "inheritance_type"),
+		op->inheritance_type);
+  data_add_boolean(composite_add_attribute(composite, "constant"),
+		   op->constant);
   data_add_boolean(composite_add_attribute(composite, "class_scope"),
 		   op->class_scope);
   
@@ -592,11 +604,21 @@
   if (attr_node != NULL)
     op->visibility =  data_enum( attribute_first_data(attr_node) );
   
-  op->abstract = FALSE;
+  op->inheritance_type = UML_VIRTUAL;
+  /* Backward compatibility */
   attr_node = composite_find_attribute(composite, "abstract");
   if (attr_node != NULL)
-    op->abstract =  data_boolean( attribute_first_data(attr_node) );
-  
+    if(data_boolean( attribute_first_data(attr_node) ))
+      op->inheritance_type = UML_ABSTRACT;
+
+  attr_node = composite_find_attribute(composite, "inheritance_type");
+  if (attr_node != NULL)
+    op->inheritance_type = data_enum( attribute_first_data(attr_node) );
+    
+  attr_node = composite_find_attribute(composite, "constant");
+  if (attr_node != NULL)
+    op->constant =  data_boolean( attribute_first_data(attr_node) );
+
   op->class_scope = FALSE;
   attr_node = composite_find_attribute(composite, "class_scope");
   if (attr_node != NULL)
diff -u -r /usr/src/dia-0.88.1/objects/UML/uml.h ./uml.h
--- /usr/src/dia-0.88.1/objects/UML/uml.h	Thu Jun  3 12:12:04 1999
+++ ./uml.h	Mon Jan 28 15:50:18 2002
@@ -33,6 +33,13 @@
   UML_IMPLEMENTATION /* ?What's this? */
 } UMLVisibility;
 
+typedef enum _UMLInheritanceType {
+  UML_ABSTRACT, /* Pure virtual method: an object of this class cannot be instanciated */
+  UML_VIRTUAL, /* Virtual method : could be reimplemented in derivated classes */
+  UML_FINAL /* Final method: can't be redefined in subclasses */
+} UMLInheritanceType;
+
+
 typedef enum _UMLParameterKind {
   UML_UNDEF_KIND,
   UML_IN,
@@ -56,7 +63,8 @@
   char *name;
   char *type; /* Return type, NULL => No return type */
   UMLVisibility visibility;
-  int abstract;
+  UMLInheritanceType inheritance_type;
+  int constant; /* Do not modify the object */
   int class_scope;
   GList *parameters; /* List of UMLParameter */
 
