All pastes #590830 Raw Edit

Miscellany

public text v1 · immutable
#590830 ·published 2007-06-26 20:14 UTC
rendered paste body
Index: enums.h
===================================================================
--- enums.h	(revision 80804)
+++ enums.h	(working copy)
@@ -58,4 +58,12 @@
 	VisibilityHidden
 };
 
+enum CollectionChangeType {
+	CollectionChangeTypeItemAdded,
+	CollectionChangeTypeItemRemoved,
+	CollectionChangeTypeItemChanged,
+
+	CollectionChangeTypeChanged
+};
+
 #endif
Index: geometry.h
===================================================================
--- geometry.h	(revision 80804)
+++ geometry.h	(working copy)
@@ -50,8 +50,6 @@
 	GeometryCollection () {}
 	virtual Type::Kind GetObjectType () { return Type::GEOMETRY_COLLECTION; }
 	virtual Type::Kind GetElementType () { return Type::GEOMETRY; }
-
-	virtual void OnSubPropertyChanged  (DependencyProperty *prop, DependencyProperty *subprop);
 };
 GeometryCollection* geometry_collection_new ();
 
@@ -68,6 +66,7 @@
 
 	virtual void OnPropertyChanged (DependencyProperty *prop);
 	virtual void OnSubPropertyChanged (DependencyProperty *prop, DependencyProperty *subprop);
+	virtual void OnCollectionChanged (Collection *col, CollectionChangeType type, DependencyObject *obj, DependencyProperty *prop);
 
 	virtual void Draw (cairo_t *cr);
 };
@@ -124,8 +123,6 @@
 	PathFigureCollection () {}
 	virtual Type::Kind GetObjectType () { return Type::PATHFIGURE_COLLECTION; }
 	virtual Type::Kind GetElementType () { return Type::PATHFIGURE; }
-
-	virtual void OnSubPropertyChanged  (DependencyProperty *prop, DependencyProperty *subprop);
 };
 PathFigureCollection* path_figure_collection_new ();
 
@@ -141,6 +138,7 @@
 	virtual Type::Kind GetObjectType () { return Type::PATHGEOMETRY; };
 
 	virtual void OnPropertyChanged (DependencyProperty *prop);
+	virtual void OnCollectionChanged (Collection *col, CollectionChangeType type, DependencyObject *obj, DependencyProperty *prop);
 	virtual void Draw (cairo_t *cr);
 
 	// this is an element-by-element decision
@@ -180,8 +178,6 @@
 	PathSegmentCollection () {}
 	virtual Type::Kind GetObjectType () { return Type::PATHSEGMENT_COLLECTION; }
 	virtual Type::Kind GetElementType () { return Type::PATHSEGMENT; }
-
-	virtual void OnSubPropertyChanged  (DependencyProperty *prop, DependencyProperty *subprop);
 };
 PathSegmentCollection* path_segment_collection_new ();
 
@@ -200,6 +196,7 @@
 	virtual Type::Kind GetObjectType () { return Type::PATHFIGURE; };
 
 	virtual void OnPropertyChanged (DependencyProperty *prop);
+	virtual void OnCollectionChanged (Collection *col, CollectionChangeType type, DependencyObject *obj, DependencyProperty *prop);
 	virtual void Draw (cairo_t *cr);
 };
 PathFigure* path_figure_new ();
@@ -282,6 +279,8 @@
 	virtual Type::Kind GetObjectType () { return Type::LINESEGMENT; };
 
 	virtual void Draw (cairo_t *cr);
+
+	virtual void OnPropertyChanged (DependencyProperty *prop);
 };
 LineSegment	*line_segment_new	();
 Point*		line_segment_get_point	(LineSegment *segment);
Index: collection.h
===================================================================
--- collection.h	(revision 80804)
+++ collection.h	(working copy)
@@ -30,7 +30,7 @@
 	};
 	
 	List *list;
