* all:
authorDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Wed, 31 May 2006 16:27:29 +0000 (16:27 +0000)
committerDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Wed, 31 May 2006 16:27:29 +0000 (16:27 +0000)
  - first step of configurable headers in  the header view.
  now, the headers to be shown and their order is a setting
  on the header view
  - added support for styles; which we will need for the
    Maemo-version

pmo-trunk-r132

src/gtk-glade/modest-ui.c
src/gtk/modest-main-window.c
src/modest-tny-header-tree-view.c
src/modest-tny-header-tree-view.h

index acd8793..478e756 100644 (file)
@@ -628,9 +628,24 @@ on_password_requested (ModestTnyAccountStore *account_store,
 static GtkWidget*
 modest_main_window_header_tree (TnyMsgFolderIface *folder)
 {
+       int i;
+       GSList *columns = NULL;
        GtkWidget *header_tree;
-
-       header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder));
+       ModestTnyHeaderTreeViewColumn cols[] = {
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE,
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH,
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM,
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT,
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE
+       };
+       
+       for (i = 0 ; i != sizeof(cols)/sizeof(ModestTnyHeaderTreeViewColumn); ++i)
+               columns = g_slist_append (columns, GINT_TO_POINTER(cols[i]));
+       
+       header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns,
+                                                                MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL));
+       g_slist_free (columns);
+       
        if (!header_tree) {
                g_warning ("could not create header tree");
                return NULL;
index 1719341..e0a2730 100644 (file)
@@ -261,9 +261,26 @@ modest_main_window_get_ui (ModestTnyFolderTreeView *folder_view,
 static GtkWidget*
 modest_main_window_header_tree (TnyMsgFolderIface *folder)
 {
+int i;
+       GSList *columns = NULL;
        GtkWidget *header_tree;
+       ModestTnyHeaderTreeViewColumn cols[] = {
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM,
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_TO,
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT,
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SENT_DATE,
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE,
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE,
+               MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH
+       };
+       
+       for (i = 0 ; i != sizeof(cols)/sizeof(ModestTnyHeaderTreeViewColumn); ++i)
+               columns = g_slist_append (columns, GINT_TO_POINTER(cols[i]));
+       
+       header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder, columns,
+                                        MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL));
+       g_slist_free (columns);
        
-       header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder));
        if (!header_tree) {
                g_warning ("could not create header tree");
                return NULL;
index 4a5509b..d69f38b 100644 (file)
@@ -20,7 +20,6 @@ enum {
        LAST_SIGNAL
 };
 
-
 enum {
        HEADER_ICON_READ  = 1,
        HEADER_ICON_UNREAD,
@@ -29,25 +28,17 @@ enum {
 };
 
 
-enum {
-       SORT_COLUMN_FROM  = 1,
-       SORT_COLUMN_TO,
-       SORT_COLUMN_SUBJECT,
-       SORT_COLUMN_ATTACH,
-       SORT_COLUMN_RECEIVED,
-       SORT_COLUMN_SENT,
-       SORT_COLUMN_MSGTYPE,
-       SORT_COLUMN_NUM
-};
-
-
 typedef struct _ModestTnyHeaderTreeViewPrivate ModestTnyHeaderTreeViewPrivate;
 struct _ModestTnyHeaderTreeViewPrivate {
+
        TnyMsgFolderIface *tny_msg_folder;
        TnyListIface      *headers;
 
-       GdkPixbuf *icons[HEADER_ICON_NUM];
-       guint sort_columns[SORT_COLUMN_NUM];
+       GdkPixbuf   *icons[HEADER_ICON_NUM];
+       guint sort_columns[MODEST_TNY_HEADER_TREE_VIEW_COLUMN_NUM];
+
+       GSList *columns;
+       ModestTnyHeaderTreeViewStyle style;
 };
 #define MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                          MODEST_TYPE_TNY_HEADER_TREE_VIEW, \
@@ -239,81 +230,107 @@ get_new_column (const gchar *name, GtkCellRenderer *renderer,
 
 
 
+static void
+remove_all_columns (ModestTnyHeaderTreeView *obj)
+{
+       GList *columns, *cursor;
+
+       columns = gtk_tree_view_get_columns (GTK_TREE_VIEW(obj));
+
+       for (cursor = columns; cursor; cursor = cursor->next)
+               gtk_tree_view_remove_column (GTK_TREE_VIEW(obj),
+                                            GTK_TREE_VIEW_COLUMN(cursor->data));
+       g_list_free (columns);  
+}
+
+
+
 
 static void
-modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj)
+init_columns (ModestTnyHeaderTreeView *obj)
 {
        GtkTreeViewColumn *column;
        GtkCellRenderer *renderer_msgtype,
                *renderer_header,
                *renderer_attach;
-       int i;
+
        ModestTnyHeaderTreeViewPrivate *priv;
+       GSList *cursor;
        
        priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(obj); 
-
-       init_icons (priv->icons);
-       
+                       
        renderer_msgtype = gtk_cell_renderer_pixbuf_new ();
        renderer_attach  = gtk_cell_renderer_pixbuf_new ();
        renderer_header = gtk_cell_renderer_text_new (); 
+       
+       remove_all_columns (obj);
+       
+       for (cursor = priv->columns; cursor; cursor = cursor->next) {
+               ModestTnyHeaderTreeViewColumn col =
+                       (ModestTnyHeaderTreeViewColumn) GPOINTER_TO_INT(cursor->data);
+               
+               switch (col) {
+                       
+               case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE:
+
+                       column = get_new_column (_("M"), renderer_msgtype, FALSE,
+                                                TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+                                                FALSE, (GtkTreeCellDataFunc)msgtype_cell_data, priv->icons);
+                       break;
+
+               case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH:
+
+                       column = get_new_column (_("A"), renderer_attach, FALSE,
+                                                TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
+                                                FALSE, (GtkTreeCellDataFunc)attach_cell_data, priv->icons);
+                       break;
+                       
+               case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE:
+                       column = get_new_column (_("Received"), renderer_header, TRUE,
+                                                TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN,
+                                                TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL);
+                       break;
+                       
+               case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM:
+                       column = get_new_column (_("From"), renderer_header, TRUE,
+                                                TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN,
+                                                TRUE, (GtkTreeCellDataFunc)sender_cell_data, NULL);
+                       break;
+
+               case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT:
+                       column = get_new_column (_("Subject"), renderer_header, TRUE,
+                                                TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN,
+                                                TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL);
+                       break;
+                       
+                       
+               case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SENT_DATE:
+                       column = get_new_column (_("Sent"), renderer_header, TRUE,
+                                                TNY_MSG_HEADER_LIST_MODEL_DATE_SENT_COLUMN,
+                                                TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL);
+                       break;
+                       
+               case MODEST_TNY_HEADER_TREE_VIEW_COLUMN_TO:
+                       column = get_new_column (_("To"), renderer_header, TRUE,
+                                                TNY_MSG_HEADER_LIST_MODEL_TO_COLUMN,
+                                                TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL);
+                       break;
+               }
+               gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);               
+       }       
+}
 
-       priv->tny_msg_folder = NULL;
-       priv->headers        = NULL;
 
-       for (i = 0; i != SORT_COLUMN_NUM; ++i)
-               priv->sort_columns[i] = -1;
 
-       /* msgtype */
-       column = get_new_column (_("M"), renderer_msgtype, FALSE, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
-                                FALSE, (GtkTreeCellDataFunc)msgtype_cell_data, priv->icons);
-       gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);
-       priv->sort_columns[SORT_COLUMN_MSGTYPE] =
-               gtk_tree_view_column_get_sort_column_id (column);
-       g_signal_connect (G_OBJECT (column), "clicked",G_CALLBACK (column_clicked), obj);  
 
