Changeset 2623


Ignore:
Timestamp:
08/03/07 16:17:18 (6 years ago)
Author:
zecke
Message:

2007-08-03 Holger Hans Peter Freyther <zecke@…>

Start creating the feedreader2, as with every second version
there might be some over-engineering but as I'm aware of this
phenomena I try to avoid the bad things.

Start with creating a Configuration model and the actual FeedData?
model. The implementation will be copied and pasted from main.c
and callback.c

Make main.c start to follow the new styleguide and use GtkNotebook?
as well. For icons I would like to use but are not available in
GtkStock? (like configuration) I'm going to use MISSING_IMAGE as well.


  • src/Makefile.am:
  • src/application-data.h:
  • src/feed-configuration.c: Added. (feed_configuration_class_init): (feed_configuration_init): (feed_configuration_get_configuration):
  • src/feed-configuration.h:
  • src/feed-data.c: Added. (feed_data_init): (feed_data_class_init): (feed_filter_init): (feed_filter_class_init): (feed_sort_init): (feed_sort_class_init): (feed_data_get_instance): (feed_data_update_all): (feed_data_set_cache): (feed_data_load_from_cache): (feed_filter_new): (feed_filter_reset): (feed_filter_filter_category): (feed_filter_filter_text): (feed_sort_new):
  • src/feed-data.h:
  • src/feed-selection-view.h: Added.
  • src/main.c: (window_delete_event): (config_new_clicked_closure): (config_delete_clicked_closure): (create_configuration_ui): (create_ui): (main):
