[mlview-list][patch] colours in gconf



Hello,

This patch puts mlview's colours in gconf.

There's no notification at all because I don't know if having different colours in different views / different colours in the same views because someone changed the settings is a good thing ; we will have to discuss about notification mecanisms to update the application when the settings are changed.

The default colour for node types which are not currently in the gconf schemas is black (#000000), but you can simply add colour settings (look at the code or just ask me).

I also commented a function which was unused - maybe we should simply delete it.

Nicolas Centa
"HappyPeng"
? colours.diff
? depcomp
? install-sh
? missing
? mkinstalldirs
? schemas/Makefile.in
Index: schemas/mlview.schemas
===================================================================
RCS file: /cvs/gnome/mlview/schemas/mlview.schemas,v
retrieving revision 1.4
diff -a -u -r1.4 mlview.schemas
--- schemas/mlview.schemas	16 Nov 2003 18:36:04 -0000	1.4
+++ schemas/mlview.schemas	28 Nov 2003 17:48:50 -0000
@@ -25,5 +25,60 @@
 feature is activated.</long>
       </locale>
     </schema>
+    <schema>
+      <key>/schemas/apps/mlview/colours/xml-element-node</key>
+      <applyto>/apps/mlview/colours/xml-element-node</applyto>
+      <owner>mlview</owner>
+      <type>string</type>
+      <default>#0080ff</default>
+      <locale name="C">
+        <short>Element node colour in mlview</short>
+        <long>Element node colour in mlview's trees.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/mlview/colours/xml-text-node</key>
+      <applyto>/apps/mlview/colours/xml-text-node</applyto>
+      <owner>mlview</owner>
+      <type>string</type>
+      <default>#ff0000</default>
+      <locale name="C">
+        <short>Text node colour in mlview</short>
+        <long>Text node colour in mlview's trees.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/mlview/colours/xml-comment-node</key>
+      <applyto>/apps/mlview/colours/xml-comment-node</applyto>
+      <owner>mlview</owner>
+      <type>string</type>
+      <default>#0000FF</default>
+      <locale name="C">
+        <short>Comment node colour in mlview</short>
+        <long>Comment node colour in mlview's trees.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/mlview/colours/xml-document-node</key>
+      <applyto>/apps/mlview/colours/xml-document-node</applyto>
+      <owner>mlview</owner>
+      <type>string</type>
+      <default>#0080ff</default>
+      <locale name="C">
+        <short>Document node colour in mlview</short>
+        <long>Document node colour in mlview's trees.</long>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/mlview/colours/xml-dtd-node</key>
+      <applyto>/apps/mlview/colours/xml-dtd-node</applyto>
+      <owner>mlview</owner>
+      <type>string</type>
+      <default>#ff00ff</default>
+      <locale name="C">
+        <short>DTD node colour in mlview</short>
+        <long>DTD node colour in mlview's trees.</long>
+      </locale>
+    </schema>	
   </schemalist>
 </gconfschemafile>
Index: src/mlview-app-context.c
===================================================================
RCS file: /cvs/gnome/mlview/src/mlview-app-context.c,v
retrieving revision 1.29
diff -a -u -r1.29 mlview-app-context.c
--- src/mlview-app-context.c	24 Nov 2003 22:07:25 -0000	1.29
+++ src/mlview-app-context.c	28 Nov 2003 17:48:51 -0000
@@ -857,6 +857,95 @@
         }
 }
 
