1 /* AbiWord
2  * Copyright (C) 2002 Dom Lachowicz <cinamod@hotmail.com>
3  * Copyright (c) 2009 Hubert Figuiere
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301 USA.
19  */
20 
21 #include <stdlib.h>
22 #include <time.h>
23 
24 #include "ut_string.h"
25 #include "ut_assert.h"
26 #include "ut_debugmsg.h"
27 
28 // This header defines some functions for Unix dialogs,
29 // like centering them, measuring them, etc.
30 #include "xap_UnixDialogHelper.h"
31 #include "xap_Gtk2Compat.h"
32 
33 #include "xap_App.h"
34 #include "xap_UnixApp.h"
35 #include "xap_Frame.h"
36 
37 #include "ap_Strings.h"
38 #include "ap_Dialog_Id.h"
39 #include "ap_Dialog_ListRevisions.h"
40 #include "ap_UnixDialog_ListRevisions.h"
41 
42 
43 void
select_row_cb(GtkTreeSelection * select,AP_UnixDialog_ListRevisions * me)44 AP_UnixDialog_ListRevisions::select_row_cb(GtkTreeSelection * select,
45 										   AP_UnixDialog_ListRevisions * me )
46 {
47 	GtkTreeIter iter;
48 	GtkTreeModel *model;
49 	if(gtk_tree_selection_get_selected(select, &model, &iter))
50     {
51         me->select_Row (iter);
52     }
53 }
54 
55 
56 void
row_activated_cb(GtkTreeView *,GtkTreePath *,GtkTreeViewColumn *,AP_UnixDialog_ListRevisions * me)57 AP_UnixDialog_ListRevisions::row_activated_cb(GtkTreeView *,
58 											  GtkTreePath *,
59 											  GtkTreeViewColumn*,
60 											  AP_UnixDialog_ListRevisions * me)
61 {
62 	UT_DEBUGMSG(("row_activated\n"));
63 	gtk_dialog_response(GTK_DIALOG(me->m_mainWindow), BUTTON_OK);
64 }
65 
66 
67 /*****************************************************************/
68 
static_constructor(XAP_DialogFactory * pFactory,XAP_Dialog_Id id)69 XAP_Dialog * AP_UnixDialog_ListRevisions::static_constructor(XAP_DialogFactory * pFactory,
70 													 XAP_Dialog_Id id)
71 {
72 	AP_UnixDialog_ListRevisions * p = new AP_UnixDialog_ListRevisions(pFactory,id);
73 	return p;
74 }
75 
AP_UnixDialog_ListRevisions(XAP_DialogFactory * pDlgFactory,XAP_Dialog_Id id)76 AP_UnixDialog_ListRevisions::AP_UnixDialog_ListRevisions(XAP_DialogFactory * pDlgFactory,
77 							 XAP_Dialog_Id id)
78   : AP_Dialog_ListRevisions(pDlgFactory,id)
79   , m_mainWindow(NULL)
80   , m_treeModel(NULL)
81 {
82 }
83 
~AP_UnixDialog_ListRevisions(void)84 AP_UnixDialog_ListRevisions::~AP_UnixDialog_ListRevisions(void)
85 {
86 }
87 
runModal(XAP_Frame * pFrame)88 void AP_UnixDialog_ListRevisions::runModal(XAP_Frame * pFrame)
89 {
90 	m_mainWindow = constructWindow();
91 	UT_return_if_fail(m_mainWindow);
92 
93 	switch ( abiRunModalDialog ( GTK_DIALOG(m_mainWindow),
94 								 pFrame, this, BUTTON_OK, false ) )
95 	{
96 		case BUTTON_OK:
97 			event_OK () ; break ;
98 		default:
99 			event_Cancel () ; break ;
100 	}
101 
102 	abiDestroyWidget ( m_mainWindow ) ;
103 }
104 
event_Cancel()105 void AP_UnixDialog_ListRevisions::event_Cancel ()
106 {
107   m_iId = 0 ;
108   m_answer = AP_Dialog_ListRevisions::a_CANCEL ;
109 }
110 
event_OK()111 void AP_UnixDialog_ListRevisions::event_OK ()
112 {
113   m_answer = AP_Dialog_ListRevisions::a_OK ;
114 }
115 
select_Row(GtkTreeIter iter)116 void AP_UnixDialog_ListRevisions::select_Row (GtkTreeIter iter)
117 {
118     guint t = 0;
119     gtk_tree_model_get (GTK_TREE_MODEL(m_treeModel), &iter, COL_REVID, &t, -1);
120     m_iId = t;
121     UT_DEBUGMSG(("DOM: select row: %d\n", m_iId));
122 }
123 
unselect_Row()124 void AP_UnixDialog_ListRevisions::unselect_Row()
125 {
126   UT_DEBUGMSG(("DOM: unselect row: %d 0\n", m_iId));
127   m_iId = 0 ;
128 }
129 
constructWindow()130 GtkWidget * AP_UnixDialog_ListRevisions::constructWindow ()
131 {
132   GtkWidget *ap_UnixDialog_ListRevisions;
133   GtkWidget *vbDialog;
134   GtkWidget *aaDialog;
135 
136   ap_UnixDialog_ListRevisions = abiDialogNew ( "list revisions dialog", TRUE, getTitle());
137 #if !GTK_CHECK_VERSION(3,0,0)
138   gtk_dialog_set_has_separator(GTK_DIALOG(ap_UnixDialog_ListRevisions), FALSE);
139 #endif
140 
141   gtk_window_set_modal (GTK_WINDOW (ap_UnixDialog_ListRevisions), TRUE);
142   gtk_window_set_default_size ( GTK_WINDOW(ap_UnixDialog_ListRevisions), 800, 450 ) ;
143 
144   vbDialog = gtk_dialog_get_content_area(GTK_DIALOG(ap_UnixDialog_ListRevisions));
145   gtk_widget_show (vbDialog);
146   gtk_container_set_border_width (GTK_CONTAINER (vbDialog), 5);
147 
148   aaDialog = gtk_dialog_get_action_area(GTK_DIALOG(ap_UnixDialog_ListRevisions));
149   gtk_widget_show (aaDialog);
150 
151   constructWindowContents ( vbDialog ) ;
152 
153   abiAddStockButton ( GTK_DIALOG(ap_UnixDialog_ListRevisions), GTK_STOCK_CANCEL, BUTTON_CANCEL ) ;
154   abiAddStockButton ( GTK_DIALOG(ap_UnixDialog_ListRevisions), GTK_STOCK_OK, BUTTON_OK ) ;
155 
156   return ap_UnixDialog_ListRevisions;
157 }
158 
constructWindowContents(GtkWidget * vbDialog)159 void AP_UnixDialog_ListRevisions::constructWindowContents ( GtkWidget * vbDialog )
160 {
161   GtkWidget *vbContent;
162   GtkWidget *lbExistingRevisions;
163   GtkWidget *swExistingRevisions;
164   GtkWidget *clExistingRevisions;
165 
166   vbContent = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
167   gtk_widget_show (vbContent);
168   gtk_container_add (GTK_CONTAINER (vbDialog), vbContent);
169   gtk_container_set_border_width (GTK_CONTAINER (vbContent), 5);
170 
171   lbExistingRevisions = gtk_label_new (NULL);
172   std::string s("<b>");
173   s += getLabel1();
174   s += "</b>";
175   gtk_label_set_markup(GTK_LABEL(lbExistingRevisions), s.c_str());
176   gtk_widget_show (lbExistingRevisions);
177   gtk_misc_set_alignment (GTK_MISC (lbExistingRevisions), 0.0, 0.5);
178   gtk_box_pack_start (GTK_BOX (vbContent), lbExistingRevisions, FALSE, FALSE, 0);
179 
180   swExistingRevisions = gtk_scrolled_window_new (NULL, NULL);
181   gtk_widget_show (swExistingRevisions);
182   gtk_container_add (GTK_CONTAINER (vbContent), swExistingRevisions);
183   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swExistingRevisions), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
184 
185   GtkListStore * list_store = gtk_list_store_new(4,
186                                                  G_TYPE_UINT,
187                                                  G_TYPE_STRING,
188 												 G_TYPE_STRING,
189                                                  G_TYPE_LONG );
190   m_treeModel = GTK_WIDGET(list_store);
191 
192 
193   clExistingRevisions = gtk_tree_view_new_with_model (GTK_TREE_MODEL(list_store));
194   gtk_widget_show (clExistingRevisions);
195   gtk_container_add (GTK_CONTAINER (swExistingRevisions), clExistingRevisions);
196 
197   // Note that columns are displayed in a different order to the model,
198   // data from col2 is shown in the first column in the view.
199   GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
200   GtkTreeViewColumn *col;
201 
202   // comment column
203   col = gtk_tree_view_column_new_with_attributes(getColumn3Label(),
204 												 renderer, "text", COL_COMMENT, NULL);
205   gtk_tree_view_column_set_sort_column_id(col, COL_COMMENT);
206   gtk_tree_view_append_column(GTK_TREE_VIEW(clExistingRevisions), col);
207 
208   // revision date column
209   col = gtk_tree_view_column_new_with_attributes(getColumn2Label(),
210 												 renderer, "text", COL_DATE_STRING, NULL);
211   // we sort on the numerical tt column instead of the human readable text
212   gtk_tree_view_column_set_sort_column_id(col, COL_DATE_AS_TIMET);
213   // later we sort on date desc.
214   gtk_tree_view_column_set_sort_order( col, GTK_SORT_DESCENDING);
215   gtk_tree_view_column_set_fixed_width(col, 80);
216   gtk_tree_view_append_column(GTK_TREE_VIEW(clExistingRevisions), col);
217 
218 
219   // revision # column
220   col = gtk_tree_view_column_new_with_attributes(getColumn1Label(),
221 												 renderer, "text", COL_REVID, NULL);
222   gtk_tree_view_column_set_fixed_width(col, 80);
223   gtk_tree_view_column_set_sort_column_id(col, COL_REVID);
224   gtk_tree_view_append_column(GTK_TREE_VIEW(clExistingRevisions), col);
225 
226 
227 
228   gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(clExistingRevisions), TRUE);
229 
230 
231 
232 //  g_object_freeze_notify(G_OBJECT(list_store));
233 
234   UT_uint32 itemCnt = getItemCount () ;
235 
236   UT_DEBUGMSG(("DOM: %d items\n", itemCnt));
237 
238   GtkTreeIter iter;
239   for ( UT_uint32 i = 0; i < itemCnt; i++ )
240   {
241     gchar buf [ 35 ] ;
242 
243     sprintf (buf, "%d", getNthItemId(i));
244 	gtk_list_store_append(list_store, &iter);
245 
246 	gchar * txt = getNthItemText(i, true);
247 	gchar * itemtime = g_locale_to_utf8(getNthItemTime(i), -1, NULL, NULL, NULL);
248 	gtk_list_store_set(list_store, &iter,
249 					   COL_REVID,         getNthItemId(i),
250 					   COL_DATE_STRING,   itemtime?itemtime:"",
251 					   COL_COMMENT,       txt,
252                        COL_DATE_AS_TIMET, getNthItemTimeT(i),
253 					   -1);
254 	g_free(itemtime);
255 
256     UT_DEBUGMSG(("appending revision %s : %s, %s\n", itemtime, buf, txt));
257 
258     FREEP(txt);
259   }
260 //  g_object_thaw_notify(G_OBJECT(list_store));
261 
262 //  gtk_clist_select_row (GTK_CLIST (clExistingRevisions), 0, 0);
263 
264   GtkTreeSelection *select = gtk_tree_view_get_selection(GTK_TREE_VIEW(clExistingRevisions));
265   gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
266   g_signal_connect (G_OBJECT(select), "changed",
267 					G_CALLBACK(select_row_cb), this);
268 
269   g_signal_connect(G_OBJECT(clExistingRevisions),
270 		   "row-activated",
271 		   G_CALLBACK(row_activated_cb),
272 		   static_cast<gpointer>(this));
273 
274   gtk_tree_sortable_set_sort_column_id( GTK_TREE_SORTABLE(list_store),
275                                         3, GTK_SORT_DESCENDING );
276 
277 }
278