Location:
trunk/src/target/OM-2007.2/applications/openmoko-feedreader2
Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/ChangeLog

    r2593 r2623  
     12007-08-03  Holger Hans Peter Freyther  <zecke@selfish.org> 
     2 
     3        Start creating the feedreader2, as with every second version 
     4        there might be some over-engineering but as I'm aware of this 
     5        phenomena I try to avoid the bad things. 
     6 
     7        Start with creating a Configuration model and the actual FeedData 
     8        model. The implementation will be copied and pasted from main.c 
     9        and callback.c 
     10 
     11        Make main.c start to follow the new styleguide and use GtkNotebook 
     12        as well. For icons I would like to use but are not available in 
     13        GtkStock (like configuration) I'm going to use MISSING_IMAGE as well. 
     14 
     15         
     16 
     17        * src/Makefile.am: 
     18        * src/application-data.h: 
     19        * src/feed-configuration.c: Added. 
     20        (feed_configuration_class_init): 
     21        (feed_configuration_init): 
     22        (feed_configuration_get_configuration): 
     23        * src/feed-configuration.h: 
     24        * src/feed-data.c: Added. 
     25        (feed_data_init): 
     26        (feed_data_class_init): 
     27        (feed_filter_init): 
     28        (feed_filter_class_init): 
     29        (feed_sort_init): 
     30        (feed_sort_class_init): 
     31        (feed_data_get_instance): 
     32        (feed_data_update_all): 
     33        (feed_data_set_cache): 
     34        (feed_data_load_from_cache): 
     35        (feed_filter_new): 
     36        (feed_filter_reset): 
     37        (feed_filter_filter_category): 
     38        (feed_filter_filter_text): 
     39        (feed_sort_new): 
     40        * src/feed-data.h: 
     41        * src/feed-selection-view.h: Added. 
     42        * src/main.c: 
     43        (window_delete_event): 
     44        (config_new_clicked_closure): 
     45        (config_delete_clicked_closure): 
     46        (create_configuration_ui): 
     47        (create_ui): 
     48        (main): 
     49 
    1502007-08-01  Holger Hans Peter Freyther  <zecke@selfish.org> 
    251 
  • trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src

    • Property svn:ignore
      •  

        old new  
        55.libs 
        66.deps 
        7 openmoko-rssreader 
         7openmoko-feedreader22 
  • trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src/Makefile.am

    r2574 r2623  
    88bin_PROGRAMS = openmoko-feedreader2 
    99 
    10 EXTRA_DIST = application-data.h callbacks.h rfcdate.h moko_cache.h 
     10EXTRA_DIST = rfcdate.h moko_cache.h feed-configuration.h feed-data.h feed-item-view.h feed-selection-view.h application-data.h 
    1111 
    12 openmoko_feedreader2_SOURCES = main.c callbacks.c rfcdate.c moko_cache.c 
     12openmoko_feedreader2_SOURCES = feed-configuration.c feed-data.c rfcdate.c moko_cache.c main.c 
    1313openmoko_feedreader2_LDADD = @OPENMOKO_LIBS@ @MRSS_LIBS@ @GTHREAD_LIBS@ @WEBKITGTK_LIBS@ 
    1414 
  • trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src/application-data.h

    r2386 r2623  
    2828#define APPLICATION_DATA_H 
    2929 
    30  
    31 #include <libmokoui/moko-application.h> 
    32 #include <libmokoui/moko-paned-window.h> 
    33 #include <libmokoui/moko-tree-view.h> 
    34 #include <libmokoui/moko-tool-box.h> 
    35  
    36 #include <webkitgtkpage.h> 
    37  
    3830#include "moko_cache.h" 
    39  
    4031#include <gtk/gtk.h> 
    4132 
    42 struct RSSReaderData { 
    43     MokoApplication   *app; 
     33struct ApplicationData { 
     34    GtkWindow         *window; 
    4435    MokoCache         *cache; 
    45     GtkMenu           *menu; 
    46     GtkMenu           *filter; 
    47     MokoPanedWindow   *window; 
    48     MokoToolBox       *box; 
    49     MokoMenuBox       *menubox; 
    50  
    51  
    52     MokoTreeView      *treeView; 
    53     GtkListStore      *feed_data; 
    54     GtkTreeModelFilter *filter_model; 
    55     GtkTreeModelSort  *sort_model; 
    56  
    57     WebKitGtkPage     *textPage; 
    58  
    59     gchar             *current_filter; 
    60     int                is_all_filter; 
    61     gchar             *current_search_text; 
     36    GtkNotebook       *notebook; 
    6237}; 
    6338 
  • trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src/feed-configuration.h

    r2593 r2623  
    3737G_BEGIN_DECLS 
    3838 
    39 #define RSS_TYPE_FEED                           feed_get_type() 
    4039#define RSS_TYPE_FEED_CONFIGURATION             feed_configuration_get_type() 
    4140#define RSS_FEED_CONFIGURATION(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), RSS_TYPE_FEED_CONFIGURATION, FeedConfiguration)) 
     
    4544#define RSS_FEED_CONFIGURATION_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj),  RSS_TYPE_FEED_CONFIGURATION, FeedConfigurationClass)) 
    4645 
    47 typedef struct _Feed Feed; 
    48  
    4946typedef struct _FeedConfiguration FeedConfiguration; 
    5047typedef struct _FeedConfigurationClass FeedConfigurationClass; 
    5148 
    52 struct _Feed { 
    53     gchar* name; 
    54     gchar* url; 
    55     gchar* user_name; 
    56     gchar* password; 
    57     gint   number_of_items_to_cache; 
     49enum { 
     50    FEED_NAME, 
     51    FEED_URL, 
     52    FEED_USER_NAME, 
     53    FEED_PASSWORD, 
     54    FEED_NUMBER_OF_ITEMS_TO_CACHE, 
     55    FEED_NUMBER_OF_COLUMNS 
    5856}; 
    59  
    6057 
    6158struct _FeedConfiguration { 
     
    6865 
    6966 
    70 GType feed_get_type (void); 
    71 Feed* feed_copy (const Feed*); 
    72 void  feed_free (Feed*); 
    73  
    74  
    75 GType feed_configuration_get_type (void); 
     67GType       feed_configuration_get_type             (void); 
    7668 
    7769/* 
    7870 * singleton 
    7971 */ 
    80 GObject* feed_configuration_get_configuration (void), 
     72GObject*    feed_configuration_get_configuration    (void); 
    8173 
    8274G_END_DECLS 
  • trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src/feed-data.h

    r2593 r2623  
    3434#define RSS_READER_FEED_DATA_H 
    3535 
    36 #include "feed-configuration.h" 
     36#include <gtk/gtk.h> 
     37#include "moko_cache.h" 
    3738 
    3839G_BEGIN_DECLS 
    3940 
    40 #define RSS_TYPE_FEED_DATA              feed_data_get_type() 
    41 #define RSS_FEED_DATA(obj)              (G_TYPE_CHECK_INSTANCE_CAST((obj), RSS_TYPE_FEED_DATA, FeedData)) 
    42 #define RSS_FEED_DATA_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST((klass),  RSS_TYPE_FEED_DATA, FeedDataClass)) 
    43 #define RSS_IS_FEED_DATA(obj)           (G_TYPE_CHECK_INSTANCE_TYPE((obj), RSS_TYPE_FEED_DATA)) 
    44 #define RSS_IS_FEED_DATA_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE((klass),  RSS_TYPE_FEED_DATA)) 
    45 #define RSS_FEED_DATA_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS((obj),  RSS_TYPE_FEED_DATA, FeedDataClass)) 
     41#define RSS_TYPE_FEED_DATA                  feed_data_get_type() 
     42#define RSS_FEED_DATA(obj)                  (G_TYPE_CHECK_INSTANCE_CAST((obj), RSS_TYPE_FEED_DATA, FeedData)) 
     43#define RSS_FEED_DATA_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST((klass),  RSS_TYPE_FEED_DATA, FeedDataClass)) 
     44#define RSS_IS_FEED_DATA(obj)               (G_TYPE_CHECK_INSTANCE_TYPE((obj), RSS_TYPE_FEED_DATA)) 
     45#define RSS_IS_FEED_DATA_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE((klass),  RSS_TYPE_FEED_DATA)) 
     46#define RSS_FEED_DATA_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS((obj),  RSS_TYPE_FEED_DATA, FeedDataClass)) 
    4647 
    47 #define RSS_TYPE_FEED_FILTER            feed_filter_get_type() 
    48 #define RSS_TYPE_FEED_SORTER            feed_sorter_get_type() 
     48#define RSS_TYPE_FEED_FILTER                feed_filter_get_type() 
     49#define RSS_FEED_FILTER(obj)                (G_TYPE_CHECK_INSTANCE_CAST((obj), RSS_TYPE_FEED_FILTER, FeedFilter)) 
     50#define RSS_FEED_FILTER_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST((klass),  RSS_TYPE_FEED_FILTER, FeedFilterClass)) 
     51#define RSS_IS_FEED_FILTER(obj)             (G_TYPE_CHECK_INSTANCE_TYPE((obj), RSS_TYPE_FEED_FILTER)) 
     52#define RSS_IS_FEED_FILTER_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE((klass),  RSS_TYPE_FEED_FILTER)) 
     53#define RSS_FEED_FILTER_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS((obj),  RSS_TYPE_FEED_FILTER, FeedFilterClass)) 
     54 
     55 
     56 
     57#define RSS_TYPE_FEED_SORT                feed_sort_get_type() 
     58#define RSS_FEED_SORT(obj)                (G_TYPE_CHECK_INSTANCE_CAST((obj), RSS_TYPE_FEED_SORT, FeedSort)) 
     59#define RSS_FEED_SORT_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST((klass),  RSS_TYPE_FEED_SORT, FeedSortClass)) 
     60#define RSS_IS_FEED_SORT(obj)             (G_TYPE_CHECK_INSTANCE_TYPE((obj), RSS_TYPE_FEED_SORT)) 
     61#define RSS_IS_FEED_SORT_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE((klass),  RSS_TYPE_FEED_SORT)) 
     62#define RSS_FEED_SORT_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS((obj),  RSS_TYPE_FEED_SORT, FeedSortClass)) 
    4963 
    5064typedef struct _FeedData FeedData; 
    5165typedef struct _FeedDataClass FeedDataClass; 
     66typedef struct _FeedFilter FeedFilter; 
     67typedef struct _FeedFilterClass FeedFilterClass; 
     68typedef struct _FeedSort FeedSort; 
     69typedef struct _FeedSortClass FeedSortClass; 
    5270 
    5371struct _FeedData { 
    5472    GtkListStore parent; 
     73    MokoCache    *cache; 
    5574}; 
    5675 
    5776struct _FeedDataClass { 
    5877    GtkListStoreClass parent; 
     78}; 
     79 
     80struct _FeedFilter { 
     81    GtkTreeModelFilter parent; 
     82 
     83    /* 
     84     * Do we have a filter set at all? 
     85     */ 
     86    gboolean all_filter; 
     87 
     88    /* 
     89     * The category to filter. Coming from the feed-configuration 
     90     */ 
     91    gchar   *category; 
     92 
     93    /* 
     94     * The filter string. 
     95     */ 
     96    gchar  *filter_string; 
     97}; 
     98 
     99struct _FeedFilterClass { 
     100    GtkTreeModelFilterClass parent; 
     101}; 
     102 
     103struct _FeedSort { 
     104    GtkTreeModelSort parent; 
     105}; 
     106 
     107struct  _FeedSortClass { 
     108    GtkTreeModelSortClass parent; 
    59109}; 
    60110 
     
    64114 
    65115void        feed_data_update_all        (FeedData*); 
    66 void        feed_data_update            (FeedData*, Feed*); 
     116void        feed_data_set_cache         (FeedData*, MokoCache*); 
     117void        feed_data_load_from_cache   (FeedData*); 
    67118 
    68119 
    69120GType       feed_filter_get_type        (void); 
    70 GObject*    feed_filter_new             (const FeedFilter*); 
    71 void        feed_filter_reset           (const FeedFilter*); 
    72 void        feed_filter_filter          (const FeedFilter*, const Feed*); 
     121GObject*    feed_filter_new             (const FeedData*); 
     122void        feed_filter_reset           (FeedFilter*); 
     123void        feed_filter_filter_category (FeedFilter*, GtkTreeIter*); 
     124void        feed_filter_filter_text     (FeedFilter*, const gchar*); 
    73125 
    74 GType       feed_sorter_get_type        (void); 
    75 GObject*    feed_sorter_new             (const FeedFilter*); 
     126GType       feed_sort_get_type        (void); 
     127GObject*    feed_sort_new             (const FeedFilter*); 
    76128 
    77129G_END_DECLS 
  • trunk/src/target/OM-2007.2/applications/openmoko-feedreader2/src/main.c

    r2574 r2623  
    2424 *  Current Version: $Rev$ ($Date$) [$Author$] 
    2525 */ 
    26 #define _GNU_SOURCE 
    27 #include "config.h" 
     26 
     27#include <gtk/gtk.h> 
    2828#include <glib/gi18n.h> 
    2929 
    30 #include "application-data.h" 
    31 #include "callbacks.h" 
    32 #include "rfcdate.h" 
    33  
    34 #include <libmokoui/moko-scrolled-pane.h> 
    35  
    36 #include <webkitgtkpage.h> 
    3730#include <webkitgtkglobal.h> 
    3831 
    39 #include <string.h> 
    40 #include <assert.h> 
     32#include <moko-finger-scroll.h> 
    4133 
    42 #define ASSERT_X(x, error) assert(x) 
     34#include "application-data.h" 
     35#include "feed-data.h" 
     36#include "feed-configuration.h" 
     37#include "config.h" 
     38 
     39static void 
     40window_delete_event (GtkWidget* widget, GdkEvent* event, struct ApplicationData* data) 
     41{ 
     42    gtk_main_quit (); 
     43} 
     44 
    4345 
    4446/* 
    45  * filter categories and such terms 
     47 * Config related functions 
    4648 */ 
    47 static gboolean 
    48 rss_filter_entries (GtkTreeModel *model, GtkTreeIter *iter, struct RSSReaderData *data) 
     49static void 
     50config_new_clicked_closure(GtkWidget* button, struct ApplicationData* data) 
     51{ 
     52} 
     53 
     54static void 
     55config_delete_clicked_closure(GtkWidget* button, struct ApplicationData* data) 
     56{ 
     57} 
     58 
     59static void 
     60create_configuration_ui (struct ApplicationData* data, GtkCellRenderer* text_renderer) 
    4961{ 
    5062    /* 
    51      * filter the category 
     63     * toolbar 
    5264     */ 
    53     if ( !data->is_all_filter ) { 
    54         gchar *category; 
    55         gtk_tree_model_get (model, iter,  RSS_READER_COLUMN_CATEGORY, &category,  -1); 
     65    GtkWidget* box = gtk_vbox_new (FALSE, 0); 
     66    gtk_notebook_append_page (data->notebook, box, gtk_image_new_from_stock (GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_LARGE_TOOLBAR)); 
     67    gtk_container_child_set (GTK_CONTAINER(data->notebook), box, "tab-expand", TRUE, "tab-fill", TRUE, NULL); 
    5668 
    57         /* 
    58          * how does this happen? 
    59          */ 
    60         if ( !category ) 
    61             return FALSE; 
     69    GtkWidget* toolbar = gtk_toolbar_new (); 
     70    gtk_box_pack_start (GTK_BOX(box), toolbar, FALSE, FALSE, 0); 
    6271 
    63         if ( strcmp(category, data->current_filter) != 0 ) 
    64             return FALSE; 
     72    GtkToolItem* toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_NEW); 
     73    gtk_tool_item_set_expand (GTK_TOOL_ITEM(toolitem), TRUE); 
     74    gtk_toolbar_insert (GTK_TOOLBAR(toolbar), toolitem, 0); 
     75    g_signal_connect (toolitem, "clicked", G_CALLBACK(config_new_clicked_closure), data); 
    6576 
    66         g_free (category); 
    67     } 
     77    gtk_toolbar_insert (GTK_TOOLBAR(toolbar), gtk_separator_tool_item_new (), 1); 
    6878 
     79    toolitem = gtk_tool_button_new_from_stock (GTK_STOCK_DELETE); 
     80    gtk_tool_item_set_expand (GTK_TOOL_ITEM(toolitem), TRUE); 
     81    gtk_toolbar_insert (GTK_TOOLBAR(toolbar), toolitem, 2); 
     82    g_signal_connect (toolitem, "clicked", G_CALLBACK(config_delete_clicked_closure), data); 
     83     
     84    /* main view */ 
     85    GtkWidget* scrolled = moko_finger_scroll_new (); 
     86    gtk_box_pack_start (GTK_BOX(box), scrolled, TRUE, TRUE, 0); 
     87    GtkWidget* treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(feed_configuration_get_configuration ())); 
     88    GtkTreeViewColumn* column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes( _("Name"), 
     89                                                                                              text_renderer, 
     90                                                                                              "text", FEED_NAME, NULL)); 
     91    gtk_tree_view_column_set_expand (column, TRUE); 
     92    gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); 
     93    gtk_tree_view_column_set_sort_column_id (column, FEED_NAME); 
     94    gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); 
    6995 
    70     /* 
    71      * filter the text according to the search now 
    72      */ 
    73     if ( data->current_search_text ) { 
    74         gchar *text; 
     96    column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes( _("Url"), 
     97                                                                            text_renderer, 
     98                                                                            "text", FEED_URL, NULL)); 
     99    gtk_tree_view_column_set_expand (column, TRUE); 
     100    gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); 
     101    gtk_tree_view_column_set_sort_column_id (column, FEED_URL); 
     102    gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); 
    75103 
    76         #define FILTER_SEARCH(column)                                      \ 
    77         gtk_tree_model_get (model, iter, column, &text, -1);               \ 
    78         if ( text && strcasestr (text, data->current_search_text) != NULL ) { \ 
    79             g_free (text);                                                 \ 
    80             return TRUE;                                                   \ 
    81         } 
    82  
    83         FILTER_SEARCH(RSS_READER_COLUMN_AUTHOR) 
    84         FILTER_SEARCH(RSS_READER_COLUMN_SUBJECT) 
    85         FILTER_SEARCH(RSS_READER_COLUMN_SOURCE) 
    86         FILTER_SEARCH(RSS_READER_COLUMN_LINK) 
    87         FILTER_SEARCH(RSS_READER_COLUMN_TEXT) 
    88  
    89         #undef FILTER_SEARCH 
    90         return FALSE; 
    91     } 
    92  
    93     return TRUE; 
     104     
     105    gtk_container_add (GTK_CONTAINER (scrolled), treeview); 
    94106} 
    95107 
    96108/* 
    97  * sort the dates according to zsort. Ideally they should sort ascending 
     109 *  ToolBar with add and remove 
     110 *  And a view with available feeds. No filtering for them 
     111 * 
     112 *  TODO: 
     113 *      How to do the actual configuration? 
     114 *        Name, URL are easy and fit on screen 
     115 *        What about username, password, number of items to cache? 
    98116 */ 
    99 static gint 
    100 rss_sort_dates (GtkTreeModel *model, GtkTreeIter *_left, GtkTreeIter *_right, gpointer that) 
     117static void 
     118create_ui (struct ApplicationData* data) 
    101119{ 
    102     RSSRFCDate *left, *right; 
    103     gtk_tree_model_get (model, _left,  RSS_READER_COLUMN_DATE, &left,  -1); 
    104     gtk_tree_model_get (model, _right, RSS_READER_COLUMN_DATE, &right, -1); 
     120    data->window = GTK_WINDOW(gtk_window_new (GTK_WINDOW_TOPLEVEL)); 
     121    g_signal_connect(data->window, "delete-event", G_CALLBACK(window_delete_event), data); 
    105122 
    106     int result; 
    107     if ( left == NULL ) 
    108         result = -1; 
    109     else if ( right == NULL ) 
    110         result = 1; 
    111     else 
    112         result = rss_rfc_date_compare (left, right); 
     123    data->notebook = GTK_NOTEBOOK(gtk_notebook_new ()); 
     124    gtk_notebook_set_tab_pos (GTK_NOTEBOOK (data->notebook), GTK_POS_BOTTOM); 
     125    gtk_container_add (GTK_CONTAINER(data->window), GTK_WIDGET(data->notebook)); 
    113126 
    114     if ( left ) 
    115         g_object_unref (left); 
    116     if ( right ) 
    117         g_object_unref (right); 
     127    /* 
     128     * Create the pages of interest 
     129     * 
     130     * 1.) Feed Overview Subject/Date 
     131     * 2.) Text View 
     132     * 3.) Configuration 
     133     */ 
     134    GtkCellRenderer *text_renderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new ()); 
    118135 
    119     return result; 
     136    /* 
     137     * 3. Configuration 
     138     */ 
     139    create_configuration_ui (data, text_renderer); 
     140 
     141 
     142    gtk_widget_show_all (GTK_WIDGET(data->window)); 
    120143} 
    121144 
    122 static void 
    123 rss_cell_data_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data) 
     145 
     146int main (int argc, char** argv) 
    124147{ 
    125     RSSRFCDate *date; 
    126     gtk_tree_model_get (tree_model, iter, RSS_READER_COLUMN_DATE, &date, -1); 
    127  
    128     g_assert (date); 
    129     g_object_set ( G_OBJECT(renderer), "text", rss_rfc_date_as_string(date), NULL); 
    130     g_object_unref (G_OBJECT(date)); 
    131 } 
    132  
    133 /* 
    134  * setup the toolbar 
    135  */ 
    136 static void setup_toolbar( struct RSSReaderData *data ) { 
    137     GtkButton *a; 
    138     GtkWidget *anImage; 
    139     data->box = MOKO_TOOL_BOX(moko_tool_box_new_with_search()); 
    140     gtk_widget_grab_focus( GTK_WIDGET(data->box) ); 
    141     g_signal_connect( G_OBJECT(data->box), "searchbox_visible",   G_CALLBACK(cb_searchbox_visible), data ); 
    142     g_signal_connect( G_OBJECT(data->box), "searchbox_invisible", G_CALLBACK(cb_searchbox_invisible), data ); 
    143  
    144  
    145     a = GTK_BUTTON(moko_tool_box_add_action_button( MOKO_TOOL_BOX(data->box) )); 
    146     anImage = gtk_image_new_from_file( PKGDATADIR "/feedreader2_refresh_all.png" ); 
    147     moko_pixmap_button_set_center_image( MOKO_PIXMAP_BUTTON(a), anImage ); 
    148     g_signal_connect( G_OBJECT(a), "clicked", G_CALLBACK(cb_refresh_all_button_clicked), data ); 
    149  
    150     a = GTK_BUTTON(moko_tool_box_add_action_button( MOKO_TOOL_BOX(data->box) )); 
    151     anImage = gtk_image_new_from_file( PKGDATADIR "/feedreader2_subscribe.png" ); 
    152     moko_pixmap_button_set_center_image( MOKO_PIXMAP_BUTTON(a), anImage ); 
    153     g_signal_connect( G_OBJECT(a), "clicked", G_CALLBACK(cb_subscribe_button_clicked), data ); 
    154  
    155     a = GTK_BUTTON(moko_tool_box_add_action_button( MOKO_TOOL_BOX(data->box)) ); 
    156     gtk_button_set_label( GTK_BUTTON(a), _("Up for rent") ); 
    157     a = GTK_BUTTON(moko_tool_box_add_action_button( MOKO_TOOL_BOX(data->box)) ); 
    158     gtk_button_set_label( GTK_BUTTON(a), _("Buy more Mate") ); 
    159  
    160     moko_paned_window_add_toolbox( MOKO_PANED_WINDOW(data->window), MOKO_TOOL_BOX(data->box) ); 
    161 } 
    162  
    163 static void create_navigaton_area( struct RSSReaderData *data ) { 
    164     data->feed_data = gtk_list_store_new( RSS_READER_NUM_COLS, 
    165                                           G_TYPE_STRING /* Author    */, 
    166                                           G_TYPE_STRING /* Subject   */, 
    167                                           RSS_TYPE_RFC_DATE /* Date  */, 
    168                                           G_TYPE_STRING /* Link      */, 
    169                                           G_TYPE_STRING /* Text      */, 
    170                                           G_TYPE_INT    /* Text_Type */, 
    171                                           G_TYPE_STRING /* Category  */, 
    172                                           G_TYPE_STRING /* Source    */ ); 
    173  
    174     /* 
    175      * allow to filter for a search string 
    176      */ 
    177     data->filter_model = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(GTK_TREE_MODEL(data->feed_data),NULL)); 
    178     gtk_tree_model_filter_set_visible_func (data->filter_model, (GtkTreeModelFilterVisibleFunc)rss_filter_entries, data, NULL); 
    179  
    180     /* 
    181      * Allow sorting of the base model 
    182      */ 
    183     data->sort_model = GTK_TREE_MODEL_SORT(gtk_tree_model_sort_new_with_model( GTK_TREE_MODEL(data->filter_model) )); 
    184     gtk_tree_sortable_set_sort_column_id( GTK_TREE_SORTABLE(data->sort_model), RSS_READER_COLUMN_DATE,    GTK_SORT_DESCENDING ); 
    185     gtk_tree_sortable_set_sort_func ( GTK_TREE_SORTABLE(data->sort_model), RSS_READER_COLUMN_DATE, rss_sort_dates, NULL, NULL); 
    186  
    187     data->treeView = MOKO_TREE_VIEW(moko_tree_view_new_with_model(GTK_TREE_MODEL(data->sort_model))); 
    188     moko_paned_window_set_navigation_pane( MOKO_PANED_WINDOW(data->window), GTK_WIDGET(moko_tree_view_put_into_scrolled_window(data->treeView)) ); 
    189  
    190     /* 
    191      * Only show the SUBJECT and DATE header 
    192      */ 
    193     GtkCellRenderer *ren; 
    194     GtkTreeViewColumn *column; 
    195     ren = GTK_CELL_RENDERER(gtk_cell_renderer_text_new()); 
    196     column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes( _("Subject"), ren, "text", RSS_READER_COLUMN_SUBJECT, NULL)); 
    197     gtk_tree_view_column_set_expand( column, TRUE ); 
    198     gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED ); 
    199     gtk_tree_view_column_set_sort_column_id( column, RSS_READER_COLUMN_SUBJECT ); 
    200     moko_tree_view_append_column( MOKO_TREE_VIEW(data->treeView), column ); 
    201  
    202     ren = GTK_CELL_RENDERER(gtk_cell_renderer_text_new()); 
    203     column = GTK_TREE_VIEW_COLUMN(gtk_tree_view_column_new_with_attributes( _("Date"), ren, NULL)); 
    204  
    205     gtk_tree_view_column_set_cell_data_func (column, ren, rss_cell_data_func, NULL, NULL); 
    206     gtk_tree_view_column_set_expand( column, TRUE ); 
    207     gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED ); 
    208     gtk_tree_view_column_set_sort_column_id( column, RSS_READER_COLUMN_DATE ); 
    209     moko_tree_view_append_column( MOKO_TREE_VIEW(data->treeView), column ); 
    210  
    211     /* 
    212      * auto completion and selection updates 
    213      */ 
    214     GtkTreeSelection *selection = GTK_TREE_SELECTION(gtk_tree_view_get_selection( GTK_TREE_VIEW(data->treeView) )); 
    215     g_signal_connect( G_OBJECT(selection), "changed", G_CALLBACK(cb_treeview_selection_changed), data ); 
    216  
    217     GtkWidget *search_entry = GTK_WIDGET(moko_tool_box_get_entry(MOKO_TOOL_BOX(data->box))); 
    218     g_signal_connect( G_OBJECT(data->treeView), "key_press_event", G_CALLBACK(cb_treeview_keypress_event), data ); 
    219     g_signal_connect( G_OBJECT(search_entry),   "changed", G_CALLBACK(cb_search_entry_changed), data ); 
    220 } 
    221  
    222 static void create_details_area( struct RSSReaderData* data ) { 
    223     data->textPage = WEBKIT_GTK_PAGE(webkit_gtk_page_new ()); 
    224  
    225     GtkWidget *scrollWindow = GTK_WIDGET(moko_scrolled_pane_new()); 
    226     moko_scrolled_pane_pack (MOKO_SCROLLED_PANE(scrollWindow), GTK_WIDGET (data->textPage)); 
    227     moko_paned_window_set_details_pane( MOKO_PANED_WINDOW(data->window), scrollWindow ) ; 
    228 } 
    229  
    230 /* 
    231  * create the mainwindow 
    232  */ 
    233 static void setup_ui( struct RSSReaderData* data ) { 
    234     data->window = MOKO_PANED_WINDOW(moko_paned_window_new()); 
    235     g_signal_connect( G_OBJECT(data->window), "delete_event", G_CALLBACK( gtk_main_quit ), NULL ); 
    236  
    237     /* 
    238      * menu 
    239      */ 
    240     data->menu = GTK_MENU(gtk_menu_new()); 
    241     GtkMenuItem *closeitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( _("Close"))); 
    242     g_signal_connect( G_OBJECT(closeitem), "activate", G_CALLBACK(gtk_main_quit), NULL ); 
    243     gtk_menu_shell_append( GTK_MENU_SHELL(data->menu), GTK_WIDGET(closeitem) ); 
    244     moko_paned_window_set_application_menu( MOKO_PANED_WINDOW(data->window), GTK_MENU(data->menu) ); 
    245  
    246     /* 
    247      * filter 
    248      */ 
    249     data->filter = GTK_MENU(gtk_menu_new()); 
    250     moko_paned_window_set_filter_menu( MOKO_PANED_WINDOW(data->window), GTK_MENU(data->filter) ); 
    251     data->menubox = MOKO_MENU_BOX(moko_paned_window_get_menubox( MOKO_PANED_WINDOW(data->window) ) ); 
    252     g_signal_connect( G_OBJECT(data->menubox), "filter_changed", G_CALLBACK(cb_filter_changed), data ); 
    253  
    254  
    255     /* 
    256      * tool bar 
    257      */ 
    258     setup_toolbar( data ); 
    259     create_navigaton_area( data ); 
    260     create_details_area( data ); 
    261 } 
    262  
    263 int main( int argc, char** argv ) 
    264 { 
    265     /* 
    266      * boiler plate code 
    267      */ 
    268148    g_debug( "openmoko-feedreader2 starting up" ); 
    269149 
    270150    /* i18n boiler plate */ 
    271     bindtextdomain ( GETTEXT_PACKAGE, RSSREADER_LOCALE_DIR ); 
    272     bind_textdomain_codeset ( GETTEXT_PACKAGE, "UTF-8" ); 
    273     textdomain ( GETTEXT_PACKAGE ); 
     151    bindtextdomain (GETTEXT_PACKAGE, RSSREADER_LOCALE_DIR); 
     152    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); 
     153    textdomain (GETTEXT_PACKAGE); 
    274154 
    275155 
     
    277157     * initialize threads for fetching the RSS in the background 
    278158     */ 
    279     g_thread_init( NULL ); 
    280     gdk_threads_init(); 
    281     gdk_threads_enter(); 
    282     gtk_init( &argc, &argv ); 
     159    g_thread_init (NULL); 
     160    gdk_threads_init (); 
     161    gdk_threads_enter (); 
     162    gtk_init (&argc, &argv); 
    283163    webkit_gtk_init (); 
     164    g_set_application_name( _("FeedReader") ); 
    284165 
    285     struct RSSReaderData *data = g_new0( struct RSSReaderData, 1 ); 
     166    struct ApplicationData* data = g_new (struct ApplicationData, 1); 
     167    data->cache = MOKO_CACHE(moko_cache_new ("feed-reader")); 
     168    feed_data_set_cache (RSS_FEED_DATA(feed_data_get_instance ()), data->cache); 
    286169 
     170    create_ui (data); 
     171    feed_data_load_from_cache (RSS_FEED_DATA(feed_data_get_instance ())); 
    287172 
    288     data->app = MOKO_APPLICATION( moko_application_get_instance() ); 
    289     g_set_application_name( _("FeedReader") ); 
    290     data->cache = MOKO_CACHE(moko_cache_new ("feed-reader")); 
    291  
    292     setup_ui( data ); 
    293  
    294     /* 
    295      * load data 
    296      */ 
    297     data->is_all_filter = TRUE; 
    298     refresh_categories( data ); 
    299     load_data_from_cache (data); 
    300     moko_menu_box_set_active_filter( data->menubox, _("All") ); 
    301  
    302     gtk_widget_show_all( GTK_WIDGET(data->window) ); 
    303     gtk_widget_grab_focus (GTK_WIDGET(data->treeView)); 
    304173    gtk_main(); 
    305174    gdk_threads_leave(); 
    306175 
     176    g_object_unref (data->cache); 
     177    g_free (data); 
     178     
    307179    return 0; 
    308180} 
    309  
    310  
Note: See TracChangeset for help on using the changeset viewer.