+/* Some gconf-related utilities to load many keys in only some
+   lines */ 
+
+#define GCONF_SEPARATOR "/"
+
+void 
+mlview_gconf_free_values (GConfValue **values, const gint nb_keys)
+{
+  gint i;
+
+  for (i = 0 ; i < nb_keys ; i++)
+    {
+      gconf_value_free (values [i]);
+    }
+  g_free (values);
+}
+
+void 
+mlview_gconf_free_strings (gchar **values, const gint nb_keys)
+{
+  gint i;
+
+  for (i = 0 ; i < nb_keys ; i++)
+    {
+      g_free (values [i]);
+    }
+  g_free (values);
+}
+
+GConfValue **
+mlview_gconf_read_values (GConfClient *client, const gchar *root, 
+			  const gchar **keys, const gint nb_keys, GError **err)
+{
+  GConfValue **values;
+  gint i;
+  gchar *path;
+  GError *tmp_err = NULL;
+
+  values = g_new (GConfValue*, nb_keys);
+  for (i = 0 ; i < nb_keys ; i++)
+    {
+      path = g_build_path (GCONF_SEPARATOR, root, keys [i], NULL);
+      values [i] = gconf_client_get (client, path, &tmp_err);
+      g_free (path);
+      if (tmp_err != NULL)
+	{
+	  g_propagate_error (err, tmp_err);
+	  mlview_gconf_free_values (values, i - 1);
+
+	  return NULL;
+	}
+    }
+
+  return values;
+}
+
+gchar **
+mlview_gconf_read_strings (GConfClient *client, const gchar *root, 
+			   const gchar **keys, const gint nb_keys, GError **err)
+{
+  GConfValue **values;
+  gint i;
+  GError *tmp_err = NULL;
+  gchar **ret;
+
+  values = mlview_gconf_read_values (client, root, keys, nb_keys, &tmp_err);
+  if (tmp_err != NULL)
+    {
+      g_propagate_error (err, tmp_err);
+
+      return NULL;
+    }
+  ret = g_new (gchar*, nb_keys);
+  for (i = 0 ; i < nb_keys ; i++)
+    {
+      ret [i] = g_strdup (gconf_value_get_string (values [i]));
+      gconf_value_free (values [i]);
+    }
+  g_free (values);
+
+  return ret;
+}
+
+/* Colours keys */
+
+const gchar *colours_dir = "/apps/mlview/colours";
+const gchar *colours_keys [] = {"xml-element-node", "xml-text-node", "xml-comment-node", 
+"xml-document-node", "xml-dtd-node"};
+
 /**
  *Loads all the gconf keys defined by the MlView application.
  * param a_this the current instance of the #MlViewAppContext.
@@ -912,6 +1001,19 @@
                 gconf_value_free (value) ;
                 value = NULL ;
         }
+        
+        /* Colours */ 
+        settings->colours = mlview_gconf_read_strings (gconf_client,
+                                                       colours_dir,
+                                                       colours_keys,
+                                                       MLVIEW_COLOURS_NB,
+                                                       NULL);
+        if (!settings->colours) {
+                mlview_utils_trace_info
+                        ("inconsistent gconf settings");
+                status = MLVIEW_ERROR;
+                goto cleanup;
+        }
 
  cleanup:
         if (value) {
@@ -1160,6 +1262,10 @@
         }
 
         if (PRIVATE (ctxt)->settings) {
+                if (PRIVATE (ctxt)->settings->colours) {
+                        mlview_gconf_free_strings (PRIVATE (ctxt)->settings->colours, 
+                                                   MLVIEW_COLOURS_NB);
+                }
                 g_free (PRIVATE (ctxt)->settings) ;
                 PRIVATE (ctxt)->settings = NULL ;
         }
Index: src/mlview-app-context.h
===================================================================
RCS file: /cvs/gnome/mlview/src/mlview-app-context.h,v
retrieving revision 1.18
diff -a -u -r1.18 mlview-app-context.h
--- src/mlview-app-context.h	24 Nov 2003 22:07:25 -0000	1.18
+++ src/mlview-app-context.h	28 Nov 2003 17:48:51 -0000
@@ -78,15 +78,26 @@
         GObjectClass parent_class;
 };
 
+enum {
+        XML_ELEMENT_NODE_COLOUR_KEY,
+        XML_TEXT_NODE_COLOUR_KEY,
+        XML_COMMENT_NODE_COLOUR_KEY,
+        XML_DOCUMENT_NODE_COLOUR_KEY,
+        XML_DTD_NODE_COLOUR_KEY,
+        MLVIEW_COLOURS_NB
+} MlViewColourKey;
+
 /**
  *The public application wide settings
  *data structure.
  *This data structure is readonly the
  *applicatoin.
  */
+
 struct MlViewAppSettings {
         gint default_doc_expansion_depth ;
         gboolean validation_is_on ;
+        gchar **colours;
 } ;
 
 
Index: src/mlview-icon-tree.c
===================================================================
RCS file: /cvs/gnome/mlview/src/mlview-icon-tree.c,v
retrieving revision 1.15
diff -a -u -r1.15 mlview-icon-tree.c
--- src/mlview-icon-tree.c	27 Nov 2003 19:46:21 -0000	1.15
+++ src/mlview-icon-tree.c	28 Nov 2003 17:48:51 -0000
@@ -61,7 +61,7 @@
         NB_COLUMNS
 };
 