-       
-       /* attachment */
-       column = get_new_column (_("A"), renderer_attach, FALSE, TNY_MSG_HEADER_LIST_MODEL_FLAGS_COLUMN,
-                                FALSE, (GtkTreeCellDataFunc)attach_cell_data, priv->icons);
-       gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);
-       priv->sort_columns[SORT_COLUMN_ATTACH] =
-               gtk_tree_view_column_get_sort_column_id (column);
-       g_signal_connect (G_OBJECT (column), "clicked",G_CALLBACK (column_clicked), obj);  
-       
-       /* received */
-       column = get_new_column (_("Received"), renderer_header, TRUE, TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN,
-                                TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL);
-       gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);
-       priv->sort_columns[SORT_COLUMN_RECEIVED] =
-               gtk_tree_view_column_get_sort_column_id (column);
-       g_signal_connect (G_OBJECT (column), "clicked",G_CALLBACK (column_clicked), obj);  
 
-       
-       /* from */
-       column = get_new_column (_("From"), renderer_header, TRUE, TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN,
-                                TRUE, (GtkTreeCellDataFunc)sender_cell_data, NULL);
-       gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);
-       priv->sort_columns[SORT_COLUMN_FROM] =
-               gtk_tree_view_column_get_sort_column_id (column);
-       g_signal_connect (G_OBJECT (column), "clicked",G_CALLBACK (column_clicked), obj);  
-
-
-       /* subject */
-       column = get_new_column (_("Subject"), renderer_header, TRUE, TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN,
-                                TRUE, (GtkTreeCellDataFunc)header_cell_data, NULL);
-       gtk_tree_view_append_column (GTK_TREE_VIEW(obj), column);
-       priv->sort_columns[SORT_COLUMN_SUBJECT] =
-               gtk_tree_view_column_get_sort_column_id (column);
-       g_signal_connect (G_OBJECT (column), "clicked",G_CALLBACK (column_clicked), obj);  
+static void
+modest_tny_header_tree_view_init (ModestTnyHeaderTreeView *obj)
+{
+       ModestTnyHeaderTreeViewPrivate *priv;
+       priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(obj); 
 
-       
-       /* all cols */
-       gtk_tree_view_set_headers_visible   (GTK_TREE_VIEW(obj), TRUE);
-       gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(obj), TRUE);
-       
-       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(obj), TRUE); /* alternating row colors */
-       
+       init_icons (priv->icons);       
 }
 
 static void
