1 /* logjam - a GTK client for LiveJournal.
2 * Copyright (C) 2000-2003 Evan Martin <evan@livejournal.com>
7 #include "draftstore.h"
23 /*GtkWidget *lstats; */
24 /*GdkPixbuf *pb_friends, *pb_private; */
28 static void row_activated_cb (GtkTreeView
*treeview
, GtkTreePath
*arg1
, GtkTreeViewColumn
*arg2
, DraftStoreUI
*dsui
) {
29 gtk_dialog_response(GTK_DIALOG(dsui
->win
), GTK_RESPONSE_OK
);
33 static GtkWidget
*make_view (DraftStoreUI
*dsui
) {
34 GtkCellRenderer
*renderer
;
35 GtkTreeViewColumn
*column
;
37 dsui
->view
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(dsui
->store
));
38 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(dsui
->view
), TRUE
);
39 g_object_unref(G_OBJECT(dsui
->store
));
40 g_signal_connect(G_OBJECT(dsui
->view
), "row-activated", G_CALLBACK(row_activated_cb
), dsui
);
42 /*renderer = gtk_cell_renderer_pixbuf_new();
43 column = gtk_tree_view_column_new_with_attributes(_("Security"), renderer,
44 "pixbuf", COL_SECURITY,
46 gtk_tree_view_append_column(GTK_TREE_VIEW(dsui->view), column); */
48 renderer
= gtk_cell_renderer_text_new();
49 column
= gtk_tree_view_column_new_with_attributes(_("Date"), renderer
, "text", COL_DATE
, NULL
);
50 gtk_tree_view_column_set_sort_column_id(column
, COL_DATE
);
51 gtk_tree_view_append_column(GTK_TREE_VIEW(dsui
->view
), column
);
53 renderer
= gtk_cell_renderer_text_new();
54 column
= gtk_tree_view_column_new_with_attributes(_("Subject"), renderer
, "text", COL_SUBJECT
, NULL
);
55 gtk_tree_view_column_set_sort_column_id(column
, COL_SUBJECT
);
56 gtk_tree_view_append_column(GTK_TREE_VIEW(dsui
->view
), column
);
58 return scroll_wrap(dsui
->view
);
62 static void delete_cb (GtkWidget
*w
, DraftStoreUI
*dsui
) {
66 if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(dsui
->view
)), &model
, &iter
)) return;
67 if (!jam_confirm(GTK_WINDOW(dsui
->win
), _("Delete"), _("Delete entry?"))) return;
68 gtk_tree_model_get(model
, &iter
, COL_ITEMID
, &itemid
, -1);
69 gtk_list_store_remove(GTK_LIST_STORE(model
), &iter
);
70 draft_store_remove_entry(dsui
->ds
, itemid
, NULL
);
74 static void dsui_destroy_cb (GtkWidget
*w
, DraftStoreUI
*dsui
) {
76 gdk_pixbuf_unref(dsui->pb_friends);
77 gdk_pixbuf_unref(dsui->pb_private);
82 static void make_dialog (DraftStoreUI
*dsui
, GtkWindow
*parent
) {
83 GtkWidget
*vbox
, *bbox
, *button
;
85 dsui
->win
= gtk_dialog_new_with_buttons(_("Entries"),
86 parent
, GTK_DIALOG_MODAL
,
87 GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
, GTK_STOCK_OK
, GTK_RESPONSE_OK
, NULL
);
88 g_signal_connect(G_OBJECT(dsui
->win
), "destroy", G_CALLBACK(dsui_destroy_cb
), dsui
);
89 gtk_window_set_default_size(GTK_WINDOW(dsui
->win
), 500, 400);
90 gtk_dialog_set_default_response(GTK_DIALOG(dsui
->win
), GTK_RESPONSE_OK
);
92 vbox
= gtk_vbox_new(FALSE
, 5);
93 gtk_box_pack_start(GTK_BOX(vbox
), make_view(dsui
), TRUE
, TRUE
, 0);
95 dsui->lstats = gtk_label_new("");
96 gtk_label_set_selectable(GTK_LABEL(dsui->lstats), TRUE);
97 gtk_box_pack_start(GTK_BOX(vbox), dsui->lstats, FALSE, FALSE, 0);
100 bbox
= jam_dialog_buttonbox_new();
101 button
= jam_dialog_buttonbox_button_from_stock(bbox
, GTK_STOCK_DELETE
);
102 g_signal_connect(G_OBJECT(button
), "clicked", G_CALLBACK(delete_cb
), dsui
);
104 jam_dialog_set_contents_buttonbox(dsui
->win
, vbox
, bbox
);
108 static void load_item_cb (DraftStore
*ec
, LJEntry
*entry
, gpointer data
) {
109 DraftStoreUI
*dsui
= data
;
114 switch (entry
->security
.type
) {
115 case SECURITY_FRIENDS
:
116 case SECURITY_CUSTOM
:
117 pb
= dsui
->pb_friends
;
119 case SECURITY_PRIVATE
:
120 pb
= dsui
->pb_private
;
123 pb
= NULL
; /* public: no icon */
126 date
= lj_tm_to_ljdate_noseconds(&entry
->time
);
127 gtk_list_store_append(dsui
->store
, &iter
);
128 gtk_list_store_set(dsui
->store
, &iter
, /*COL_SECURITY, pb,*/ COL_DATE
, date
, COL_SUBJECT
, entry
->subject
, COL_ITEMID
, entry
->itemid
, -1);
133 static gboolean
load_items (DraftStoreUI
*dsui
) {
134 LJEntry
*entry
= lj_entry_new();
135 draft_store_each_header(dsui
->ds
, entry
, load_item_cb
, dsui
);
136 lj_entry_free(entry
);
141 static LJEntry
*load_selected (DraftStoreUI
*dsui
) {
145 if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(dsui
->view
)), &model
, &iter
)) return NULL
;
146 gtk_tree_model_get(model
, &iter
, COL_ITEMID
, &itemid
, -1);
147 return draft_store_get_entry(dsui
->ds
, itemid
, NULL
);
151 LJEntry
*draft_store_ui_select (DraftStore
*ds
, GtkWindow
*parent
) {
152 DraftStoreUI dsui_actual
= {0}, *dsui
= &dsui_actual
;
153 LJEntry
*entry
= NULL
;
155 dsui
->store
= gtk_list_store_new(COL_COUNT
, /*GDK_TYPE_PIXBUF,*/ G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_INT
);
156 make_dialog(dsui
, parent
);
158 dsui->pb_friends = gtk_widget_render_icon(dsui->win, "logjam-protected", GTK_ICON_SIZE_MENU, NULL);
159 dsui->pb_private = gtk_widget_render_icon(dsui->win, "logjam-private", GTK_ICON_SIZE_MENU, NULL);
161 if (!load_items(dsui
)) return NULL
;
162 if (gtk_dialog_run(GTK_DIALOG(dsui
->win
)) == GTK_RESPONSE_OK
) entry
= load_selected(dsui
);
163 gtk_widget_destroy(dsui
->win
);