-static guchar *node_to_string_tag (xmlNode * a_node);
+static guchar *node_to_string_tag (xmlNode * a_node, MlViewAppContext *ctxt);
 static enum MlViewStatus build_tree_model_from_xml_tree (MlViewTreeEditor2 * a_this,
 							 const xmlNode * a_node,
 							 GtkTreeIter * a_ref_iter,
@@ -85,8 +85,8 @@
         gtk_tree_model_get (model, a_iter, XML_NODE_COLUMN,
                             &xml_node, -1);
   
-        start_tag_str = node_to_string_tag (xml_node);
-        attr_str = mlview_tree_editor2_build_attrs_list_str (xml_node);
+        start_tag_str = node_to_string_tag (xml_node, a_this->app_context);
+        attr_str = mlview_tree_editor2_build_attrs_list_str (xml_node, a_this->app_context);
         if (!start_tag_str)
                 return MLVIEW_OK ;
   
@@ -223,7 +223,7 @@
              cur_node; cur_node = cur_node->next) {
                 GtkTreeRowReference *row_ref = NULL;
 
-                start_tag = node_to_string_tag (cur_node);
+                start_tag = node_to_string_tag (cur_node, a_this->app_context);
                 switch (a_type) {
                 case INSERT_TYPE_ADD_CHILD:
                         gtk_tree_store_append (model, &iter,
@@ -302,7 +302,8 @@
                                             MLVIEW_ICON_TREE_CLASS
                                             (G_OBJECT_GET_CLASS (a_this))->icons.open_element,
                                             ATTRIBUTES_COLUMN,
-                                            mlview_tree_editor2_build_attrs_list_str (cur_node),
+                                            mlview_tree_editor2_build_attrs_list_str (cur_node, 
+                                                                                      a_this->app_context),
                                             ARE_ATTRIBUTES_EDITABLE_COLUMN,
                                             TRUE,
                                             -1);
@@ -395,16 +396,17 @@
  *(e.g: <node-name attr0="val0" attr1="val1">)out of
  *an instance of xmlNode *
  * param a_node the instance of xmlNode * to consider.
+ * param ctxt the application context.
  * return the newly built start tag string.
  */
 static guchar *
-node_to_string_tag (xmlNode * a_node)
+node_to_string_tag (xmlNode * a_node, MlViewAppContext *ctxt)
 {
         guchar *result = NULL,
                 *content = NULL,
                 *escaped_content = NULL;
         const gchar *colour_str = 
-                mlview_tree_editor2_get_colour_string (a_node->type);
+                mlview_tree_editor2_get_colour_string (a_node->type, ctxt);
 
         g_return_val_if_fail (a_node != NULL, NULL) ;
         if (a_node->type == XML_ELEMENT_NODE) {
@@ -521,7 +523,7 @@
                 guchar *tmp_str = NULL ;
                 guchar *dtd_color = (guchar*)
                         mlview_tree_editor2_get_colour_string
-                        (a_node->type) ;
+                        (a_node->type, ctxt) ;
                 if (!a_node->name) {
                         mlview_utils_trace_info 
                                 ("a node of type XML_DTD_NODE must have a ->name field set!!") ;
@@ -751,13 +753,14 @@
         return result;
 }
 
+/*  UNUSED
 static guchar *
-build_attrs_list_str_from_nv_pairs (GList *list)
+build_attrs_list_str_from_nv_pairs (GList *list, MlViewAppContext *ctxt)
 {
         guchar *result = NULL, *tmp;
         struct NameValuePair *pair;
         const gchar *attval_col = "#00FF00",
-                *attname_col = mlview_tree_editor2_get_colour_string (XML_ATTRIBUTE_NODE);
+                *attname_col = mlview_tree_editor2_get_colour_string (XML_ATTRIBUTE_NODE, ctxt);
 
         while (list)
         {
@@ -781,7 +784,8 @@
 
         return result;
 }
-	
+*/ 
+
 static void
 node_attributes_edited_cb (GtkCellRendererText *a_renderer,
 			   gchar *a_cell_path,
Index: src/mlview-tree-editor2.c
===================================================================
RCS file: /cvs/gnome/mlview/src/mlview-tree-editor2.c,v
retrieving revision 1.59
diff -a -u -r1.59 mlview-tree-editor2.c
--- src/mlview-tree-editor2.c	27 Nov 2003 22:47:45 -0000	1.59
+++ src/mlview-tree-editor2.c	28 Nov 2003 17:48:53 -0000
@@ -690,61 +690,38 @@
         }
 }
 
-
 /**
  *Returns the color code of a given type of xml node.
  * param a_type the type of xml node to consider.  
+ * param ctxt the application context.
  * return string representing the color code of the node
  *in the form "#006FFF" for example.
  */
+
 const gchar*
-mlview_tree_editor2_get_colour_string (xmlElementType a_type)
+mlview_tree_editor2_get_colour_string (xmlElementType a_type, 
+                                       MlViewAppContext *ctxt)
 {
-	switch (a_type) {
+        struct MlViewAppSettings *settings;
+
+        g_return_val_if_fail (ctxt, "#000000");
+        settings = mlview_app_context_get_settings (ctxt);
+        g_return_val_if_fail (settings && settings->colours, "#000000");
+
+        switch (a_type) {
         case XML_ELEMENT_NODE:
-		return "#0080ff";
-	case XML_ATTRIBUTE_NODE:
-		return "#000000";
-	case XML_TEXT_NODE:
-		return "#ff0000";
-	case XML_CDATA_SECTION_NODE:
-		return "#000000";
-	case XML_ENTITY_REF_NODE:
-		return "#000000";
-	case XML_ENTITY_NODE:
-		return "#000000";
-	case XML_PI_NODE:
-		return "#000000";
-	case XML_COMMENT_NODE:
-		return "#0000FF";
-	case XML_DOCUMENT_NODE:
-		return "#0080ff";
-	case XML_DOCUMENT_TYPE_NODE:
-		return "#000000";
-	case XML_DOCUMENT_FRAG_NODE:
-		return "#000000";
-	case XML_NOTATION_NODE:
-		return "#000000";
-	case XML_HTML_DOCUMENT_NODE:
-		return "#000000";
-	case XML_DTD_NODE:
-		return "#FF00FF";
-	case XML_ELEMENT_DECL:
-		return "#000000";
-	case XML_ATTRIBUTE_DECL:
-		return "#000000";
-	case XML_ENTITY_DECL:
-		return "#000000";
-	case XML_NAMESPACE_DECL:
-		return "#000000";
-	case XML_XINCLUDE_START:
-		return "#000000";
-	case XML_XINCLUDE_END:
-		return "#000000";
-	default: 
-                return "#000000" ;
-	
-	}
+                return settings->colours [XML_ELEMENT_NODE_COLOUR_KEY];
+        case XML_TEXT_NODE:
+                return settings->colours [XML_TEXT_NODE_COLOUR_KEY];
+        case XML_COMMENT_NODE:
+                return settings->colours [XML_COMMENT_NODE_COLOUR_KEY];
+        case XML_DOCUMENT_NODE:
+                return settings->colours [XML_DOCUMENT_NODE_COLOUR_KEY];
+        case XML_DTD_NODE:
+                return settings->colours [XML_DTD_NODE_COLOUR_KEY];
+        default:
+                return "#000000";
+        }
 }
 
 /**
@@ -752,15 +729,16 @@
  *(e.g: <node-name attr0="val0" attr1="val1">)out of
  *an instance of xmlNode *
  * param a_node the instance of xmlNode * to consider.
+ * param ctxt the application context.
  * return the newly built start tag string.
  */
 static guchar *
-node_to_string_tag (xmlNode * a_node)
+node_to_string_tag (xmlNode * a_node, MlViewAppContext *ctxt)
 {
         guchar *result = NULL,
                 *content = NULL,
                 *escaped_content = NULL;
-        const gchar *colour_str = mlview_tree_editor2_get_colour_string (a_node->type);
+        const gchar *colour_str = mlview_tree_editor2_get_colour_string (a_node->type, ctxt);
 
         g_return_val_if_fail (a_node != NULL, NULL);        
 
@@ -771,10 +749,10 @@
 
                 const gchar *attr_colour_str = 
                         mlview_tree_editor2_get_colour_string 
-                        (XML_ATTRIBUTE_NODE) ;
+                        (XML_ATTRIBUTE_NODE, ctxt) ;
 
                 attr_str = mlview_tree_editor2_build_attrs_list_str 
-                        (a_node) ;
+                        (a_node, ctxt) ;
                 if (a_node->ns != NULL && a_node->ns->prefix) {
                         ns_prefix = g_strconcat (a_node->ns->prefix,
                                                  ":", NULL);
@@ -922,7 +900,7 @@
                 xmlDtd *node = (xmlDtd*)a_node ;
                 guchar *tmp_str = NULL ;
                 guchar *dtd_color = (guchar*)mlview_tree_editor2_get_colour_string
-                        (a_node->type) ;
+                        (a_node->type, ctxt) ;
 
                 if (!a_node->name) {
                         mlview_utils_trace_info 
@@ -1100,7 +1078,7 @@
              cur_node; cur_node = cur_node->next) {
                 GtkTreeRowReference *row_ref = NULL;
 
-                start_tag = node_to_string_tag (cur_node);
+                start_tag = node_to_string_tag (cur_node, a_this->app_context);
                 switch (a_type) {
                 case INSERT_TYPE_ADD_CHILD:
                         gtk_tree_store_append (model, &iter,
@@ -1484,7 +1462,7 @@
                         ("mlview_xml_doc failed") ;
                 goto cleanup ;
         }
-        start_tag = node_to_string_tag (cur_node) ;
+        start_tag = node_to_string_tag (cur_node, tree_editor->app_context) ;
         if (cur_node->type == XML_ELEMENT_NODE) {
                 status = mlview_utils_parse_start_tag
                         (a_new_text, &element_name, &nv_pair_list) ;
@@ -2271,17 +2249,18 @@
  *construct a string which looks like
  *'attrname0="attrval0" attrname1=attrvall'
  *where each attrnamei is
- * param a_node the  node to build the attribute list from.
+ * param a_node the node to build the attribute list from.
+ * param ctxt the application context.
  * return the newly built attribute list string, or NULL if something
  *bad happened.
  */
 guchar *
-mlview_tree_editor2_build_attrs_list_str (xmlNode * a_node)
+mlview_tree_editor2_build_attrs_list_str (xmlNode * a_node, MlViewAppContext *ctxt)
 {        
         enum MlViewStatus status = MLVIEW_OK ;
         xmlAttrPtr attr_iter = NULL ;
         const gchar *attval_col = "#00FF00",
-                *attname_col = mlview_tree_editor2_get_colour_string (XML_ATTRIBUTE_NODE);
+                *attname_col = mlview_tree_editor2_get_colour_string (XML_ATTRIBUTE_NODE, ctxt);
         gchar *attribute, *result = NULL, *tmp = NULL ;
         guchar *escaped_content = NULL;
         guint esc_content_len = 0 ;
@@ -3767,7 +3746,7 @@
         g_return_val_if_fail (model, MLVIEW_ERROR);
         gtk_tree_model_get (model, a_iter, XML_NODE_COLUMN,
                             &xml_node, -1);
-        start_tag_str = node_to_string_tag (xml_node);
+        start_tag_str = node_to_string_tag (xml_node, a_this->app_context);
         if (!start_tag_str) {
                 return MLVIEW_OK;
         }
Index: src/mlview-tree-editor2.h
===================================================================
RCS file: /cvs/gnome/mlview/src/mlview-tree-editor2.h,v
retrieving revision 1.22
diff -a -u -r1.22 mlview-tree-editor2.h
--- src/mlview-tree-editor2.h	11 Nov 2003 00:03:12 -0000	1.22
+++ src/mlview-tree-editor2.h	28 Nov 2003 17:48:53 -0000
@@ -245,9 +245,11 @@
 enum MlViewStatus mlview_tree_editor2_disconnect_from_doc (MlViewTreeEditor2 *a_this,
                                                            MlViewXMLDocument *a_doc) ;
 
-guchar *mlview_tree_editor2_build_attrs_list_str (xmlNode *a_node);
+guchar *mlview_tree_editor2_build_attrs_list_str (xmlNode *a_node,
+                                                  MlViewAppContext *ctxt);
 
-const gchar *mlview_tree_editor2_get_colour_string (xmlElementType a_type);
+const gchar *mlview_tree_editor2_get_colour_string (xmlElementType a_type,
+                                                    MlViewAppContext *ctxt);
 
 enum MlViewTreeInsertType {
         INSERT_TYPE_ADD_CHILD,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]