@@ -342,21 +359,33 @@ modest_tny_header_tree_view_finalize (GObject *obj)
 }
 
 GtkWidget*
-modest_tny_header_tree_view_new (TnyMsgFolderIface *folder)
+modest_tny_header_tree_view_new (TnyMsgFolderIface *folder,
+                                GSList *columns,
+                                ModestTnyHeaderTreeViewStyle style)
 {
        GObject *obj;
        GtkTreeSelection *sel;
        ModestTnyHeaderTreeView *self;
-               
+       
        obj  = G_OBJECT(g_object_new(MODEST_TYPE_TNY_HEADER_TREE_VIEW, NULL));
        self = MODEST_TNY_HEADER_TREE_VIEW(obj);
-
+       
        if (!modest_tny_header_tree_view_set_folder (self, NULL)) {
                g_warning ("could not set the folder");
                g_object_unref (obj);
                return NULL;
        }
        
+       modest_tny_header_tree_view_set_style   (self, style);
+       modest_tny_header_tree_view_set_columns (self, columns);
+       
+       /* all cols */
+       gtk_tree_view_set_headers_visible   (GTK_TREE_VIEW(obj), TRUE);
+       gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(obj), TRUE);
+       
+       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(obj),
+                                     TRUE); /* alternating row colors */
+
        sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
        g_signal_connect (sel, "changed",
                          G_CALLBACK(selection_changed), self);
@@ -364,7 +393,71 @@ modest_tny_header_tree_view_new (TnyMsgFolderIface *folder)
        return GTK_WIDGET(self);
 }
 
+gboolean
+modest_tny_header_tree_view_set_columns (ModestTnyHeaderTreeView *self, GSList *columns)
+{
+       ModestTnyHeaderTreeViewPrivate *priv;
+       GSList *cursor;
+
+       g_return_val_if_fail (self, FALSE);
+       
+       priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self);
 
+       g_slist_free (priv->columns);
+       
+       for (cursor = columns; cursor; cursor = cursor->next) {
+               ModestTnyHeaderTreeViewColumn col = 
+                       (ModestTnyHeaderTreeViewColumn) GPOINTER_TO_INT(cursor->data);
+               if (0 > col || col >= MODEST_TNY_HEADER_TREE_VIEW_COLUMN_NUM)
+                       g_warning ("invalid column in column list");
+               else
+                       priv->columns = g_slist_append (priv->columns, cursor->data);
+       }
+
+       init_columns (self); /* redraw them */
+       return TRUE;
+}
+
+
+
+const GSList*
+modest_tny_header_tree_view_get_columns (ModestTnyHeaderTreeView *self)
+{
+       ModestTnyHeaderTreeViewPrivate *priv;
+       GSList *cursor;
+
+       g_return_val_if_fail (self, FALSE);
+       
+       priv = MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self);
+       return priv->columns;
+}
+
+
+
+
+gboolean
+modest_tny_header_tree_view_set_style (ModestTnyHeaderTreeView *self,
+                                      ModestTnyHeaderTreeViewStyle style)
+{
+       g_return_val_if_fail (self, FALSE);
+       g_return_val_if_fail (style >= 0 && style < MODEST_TNY_HEADER_TREE_VIEW_STYLE_NUM,
+                             FALSE);
+       
+       MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self)->style = style;
+       
+       return TRUE;
+}
+
+ModestTnyHeaderTreeViewStyle
+modest_tny_header_tree_view_get_style (ModestTnyHeaderTreeView *self)
+{
+       g_return_val_if_fail (self, FALSE);
+
+       return MODEST_TNY_HEADER_TREE_VIEW_GET_PRIVATE(self)->style;
+}
+
+
+# if 0
 static gint
 cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2,
          gpointer user_data)
@@ -415,7 +508,7 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2,
                return &iter1 - &iter2;
        }
 }
-
+#endif
 
 
 gboolean
