[dia] layer: fix ownership of layer objects
- From: Zander <zbrown src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] layer: fix ownership of layer objects
- Date: Thu, 23 Apr 2020 11:45:07 +0000 (UTC)
commit 97dfdefb5d40ba93eca448c5e1f3794b59ae7b58
Author: Zander Brown <zbrown gnome org>
Date: Sun Apr 5 01:03:24 2020 +0100
layer: fix ownership of layer objects
DiaLayer instances are now owned by the DiagramData they are in, rather than fluke leaked refs
->layer and ->active_layer are now effectivly private
app/app_procs.c | 58 +++----
app/commands.c | 5 +-
app/diagram.c | 43 +++--
app/find-and-replace.c | 2 +-
app/highlight.c | 11 +-
app/layer-editor/dia-layer-properties.c | 6 +-
app/layer-editor/dia-layer-widget.c | 20 ++-
app/layer-editor/layer_dialog.c | 72 +++-----
app/load_save.c | 299 ++++++++++++++++++--------------
app/modify_tool.c | 4 +-
app/select.c | 6 +-
app/undo.c | 40 ++---
lib/dia_xml.h | 3 +
lib/diagramdata.c | 272 +++++++++++++++++------------
lib/diagramdata.h | 23 ++-
lib/object.c | 5 +-
plug-ins/drs/dia-render-script-import.c | 24 ++-
plug-ins/drs/dia-render-script.c | 13 +-
plug-ins/dxf/dxf-export.c | 52 +++---
plug-ins/dxf/dxf-import.c | 43 ++---
plug-ins/pixbuf/pixbuf.c | 54 +++---
plug-ins/python/pydia-diagramdata.c | 121 ++++++-------
plug-ins/python/pydia-layer.c | 3 +-
plug-ins/svg/svg-import.c | 11 +-
plug-ins/vdx/vdx-export.c | 8 +-
plug-ins/vdx/vdx-import.c | 137 ++++++++-------
plug-ins/wpg/wpg-import.c | 2 +-
plug-ins/xfig/xfig-export.c | 22 ++-
plug-ins/xfig/xfig-import.c | 46 ++---
29 files changed, 768 insertions(+), 637 deletions(-)
---
diff --git a/app/app_procs.c b/app/app_procs.c
index b5b37b4c..11c8f64a 100644
--- a/app/app_procs.c
+++ b/app/app_procs.c
@@ -164,12 +164,14 @@ show_layers_parse_numbers (DiagramData *diagdata,
g_warning (_("invalid layer range %lu - %lu"), low, high - 1);
return;
}
- if (high > n_layers)
+
+ if (high > n_layers) {
high = n_layers;
+ }
/* Set the visible layers */
- for ( i = low; i < high; i++ ) {
- DiaLayer *lay = DIA_LAYER (g_ptr_array_index (diagdata->layers, i));
+ for (i = low; i < high; i++) {
+ DiaLayer *lay = data_layer_get_nth (diagdata, i);
if (visible_layers[i] == TRUE) {
g_warning (_("Layer %lu (%s) selected more than once."),
@@ -180,41 +182,37 @@ show_layers_parse_numbers (DiagramData *diagdata,
}
}
+
static void
show_layers_parse_word (DiagramData *diagdata,
gboolean *visible_layers,
gint n_layers,
const char *str)
{
- GPtrArray *layers = diagdata->layers;
gboolean found = FALSE;
+ int len;
+ char *p;
+ const char *name;
/* Apply --show-layers=LAYER,LAYER,... switch. 13.3.2004 sampo iki fi */
- if (layers) {
- int len, k = 0;
- DiaLayer *lay;
- char *p;
- const char *name;
-
- for (k = 0; k < layers->len; k++) {
- lay = DIA_LAYER (g_ptr_array_index (layers, k));
- name = dia_layer_get_name (lay);
-
- if (name) {
- len = strlen (name);
- if ((p = strstr (str, name)) != NULL) {
- if (((p == str) || (p[-1] == ',')) /* zap false positives */
- && ((p[len] == 0) || (p[len] == ','))){
- found = TRUE;
- if (visible_layers[k] == TRUE) {
- g_warning (_("Layer %d (%s) selected more than once."), k, name);
- }
- visible_layers[k] = TRUE;
+
+ DIA_FOR_LAYER_IN_DIAGRAM (diagdata, lay, k, {
+ name = dia_layer_get_name (lay);
+
+ if (name) {
+ len = strlen (name);
+ if ((p = strstr (str, name)) != NULL) {
+ if (((p == str) || (p[-1] == ',')) /* zap false positives */
+ && ((p[len] == 0) || (p[len] == ','))){
+ found = TRUE;
+ if (visible_layers[k] == TRUE) {
+ g_warning (_("Layer %d (%s) selected more than once."), k, name);
}
+ visible_layers[k] = TRUE;
}
}
}
- }
+ });
if (found == FALSE) {
g_warning (_("There is no layer named %s."), str);
@@ -262,21 +260,21 @@ handle_show_layers (DiagramData *diagdata,
DiaLayer *layer;
int i;
- visible_layers = g_new (gboolean, diagdata->layers->len);
+ visible_layers = g_new (gboolean, data_layer_count (diagdata));
/* Assume all layers are non-visible */
- for (i = 0; i < diagdata->layers->len; i++) {
+ for (i = 0; i < data_layer_count (diagdata); i++) {
visible_layers[i] = FALSE;
}
/* Split the layer-range by commas */
show_layers_parse_string (diagdata,
visible_layers,
- diagdata->layers->len,
+ data_layer_count (diagdata),
show_layers);
/* Set the visibility of the layers */
- for (i = 0; i < diagdata->layers->len; i++) {
- layer = g_ptr_array_index (diagdata->layers, i);
+ for (i = 0; i < data_layer_count (diagdata); i++) {
+ layer = data_layer_get_nth (diagdata, i);
if (visible_layers[i] == TRUE) {
dia_layer_set_visible (layer, TRUE);
diff --git a/app/commands.c b/app/commands.c
index dcedd5a9..7c6e33f4 100644
--- a/app/commands.c
+++ b/app/commands.c
@@ -1513,6 +1513,7 @@ layers_add_layer_callback (GtkAction *action)
diagram_edit_layer (dia, NULL);
}
+
void
layers_rename_layer_callback (GtkAction *action)
{
@@ -1523,9 +1524,11 @@ layers_rename_layer_callback (GtkAction *action)
return;
}
- diagram_edit_layer (dia, dia->data->active_layer);
+ diagram_edit_layer (dia,
+ dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)));
}
+
void
objects_place_over_callback (GtkAction *action)
{
diff --git a/app/diagram.c b/app/diagram.c
index aa2f0f1f..86e1bafc 100644
--- a/app/diagram.c
+++ b/app/diagram.c
@@ -151,7 +151,7 @@ dia_diagram_finalize (GObject *object)
g_clear_object (&priv->file);
g_clear_pointer (&dia->filename, g_free);
-
+
G_OBJECT_CLASS (dia_diagram_parent_class)->finalize (object);
}
@@ -714,22 +714,27 @@ diagram_remove_ddisplay (Diagram *dia, DDisplay *ddisp)
}
}
+
void
diagram_add_object (Diagram *dia, DiaObject *obj)
{
- dia_layer_add_object (dia->data->active_layer, obj);
+ dia_layer_add_object (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)),
+ obj);
diagram_modified (dia);
}
+
void
diagram_add_object_list (Diagram *dia, GList *list)
{
- dia_layer_add_objects (dia->data->active_layer, list);
+ dia_layer_add_objects (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)),
+ list);
diagram_modified (dia);
}
+
void
diagram_selected_break_external (Diagram *dia)
{
@@ -996,7 +1001,7 @@ diagram_find_clicked_object (Diagram *dia,
Point *pos,
real maxdist)
{
- return dia_layer_find_closest_object_except (dia->data->active_layer,
+ return dia_layer_find_closest_object_except (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)),
pos, maxdist, NULL);
}
@@ -1006,7 +1011,7 @@ diagram_find_clicked_object_except (Diagram *dia,
real maxdist,
GList *avoid)
{
- return dia_layer_find_closest_object_except (dia->data->active_layer,
+ return dia_layer_find_closest_object_except (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)),
pos,
maxdist,
avoid);
@@ -1058,9 +1063,8 @@ diagram_find_closest_connectionpoint (Diagram *dia,
DiaObject *notthis)
{
real dist = 100000000.0;
- guint i;
- for (i = 0; i < dia->data->layers->len; i++) {
- DiaLayer *layer = DIA_LAYER (g_ptr_array_index (dia->data->layers, i));
+
+ DIA_FOR_LAYER_IN_DIAGRAM (DIA_DIAGRAM_DATA (dia), layer, i, {
ConnectionPoint *this_cp;
real this_dist;
if (dia_layer_is_connectable (layer)) {
@@ -1073,7 +1077,8 @@ diagram_find_closest_connectionpoint (Diagram *dia,
*closest = this_cp;
}
}
- }
+ });
+
return dist;
}
@@ -1287,7 +1292,7 @@ diagram_group_selected (Diagram *dia)
dia->data->selected = parent_list_affected(dia->data->selected);
#endif
- orig_list = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA (dia)->active_layer));
+ orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA
(dia))));
/* We have to rebuild the selection list so that it is the same
order as in the Diagram list. */
@@ -1348,7 +1353,7 @@ void diagram_ungroup_selected(Diagram *dia)
group_list = group_objects(group);
- group_index = dia_layer_object_get_index (dia->data->active_layer, group);
+ group_index = dia_layer_object_get_index (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)),
group);
change = dia_ungroup_objects_change_new (dia, group_list, group, group_index);
dia_change_apply (change, dia);
@@ -1393,11 +1398,11 @@ diagram_place_under_selected (Diagram *dia)
if (g_list_length (dia->data->selected) == 0)
return;
- orig_list = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA (dia)->active_layer));
+ orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA
(dia))));
sorted_list = diagram_get_sorted_selected_remove (dia);
object_add_updates_list (sorted_list, dia);
- dia_layer_add_objects_first (dia->data->active_layer, sorted_list);
+ dia_layer_add_objects_first (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)), sorted_list);
dia_reorder_objects_change_new (dia, g_list_copy (sorted_list), orig_list);
@@ -1415,11 +1420,11 @@ diagram_place_over_selected(Diagram *dia)
if (g_list_length (dia->data->selected) == 0)
return;
- orig_list = g_list_copy (dia_layer_get_object_list (dia->data->active_layer));
+ orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA
(dia))));
sorted_list = diagram_get_sorted_selected_remove (dia);
object_add_updates_list (sorted_list, dia);
- dia_layer_add_objects (dia->data->active_layer, sorted_list);
+ dia_layer_add_objects (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)), sorted_list);
dia_reorder_objects_change_new (dia, g_list_copy (sorted_list), orig_list);
@@ -1439,7 +1444,7 @@ diagram_place_up_selected(Diagram *dia)
if (g_list_length (dia->data->selected) == 0)
return;
- orig_list = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA (dia)->active_layer));
+ orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA
(dia))));
sorted_list = diagram_get_sorted_selected(dia);
object_add_updates_list(orig_list, dia);
@@ -1462,7 +1467,7 @@ diagram_place_up_selected(Diagram *dia)
}
}
- dia_layer_set_object_list (dia->data->active_layer, new_list);
+ dia_layer_set_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)), new_list);
dia_reorder_objects_change_new (dia, g_list_copy (sorted_list), orig_list);
@@ -1482,7 +1487,7 @@ diagram_place_down_selected (Diagram *dia)
if (g_list_length (dia->data->selected) == 0)
return;
- orig_list = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA (dia)->active_layer));
+ orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA
(dia))));
sorted_list = diagram_get_sorted_selected (dia);
object_add_updates_list (orig_list, dia);
@@ -1508,7 +1513,7 @@ diagram_place_down_selected (Diagram *dia)
}
}
- dia_layer_set_object_list (dia->data->active_layer, new_list);
+ dia_layer_set_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)), new_list);
dia_reorder_objects_change_new (dia, g_list_copy (sorted_list), orig_list);
diff --git a/app/find-and-replace.c b/app/find-and-replace.c
index fa184559..fe692c59 100644
--- a/app/find-and-replace.c
+++ b/app/find-and-replace.c
@@ -408,7 +408,7 @@ fnr_respond (GtkWidget *widget, gint response_id, gpointer data)
sd.last = sd.found ? sd.found : sd.first;
g_object_set_data (G_OBJECT (widget), "last-found", sd.last);
if (sd.last) {
- if (dia_object_get_parent_layer(sd.last) != ddisp->diagram->data->active_layer) {
+ if (dia_object_get_parent_layer(sd.last) != dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA
(ddisp->diagram))) {
/* can only select objects in the active layer */
data_set_active_layer(ddisp->diagram->data, dia_object_get_parent_layer(sd.last));
diagram_add_update_all(ddisp->diagram);
diff --git a/app/highlight.c b/app/highlight.c
index a46cc46f..e04d31ff 100644
--- a/app/highlight.c
+++ b/app/highlight.c
@@ -71,6 +71,7 @@ highlight_reset_objects(GList *objects, Diagram *dia)
}
}
+
/* Currently does a brute-force run-through of all objects.
* If this is too slow, we could create a list of currently highlighted
* objects in the diagram and traverse that before killing it.
@@ -78,9 +79,9 @@ highlight_reset_objects(GList *objects, Diagram *dia)
* the active layer.
*/
void
-highlight_reset_all (Diagram *dia) {
- int i;
- for (i = 0; i < dia->data->layers->len; i++) {
- highlight_reset_objects (dia_layer_get_object_list (DIA_LAYER (g_ptr_array_index (dia->data->layers,
i))), dia);
- }
+highlight_reset_all (Diagram *dia)
+{
+ DIA_FOR_LAYER_IN_DIAGRAM (DIA_DIAGRAM_DATA (dia), layer, i, {
+ highlight_reset_objects (dia_layer_get_object_list (layer), dia);
+ });
}
diff --git a/app/layer-editor/dia-layer-properties.c b/app/layer-editor/dia-layer-properties.c
index 5abe50ed..93a2358d 100644
--- a/app/layer-editor/dia-layer-properties.c
+++ b/app/layer-editor/dia-layer-properties.c
@@ -136,7 +136,7 @@ dia_layer_properties_response (GtkDialog *dialog,
} else if (priv->diagram) {
DiaLayer *layer;
int pos = data_layer_get_index (DIA_DIAGRAM_DATA (priv->diagram),
- DIA_DIAGRAM_DATA (priv->diagram)->active_layer) + 1;
+ dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (priv->diagram)) +
1);
layer = dia_layer_new (gtk_entry_get_text (GTK_ENTRY (priv->entry)),
DIA_DIAGRAM_DATA (priv->diagram));
@@ -148,6 +148,8 @@ dia_layer_properties_response (GtkDialog *dialog,
dia_layer_change_new (priv->diagram, layer, TYPE_ADD_LAYER, pos);
undo_set_transactionpoint (priv->diagram->undo);
+
+ g_clear_object (&layer);
} else {
g_critical ("Huh, no layer or diagram");
}
@@ -312,7 +314,7 @@ dia_layer_properties_set_diagram (DiaLayerProperties *self,
data_layer_count (DIA_DIAGRAM_DATA (dia)));
gtk_entry_set_text (GTK_ENTRY (priv->entry), name);
- g_free (name);
+ g_clear_pointer (&name, g_free);
}
g_object_notify_by_pspec (G_OBJECT (self), lp_pspecs[LP_PROP_DIAGRAM]);
diff --git a/app/layer-editor/dia-layer-widget.c b/app/layer-editor/dia-layer-widget.c
index 64dd0afc..d66dde95 100644
--- a/app/layer-editor/dia-layer-widget.c
+++ b/app/layer-editor/dia-layer-widget.c
@@ -250,7 +250,8 @@ connectable_toggled (GtkToggleButton *widget,
gtk_toggle_button_get_active (widget));
}
- if (priv->layer == dia_layer_get_parent_diagram (priv->layer)->active_layer) {
+
+ if (priv->layer == dia_diagram_data_get_active_layer (dia_layer_get_parent_diagram (priv->layer))) {
priv->connect_off = !gtk_toggle_button_get_active (widget);
if (priv->connect_off) {
priv->connect_on = FALSE;
@@ -272,6 +273,7 @@ connectable_toggled (GtkToggleButton *widget,
}
}
+
static void
visible_clicked (GtkToggleButton *widget,
gpointer userdata)
@@ -427,7 +429,19 @@ dia_layer_widget_set_layer (DiaLayerWidget *self,
if (layer) {
priv->layer = g_object_ref (layer);
+ if (g_set_object (&priv->layer, layer)) {
g_clear_object (&priv->name_binding);
+
+ g_message (" -> accepted %p", priv->layer);
+
+ if (!layer) {
+ gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
+
+ g_object_notify_by_pspec (G_OBJECT (self), lw_pspecs[LW_PROP_LAYER]);
+
+ return;
+ }
+
priv->name_binding = g_object_bind_property (layer, "name",
priv->label, "label",
G_BINDING_SYNC_CREATE);
@@ -449,12 +463,10 @@ dia_layer_widget_set_layer (DiaLayerWidget *self,
priv->connect_off = FALSE;
gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
- } else {
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- }
g_object_notify_by_pspec (G_OBJECT (self), lw_pspecs[LW_PROP_LAYER]);
}
+}
DiaLayer *
diff --git a/app/layer-editor/layer_dialog.c b/app/layer-editor/layer_dialog.c
index 5a416daa..dcd81182 100644
--- a/app/layer-editor/layer_dialog.c
+++ b/app/layer-editor/layer_dialog.c
@@ -160,16 +160,16 @@ dia_layer_change_apply (DiaChange *self, Diagram *dia)
switch (change->type) {
case TYPE_DELETE_LAYER:
- data_remove_layer(dia->data, change->layer);
+ data_remove_layer (dia->data, change->layer);
break;
case TYPE_ADD_LAYER:
- data_add_layer_at(dia->data, change->layer, change->index);
+ data_add_layer_at (dia->data, change->layer, change->index);
break;
case TYPE_RAISE_LAYER:
- data_raise_layer(dia->data, change->layer);
+ data_raise_layer (dia->data, change->layer);
break;
case TYPE_LOWER_LAYER:
- data_lower_layer(dia->data, change->layer);
+ data_lower_layer (dia->data, change->layer);
break;
default:
g_return_if_reached ();
@@ -186,16 +186,16 @@ dia_layer_change_revert (DiaChange *self, Diagram *dia)
switch (change->type) {
case TYPE_DELETE_LAYER:
- data_add_layer_at(dia->data, change->layer, change->index);
+ data_add_layer_at (dia->data, change->layer, change->index);
break;
case TYPE_ADD_LAYER:
- data_remove_layer(dia->data, change->layer);
+ data_remove_layer (dia->data, change->layer);
break;
case TYPE_RAISE_LAYER:
- data_lower_layer(dia->data, change->layer);
+ data_lower_layer (dia->data, change->layer);
break;
case TYPE_LOWER_LAYER:
- data_raise_layer(dia->data, change->layer);
+ data_raise_layer (dia->data, change->layer);
break;
default:
g_return_if_reached ();
@@ -212,31 +212,17 @@ dia_layer_change_free (DiaChange *self)
{
DiaLayerChange *change = DIA_LAYER_CHANGE (self);
- switch (change->type) {
- case TYPE_DELETE_LAYER:
- if (change->applied) {
- g_clear_object (&change->layer);
- }
- break;
- case TYPE_ADD_LAYER:
- if (!change->applied) {
- g_clear_object (&change->layer);
- }
- break;
- case TYPE_RAISE_LAYER:
- case TYPE_LOWER_LAYER:
- default:
- break;
- }
+ g_clear_object (&change->layer);
}
+
DiaChange *
dia_layer_change_new (Diagram *dia, DiaLayer *layer, enum LayerChangeType type, int index)
{
DiaLayerChange *change = dia_change_new (DIA_TYPE_LAYER_CHANGE);
change->type = type;
- change->layer = layer;
+ g_set_object (&change->layer, layer);
change->index = index;
change->applied = 1;
@@ -264,34 +250,30 @@ dia_layer_visibility_change_apply (DiaChange *self,
Diagram *dia)
{
DiaLayerVisibilityChange *change = DIA_LAYER_VISIBILITY_CHANGE (self);
- GPtrArray *layers;
DiaLayer *layer = change->layer;
int visible = FALSE;
- int i;
if (change->is_exclusive) {
/* First determine if _any_ other layer widgets are set to visible.
* If there is, exclusive switching turns all off. */
- for (i=0;i<dia->data->layers->len;i++) {
- DiaLayer *temp_layer = g_ptr_array_index(dia->data->layers, i);
+ DIA_FOR_LAYER_IN_DIAGRAM (DIA_DIAGRAM_DATA (dia), temp_layer, i, {
if (temp_layer != layer) {
visible |= dia_layer_is_visible (temp_layer);
}
- }
+ });
/* Now, toggle the visibility for all layers except the specified one */
- layers = dia->data->layers;
- for (i = 0; i < layers->len; i++) {
- DiaLayer *temp_layer = (DiaLayer *) g_ptr_array_index(layers, i);
+ DIA_FOR_LAYER_IN_DIAGRAM (DIA_DIAGRAM_DATA (dia), temp_layer, i, {
if (temp_layer == layer) {
dia_layer_set_visible (temp_layer, TRUE);
} else {
dia_layer_set_visible (temp_layer, !visible);
}
- }
+ });
} else {
dia_layer_set_visible (layer, !dia_layer_is_visible (layer));
}
+
diagram_add_update_all (dia);
}
@@ -305,17 +287,17 @@ dia_layer_visibility_change_revert (DiaChange *self,
{
DiaLayerVisibilityChange *change = DIA_LAYER_VISIBILITY_CHANGE (self);
GList *vis = change->original_visibility;
- GPtrArray *layers = dia->data->layers;
int i;
- for (i = 0; vis != NULL && i < layers->len; vis = g_list_next(vis), i++) {
- DiaLayer *layer = DIA_LAYER (g_ptr_array_index (layers, i));
+ for (i = 0; vis != NULL && i < data_layer_count (DIA_DIAGRAM_DATA (dia)); vis = g_list_next (vis), i++) {
+ DiaLayer *layer = data_layer_get_nth (DIA_DIAGRAM_DATA (dia), i);
dia_layer_set_visible (layer, GPOINTER_TO_INT (vis->data));
}
- if (vis != NULL || i < layers->len) {
- g_printerr ("Internal error: visibility undo has %d visibilities, but %d layers\n",
- g_list_length(change->original_visibility), layers->len);
+ if (vis != NULL || i < data_layer_count (DIA_DIAGRAM_DATA (dia))) {
+ g_critical ("Internal error: visibility undo has %d visibilities, but %d layers\n",
+ g_list_length (change->original_visibility),
+ data_layer_count (DIA_DIAGRAM_DATA (dia)));
}
diagram_add_update_all(dia);
@@ -336,13 +318,11 @@ dia_layer_visibility_change_new (Diagram *dia, DiaLayer *layer, gboolean exclusi
{
DiaLayerVisibilityChange *change = dia_change_new (DIA_TYPE_LAYER_VISIBILITY_CHANGE);
GList *visibilities = NULL;
- int i;
- GPtrArray *layers = dia->data->layers;
- for (i = 0; i < layers->len; i++) {
- DiaLayer *temp_layer = DIA_LAYER (g_ptr_array_index (layers, i));
- visibilities = g_list_append (visibilities, GINT_TO_POINTER (dia_layer_is_visible (temp_layer)));
- }
+ DIA_FOR_LAYER_IN_DIAGRAM (DIA_DIAGRAM_DATA (dia), temp_layer, i, {
+ visibilities = g_list_append (visibilities,
+ GINT_TO_POINTER (dia_layer_is_visible (temp_layer)));
+ });
change->original_visibility = visibilities;
change->layer = layer;
diff --git a/app/load_save.c b/app/load_save.c
index a32bdf94..a9c321e4 100644
--- a/app/load_save.c
+++ b/app/load_save.c
@@ -373,8 +373,12 @@ _get_bool_prop (xmlNodePtr node, const char *name, gboolean preset)
return ret;
}
+
static gboolean
-diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, void* user_data)
+diagram_data_load (const char *filename,
+ DiagramData *data,
+ DiaContext *ctx,
+ void *user_data)
{
GHashTable *objects_hash;
int fd;
@@ -393,21 +397,24 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
GHashTable* unknown_objects_hash = g_hash_table_new(g_str_hash, g_str_equal);
int num_layers_added = 0;
- g_return_val_if_fail(data!=NULL, FALSE);
+ g_return_val_if_fail (data != NULL, FALSE);
if (g_file_test (filename, G_FILE_TEST_IS_DIR)) {
- dia_context_add_message(ctx, _("You must specify a file, not a directory."));
+ dia_context_add_message (ctx,
+ _("You must specify a file, not a directory."));
return FALSE;
}
- fd = g_open(filename, O_RDONLY, 0);
+ fd = g_open (filename, O_RDONLY, 0);
if (fd==-1) {
- dia_context_add_message(ctx, _("Couldn't open: '%s' for reading.\n"), filename);
+ dia_context_add_message (ctx,
+ _("Couldn't open: '%s' for reading.\n"),
+ filename);
return FALSE;
}
- if (read(fd, &firstchar, 1)) {
+ if (read (fd, &firstchar, 1)) {
data->is_compressed = (firstchar != '<');
} else {
/* Couldn't read a single char? Set to default. */
@@ -415,39 +422,40 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
}
/* Note that this closing and opening means we can't read from a pipe */
- close(fd);
+ close (fd);
doc = diaXmlParseFile (filename, ctx, TRUE);
if (doc == NULL){
/* this was talking about unknown file type but it could as well be broken XML */
- dia_context_add_message(ctx, _("Error loading diagram %s."), filename);
+ dia_context_add_message (ctx, _("Error loading diagram %s."), filename);
return FALSE;
}
root = doc->xmlRootNode;
/* skip comments */
- while (root && (root->type != XML_ELEMENT_NODE))
+ while (root && (root->type != XML_ELEMENT_NODE)) {
root = root->next;
+ }
+
if (root == NULL) {
- message_error(_("Error loading diagram %s.\nUnknown file type."),
- dia_message_filename(filename));
+ message_error (_("Error loading diagram %s.\nUnknown file type."),
+ dia_message_filename (filename));
xmlFreeDoc (doc);
return FALSE;
}
- namespace = xmlSearchNs(doc, root, (const xmlChar *)"dia");
- if (xmlStrcmp (root->name, (const xmlChar *)"diagram") || (namespace == NULL)){
- message_error(_("Error loading diagram %s.\nNot a Dia file."),
- dia_message_filename(filename));
+ namespace = xmlSearchNs (doc, root, "dia");
+ if (xmlStrcmp (root->name, "diagram") || (namespace == NULL)) {
+ message_error (_("Error loading diagram %s.\nNot a Dia file."),
+ dia_message_filename (filename));
xmlFreeDoc (doc);
return FALSE;
}
/* Destroy the default layer: */
- if (dia_layer_object_count (data->active_layer) == 0) {
- g_ptr_array_remove (data->layers, data->active_layer);
- g_clear_object (&data->active_layer);
+ if (dia_layer_object_count (dia_diagram_data_get_active_layer (data)) == 0) {
+ data_remove_layer (data, dia_diagram_data_get_active_layer (data));
}
diagramdata =
@@ -455,80 +463,98 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
/* Read in diagram data: */
data->bg_color = prefs.new_diagram.bg_color;
- attr = composite_find_attribute(diagramdata, "background");
- if (attr != NULL)
- data_color(attribute_first_data(attr), &data->bg_color, ctx);
+ attr = composite_find_attribute (diagramdata, "background");
+ if (attr != NULL) {
+ data_color (attribute_first_data (attr), &data->bg_color, ctx);
+ }
if (diagram) {
diagram->pagebreak_color = prefs.new_diagram.pagebreak_color;
- attr = composite_find_attribute(diagramdata, "pagebreak");
- if (attr != NULL)
- data_color(attribute_first_data(attr), &diagram->pagebreak_color, ctx);
+ attr = composite_find_attribute (diagramdata, "pagebreak");
+ if (attr != NULL) {
+ data_color (attribute_first_data (attr), &diagram->pagebreak_color, ctx);
+ }
}
+
/* load paper information from diagramdata section */
- attr = composite_find_attribute(diagramdata, "paper");
+ attr = composite_find_attribute (diagramdata, "paper");
if (attr != NULL) {
- paperinfo = attribute_first_data(attr);
+ paperinfo = attribute_first_data (attr);
- attr = composite_find_attribute(paperinfo, "name");
+ attr = composite_find_attribute (paperinfo, "name");
if (attr != NULL) {
g_clear_pointer (&data->paper.name, g_free);
- data->paper.name = data_string(attribute_first_data(attr), ctx);
+ data->paper.name = data_string (attribute_first_data (attr), ctx);
}
+
if (data->paper.name == NULL || data->paper.name[0] == '\0') {
- data->paper.name = g_strdup(prefs.new_diagram.papertype);
+ data->paper.name = g_strdup (prefs.new_diagram.papertype);
}
+
/* set default margins for paper size ... */
- dia_page_layout_get_default_margins(data->paper.name,
- &data->paper.tmargin,
- &data->paper.bmargin,
- &data->paper.lmargin,
- &data->paper.rmargin);
-
- attr = composite_find_attribute(paperinfo, "tmargin");
- if (attr != NULL)
- data->paper.tmargin = data_real(attribute_first_data(attr), ctx);
- attr = composite_find_attribute(paperinfo, "bmargin");
- if (attr != NULL)
- data->paper.bmargin = data_real(attribute_first_data(attr), ctx);
- attr = composite_find_attribute(paperinfo, "lmargin");
- if (attr != NULL)
- data->paper.lmargin = data_real(attribute_first_data(attr), ctx);
- attr = composite_find_attribute(paperinfo, "rmargin");
- if (attr != NULL)
- data->paper.rmargin = data_real(attribute_first_data(attr), ctx);
-
- attr = composite_find_attribute(paperinfo, "is_portrait");
+ dia_page_layout_get_default_margins (data->paper.name,
+ &data->paper.tmargin,
+ &data->paper.bmargin,
+ &data->paper.lmargin,
+ &data->paper.rmargin);
+
+ attr = composite_find_attribute (paperinfo, "tmargin");
+ if (attr != NULL) {
+ data->paper.tmargin = data_real (attribute_first_data(attr), ctx);
+ }
+
+ attr = composite_find_attribute (paperinfo, "bmargin");
+ if (attr != NULL) {
+ data->paper.bmargin = data_real (attribute_first_data (attr), ctx);
+ }
+
+ attr = composite_find_attribute (paperinfo, "lmargin");
+ if (attr != NULL) {
+ data->paper.lmargin = data_real (attribute_first_data (attr), ctx);
+ }
+
+ attr = composite_find_attribute (paperinfo, "rmargin");
+ if (attr != NULL) {
+ data->paper.rmargin = data_real (attribute_first_data (attr), ctx);
+ }
+
+ attr = composite_find_attribute (paperinfo, "is_portrait");
data->paper.is_portrait = TRUE;
- if (attr != NULL)
- data->paper.is_portrait = data_boolean(attribute_first_data(attr), ctx);
+ if (attr != NULL) {
+ data->paper.is_portrait = data_boolean (attribute_first_data (attr),
+ ctx);
+ }
- attr = composite_find_attribute(paperinfo, "scaling");
+ attr = composite_find_attribute (paperinfo, "scaling");
data->paper.scaling = 1.0;
- if (attr != NULL)
- data->paper.scaling = data_real(attribute_first_data(attr), ctx);
+ if (attr != NULL) {
+ data->paper.scaling = data_real (attribute_first_data (attr), ctx);
+ }
- attr = composite_find_attribute(paperinfo, "fitto");
+ attr = composite_find_attribute (paperinfo, "fitto");
data->paper.fitto = FALSE;
- if (attr != NULL)
- data->paper.fitto = data_boolean(attribute_first_data(attr), ctx);
+ if (attr != NULL) {
+ data->paper.fitto = data_boolean (attribute_first_data (attr), ctx);
+ }
- attr = composite_find_attribute(paperinfo, "fitwidth");
+ attr = composite_find_attribute (paperinfo, "fitwidth");
data->paper.fitwidth = 1;
- if (attr != NULL)
- data->paper.fitwidth = data_int(attribute_first_data(attr), ctx);
+ if (attr != NULL) {
+ data->paper.fitwidth = data_int (attribute_first_data (attr), ctx);
+ }
- attr = composite_find_attribute(paperinfo, "fitheight");
+ attr = composite_find_attribute (paperinfo, "fitheight");
data->paper.fitheight = 1;
- if (attr != NULL)
- data->paper.fitheight = data_int(attribute_first_data(attr), ctx);
+ if (attr != NULL) {
+ data->paper.fitheight = data_int (attribute_first_data (attr), ctx);
+ }
/* calculate effective width/height */
- dia_page_layout_get_paper_size(data->paper.name,
- &data->paper.width,
- &data->paper.height);
+ dia_page_layout_get_paper_size (data->paper.name,
+ &data->paper.width,
+ &data->paper.height);
if (!data->paper.is_portrait) {
- gfloat tmp = data->paper.width;
+ float tmp = data->paper.width;
data->paper.width = data->paper.height;
data->paper.height = tmp;
@@ -616,37 +642,44 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
if (attr != NULL) {
DataNode dispinfo;
- dispinfo = attribute_first_data(attr);
+ dispinfo = attribute_first_data (attr);
/* using the diagramdata object as temporary storage is a bit hacky,
* and also the magic numbers (keeping 0 as dont care) */
- attr = composite_find_attribute(dispinfo, "antialiased");
- if (attr != NULL)
- g_object_set_data(G_OBJECT(diagram),
- "antialiased", GINT_TO_POINTER (data_boolean(attribute_first_data(attr), ctx) ? 1 : -1));
+ attr = composite_find_attribute (dispinfo, "antialiased");
+ if (attr != NULL) {
+ g_object_set_data (G_OBJECT (diagram),
+ "antialiased",
+ GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
+ }
- attr = composite_find_attribute(dispinfo, "snap-to-grid");
- if (attr != NULL)
- g_object_set_data(G_OBJECT(diagram),
- "snap-to-grid", GINT_TO_POINTER (data_boolean(attribute_first_data(attr), ctx) ? 1 : -1));
+ attr = composite_find_attribute (dispinfo, "snap-to-grid");
+ if (attr != NULL) {
+ g_object_set_data (G_OBJECT (diagram),
+ "snap-to-grid",
+ GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
+ }
- attr = composite_find_attribute(dispinfo, "snap-to-guides");
+ attr = composite_find_attribute (dispinfo, "snap-to-guides");
if (attr != NULL) {
g_object_set_data (G_OBJECT (diagram),
"snap-to-guides",
GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
}
- attr = composite_find_attribute(dispinfo, "snap-to-object");
- if (attr != NULL)
- g_object_set_data(G_OBJECT(diagram),
- "snap-to-object", GINT_TO_POINTER (data_boolean(attribute_first_data(attr), ctx) ? 1 : -1));
-
- attr = composite_find_attribute(dispinfo, "show-grid");
- if (attr != NULL)
- g_object_set_data(G_OBJECT(diagram),
- "show-grid", GINT_TO_POINTER (data_boolean(attribute_first_data(attr), ctx) ? 1 : -1));
+ attr = composite_find_attribute (dispinfo, "snap-to-object");
+ if (attr != NULL) {
+ g_object_set_data (G_OBJECT (diagram),
+ "snap-to-object",
+ GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
+ }
+ attr = composite_find_attribute (dispinfo, "show-grid");
+ if (attr != NULL) {
+ g_object_set_data (G_OBJECT (diagram),
+ "show-grid",
+ GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
+ }
attr = composite_find_attribute(dispinfo, "show-guides");
if (attr != NULL) {
@@ -655,34 +688,35 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
}
- attr = composite_find_attribute(dispinfo, "show-connection-points");
- if (attr != NULL)
- g_object_set_data(G_OBJECT(diagram),
- "show-connection-points", GINT_TO_POINTER (data_boolean(attribute_first_data(attr), ctx) ? 1 : -1));
+ attr = composite_find_attribute (dispinfo, "show-connection-points");
+ if (attr != NULL) {
+ g_object_set_data (G_OBJECT (diagram),
+ "show-connection-points",
+ GINT_TO_POINTER (data_boolean (attribute_first_data(attr), ctx) ? 1 : -1));
+ }
}
}
/* Read in all layers: */
layer_node =
find_node_named (root->xmlChildrenNode, "layer");
- objects_hash = g_hash_table_new(g_str_hash, g_str_equal);
+ objects_hash = g_hash_table_new (g_str_hash, g_str_equal);
while (layer_node != NULL) {
- gchar *name;
- gboolean active;
+ xmlChar *name;
- if (xmlIsBlankNode(layer_node)) {
+ if (xmlIsBlankNode (layer_node)) {
layer_node = layer_node->next;
continue;
}
if (!layer_node) break;
- name = (char *)xmlGetProp(layer_node, (const xmlChar *)"name");
+ name = xmlGetProp (layer_node, "name");
if (!name) break; /* name is mandatory */
- layer = dia_layer_new (name, data);
- if (name) xmlFree (name);
+ layer = dia_layer_new ((char *) name, data);
+ dia_clear_xml_string (&name);
g_object_set (layer,
"visible", _get_bool_prop (layer_node, "visible", FALSE),
@@ -696,9 +730,11 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
data_add_layer (data, layer);
++num_layers_added;
- active = _get_bool_prop (layer_node, "active", FALSE);
- if (active)
- active_layer = layer;
+ if (_get_bool_prop (layer_node, "active", FALSE)) {
+ g_set_object (&active_layer, layer);
+ }
+
+ g_clear_object (&layer);
layer_node = layer_node->next;
}
@@ -708,7 +744,7 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
int i = data_layer_count (data) - num_layers_added;
layer_node = find_node_named (root->xmlChildrenNode, "layer");
for (; i < data_layer_count (data); ++i) {
- layer = (DiaLayer *) g_ptr_array_index(data->layers, i);
+ layer = data_layer_get_nth (data, i);
while (layer_node && xmlStrcmp (layer_node->name, (xmlChar *)"layer") != 0)
layer_node = layer_node->next;
@@ -723,37 +759,40 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
}
}
- if (!active_layer)
- data->active_layer = DIA_LAYER (g_ptr_array_index (data->layers, 0));
- else
+ if (!active_layer) {
+ data_set_active_layer (data, data_layer_get_nth (data, 0));
+ } else {
data_set_active_layer (data, active_layer);
+ }
- xmlFreeDoc(doc);
+ g_clear_object (&active_layer);
+ xmlFreeDoc (doc);
- g_hash_table_foreach(objects_hash, hash_free_string, NULL);
+ g_hash_table_foreach (objects_hash, hash_free_string, NULL);
- g_hash_table_destroy(objects_hash);
+ g_hash_table_destroy (objects_hash);
- if (data->layers->len < 1) {
+ if (data_layer_count (data) < 1) {
message_error (_("Error loading diagram:\n%s.\n"
"A valid Dia file defines at least one layer."),
- dia_message_filename(filename));
+ dia_message_filename(filename));
return FALSE;
- } else if (0 < g_hash_table_size(unknown_objects_hash)) {
- GString* unknown_str = g_string_new("Unknown types while reading diagram file");
+ } else if (0 < g_hash_table_size (unknown_objects_hash)) {
+ GString *unknown_str = g_string_new ("Unknown types while reading diagram file");
/* show all the unknown types in one message */
- g_hash_table_foreach(unknown_objects_hash,
- GHFuncUnknownObjects,
- unknown_str);
- message_warning("%s", unknown_str->str);
- g_string_free(unknown_str, TRUE);
+ g_hash_table_foreach (unknown_objects_hash,
+ GHFuncUnknownObjects,
+ unknown_str);
+ message_warning ("%s", unknown_str->str);
+ g_string_free (unknown_str, TRUE);
}
- g_hash_table_destroy(unknown_objects_hash);
+ g_hash_table_destroy (unknown_objects_hash);
return TRUE;
}
+
static gboolean
write_objects(GList *objects, xmlNodePtr objects_node,
GHashTable *objects_hash, int *obj_nr,
@@ -908,8 +947,6 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx)
GHashTable *objects_hash;
gboolean res;
int obj_nr;
- guint i;
- DiaLayer *layer;
AttributeNode attr;
xmlNs *name_space;
Diagram *diagram = DIA_IS_DIAGRAM (data) ? DIA_DIAGRAM (data) : NULL;
@@ -1024,11 +1061,10 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx)
obj_nr = 0;
- for (i = 0; i < data->layers->len; i++) {
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
layer_node = xmlNewChild (doc->xmlRootNode,
name_space,
(const xmlChar *) "layer", NULL);
- layer = (DiaLayer *) g_ptr_array_index (data->layers, i);
xmlSetProp (layer_node,
(const xmlChar *) "name",
(xmlChar *) dia_layer_get_name (layer));
@@ -1040,7 +1076,7 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx)
(const xmlChar *) "connectable",
(const xmlChar *) (dia_layer_is_connectable (layer) ? "true" : "false"));
- if (layer == data->active_layer) {
+ if (layer == dia_diagram_data_get_active_layer (data)) {
xmlSetProp (layer_node,
(const xmlChar *) "active",
(const xmlChar *) "true");
@@ -1052,14 +1088,13 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx)
&obj_nr,
filename,
ctx);
- }
+ });
/* The connections are stored per layer in the file format, but connections are not any longer
* restricted to objects on the same layer. So we iterate over all the layer (nodes) again to
* 'know' all objects we might have to connect to
*/
layer_node = doc->xmlRootNode->children;
- for (i = 0; i < data->layers->len; i++) {
- layer = (DiaLayer *) g_ptr_array_index (data->layers, i);
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
while (layer_node && xmlStrcmp (layer_node->name, (xmlChar *) "layer") != 0) {
layer_node = layer_node->next;
}
@@ -1078,18 +1113,20 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx)
dia_layer_get_name (layer));
}
layer_node = layer_node->next;
- }
+ });
- g_hash_table_destroy(objects_hash);
+ g_hash_table_destroy (objects_hash);
- if (data->is_compressed)
- xmlSetDocCompressMode(doc, 9);
- else
- xmlSetDocCompressMode(doc, 0);
+ if (data->is_compressed) {
+ xmlSetDocCompressMode (doc, 9);
+ } else {
+ xmlSetDocCompressMode (doc, 0);
+ }
return doc;
}
+
/** This tries to save the diagram into a file, without any backup
* Returns >= 0 on success.
* Only for internal use. */
diff --git a/app/modify_tool.c b/app/modify_tool.c
index 96c1f6b9..d018abbf 100644
--- a/app/modify_tool.c
+++ b/app/modify_tool.c
@@ -708,10 +708,10 @@ find_selected_objects(DDisplay *ddisp, ModifyTool *tool)
if (prefs.reverse_rubberbanding_intersects &&
tool->start_box.x > tool->end_box.x) {
return
- dia_layer_find_objects_intersecting_rectangle (ddisp->diagram->data->active_layer, &r);
+ dia_layer_find_objects_intersecting_rectangle (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA
(ddisp->diagram)), &r);
} else {
return
- dia_layer_find_objects_in_rectangle (ddisp->diagram->data->active_layer, &r);
+ dia_layer_find_objects_in_rectangle (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA
(ddisp->diagram)), &r);
}
}
diff --git a/app/select.c b/app/select.c
index 4294a855..0686babd 100644
--- a/app/select.c
+++ b/app/select.c
@@ -41,7 +41,7 @@ select_all_callback(GtkAction *action)
if (!ddisp || textedit_mode(ddisp)) return;
dia = ddisp->diagram;
- objects = dia_layer_get_object_list (dia->data->active_layer);
+ objects = dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)));
while (objects != NULL) {
DiaObject *obj = DIA_OBJECT (objects->data);
@@ -84,7 +84,7 @@ select_invert_callback (GtkAction *action)
if (!ddisp || textedit_mode (ddisp)) return;
dia = ddisp->diagram;
- tmp = dia_layer_get_object_list (dia->data->active_layer);
+ tmp = dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)));
for (; tmp != NULL; tmp = g_list_next (tmp)) {
DiaObject *obj = DIA_OBJECT (tmp->data);
@@ -233,7 +233,7 @@ select_same_type_callback (GtkAction *action)
if (!ddisp || textedit_mode (ddisp)) return;
dia = ddisp->diagram;
- tmp = dia_layer_get_object_list (dia->data->active_layer);
+ tmp = dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)));
objects = dia->data->selected;
diff --git a/app/undo.c b/app/undo.c
index 78af391a..7ea73fa5 100644
--- a/app/undo.c
+++ b/app/undo.c
@@ -751,9 +751,9 @@ dia_delete_objects_change_new (Diagram *dia, GList *obj_list)
{
DiaDeleteObjectsChange *change = dia_change_new (DIA_TYPE_DELETE_OBJECTS_CHANGE);
- change->layer = dia->data->active_layer;
+ change->layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
change->obj_list = obj_list;
- change->original_objects = g_list_copy (dia_layer_get_object_list (dia->data->active_layer));
+ change->original_objects = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer
(DIA_DIAGRAM_DATA (dia))));
change->applied = 0;
undo_push_change (dia->undo, DIA_CHANGE (change));
@@ -829,7 +829,7 @@ dia_insert_objects_change_new (Diagram *dia, GList *obj_list, int applied)
{
DiaInsertObjectsChange *change = dia_change_new (DIA_TYPE_INSERT_OBJECTS_CHANGE);
- change->layer = dia->data->active_layer;
+ change->layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
change->obj_list = obj_list;
change->applied = applied;
@@ -895,10 +895,10 @@ dia_reorder_objects_change_new (Diagram *dia, GList *changed_list, GList *orig_l
{
DiaReorderObjectsChange *change = dia_change_new (DIA_TYPE_REORDER_OBJECTS_CHANGE);
- change->layer = dia->data->active_layer;
+ change->layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
change->changed_list = changed_list;
change->original_objects = orig_list;
- change->reordered_objects = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA (dia)->active_layer));
+ change->reordered_objects = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer
(DIA_DIAGRAM_DATA (dia))));
undo_push_change (dia->undo, DIA_CHANGE (change));
@@ -1109,7 +1109,7 @@ dia_group_objects_change_new (Diagram *dia,
{
DiaGroupObjectsChange *change = dia_change_new (DIA_TYPE_GROUP_OBJECTS_CHANGE);
- change->layer = dia->data->active_layer;
+ change->layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
change->group = group;
change->obj_list = obj_list;
change->orig_list = orig_list;
@@ -1207,7 +1207,7 @@ dia_ungroup_objects_change_new (Diagram *dia,
{
DiaUngroupObjectsChange *change = dia_change_new (DIA_TYPE_UNGROUP_OBJECTS_CHANGE);
- change->layer = dia->data->active_layer;
+ change->layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
change->group = group;
change->obj_list = obj_list;
change->group_index = group_index;
@@ -1344,21 +1344,19 @@ move_object_layer_relative (Diagram *dia, GList *objects, gint dist)
DiaLayer *active, *target;
guint pos;
- g_return_if_fail (dia->data->active_layer);
- g_return_if_fail (dia->data->layers->len != 0);
+ g_return_if_fail (data_layer_count (DIA_DIAGRAM_DATA (dia)) != 0);
- active = dia->data->active_layer;
- for (pos = 0; pos < dia->data->layers->len; ++pos) {
- if (active == g_ptr_array_index (dia->data->layers, pos)) {
- break;
- }
- }
+ active = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
+
+ g_return_if_fail (active);
+
+ pos = data_layer_get_index (DIA_DIAGRAM_DATA (dia), active);
- pos = (pos + dia->data->layers->len + dist) % dia->data->layers->len;
- target = g_ptr_array_index (dia->data->layers, pos);
+ pos = (pos + data_layer_count (DIA_DIAGRAM_DATA (dia)) + dist) % data_layer_count (DIA_DIAGRAM_DATA (dia));
+ target = data_layer_get_nth (DIA_DIAGRAM_DATA (dia), pos);
object_add_updates_list (objects, dia);
dia_layer_remove_objects (active, objects);
- dia_layer_add_objects (target, g_list_copy(objects));
+ dia_layer_add_objects (target, g_list_copy (objects));
data_set_active_layer (dia->data, target);
}
@@ -1413,8 +1411,8 @@ dia_move_object_to_layer_change_new (Diagram *dia,
{
DiaMoveObjectToLayerChange *movetolayerchange = dia_change_new (DIA_TYPE_MOVE_OBJECT_TO_LAYER_CHANGE);
- movetolayerchange->orig_layer = dia->data->active_layer;
- movetolayerchange->orig_list = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA
(dia)->active_layer));
+ movetolayerchange->orig_layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
+ movetolayerchange->orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer
(DIA_DIAGRAM_DATA (dia))));
movetolayerchange->objects = g_list_copy (selected_list);
movetolayerchange->moving_up = moving_up;
@@ -1442,7 +1440,7 @@ dia_import_change_apply (DiaChange *self,
{
DiaImportChange *change = DIA_IMPORT_CHANGE (self);
GList *list;
- DiaLayer *layer = dia->data->active_layer;
+ DiaLayer *layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
/* add all objects and layers added from the diagram */
for (list = change->layers; list != NULL; list = list->next) {
diff --git a/lib/dia_xml.h b/lib/dia_xml.h
index f6f9598b..d624292d 100644
--- a/lib/dia_xml.h
+++ b/lib/dia_xml.h
@@ -115,5 +115,8 @@ void data_add_pattern(AttributeNode attr, DiaPattern *pat, DiaContext *ctx);
xmlDocPtr diaXmlParseFile(const char *filename, DiaContext *ctx, gboolean try_harder);
+#define dia_clear_xml_string(pointer) g_clear_pointer(pointer, xmlFree)
+
+
#endif /* DIA_XML_H */
diff --git a/lib/diagramdata.c b/lib/diagramdata.c
index 1aadd2c8..0ee321dc 100644
--- a/lib/diagramdata.c
+++ b/lib/diagramdata.c
@@ -23,7 +23,9 @@
#include <config.h>
#include "intl.h"
+#define __in_diagram_data
#include "diagramdata.h"
+#undef __in_diagram_data
#include "diarenderer.h"
#include "diainteractiverenderer.h"
#include "paper.h"
@@ -124,12 +126,6 @@ diagram_data_init(DiagramData *data)
get_paper_info (&data->paper, -1, NULL);
- first_layer = dia_layer_new (_("Background"), data);
-
- data->layers = g_ptr_array_new_with_free_func (g_object_unref);
- g_ptr_array_add (data->layers, first_layer);
- data->active_layer = first_layer;
-
data->selected_count_private = 0;
data->selected = NULL;
@@ -139,6 +135,14 @@ diagram_data_init(DiagramData *data)
data->text_edits = NULL;
data->active_text_edit = NULL;
+
+ first_layer = dia_layer_new (_("Background"), data);
+
+ data->layers = g_ptr_array_new_with_free_func (g_object_unref);
+ data_add_layer (data, first_layer);
+ data_set_active_layer (data, first_layer);
+
+ g_clear_object (&first_layer);
}
@@ -152,8 +156,8 @@ diagram_data_finalize (GObject *object)
g_clear_pointer (&data->paper.name, g_free);
+ g_clear_weak_pointer (&data->active_layer);
g_ptr_array_free (data->layers, TRUE);
- data->active_layer = NULL;
g_list_free (data->selected);
data->selected = NULL; /* for safety */
@@ -177,7 +181,6 @@ DiagramData *
diagram_data_clone (DiagramData *data)
{
DiagramData *clone;
- guint i;
clone = g_object_new (DIA_TYPE_DIAGRAM_DATA, NULL);
@@ -187,20 +190,17 @@ diagram_data_clone (DiagramData *data)
clone->paper.name = g_strdup (data->paper.name);
clone->is_compressed = data->is_compressed;
- g_ptr_array_remove_index (clone->layers, 0);
- g_ptr_array_remove (clone->layers, clone->active_layer);
+ data_remove_layer (clone, data_layer_get_nth (clone, 0));
- for (i=0; i < data->layers->len; ++i) {
- DiaLayer *src_layer = g_ptr_array_index (data->layers, i);
+ DIA_FOR_LAYER_IN_DIAGRAM (data, src_layer, i, {
DiaLayer *dest_layer = dia_layer_new_from_layer (src_layer);
- g_ptr_array_add (clone->layers, dest_layer);
+ data_add_layer (clone, dest_layer);
- if (src_layer == data->active_layer)
- clone->active_layer = dest_layer;
+ g_clear_object (&dest_layer);
+ });
- /* the rest should be initialized by construction */
- }
+ data_set_active_layer (clone, dia_diagram_data_get_active_layer (data));
return clone;
}
@@ -213,6 +213,7 @@ DiagramData *
diagram_data_clone_selected (DiagramData *data)
{
DiagramData *clone;
+ DiaLayer *src_layer;
DiaLayer *dest_layer;
GList *sorted;
@@ -224,13 +225,14 @@ diagram_data_clone_selected (DiagramData *data)
clone->paper.name = g_strdup (data->paper.name);
clone->is_compressed = data->is_compressed;
+ src_layer = dia_diagram_data_get_active_layer (data);
/* the selection - if any - can only be on the active layer */
- dest_layer = g_ptr_array_index (clone->layers, 0);
+ dest_layer = dia_diagram_data_get_active_layer (clone);
g_object_set (dest_layer,
- "name", dia_layer_get_name (data->active_layer),
- "connectable", dia_layer_is_connectable (data->active_layer),
- "visible", dia_layer_is_visible (data->active_layer),
+ "name", dia_layer_get_name (src_layer),
+ "connectable", dia_layer_is_connectable (src_layer),
+ "visible", dia_layer_is_visible (src_layer),
NULL);
sorted = data_get_sorted_selected (data);
@@ -292,6 +294,7 @@ diagram_data_class_init(DiagramDataClass *klass)
klass->selection_changed = _diagram_data_selection_changed;
}
+
/*!
* \brief Raise a layer up one in a diagram.
* @param data The diagram that the layer belongs to.
@@ -301,23 +304,20 @@ diagram_data_class_init(DiagramDataClass *klass)
void
data_raise_layer (DiagramData *data, DiaLayer *layer)
{
- guint i;
guint layer_nr = 0;
DiaLayer *tmp;
- for (i=0;i<data->layers->len;i++) {
- if (g_ptr_array_index(data->layers, i)==layer)
- layer_nr = i;
- }
+ layer_nr = data_layer_get_index (data, layer);
- if (layer_nr < data->layers->len-1) {
- tmp = g_ptr_array_index(data->layers, layer_nr+1);
- g_ptr_array_index(data->layers, layer_nr+1) =
- g_ptr_array_index(data->layers, layer_nr);
- g_ptr_array_index(data->layers, layer_nr) = tmp;
+ if (layer_nr < data_layer_count (data) - 1) {
+ tmp = g_ptr_array_index (data->layers, layer_nr + 1);
+ g_ptr_array_index (data->layers, layer_nr + 1) =
+ g_ptr_array_index (data->layers, layer_nr);
+ g_ptr_array_index (data->layers, layer_nr) = tmp;
}
}
+
/*!
* \brief Lower a layer by one in a diagram.
* @param data The diagram that the layer belongs to.
@@ -325,27 +325,24 @@ data_raise_layer (DiagramData *data, DiaLayer *layer)
* \memberof _DiagramData
*/
void
-data_lower_layer(DiagramData *data, DiaLayer *layer)
+data_lower_layer (DiagramData *data, DiaLayer *layer)
{
- guint i;
int layer_nr = -1;
DiaLayer *tmp;
- for (i=0;i<data->layers->len;i++) {
- if (g_ptr_array_index(data->layers, i)==layer)
- layer_nr = i;
- }
+ layer_nr = data_layer_get_index (data, layer);
- g_assert(layer_nr>=0);
+ g_return_if_fail (layer_nr >= 0);
if (layer_nr > 0) {
- tmp = g_ptr_array_index(data->layers, layer_nr-1);
- g_ptr_array_index(data->layers, layer_nr-1) =
- g_ptr_array_index(data->layers, layer_nr);
- g_ptr_array_index(data->layers, layer_nr) = tmp;
+ tmp = g_ptr_array_index (data->layers, layer_nr-1);
+ g_ptr_array_index (data->layers, layer_nr-1) =
+ g_ptr_array_index(data->layers, layer_nr);
+ g_ptr_array_index (data->layers, layer_nr) = tmp;
}
}
+
/**
* data_add_layer:
* @data: The diagram to add the layer to.
@@ -356,13 +353,10 @@ data_lower_layer(DiagramData *data, DiaLayer *layer)
void
data_add_layer (DiagramData *data, DiaLayer *layer)
{
- g_ptr_array_add (data->layers, layer);
- dia_layer_set_parent_diagram (layer, data);
- data_emit (data, layer, NULL, "object_add");
- dia_layer_update_extents (layer);
- data_update_extents (data);
+ data_add_layer_at (data, layer, data_layer_count (data));
}
+
/**
* data_add_layer_at:
* @data: the diagram
@@ -379,14 +373,14 @@ data_add_layer_at (DiagramData *data, DiaLayer *layer, int pos)
int len;
int i;
- g_ptr_array_add(data->layers, layer);
- len = data->layers->len;
+ g_ptr_array_add (data->layers, g_object_ref (layer));
+ len = data_layer_count (data);
- if ( (pos>=0) && (pos < len)) {
- for (i=len-1;i>pos;i--) {
- g_ptr_array_index(data->layers, i) = g_ptr_array_index(data->layers, i-1);
+ if ((pos >= 0) && (pos < len)) {
+ for (i = len - 1; i > pos; i--) {
+ g_ptr_array_index (data->layers, i) = g_ptr_array_index (data->layers, i - 1);
}
- g_ptr_array_index(data->layers, pos) = layer;
+ g_ptr_array_index (data->layers, pos) = layer;
}
dia_layer_set_parent_diagram (layer, data);
@@ -395,6 +389,7 @@ data_add_layer_at (DiagramData *data, DiaLayer *layer, int pos)
data_update_extents (data);
}
+
/*!
* \brief Get the index of a layer contained in the diagram
*
@@ -407,40 +402,61 @@ data_add_layer_at (DiagramData *data, DiaLayer *layer, int pos)
int
data_layer_get_index (const DiagramData *data, const DiaLayer *layer)
{
- int len;
- int i;
-
- len = data->layers->len;
- for (i=0;i<len;++i) {
- if (layer == g_ptr_array_index(data->layers, i))
+ DIA_FOR_LAYER_IN_DIAGRAM (data, current, i, {
+ if (layer == current) {
return i;
- }
+ }
+ });
+
return -1;
}
-/*!
- * \brief Get the layer at position index
+
+/**
+ * data_layer_get_nth:
+ * @data: the #DiagramData
+ * @index: the layer position
*
- * @param data the diagram
- * @param index the layer position
- * @return the _Layer or NULL if not found
+ * Get the layer at position @index
*
- * \memberof _DiagramData
+ * Returns: the #DiaLayer or %NULL if not found
+ *
+ * Since: dawn-of-time
*/
DiaLayer *
data_layer_get_nth (const DiagramData *data, guint index)
{
- if (data->layers->len > index)
- return g_ptr_array_index(data->layers, index);
+ g_return_val_if_fail (DIA_IS_DIAGRAM_DATA (data), NULL);
+ g_return_val_if_fail (data->layers, NULL);
+
+ if (index < data_layer_count (data)) {
+ return g_ptr_array_index (data->layers, index);
+ }
+
return NULL;
}
+
+/**
+ * data_layer_count:
+ * @data: the #DiagramData
+ *
+ * Get the number of layers in @data
+ *
+ * Returns: the count
+ *
+ * Since: dawn-of-time
+ */
int
-data_layer_count(const DiagramData *data)
+data_layer_count (const DiagramData *data)
{
+ g_return_val_if_fail (DIA_IS_DIAGRAM_DATA (data), -1);
+ g_return_val_if_fail (data->layers, -1);
+
return data->layers->len;
}
+
/**
* data_set_active_layer:
* @data: The diagram in which to set the active layer.
@@ -451,9 +467,29 @@ data_layer_count(const DiagramData *data)
void
data_set_active_layer (DiagramData *data, DiaLayer *layer)
{
- data->active_layer = layer;
+ g_set_weak_pointer (&data->active_layer, layer);
}
+
+/**
+ * dia_diagram_data_get_active_layer:
+ * @self: the #DiagramData
+ *
+ * Get the active layer, see data_set_active_layer()
+ *
+ * Returns: the active #DiaLayer, or %NULL
+ *
+ * Since: 0.98
+ */
+DiaLayer *
+dia_diagram_data_get_active_layer (DiagramData *self)
+{
+ g_return_val_if_fail (DIA_IS_DIAGRAM_DATA (self), NULL);
+
+ return self->active_layer;
+}
+
+
/**
* data_remove_layer:
* @data: The diagram to remove the layer from.
@@ -464,21 +500,24 @@ data_set_active_layer (DiagramData *data, DiaLayer *layer)
void
data_remove_layer (DiagramData *data, DiaLayer *layer)
{
- if (data->layers->len<=1)
+ if (data_layer_count (data) <= 1) {
return;
+ }
- if (data->active_layer == layer) {
+ if (dia_diagram_data_get_active_layer (data) == layer) {
data_remove_all_selected (data);
}
+
data_emit (data, layer, NULL, "object_remove");
dia_layer_set_parent_diagram (layer, NULL);
g_ptr_array_remove (data->layers, layer);
- if (data->active_layer == layer) {
- data->active_layer = g_ptr_array_index (data->layers, 0);
+ if (dia_diagram_data_get_active_layer (data) == NULL) {
+ data_set_active_layer (data, data_layer_get_nth (data, 0));
}
}
+
static ObjectHighlight *
find_object_highlight(GList *list, DiaObject *obj)
{
@@ -585,41 +624,45 @@ data_remove_all_selected(DiagramData *data)
g_signal_emit (data, diagram_data_signals[SELECTION_CHANGED], 0, data->selected_count_private);
}
-/*!
- * \brief Return TRUE if the diagram has visible layers.
- * @param data The diagram to check.
- * @return TRUE if at least one layer in the diagram is visible.
- * \protected \memberof _DiagramData
+
+/**
+ * data_has_visible_layers:
+ * @data: The #DiagramData to check.
+ *
+ * Return %TRUE if the diagram has visible layers.
+ *
+ * Returns: %TRUE if at least one layer in the diagram is visible.
+ *
+ * Since: dawn-of-time
*/
static gboolean
data_has_visible_layers (DiagramData *data)
{
- guint i;
- for (i = 0; i < data->layers->len; i++) {
- DiaLayer *layer = g_ptr_array_index (data->layers, i);
-
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
if (dia_layer_is_visible (layer)) {
return TRUE;
}
- }
+ });
+
return FALSE;
}
-/*!
- * \brief Set the diagram extents field to the union of the extents of the layers.
- * @param data The diagram to get the extents for.
- * \protected \memberof _DiagramData
+
+/**
+ * data_get_layers_extents_union:
+ * @data: The #DiagramData to get the extents for.
+ *
+ * Set the diagram extents field to the union of the extents of the layers.
+ *
+ * Since: dawn-of-time
*/
static void
data_get_layers_extents_union (DiagramData *data)
{
- guint i;
gboolean first = TRUE;
DiaRectangle new_extents;
- for ( i = 0; i < data->layers->len; i++) {
- DiaLayer *layer = g_ptr_array_index (data->layers, i);
-
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
if (!dia_layer_is_visible (layer)) {
continue;
}
@@ -638,11 +681,12 @@ data_get_layers_extents_union (DiagramData *data)
rectangle_union (&new_extents, &extents);
}
}
- }
+ });
data->extents = new_extents;
}
+
/*!
* \brief Change diagram scaling so that the extents are exactly visible.
* @param data The diagram to adjust.
@@ -664,6 +708,7 @@ data_adapt_scaling_to_extents(DiagramData *data)
data->paper.height = (float)(pheight / data->paper.scaling);
}
+
/*!
* \brief Adjust the extents field of a diagram.
* @param data The diagram to adjust.
@@ -676,8 +721,8 @@ data_compute_extents (DiagramData *data)
DiaRectangle old_extents = data->extents;
if (!data_has_visible_layers (data)) {
- if (data->layers->len > 0) {
- DiaLayer *layer = g_ptr_array_index (data->layers, 0);
+ if (data_layer_count (data) > 0) {
+ DiaLayer *layer = data_layer_get_nth (data, 0);
dia_layer_update_extents (layer);
@@ -690,14 +735,16 @@ data_compute_extents (DiagramData *data)
}
if (rectangle_equals (&data->extents, &invalid_extents)) {
- data->extents.left = 0.0;
- data->extents.right = 10.0;
- data->extents.top = 0.0;
- data->extents.bottom = 10.0;
+ data->extents.left = 0.0;
+ data->extents.right = 10.0;
+ data->extents.top = 0.0;
+ data->extents.bottom = 10.0;
}
+
return (!rectangle_equals (&data->extents, &old_extents));
}
+
/*!
* \brief Update the extents of a diagram and adjust scaling if needed.
* @param data Diagram to update.
@@ -736,7 +783,7 @@ data_get_sorted_selected (DiagramData *data)
return NULL;
sorted_list = NULL;
- list = g_list_last (dia_layer_get_object_list (data->active_layer));
+ list = g_list_last (dia_layer_get_object_list (dia_diagram_data_get_active_layer (data)));
while (list != NULL) {
found = g_list_find (data->selected, list->data);
if (found) {
@@ -772,7 +819,7 @@ data_get_sorted_selected_remove (DiagramData *data)
return NULL;
sorted_list = NULL;
- list = g_list_last (dia_layer_get_object_list (data->active_layer));
+ list = g_list_last (dia_layer_get_object_list (dia_diagram_data_get_active_layer (data)));
while (list != NULL) {
found = g_list_find (data->selected, list->data);
if (found) {
@@ -781,7 +828,7 @@ data_get_sorted_selected_remove (DiagramData *data)
list = g_list_previous (list);
- dia_layer_remove_object (data->active_layer, obj);
+ dia_layer_remove_object (dia_diagram_data_get_active_layer (data), obj);
} else {
list = g_list_previous (list);
}
@@ -831,16 +878,17 @@ data_render (DiagramData *data,
ObjectRenderer obj_renderer,
gpointer gdata)
{
- DiaLayer *layer;
- guint i, active_layer;
+ DiaLayer *active;
+ guint active_layer;
if (!DIA_IS_INTERACTIVE_RENDERER (renderer)) {
dia_renderer_begin_render (renderer, update);
}
- for (i = 0; i < data->layers->len; i++) {
- layer = (DiaLayer *) g_ptr_array_index (data->layers, i);
- active_layer = (layer == data->active_layer);
+ active = dia_diagram_data_get_active_layer (data);
+
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
+ active_layer = (layer == active);
if (dia_layer_is_visible (layer)) {
if (obj_renderer) {
dia_layer_render (layer, renderer, update, obj_renderer, gdata, active_layer);
@@ -848,7 +896,7 @@ data_render (DiagramData *data,
dia_renderer_draw_layer (renderer, layer, active_layer, update);
}
}
- }
+ });
if (!DIA_IS_INTERACTIVE_RENDERER (renderer)) {
dia_renderer_end_render (renderer);
@@ -906,6 +954,7 @@ data_render_paginated (DiagramData *data, DiaRenderer *renderer, gpointer user_d
}
}
+
/*!
* \brief Visit all objects within the diagram
* @param data the diagram
@@ -916,10 +965,7 @@ data_render_paginated (DiagramData *data, DiaRenderer *renderer, gpointer user_d
void
data_foreach_object (DiagramData *data, GFunc func, gpointer user_data)
{
- DiaLayer *layer;
- guint i;
- for (i=0; i<data->layers->len; i++) {
- layer = (DiaLayer *) g_ptr_array_index (data->layers, i);
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
g_list_foreach (dia_layer_get_object_list (layer), func, user_data);
- }
+ });
}
diff --git a/lib/diagramdata.h b/lib/diagramdata.h
index 0bd3fbaf..bc18575e 100644
--- a/lib/diagramdata.h
+++ b/lib/diagramdata.h
@@ -30,6 +30,13 @@
G_BEGIN_DECLS
+#ifndef __in_diagram_data
+#define DIA_DIAGRAM_DATA_PRIVATE(name) __priv_##name
+#else
+#define DIA_DIAGRAM_DATA_PRIVATE(name) name
+#endif
+
+
/*!
* \brief Helper to create new diagram
*/
@@ -72,8 +79,10 @@ struct _DiagramData {
gboolean is_compressed; /*!< TRUE if by default it should be save compressed.
The user can override this in Save As... */
- GPtrArray *layers; /*!< Layers ordered by decreasing z-order */
- DiaLayer *active_layer; /*!< The active layer, Defensive programmers check for NULL */
+ /*!< Layers ordered by decreasing z-order */
+ GPtrArray *DIA_DIAGRAM_DATA_PRIVATE(layers);
+ /*!< The active layer, Defensive programmers check for NULL */
+ DiaLayer *DIA_DIAGRAM_DATA_PRIVATE(active_layer);
guint selected_count_private; /*!< kept for binary compatibility and sanity, don't use ! */
GList *selected; /*!< List of objects that are selected,
@@ -116,6 +125,7 @@ void data_lower_layer(DiagramData *data, DiaLayer *layer);
void data_add_layer(DiagramData *data, DiaLayer *layer);
void data_add_layer_at(DiagramData *data, DiaLayer *layer, int pos);
void data_set_active_layer(DiagramData *data, DiaLayer *layer);
+DiaLayer *dia_diagram_data_get_active_layer (DiagramData *self);
void data_remove_layer(DiagramData *data, DiaLayer *layer);
int data_layer_get_index (const DiagramData *data, const DiaLayer *layer);
int data_layer_count(const DiagramData *data);
@@ -147,6 +157,15 @@ void data_render_paginated(DiagramData *data, DiaRenderer *renderer, gpointer us
DiagramData *diagram_data_clone (DiagramData *data);
DiagramData *diagram_data_clone_selected (DiagramData *data);
+#define DIA_FOR_LAYER_IN_DIAGRAM(diagram, layer, i, body) \
+ G_STMT_START { \
+ int __dia_layers_len = data_layer_count (diagram); \
+ for (int i = 0; i < __dia_layers_len; i++) { \
+ DiaLayer *layer = data_layer_get_nth (diagram, i); \
+ body \
+ } \
+ } G_STMT_END
+
G_END_DECLS
#endif /* DIAGRAMDATA_H */
diff --git a/lib/object.c b/lib/object.c
index eacf58a5..fb8a2581 100644
--- a/lib/object.c
+++ b/lib/object.c
@@ -931,6 +931,7 @@ dia_object_get_parent_with_flags(DiaObject *obj, guint flags)
return top;
}
+
/** Utility function: Checks if an objects can be selected.
* Reasons for not being selectable include:
* Being inside a closed group.
@@ -940,12 +941,12 @@ dia_object_get_parent_with_flags(DiaObject *obj, guint flags)
* @returns TRUE if the object is not currently selected.
*/
gboolean
-dia_object_is_selectable(DiaObject *obj)
+dia_object_is_selectable (DiaObject *obj)
{
if (obj->parent_layer == NULL) {
return FALSE;
}
- return obj->parent_layer == dia_layer_get_parent_diagram (obj->parent_layer)->active_layer;
+ return obj->parent_layer == dia_diagram_data_get_active_layer (dia_layer_get_parent_diagram
(obj->parent_layer));
}
diff --git a/plug-ins/drs/dia-render-script-import.c b/plug-ins/drs/dia-render-script-import.c
index fff5a885..7d87ed78 100644
--- a/plug-ins/drs/dia-render-script-import.c
+++ b/plug-ins/drs/dia-render-script-import.c
@@ -488,17 +488,16 @@ import_drs (const gchar *filename, DiagramData *dia, DiaContext *ctx, void* user
for (node = root->children; node != NULL; node = node->next) {
if (xmlStrcmp (node->name, (const xmlChar *) "layer") == 0) {
xmlChar *str;
- xmlChar *name = xmlGetProp (node, (const xmlChar *) "name");
- DiaLayer *layer = dia_layer_new (name ? (gchar *) name : _("Layer"), dia);
+ xmlChar *name = xmlGetProp (node, "name");
+ DiaLayer *layer = dia_layer_new (name ? (char *) name : _("Layer"), dia);
- if (name)
- xmlFree (name);
+ dia_clear_xml_string (&name);
- str = xmlGetProp (node, (const xmlChar *) "active");
- if (xmlStrcmp (str, (const xmlChar *) "true")) {
- active_layer = layer;
- xmlFree (str);
+ str = xmlGetProp (node, "active");
+ if (xmlStrcmp (str, "true")) {
+ g_set_object (&active_layer, layer);
}
+ dia_clear_xml_string (&str);
items = read_items (node->children, ctx);
for (item = items; item != NULL; item = g_list_next (item)) {
@@ -507,10 +506,17 @@ import_drs (const gchar *filename, DiagramData *dia, DiaContext *ctx, void* user
}
g_list_free (items);
data_add_layer (dia, layer);
+
+ g_clear_object (&layer);
}
}
- if (active_layer)
+
+ if (active_layer) {
data_set_active_layer (dia, active_layer);
+ }
+
xmlFreeDoc(doc);
+ g_clear_object (&active_layer);
+
return TRUE;
}
diff --git a/plug-ins/drs/dia-render-script.c b/plug-ins/drs/dia-render-script.c
index e33a624e..d6958ab7 100644
--- a/plug-ins/drs/dia-render-script.c
+++ b/plug-ins/drs/dia-render-script.c
@@ -97,20 +97,23 @@ drs_render_layer (DiaRenderer *self, DiaLayer *layer, gboolean active)
renderer->root = g_queue_pop_tail (renderer->parents);
}
+
/*! own version to render invisible layers, too */
static void
drs_data_render (DiagramData *data, DiaRenderer *renderer)
{
- int i;
+ DiaLayer *active = dia_diagram_data_get_active_layer (data);
dia_renderer_begin_render (renderer, NULL);
- for (i=0; i < data->layers->len; i++) {
- DiaLayer *layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
- drs_render_layer (renderer, layer, layer == data->active_layer);
- }
+
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
+ drs_render_layer (renderer, layer, layer == active);
+ });
+
dia_renderer_end_render (renderer);
}
+
/* dia export funtion */
static gboolean
export_data(DiagramData *data, DiaContext *ctx,
diff --git a/plug-ins/dxf/dxf-export.c b/plug-ins/dxf/dxf-export.c
index ce228ae3..3f95d752 100644
--- a/plug-ins/dxf/dxf-export.c
+++ b/plug-ins/dxf/dxf-export.c
@@ -564,19 +564,20 @@ dxf_renderer_class_init (DxfRendererClass *klass)
g_object_class_override_property (object_class, PROP_FONT_HEIGHT, "font-height");
}
+
static gboolean
-export_dxf(DiagramData *data, DiaContext *ctx,
- const gchar *filename, const gchar *diafilename,
- void* user_data)
+export_dxf (DiagramData *data,
+ DiaContext *ctx,
+ const char *filename,
+ const char *diafilename,
+ void *user_data)
{
- DxfRenderer *renderer;
- FILE *file;
- int i;
- DiaLayer *layer;
- gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
- gchar buf2[G_ASCII_DTOSTR_BUF_SIZE];
+ DxfRenderer *renderer;
+ FILE *file;
+ gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
+ gchar buf2[G_ASCII_DTOSTR_BUF_SIZE];
- file = g_fopen(filename, "w");
+ file = g_fopen(filename, "w");
if (file == NULL) {
dia_context_add_message_with_errno (ctx, errno, _("Can't open output file %s"),
@@ -599,19 +600,19 @@ export_dxf(DiagramData *data, DiaContext *ctx,
fprintf(file, " 0\nENDSEC\n");
/* write layer description */
- fprintf(file," 0\nSECTION\n 2\nTABLES\n 0\nTABLE\n");
+ fprintf (file," 0\nSECTION\n 2\nTABLES\n 0\nTABLE\n");
/* some dummy entry to make it work for more DXF viewers */
- fprintf(file," 2\nLAYER\n 70\n255\n");
-
- for (i=0; i<data->layers->len; i++) {
- layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
- fprintf (file," 0\nLAYER\n 2\n%s\n", dia_layer_get_name (layer));
- if (dia_layer_is_visible (layer))
- fprintf (file," 62\n%d\n",i+1);
- else
- fprintf (file," 62\n%d\n",(-1)*(i+1));
+ fprintf (file," 2\nLAYER\n 70\n255\n");
+
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
+ fprintf (file," 0\nLAYER\n 2\n%s\n", dia_layer_get_name (layer));
+ if (dia_layer_is_visible (layer)) {
+ fprintf (file, " 62\n%d\n", i + 1);
+ } else {
+ fprintf (file, " 62\n%d\n", (-1) * (i + 1));
}
- fprintf(file, " 0\nENDTAB\n 0\nENDSEC\n");
+ });
+ fprintf (file, " 0\nENDTAB\n 0\nENDSEC\n");
/* write graphics */
fprintf(file," 0\nSECTION\n 2\nENTITIES\n");
@@ -620,11 +621,10 @@ export_dxf(DiagramData *data, DiaContext *ctx,
dia_renderer_begin_render (DIA_RENDERER (renderer), NULL);
- for (i=0; i<data->layers->len; i++) {
- layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
- renderer->layername = dia_layer_get_name (layer);
- dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
- }
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
+ renderer->layername = dia_layer_get_name (layer);
+ dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
+ });
dia_renderer_end_render (DIA_RENDERER (renderer));
diff --git a/plug-ins/dxf/dxf-import.c b/plug-ins/dxf/dxf-import.c
index 155acc8e..ea730e51 100644
--- a/plug-ins/dxf/dxf-import.c
+++ b/plug-ins/dxf/dxf-import.c
@@ -122,32 +122,34 @@ _color_init_from_rgb (Color *color, RGB_t rgb)
color->alpha = 1.0;
}
+
/* returns the layer with the given name */
/* TODO: merge this with other layer code? */
static DiaLayer *
-layer_find_by_name(char *layername, DiagramData *dia)
+layer_find_by_name (char *layername, DiagramData *dia)
{
- DiaLayer *matching_layer, *layer;
- guint i;
+ DiaLayer *matching_layer;
matching_layer = NULL;
- for (i=0; i<dia->layers->len; i++) {
- layer = DIA_LAYER (g_ptr_array_index (dia->layers, i));
+ DIA_FOR_LAYER_IN_DIAGRAM (dia, layer, i, {
if (strcmp (dia_layer_get_name (layer), layername) == 0) {
matching_layer = layer;
break;
}
- }
+ });
if (matching_layer == NULL) {
matching_layer = dia_layer_new (layername, dia);
data_add_layer (dia, matching_layer);
+ // dia now owns the layer
+ g_object_unref (matching_layer);
}
return matching_layer;
}
+
/* returns the matching dia linestyle for a given dxf linestyle */
/* if no matching style is found, LINESTYLE solid is returned as a default */
static LineStyle
@@ -182,7 +184,7 @@ read_entity_line_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
real line_width = DEFAULT_LINE_WIDTH;
LineStyle style = LINESTYLE_SOLID;
- DiaLayer *layer = dia->active_layer;
+ DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
end.x=0;
end.y=0;
@@ -269,7 +271,7 @@ read_entity_solid_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
real line_width = 0.001;
LineStyle style = LINESTYLE_SOLID;
- DiaLayer *layer = dia->active_layer;
+ DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
RGB_t color = { 127, 127, 127 };
/* printf( "Solid " ); */
@@ -411,7 +413,7 @@ read_entity_polyline_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
real line_width = DEFAULT_LINE_WIDTH;
real radius, start_angle = 0;
LineStyle style = LINESTYLE_SOLID;
- DiaLayer *layer = dia->active_layer;
+ DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
RGB_t color = { 0, };
unsigned char closed = 0;
int points = 0;
@@ -600,7 +602,7 @@ read_entity_circle_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
GPtrArray *props;
real line_width = DEFAULT_LINE_WIDTH;
- DiaLayer *layer = dia->active_layer;
+ DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
do {
if (read_dxf_codes (filedxf, data) == FALSE) {
@@ -681,7 +683,7 @@ read_entity_arc_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
GPtrArray *props;
real line_width = DEFAULT_LINE_WIDTH;
- DiaLayer *layer = dia->active_layer;
+ DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
do {
if (read_dxf_codes (filedxf, data) == FALSE){
@@ -775,7 +777,7 @@ read_entity_ellipse_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
GPtrArray *props;
real line_width = DEFAULT_LINE_WIDTH;
- DiaLayer *layer = dia->active_layer;
+ DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
do {
if (read_dxf_codes (filedxf, data) == FALSE) {
@@ -865,7 +867,7 @@ read_entity_text_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
TextProperty *tprop;
GPtrArray *props;
- DiaLayer *layer = dia->active_layer;
+ DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
do {
if (read_dxf_codes (filedxf, data) == FALSE) {
@@ -1267,13 +1269,14 @@ read_section_blocks_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
} else if((data->code == 0) && (strcmp(data->value, "ENDBLK") == 0)) {
/* printf( "End group %d\n", group_items ); */
- if( group && group_items > 0 && group_list != NULL )
- {
- obj = group_create( group_list );
- if (NULL == group_layer )
- dia_layer_add_object( dia->active_layer, obj );
- else
- dia_layer_add_object( group_layer, obj );
+ if (group && group_items > 0 && group_list != NULL) {
+ obj = group_create (group_list);
+ if (NULL == group_layer) {
+ dia_layer_add_object (dia_diagram_data_get_active_layer (dia),
+ obj);
+ } else {
+ dia_layer_add_object (group_layer, obj);
+ }
}
group = FALSE;
diff --git a/plug-ins/pixbuf/pixbuf.c b/plug-ins/pixbuf/pixbuf.c
index e6f8aa52..f8c591d6 100644
--- a/plug-ins/pixbuf/pixbuf.c
+++ b/plug-ins/pixbuf/pixbuf.c
@@ -115,48 +115,50 @@ export_data(DiagramData *data, DiaContext *ctx,
return TRUE;
}
+
static gboolean
-import_data (const gchar *filename, DiagramData *data, DiaContext *ctx, void* user_data)
+import_data (const char *filename,
+ DiagramData *data,
+ DiaContext *ctx,
+ void *user_data)
{
- DiaObjectType *otype = object_get_type("Standard - Image");
+ DiaObjectType *otype = object_get_type ("Standard - Image");
gint width, height;
if (!otype) /* this would be really broken */
return FALSE;
if (!user_data) {
- dia_context_add_message(ctx, _("Calling error, missing user_data."));
+ dia_context_add_message (ctx, _("Calling error, missing user_data."));
return FALSE;
}
- if (gdk_pixbuf_get_file_info (filename, &width, &height))
- {
- DiaObject *obj;
- Handle *h1, *h2;
- Point point;
- point.x = point.y = 0.0;
+ if (gdk_pixbuf_get_file_info (filename, &width, &height)) {
+ DiaObject *obj;
+ Handle *h1, *h2;
+ Point point;
+ point.x = point.y = 0.0;
- obj = otype->ops->create(&point, otype->default_user_data, &h1, &h2);
- if (obj)
- {
- GPtrArray *plist = g_ptr_array_new ();
+ obj = otype->ops->create(&point, otype->default_user_data, &h1, &h2);
+ if (obj) {
+ GPtrArray *plist = g_ptr_array_new ();
- prop_list_add_filename (plist, "image_file", filename);
- prop_list_add_real (plist, "elem_width", width / 20.0);
- prop_list_add_real (plist, "elem_height", height / 20.0);
+ prop_list_add_filename (plist, "image_file", filename);
+ prop_list_add_real (plist, "elem_width", width / 20.0);
+ prop_list_add_real (plist, "elem_height", height / 20.0);
- dia_object_set_properties (obj, plist);
- prop_list_free (plist);
+ dia_object_set_properties (obj, plist);
+ prop_list_free (plist);
- dia_layer_add_object (data->active_layer, obj);
- return TRUE;
- }
- }
- else
- {
- dia_context_add_message(ctx, _("Pixbuf[%s] can't load:\n%s"),
- (gchar*)user_data, dia_context_get_filename(ctx));
+ dia_layer_add_object (dia_diagram_data_get_active_layer (data), obj);
+ return TRUE;
}
+ } else {
+ dia_context_add_message (ctx,
+ _("Pixbuf[%s] can't load:\n%s"),
+ (char *) user_data,
+ dia_context_get_filename (ctx));
+ }
return FALSE;
}
diff --git a/plug-ins/python/pydia-diagramdata.c b/plug-ins/python/pydia-diagramdata.c
index 9416dde3..c5f12f83 100644
--- a/plug-ins/python/pydia-diagramdata.c
+++ b/plug-ins/python/pydia-diagramdata.c
@@ -132,13 +132,17 @@ PyDiaDiagramData_AddLayer (PyDiaDiagramData *self, PyObject *args)
layer = dia_layer_new (name, self->data);
if (pos != -1) {
- data_add_layer_at(self->data, layer, pos);
+ data_add_layer_at (self->data, layer, pos);
} else {
data_add_layer (self->data, layer);
}
+ // self->data now owns the layer
+ g_object_unref (layer);
+
return PyDiaLayer_New (layer);
}
+
static PyObject *
PyDiaDiagramData_RaiseLayer(PyDiaDiagramData *self, PyObject *args)
{
@@ -355,76 +359,65 @@ static PyMemberDef PyDiaDiagramData_Members[] = {
static PyObject *
PyDiaDiagramData_GetAttr (PyDiaDiagramData *self, char *attr)
{
- DiagramData *data = self->data;
-
- if (!strcmp(attr, "__members__"))
- return Py_BuildValue("[ssssssssssss]",
- "extents", "bg_color", "paper",
- "layers", "active_layer",
- "grid_width", "grid_visible",
- "hguides", "vguides",
- "layers", "active_layer",
- "selected" );
- else if (!strcmp(attr, "extents"))
- return PyDiaRectangle_New(&data->extents, NULL);
- else if (!strcmp(attr, "bg_color")) {
- return PyDiaColor_New (&(data->bg_color));
+ DiagramData *data = self->data;
+
+ if (!strcmp (attr, "__members__")) {
+ return Py_BuildValue ("[ssssssssssss]",
+ "extents", "bg_color", "paper",
+ "layers", "active_layer",
+ "grid_width", "grid_visible",
+ "hguides", "vguides",
+ "selected" );
+ } else if (!strcmp (attr, "extents")) {
+ return PyDiaRectangle_New (&data->extents, NULL);
+ } else if (!strcmp (attr, "bg_color")) {
+ return PyDiaColor_New (&(data->bg_color));
+ } else if (!strcmp (attr, "layers")) {
+ PyObject *ret = PyTuple_New (data_layer_count (data));
+
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
+ PyTuple_SetItem (ret, i, PyDiaLayer_New (layer));
+ });
+
+ return ret;
+ } else if (!strcmp (attr, "active_layer")) {
+ return PyDiaLayer_New (dia_diagram_data_get_active_layer (data));
+ } else if (!strcmp (attr, "paper")) {
+ return PyDiaPaperinfo_New (&data->paper);
+ } else if (!strcmp(attr, "selected")) {
+ PyObject *ret;
+ GList *tmp;
+ int i;
+
+ ret = PyTuple_New (g_list_length (self->data->selected));
+ for (i = 0, tmp = data->selected; tmp; i++, tmp = tmp->next) {
+ PyTuple_SetItem (ret, i, PyDiaObject_New ((DiaObject *) tmp->data));
}
- else if (!strcmp(attr, "layers")) {
- guint i, len = data->layers->len;
- PyObject *ret = PyTuple_New(len);
-
- for (i = 0; i < len; i++)
- PyTuple_SetItem(ret, i, PyDiaLayer_New(
- g_ptr_array_index(data->layers, i)));
- return ret;
- } else if (!strcmp(attr, "active_layer")) {
- return PyDiaLayer_New(data->active_layer);
- } else if (!strcmp(attr, "paper")) {
- return PyDiaPaperinfo_New (&data->paper);
- } else if (!strcmp(attr, "layers")) {
- guint i, len = data->layers->len;
- PyObject *ret = PyTuple_New(len);
-
- for (i = 0; i < len; i++)
- PyTuple_SetItem(ret, i, PyDiaLayer_New(
- g_ptr_array_index(self->data->layers, i)));
- return ret;
- } else if (!strcmp(attr, "active_layer")) {
- return PyDiaLayer_New(data->active_layer);
- } else if (!strcmp(attr, "selected")) {
- PyObject *ret;
- GList *tmp;
- int i;
-
- ret = PyTuple_New (g_list_length (self->data->selected));
- for (i = 0, tmp = data->selected; tmp; i++, tmp = tmp->next) {
- PyTuple_SetItem (ret, i, PyDiaObject_New ((DiaObject *) tmp->data));
- }
- return ret;
- } else if (!strcmp(attr, "diagram")) {
- if (DIA_IS_DIAGRAM (self->data)) {
- return PyDiaDiagram_New (DIA_DIAGRAM (self->data));
- }
- Py_INCREF (Py_None);
- return Py_None;
- } else {
- /* In the interactive case diagramdata is_a diagram */
- if (DIA_IS_DIAGRAM (self->data)) {
- Diagram *diagram = DIA_DIAGRAM (self->data);
- if (diagram) { /* paranoid and helping scan-build */
- if (!strcmp (attr, "grid_width")) {
- return Py_BuildValue ("(dd)", diagram->grid.width_x, diagram->grid.width_y);
- } else if (!strcmp (attr, "grid_visible")) {
- return Py_BuildValue ("(ii)", diagram->grid.visible_x, diagram->grid.visible_y);
- }
+ return ret;
+ } else if (!strcmp(attr, "diagram")) {
+ if (DIA_IS_DIAGRAM (self->data)) {
+ return PyDiaDiagram_New (DIA_DIAGRAM (self->data));
+ }
+ Py_INCREF (Py_None);
+ return Py_None;
+ } else {
+ /* In the interactive case diagramdata is_a diagram */
+ if (DIA_IS_DIAGRAM (self->data)) {
+ Diagram *diagram = DIA_DIAGRAM (self->data);
+ if (diagram) { /* paranoid and helping scan-build */
+ if (!strcmp (attr, "grid_width")) {
+ return Py_BuildValue ("(dd)", diagram->grid.width_x, diagram->grid.width_y);
+ } else if (!strcmp (attr, "grid_visible")) {
+ return Py_BuildValue ("(ii)", diagram->grid.visible_x, diagram->grid.visible_y);
}
}
}
+ }
- return Py_FindMethod(PyDiaDiagramData_Methods, (PyObject *)self, attr);
+ return Py_FindMethod (PyDiaDiagramData_Methods, (PyObject *) self, attr);
}
+
PyTypeObject PyDiaDiagramData_Type = {
PyObject_HEAD_INIT(NULL)
0,
diff --git a/plug-ins/python/pydia-layer.c b/plug-ins/python/pydia-layer.c
index 76469202..20d0f088 100644
--- a/plug-ins/python/pydia-layer.c
+++ b/plug-ins/python/pydia-layer.c
@@ -210,8 +210,7 @@ PyDiaLayer_Render (PyDiaLayer *self, PyObject *args)
PyObject* renderer;
DiaRenderer *wrapper;
DiaRectangle *update = NULL;
- gboolean active = FALSE; /* could derive from layer->parent_diagram->active_layer
- * but not sure if it's worth the effort. */
+ gboolean active = FALSE; /* could derive but not sure if it's worth the effort. */
if (!PyArg_ParseTuple (args, "O:Layer.render", &renderer))
return NULL;
diff --git a/plug-ins/svg/svg-import.c b/plug-ins/svg/svg-import.c
index a808cb97..93b700d7 100644
--- a/plug-ins/svg/svg-import.c
+++ b/plug-ins/svg/svg-import.c
@@ -1976,6 +1976,9 @@ import_shape_info (xmlNodePtr start_node, DiagramData *dia, DiaContext *ctx)
} else if (!xmlStrcmp(node->name, (const xmlChar *)"can-parent")) {
}
}
+
+ g_clear_object (&layer);
+
return TRUE;
}
@@ -2130,7 +2133,6 @@ import_svg (xmlDocPtr doc, DiagramData *dia,
if (groups_to_layers) {
char *name = dia_object_get_meta (obj, "id");
- /* new_layer() is taking ownership of the name */
DiaLayer *layer = dia_layer_new (name, dia);
g_clear_pointer (&name, g_free);
@@ -2138,10 +2140,13 @@ import_svg (xmlDocPtr doc, DiagramData *dia,
/* keep the group for potential transformation */
dia_layer_add_object (layer, obj);
data_add_layer (dia, layer);
+
+ g_clear_object (&layer);
} else {
+ DiaLayer *active = dia_diagram_data_get_active_layer (dia);
/* Just as before: throw it in the active layer */
- dia_layer_add_object (dia->active_layer, obj);
- dia_layer_update_extents (dia->active_layer);
+ dia_layer_add_object (active, obj);
+ dia_layer_update_extents (active);
}
}
diff --git a/plug-ins/vdx/vdx-export.c b/plug-ins/vdx/vdx-export.c
index 764d297b..5163efed 100644
--- a/plug-ins/vdx/vdx-export.c
+++ b/plug-ins/vdx/vdx-export.c
@@ -1799,8 +1799,8 @@ export_vdx (DiagramData *data,
dia_renderer_begin_render (DIA_RENDERER (renderer), NULL);
/* First run through without drawing to setup tables */
- for (i = 0; i < data->layers->len; i++) {
- layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
+ for (i = 0; i < data_layer_count (data); i++) {
+ layer = data_layer_get_nth (data, i);
if (dia_layer_is_visible (layer)) {
dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
}
@@ -1817,8 +1817,8 @@ export_vdx (DiagramData *data,
/* Now render */
- for (i = 0; i < data->layers->len; i++) {
- layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
+ for (i = 0; i < data_layer_count (data); i++) {
+ layer = data_layer_get_nth (data, i);
if (dia_layer_is_visible (layer)) {
dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
}
diff --git a/plug-ins/vdx/vdx-import.c b/plug-ins/vdx/vdx-import.c
index 519498ae..7d629862 100644
--- a/plug-ins/vdx/vdx-import.c
+++ b/plug-ins/vdx/vdx-import.c
@@ -2735,7 +2735,7 @@ vdx_parse_shape(xmlNodePtr Shape, struct vdx_PageSheet *PageSheet,
if (theDoc->debug_comments)
g_debug("Layer %d", dia_layer_num);
}
- diaLayer = DIA_LAYER (g_ptr_array_index (dia->layers, dia_layer_num));
+ diaLayer = data_layer_get_nth (dia, dia_layer_num);
/* Draw the shape (or group) and get list of created objects */
objects = vdx_plot_shape (&theShape, objects, 0, theDoc, ctx);
@@ -2753,80 +2753,91 @@ vdx_parse_shape(xmlNodePtr Shape, struct vdx_PageSheet *PageSheet,
g_slist_free (objects);
}
-/** Parse the pages of the VDX
- * @param PageSheet the PageSheet
- * @param theDoc the document
- * @param dia the growing diagram
- * @bug This doesn't handle multi-page diagrams very well
- */
+/**
+ * vdx_setup_layers:
+ * @PageSheet: the PageSheet
+ * @theDoc: the document
+ * @dia: the growing diagram
+ *
+ * Parse the pages of the VDX
+ *
+ * Bug: This doesn't handle multi-page diagrams very well
+ */
static void
-vdx_setup_layers(struct vdx_PageSheet* PageSheet, VDXDocument* theDoc,
- DiagramData *dia)
+vdx_setup_layers (struct vdx_PageSheet *PageSheet,
+ VDXDocument *theDoc,
+ DiagramData *dia)
{
- GSList *child = NULL;
- GSList *layernames = NULL;
- GSList *layername = NULL;
- struct vdx_any* Any;
- struct vdx_Layer *theLayer;
- DiaLayer *diaLayer = 0;
- unsigned int found_layer, page_layer;
- gboolean found;
-
- /* What layers are on this page? */
+ GSList *child = NULL;
+ GSList *layernames = NULL;
+ GSList *layername = NULL;
+ struct vdx_any* Any;
+ struct vdx_Layer *theLayer;
+ DiaLayer *diaLayer = 0;
+ unsigned int found_layer, page_layer;
+ gboolean found;
+
+ /* What layers are on this page? */
+
+ if (!PageSheet) {
+ g_debug ("vdx_setup_layers() called with PageSheet=0");
+ return;
+ }
- if (!PageSheet)
- {
- g_debug("vdx_setup_layers() called with PageSheet=0");
- return;
+ for (child = PageSheet->any.children; child; child = child->next) {
+ if (!child || !child->data) {
+ continue;
}
- for (child = PageSheet->any.children; child; child = child->next)
- {
- if (!child || !child->data) continue;
- Any = (struct vdx_any *)(child->data);
- if (Any->type != vdx_types_Layer) continue;
- theLayer = (struct vdx_Layer *)child->data;
- layernames = g_slist_prepend(layernames, theLayer->Name);
+ Any = (struct vdx_any *) (child->data);
+ if (Any->type != vdx_types_Layer) {
+ continue;
}
- /* Add any missing layers to Dia's list
- Must be back to front
- Also construct translation table for this page's layers */
+ theLayer = (struct vdx_Layer *) child->data;
+ layernames = g_slist_prepend (layernames, theLayer->Name);
+ }
- if (theDoc->PageLayers) g_array_free(theDoc->PageLayers, TRUE);
- theDoc->PageLayers = g_array_new(FALSE, TRUE, sizeof (unsigned int));
+ /* Add any missing layers to Dia's list
+ Must be back to front
+ Also construct translation table for this page's layers */
- if (!theDoc->LayerNames)
- theDoc->LayerNames = g_array_new(FALSE, TRUE, sizeof (char *));
+ if (theDoc->PageLayers) {
+ g_array_free (theDoc->PageLayers, TRUE);
+ }
+ theDoc->PageLayers = g_array_new (FALSE, TRUE, sizeof (unsigned int));
- page_layer = 0;
- for (layername = layernames; layername; layername = layername->next)
- {
- found = FALSE;
- for (found_layer = 0; found_layer < theDoc->LayerNames->len;
- found_layer++)
- {
- if (layername->data &&
- g_array_index(theDoc->LayerNames, char *, found_layer) &&
- !strcmp((char *)layername->data,
- g_array_index(theDoc->LayerNames, char *,
- found_layer)))
- {
- found = TRUE;
- break;
- }
- }
- if (!found)
- {
- g_array_append_val(theDoc->LayerNames, layername->data);
- diaLayer = dia_layer_new (((char*) layername->data), dia);
- data_add_layer (dia, diaLayer);
- }
- page_layer++;
- g_array_prepend_val(theDoc->PageLayers, page_layer);
+ if (!theDoc->LayerNames) {
+ theDoc->LayerNames = g_array_new(FALSE, TRUE, sizeof (char *));
+ }
+
+ page_layer = 0;
+ for (layername = layernames; layername; layername = layername->next) {
+ found = FALSE;
+ for (found_layer = 0; found_layer < theDoc->LayerNames->len; found_layer++) {
+ if (layername->data &&
+ g_array_index (theDoc->LayerNames, char *, found_layer) &&
+ !strcmp ((char *) layername->data,
+ g_array_index (theDoc->LayerNames, char *, found_layer)))
+ {
+ found = TRUE;
+ break;
+ }
}
- data_set_active_layer(dia, diaLayer);
+
+ if (!found) {
+ g_array_append_val (theDoc->LayerNames, layername->data);
+ g_clear_object (&diaLayer);
+ diaLayer = dia_layer_new (((char*) layername->data), dia);
+ data_add_layer (dia, diaLayer);
+ }
+ page_layer++;
+ g_array_prepend_val (theDoc->PageLayers, page_layer);
+ }
+
+ data_set_active_layer (dia, diaLayer);
+ g_clear_object (&diaLayer);
}
/** Parse the pages of the VDX
diff --git a/plug-ins/wpg/wpg-import.c b/plug-ins/wpg/wpg-import.c
index f0937579..26a09235 100644
--- a/plug-ins/wpg/wpg-import.c
+++ b/plug-ins/wpg/wpg-import.c
@@ -681,7 +681,7 @@ import_data (const gchar *filename, DiagramData *dia, DiaContext *ctx, void* use
{
DiaObject *objs = dia_import_renderer_get_objects (DIA_RENDERER(ren));
if (objs) {
- dia_layer_add_object (dia->active_layer, objs);
+ dia_layer_add_object (dia_diagram_data_get_active_layer (dia), objs);
} else {
dia_context_add_message (ctx, _("Empty WPG file?"));
bRet = FALSE;
diff --git a/plug-ins/xfig/xfig-export.c b/plug-ins/xfig/xfig-export.c
index 69408d3a..eaab9183 100644
--- a/plug-ins/xfig/xfig-export.c
+++ b/plug-ins/xfig/xfig-export.c
@@ -1179,14 +1179,14 @@ draw_object (DiaRenderer *self,
static gboolean
-export_fig(DiagramData *data, DiaContext *ctx,
- const gchar *filename, const gchar *diafilename,
- void* user_data)
+export_fig (DiagramData *data,
+ DiaContext *ctx,
+ const char *filename,
+ const char *diafilename,
+ void *user_data)
{
FILE *file;
XfigRenderer *renderer;
- int i;
- DiaLayer *layer;
gchar d_buf[DTOSTR_BUF_SIZE];
file = g_fopen(filename, "w");
@@ -1199,7 +1199,7 @@ export_fig(DiagramData *data, DiaContext *ctx,
return FALSE;
}
- renderer = g_object_new(XFIG_TYPE_RENDERER, NULL);
+ renderer = g_object_new (XFIG_TYPE_RENDERER, NULL);
renderer->file = file;
@@ -1217,13 +1217,12 @@ export_fig(DiagramData *data, DiaContext *ctx,
dia_renderer_begin_render (DIA_RENDERER (renderer), NULL);
- for (i = 0; i < data->layers->len; i++) {
- layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
if (dia_layer_is_visible (layer)) {
dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
renderer->depth++;
}
- }
+ });
dia_renderer_end_render (DIA_RENDERER (renderer));
@@ -1231,13 +1230,12 @@ export_fig(DiagramData *data, DiaContext *ctx,
dia_renderer_begin_render (DIA_RENDERER (renderer), NULL);
- for (i=0; i<data->layers->len; i++) {
- layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
+ DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
if (dia_layer_is_visible (layer)) {
dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
renderer->depth++;
}
- }
+ });
dia_renderer_end_render (DIA_RENDERER (renderer));
diff --git a/plug-ins/xfig/xfig-import.c b/plug-ins/xfig/xfig-import.c
index 308ad992..75af448e 100644
--- a/plug-ins/xfig/xfig-import.c
+++ b/plug-ins/xfig/xfig-import.c
@@ -1328,32 +1328,38 @@ import_fig(const gchar *filename, DiagramData *dia, DiaContext *ctx, void* user_
return FALSE;
}
- if (!fig_read_meta_data(figfile, dia, ctx)) {
- fclose(figfile);
- return FALSE;
- }
+ if (!fig_read_meta_data (figfile, dia, ctx)) {
+ fclose (figfile);
+ return FALSE;
+ }
- compound_stack = NULL;
+ compound_stack = NULL;
- do {
- if (!skip_comments(figfile)) {
- if (!feof(figfile)) {
- dia_context_add_message_with_errno(ctx, errno, _("Error reading Fig file."));
- } else {
- break;
- }
- }
- if (! fig_read_object(figfile, ctx)) {
- fclose(figfile);
- break;
- }
- } while (TRUE);
+ do {
+ if (!skip_comments (figfile)) {
+ if (!feof (figfile)) {
+ dia_context_add_message_with_errno (ctx,
+ errno,
+ _("Error reading Fig file."));
+ } else {
+ break;
+ }
+ }
+
+ if (!fig_read_object (figfile, ctx)) {
+ fclose (figfile);
+ break;
+ }
+ } while (TRUE);
/* Now we can reorder for the depth fields */
for (i = 0; i < FIG_MAX_DEPTHS; i++) {
- if (depths[i] != NULL)
- dia_layer_add_objects_first (dia->active_layer, depths[i]);
+ if (depths[i] != NULL) {
+ dia_layer_add_objects_first (dia_diagram_data_get_active_layer (dia),
+ depths[i]);
+ }
}
+
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]