-	void *closure;
+	DependencyObject *closure;
 	
 	Collection ();
 	virtual ~Collection ();
@@ -42,6 +42,8 @@
 	virtual void Insert (int index, DependencyObject *data);
 	virtual void Clear  ();
 
+	virtual void OnSubPropertyChanged (DependencyProperty *prop, DependencyProperty *subprop);
+
  private:
 	void SharedAdd (DependencyObject *data);
 };
Index: dependencyobject.h
===================================================================
--- dependencyobject.h	(revision 80804)
+++ dependencyobject.h	(working copy)
@@ -11,6 +11,7 @@
 #define __MONO_DEPOBJECT_H__
 
 #include "value.h"
+#include "enums.h"
 
 typedef void (*EventHandler) (gpointer data);
 
@@ -85,7 +86,13 @@
 	//    returning TRUE.
 	//
 	virtual bool OnChildPropertyChanged (DependencyProperty *prop, DependencyObject *child) { return FALSE; }
-	
+
+
+	//
+	// OnCollectionPropertyChanged:
+	//
+	virtual void OnCollectionChanged (Collection *col, CollectionChangeType type, DependencyObject *obj, DependencyProperty *prop) { }
+
 	virtual Type::Kind GetObjectType ();
 	Type* GetType ()
 	{
Index: geometry.cpp
===================================================================
--- geometry.cpp	(revision 80804)
+++ geometry.cpp	(working copy)
@@ -119,6 +119,14 @@
 }
 
 void
+GeometryGroup::OnCollectionChanged (Collection *col, CollectionChangeType type, DependencyObject *obj, DependencyProperty *prop)
+{
+	// GeometryGroup only has one collection, so let's save the hash lookup
+	//if (col == GetValue (GeometryGroup::ChildrenProperty)->AsGeometryCollection())
+		NotifyAttacheesOfPropertyChange (GeometryGroup::ChildrenProperty);
+}
+
+void
 GeometryGroup::Draw (cairo_t *cr)
 {
 	GeometryCollection *children = geometry_group_get_children (this);
@@ -156,12 +164,6 @@
 	return new GeometryCollection ();
 }
 
-void
-GeometryCollection::OnSubPropertyChanged  (DependencyProperty *prop, DependencyProperty *subprop)
-{
-	NotifyAttacheesOfPropertyChange (subprop);
-}
-
 //
 // PathFigureCollection
 //
@@ -172,12 +174,6 @@
 	return new PathFigureCollection ();
 }
 
-void
-PathFigureCollection::OnSubPropertyChanged  (DependencyProperty *prop, DependencyProperty *subprop)
-{
-	NotifyAttacheesOfPropertyChange (subprop);
-}
-
 //
 // PathSegmentCollection
 //
@@ -188,12 +184,6 @@
 	return new PathSegmentCollection ();
 }
 
-void
-PathSegmentCollection::OnSubPropertyChanged  (DependencyProperty *prop, DependencyProperty *subprop)
-{
-	NotifyAttacheesOfPropertyChange (subprop);
-}
-
 //
 // EllipseGeometry
 //
@@ -346,6 +336,14 @@
 }
 
 void
+PathGeometry::OnCollectionChanged (Collection *col, CollectionChangeType type, DependencyObject *obj, DependencyProperty *prop)
+{
+	// PathGeometry only has one collection, so let's save the hash lookup
+	//if (col == GetValue (PathGeometry::FiguresProperty)->AsPathFigureCollection ())
+		NotifyAttacheesOfPropertyChange (PathGeometry::FiguresProperty);
+}
+
+void
 PathGeometry::Draw (cairo_t *cr)
 {
 	PathFigureCollection *children = GetValue (PathGeometry::FiguresProperty)->AsPathFigureCollection();
@@ -480,9 +478,21 @@
 			newcol->closure = this;
 		}
 	}