index b0cb60a..38ed0ec 100644 (file)
@@ -38,6 +38,29 @@ struct _ModestTnyHeaderTreeViewClass {
 };
 
 
+enum {
+       MODEST_TNY_HEADER_TREE_VIEW_COLUMN_FROM,
+       MODEST_TNY_HEADER_TREE_VIEW_COLUMN_TO,
+       MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SUBJECT,
+       MODEST_TNY_HEADER_TREE_VIEW_COLUMN_SENT_DATE,
+       MODEST_TNY_HEADER_TREE_VIEW_COLUMN_RECEIVED_DATE,
+       MODEST_TNY_HEADER_TREE_VIEW_COLUMN_MSGTYPE,
+       MODEST_TNY_HEADER_TREE_VIEW_COLUMN_ATTACH,
+
+       MODEST_TNY_HEADER_TREE_VIEW_COLUMN_NUM
+};
+typedef guint ModestTnyHeaderTreeViewColumn;
+
+enum {
+       MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL,
+       MODEST_TNY_HEADER_TREE_VIEW_STYLE_COMPACT,
+       
+       MODEST_TNY_HEADER_TREE_VIEW_STYLE_NUM
+};
+typedef guint ModestTnyHeaderTreeViewStyle;
+
+
+
 /**
  * modest_tny_header_tree_view_get_type:
  * 
@@ -51,13 +74,17 @@ GType        modest_tny_header_tree_view_get_type    (void) G_GNUC_CONST;
 /**
  * modest_tny_header_tree_view_new:
  * @folder: a TnyMsgFolderIface object
+ * @columns: a list of ModestTnyHeaderTreeViewColumn
+ * @style: a ModestTnyHeaderTreeViewColumn with the style of this listview
+ *  (  MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL or MODEST_TNY_HEADER_TREE_VIEW_STYLE_COMPACT)
  * 
  * create a new ModestTnyHeaderTreeView instance, based on a folder iface
- *  
+ *   
  * Returns: a new GtkWidget (a GtkTreeView-subclass)
  */
-GtkWidget*   modest_tny_header_tree_view_new        (TnyMsgFolderIface *folder);
-
+GtkWidget*   modest_tny_header_tree_view_new        (TnyMsgFolderIface *folder,
+                                                    GSList *columns,
+                                                    ModestTnyHeaderTreeViewStyle style);
 
 /**
  * modest_tny_header_tree_view_set_folder:
@@ -71,7 +98,58 @@ GtkWidget*   modest_tny_header_tree_view_new        (TnyMsgFolderIface *folder);
 gboolean     modest_tny_header_tree_view_set_folder (ModestTnyHeaderTreeView *self,
                                                      TnyMsgFolderIface *folder);
 
+
+/**
+ * modest_tny_header_tree_view_set_columns:
+ * @self: a ModestTnyHeaderTreeView instance
+ * @columns: a list of ModestTnyHeaderTreeViewColumn
+ * 
+ * set the columns for this ModestTnyHeaderTreeView
+ *  
+ * Returns: TRUE if it succeeded, FALSE otherwise
+ */
+gboolean     modest_tny_header_tree_view_set_columns (ModestTnyHeaderTreeView *self,
+                                                     GSList *columns);
+/**
+ * modest_tny_header_tree_view_get_columns:
+ * @self: a ModestTnyHeaderTreeView instance
+ * @folder: a TnyMsgFolderIface object
+ * 
+ * get the columns for this ModestTnyHeaderTreeView
+ *  
+ * Returns: list of columms, or NULL in case of no columns or error
+ */
+const GSList*   modest_tny_header_tree_view_get_columns (ModestTnyHeaderTreeView *self);
+       
+
+/**
+ * modest_tny_header_tree_view_set_style:
+ * @self: a ModestTnyHeaderTreeView instance
+ * @style: the style for this tree view
+ * 
+ * set the folder for this ModestTnyHeaderTreeView
+ *  
+ * Returns: TRUE if it succeeded, FALSE otherwise
+ */
+gboolean   modest_tny_header_tree_view_set_style (ModestTnyHeaderTreeView *self,
+                                                 ModestTnyHeaderTreeViewStyle style);
+
+/**
+ * modest_tny_header_tree_view_set_folder:
+ * @self: a ModestTnyHeaderTreeView instance
+ * @folder: a TnyMsgFolderIface object
+ * 
+ * set the folder for this ModestTnyHeaderTreeView
+ *  
+ * Returns: TRUE if it succeeded, FALSE otherwise
+ */
+ModestTnyHeaderTreeViewStyle   modest_tny_header_tree_view_get_style (ModestTnyHeaderTreeView *self);
+
 G_END_DECLS
 
+
+
+
+
 #endif /* __MODEST_TNY_HEADER_TREE_VIEW_H__ */