+
+	if (prop->type == Type::PATHFIGURE) {
+		NotifyAttacheesOfPropertyChange (prop);
+	}
 }
 
 void
+PathFigure::OnCollectionChanged (Collection *col, CollectionChangeType type, DependencyObject *obj, DependencyProperty *prop)
+{
+	// PathFigure only has one collection, so let's save the hash lookup
+	//if (col == GetValue (PathFigure::SegmentsProperty)->AsPathSegmentCollection())
+		NotifyAttacheesOfPropertyChange (PathFigure::SegmentsProperty);
+}
+
+void
 PathFigure::Draw (cairo_t *cr)
 {
 	PathSegmentCollection *children = GetValue (PathFigure::SegmentsProperty)->AsPathSegmentCollection ();
@@ -754,6 +764,15 @@
 	cairo_line_to (cr, x, y);
 }
 
+void
+LineSegment::OnPropertyChanged (DependencyProperty *prop)
+{
+	if (prop->type == Type::LINESEGMENT)
+		NotifyAttacheesOfPropertyChange (prop);
+	else
+		PathSegment::OnPropertyChanged (prop);
+}
+
 //
 // PolyBezierSegment
 //
Index: collection.cpp
===================================================================
--- collection.cpp	(revision 80804)
+++ collection.cpp	(working copy)
@@ -60,6 +60,11 @@
 	g_return_if_fail (Type::Find(data->GetObjectType())->IsSubclassOf(GetElementType()));
 	
 	list->Append (new Collection::Node (data, this));
+
+	data->Attach (NULL, this);
+
+	if (closure)
+		closure->OnCollectionChanged (this, CollectionChangeTypeItemAdded, data, NULL);
 }
 
 void
@@ -68,9 +73,24 @@
 	g_return_if_fail (Type::Find(data->GetObjectType())->IsSubclassOf(GetElementType()));
 	
 	list->Insert (new Collection::Node (data, this), index);
+
+	data->Attach (NULL, this);
+
+	if (closure)
+		closure->OnCollectionChanged (this, CollectionChangeTypeItemAdded, data, NULL);
 }
 
 void
+Collection::OnSubPropertyChanged (DependencyProperty *prop, DependencyProperty *subprop)
+{
+	if (closure) {
+		/* unfortunately OnSubPropertyChanged doesn't give us
+		   enough info to fill in the obj parameter here */
+		closure->OnCollectionChanged (this, CollectionChangeTypeItemChanged, NULL, subprop);
+	}
+}
+
+void
 Collection::Remove (DependencyObject *data)
 {
 	Collection::Node *n;
@@ -79,6 +99,9 @@
 		return;
 	
 	n->Unlink ();
+
+	if (closure)
+		closure->OnCollectionChanged (this, CollectionChangeTypeItemRemoved, data, NULL);
 	
 	delete n;
 }
@@ -87,6 +110,9 @@
 Collection::Clear ()
 {
 	list->Clear (true);
+
+	if (closure)
+		closure->OnCollectionChanged (this, CollectionChangeTypeChanged, NULL, NULL);
 }
 
 void 
Index: shape.cpp
===================================================================
--- shape.cpp	(revision 80804)
+++ shape.cpp	(working copy)
@@ -1089,6 +1089,13 @@
 	Shape::OnPropertyChanged (prop);
 }
 
+void
+Path::OnSubPropertyChanged (DependencyProperty *prop, DependencyProperty *subprop)
+{
+	CleanupCache ();
+	FullInvalidate (false);
+}
+
 Geometry *
 path_get_data (Path *path)
 {
Index: shape.h
===================================================================
--- shape.h	(revision 80804)
+++ shape.h	(working copy)
@@ -253,6 +253,7 @@
 
 	virtual bool CanFill ();
 	virtual void OnPropertyChanged (DependencyProperty *prop);
+	virtual void OnSubPropertyChanged (DependencyProperty *prop, DependencyProperty *subprop);
 };
 
 Path *path_new (void);