2 * This file is part of maemopad+
5 * This software is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public License
7 * as published by the Free Software Foundation; either version 2.1 of
8 * the License, or (at your option) any later version.
10 * This software is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this software; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22 #include <ui/callbacks.h>
23 #include <ui/interface.h>
25 #include <gdk/gdkkeysyms.h>
29 * strlen needed from string.h
32 #include <sys/types.h>
36 #include <hildon-widgets/hildon-banner.h>
37 #include <hildon-widgets/hildon-note.h>
38 #include <hildon-widgets/hildon-font-selection-dialog.h>
39 #include <libgnomevfs/gnome-vfs.h>
40 #include <osso-browser-interface.h>
47 gboolean
read_file_to_buffer(MainView
* mainview
);
48 void write_buffer_to_file(MainView
* mainview
);
49 void new_node_dialog(nodeType typ
, MainView
* mainview
);
52 st==0: turn off/zero refcount
53 st==1: turn on/increase ref
54 st==2: decrease refcount and turn off if necessary
56 void setBusy(MainView
*mainview
, gchar st
)
58 if (st
==0) mainview
->busyrefcount
=0;
59 else if (st
==1) mainview
->busyrefcount
++;
60 else if (st
==2 && mainview
->busyrefcount
>0) mainview
->busyrefcount
--;
61 gdk_window_set_cursor(GTK_WIDGET(mainview
->data
->main_view
)->window
, (mainview
->busyrefcount
>0)?mainview
->cursorBusy
:NULL
);
64 gboolean
isBusy(MainView
*mainview
)
66 if (mainview
->busyrefcount
>0) return(TRUE
);
70 void prepareUIforNodeChange(MainView
* mainview
, nodeType typ
)
74 gtk_widget_show(GTK_WIDGET(mainview
->font_tb
));
75 gtk_widget_show(GTK_WIDGET(mainview
->bold_tb
));
76 gtk_widget_show(GTK_WIDGET(mainview
->italic_tb
));
77 gtk_widget_show(GTK_WIDGET(mainview
->underline_tb
));
78 gtk_widget_show(mainview
->tools_font
);
79 gtk_widget_show(mainview
->tools_wordwrap
);
83 gtk_widget_hide(GTK_WIDGET(mainview
->font_tb
));
84 gtk_widget_hide(GTK_WIDGET(mainview
->bold_tb
));
85 gtk_widget_hide(GTK_WIDGET(mainview
->italic_tb
));
86 gtk_widget_hide(GTK_WIDGET(mainview
->underline_tb
));
87 gtk_widget_hide(mainview
->tools_font
);
88 gtk_widget_hide(mainview
->tools_wordwrap
);
91 if (typ
== NODE_SKETCH
)
93 gtk_widget_show(GTK_WIDGET(mainview
->colorbutton_tb
));
94 gtk_widget_show(GTK_WIDGET(mainview
->eraser_tb
));
95 gtk_widget_show(GTK_WIDGET(mainview
->brushsize_tb
));
96 gtk_widget_show(GTK_WIDGET(mainview
->sketchlines_tb
));
97 gtk_widget_show(GTK_WIDGET(mainview
->shape_tb
));
98 gtk_widget_show(GTK_WIDGET(mainview
->undo_tb
));
99 gtk_widget_show(GTK_WIDGET(mainview
->redo_tb
));
100 gtk_widget_show(mainview
->tools_color
);
101 gtk_widget_show(mainview
->tools_brushsize
);
102 gtk_widget_show(mainview
->tools_pagestyle
);
103 gtk_widget_show(mainview
->tools_shape
);
107 gtk_widget_hide(GTK_WIDGET(mainview
->colorbutton_tb
));
108 gtk_widget_hide(GTK_WIDGET(mainview
->eraser_tb
));
109 gtk_widget_hide(GTK_WIDGET(mainview
->brushsize_tb
));
110 gtk_widget_hide(GTK_WIDGET(mainview
->sketchlines_tb
));
111 gtk_widget_hide(GTK_WIDGET(mainview
->shape_tb
));
112 gtk_widget_hide(GTK_WIDGET(mainview
->undo_tb
));
113 gtk_widget_hide(GTK_WIDGET(mainview
->redo_tb
));
114 gtk_widget_hide(mainview
->tools_color
);
115 gtk_widget_hide(mainview
->tools_brushsize
);
116 gtk_widget_hide(mainview
->tools_pagestyle
);
117 gtk_widget_hide(mainview
->tools_shape
);
120 if (typ
== NODE_TEXT
)
122 gtk_widget_hide(sketchwidget_get_mainwidget(mainview
->sk
));
123 gtk_widget_show(GTK_WIDGET(mainview
->scrolledwindow
));
124 gtk_widget_show(mainview
->tools_item
);
126 else if (typ
== NODE_SKETCH
)
128 gtk_widget_hide(GTK_WIDGET(mainview
->scrolledwindow
));
129 gtk_widget_show(sketchwidget_get_mainwidget(mainview
->sk
));
130 gtk_widget_show(mainview
->tools_item
);
134 gtk_widget_hide(GTK_WIDGET(mainview
->scrolledwindow
));
135 gtk_widget_hide(sketchwidget_get_mainwidget(mainview
->sk
));
136 gtk_widget_hide(mainview
->tools_item
);
140 nodeData
*getSelectedNode(MainView
* mainview
)
147 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(mainview
->treeview
));
149 if (!gtk_tree_selection_get_selected(selection
, &model
, &iter
))
152 gtk_tree_model_get(model
, &iter
, NODE_DATA
, &nd
, -1);
157 void saveCurrentData(MainView
* mainview
)
159 nodeData
*selnode
= getSelectedNode(mainview
);
160 saveDataToNode(mainview
, selnode
);
163 void saveDataToNode(MainView
* mainview
, nodeData
*selnode
)
168 if ((selnode
->typ
== NODE_SKETCH
&& sketchwidget_get_edited(mainview
->sk
) == FALSE
)/* || (selnode->typ == NODE_TEXT && gtk_text_buffer_get_modified(GTK_TEXT_BUFFER(mainview->buffer)) == FALSE)*/)
170 fprintf(stderr
, "node not edited, not saving\n");
174 mainview
->file_edited
= TRUE
;
176 setBusy(mainview
, 1);
177 fprintf(stderr
, "savecurrentdata!\n");
179 gboolean goterr
= TRUE
;
180 gchar
*textdata
= NULL
;
181 GdkPixbuf
*pixbuf
= NULL
;
182 gchar
*sketchdata
= NULL
;
186 if (selnode
->typ
== NODE_TEXT
)
188 GtkTextIter start
, end
;
190 gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(mainview
->buffer
), &start
, &end
);
191 /* textdata = gtk_text_buffer_get_slice(GTK_TEXT_BUFFER(mainview->buffer), &start, &end, TRUE);*/
192 textdata
= gtk_text_buffer_serialize_rich_text(GTK_TEXT_BUFFER(mainview
->buffer
), &start
, &end
, &datalen
);
194 /* snprintf(tq, sizeof(tq), "UPDATE %s SET bodytype=%d, bodyblob=NULL, body=?, flags=%d WHERE nodeid=%d", datatable_tmpname, selnode->typ, selnode->flags, selnode->sql3id);*/
195 snprintf(tq
, sizeof(tq
), "UPDATE %s SET bodytype=%d, bodyblob=?, body=NULL, flags=%d WHERE nodeid=%d", datatable_tmpname
, selnode
->typ
, selnode
->flags
, selnode
->sql3id
);
197 else if (selnode
->typ
== NODE_SKETCH
)
200 GdkPixmap
*skpix
= sketchwidget_get_Pixmap(mainview
->sk
);
201 GtkWidget
*skdr
= sketchwidget_get_drawingarea(mainview
->sk
);
203 pixbuf
= gdk_pixbuf_get_from_drawable(NULL
, GDK_DRAWABLE(skpix
), NULL
, 0, 0, 0, 0, skdr
->allocation
.width
, skdr
->allocation
.height
);
206 fprintf(stderr
, "Error saving: pixbuf is null\n");
211 GdkPixbuf
*pixbuf2
= sketchwidget_trim_image(pixbuf
, skdr
->allocation
.width
, skdr
->allocation
.height
, &w
, &h
, FALSE
);
215 if (gdk_pixbuf_save_to_buffer(pixbuf2
, &sketchdata
, &datalen
, "png", &err
, NULL
) == FALSE
)
219 fprintf(stderr
, "Error saving sketch! %s\n", err
->message
);
222 gdk_pixbuf_unref(pixbuf2
);
225 snprintf(tq
, sizeof(tq
), "UPDATE %s SET bodytype=%d, body=NULL, bodyblob=?, flags=%d WHERE nodeid=%d", datatable_tmpname
, selnode
->typ
, selnode
->flags
, selnode
->sql3id
);
226 fprintf(stderr
, "datalen:%d\n", datalen
);
227 if (skpix
&& G_IS_OBJECT(skpix
)) g_object_unref(skpix
);
231 * fprintf(stderr, "query is *%s*\n", tq);
236 sqlite3_stmt
*stmt
= NULL
;
238 int rc
= sqlite3_prepare(mainview
->db
, tq
, strlen(tq
), &stmt
, &dum
);
242 fprintf(stderr
, "Error updating: %s\n", sqlite3_errmsg(mainview
->db
));
245 if (selnode
->typ
== NODE_TEXT
)
246 sqlite3_bind_text(stmt
, 1, textdata
, datalen
, /*strlen(textdata),*/ SQLITE_TRANSIENT
);
247 else if (selnode
->typ
== NODE_SKETCH
)
248 sqlite3_bind_blob(stmt
, 1, sketchdata
, datalen
, SQLITE_TRANSIENT
);
251 while(rc
== SQLITE_BUSY
)
253 rc
= sqlite3_step(stmt
);
254 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
257 sqlite3_finalize(stmt
);
258 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
)
260 fprintf(stderr
, "Error saving node: %s\n", sqlite3_errmsg(mainview
->db
));
264 if (selnode
->typ
== NODE_TEXT
)
265 gtk_text_buffer_set_modified(GTK_TEXT_BUFFER(mainview
->buffer
), FALSE
);
266 else if (selnode
->typ
== NODE_SKETCH
)
267 sketchwidget_set_edited(mainview
->sk
, FALSE
);
279 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error saving memo"));
281 setBusy(mainview
, 2);
284 void callback_treeview_celldatafunc(GtkTreeViewColumn
* tree_column
, GtkCellRenderer
* cell
, GtkTreeModel
* tree_model
, GtkTreeIter
* iter
, gpointer data
)
286 MainView
*mainview
= NULL
;
287 mainview
= ( MainView
* ) data
;
288 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
292 gtk_tree_model_get(tree_model
, iter
, NODE_DATA
, &nd
, -1);
296 if (nd
->namepix
== NULL
)
298 g_object_set(cell
, "visible", FALSE
, NULL
);
302 g_object_set(cell
, "visible", TRUE
, NULL
);
303 g_object_set(cell
, "width", SKETCHNODE_RX
, NULL
);
304 g_object_set(cell
, "height", SKETCHNODE_RY
, NULL
);
308 gboolean
callback_treeview_testcollapse(GtkTreeView
* treeview
, GtkTreeIter
* arg1
, GtkTreePath
* arg2
, gpointer user_data
)
313 void callback_treeview_change(GtkTreeSelection
* selection
, gpointer data
)
315 MainView
*mainview
= NULL
;
317 mainview
= (MainView
*) data
;
318 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
320 nodeData
*nd
= getSelectedNode(mainview
);
324 fprintf(stderr, "changed called but no selectednode\n");
326 fprintf(stderr, "changed called, selectednode is %d\n", nd->sql3id);
330 if (mainview
->cansel_time
>0 && mainview
->cansel_time
+1.0<tm
) mainview
->cansel_node
=NULL
;
334 if (mainview
->cansel_node
!=NULL
)
336 fprintf(stderr
, "[SELLOGIC] saving %d to unselect all nodes\n", (mainview
->cansel_node
)->sql3id
);
337 saveDataToNode(mainview
, (mainview
->cansel_node
));
338 mainview
->cansel_node
=NULL
;
343 if (mainview
->cansel_node
!=NULL
)
345 if (nd
->sql3id
== (mainview
->cansel_node
)->sql3id
)
347 mainview
->cansel_node
=NULL
;
348 fprintf(stderr
, "[SELLOGIC] doubly selected %d, doing nothing\n", nd
->sql3id
);
353 fprintf(stderr
, "[SELLOGIC] saving %d to load new node\n", (mainview
->cansel_node
)->sql3id
);
354 saveDataToNode(mainview
, (mainview
->cansel_node
));
355 mainview
->cansel_node
=NULL
;
360 if (nd
== NULL
) return;
362 setBusy(mainview
, 1);
364 gboolean goterr
= TRUE
;
365 char *textdata
= NULL
;
367 int blobsize
= 0, textsize
= 0;
371 snprintf(tq
, sizeof(tq
), "SELECT bodytype, body, bodyblob, flags FROM %s WHERE nodeid=%d", datatable_tmpname
, nd
->sql3id
);
372 sqlite3_stmt
*stmt
= NULL
;
374 int rc
= sqlite3_prepare(mainview
->db
, tq
, strlen(tq
), &stmt
, &dum
);
378 fprintf(stderr
, "Error reading (1) %s\n", sqlite3_errmsg(mainview
->db
));
383 while(rc
== SQLITE_BUSY
|| rc
== SQLITE_ROW
)
385 rc
= sqlite3_step(stmt
);
386 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
388 else if (rc
== SQLITE_ROW
)
390 nd
->typ
= sqlite3_column_int(stmt
, 0);
391 nd
->flags
= sqlite3_column_int(stmt
, 3);
393 prepareUIforNodeChange(mainview
, nd
->typ
);
394 if (nd
->typ
== NODE_TEXT
)
396 gboolean file_edited_backup
= mainview
->file_edited
;
398 blobsize
= sqlite3_column_bytes(stmt
, 2);
399 blob
= (char *)sqlite3_column_blob(stmt
, 2);
401 textdata
= (char *)sqlite3_column_text(stmt
, 1);
402 textsize
= sqlite3_column_bytes(stmt
, 1);
404 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(mainview
->buffer
), "", -1);
406 gboolean richtext
=FALSE
;
412 gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(mainview
->buffer
), &iter
);
413 gtk_text_buffer_deserialize_rich_text(GTK_TEXT_BUFFER(mainview
->buffer
), &iter
, blob
, blobsize
, TRUE
, &err
);
416 fprintf(stderr
, "Error loading text memo! %s\n", err
->message
);
424 if (richtext
==FALSE
&& !(textdata
== NULL
|| g_utf8_validate(textdata
, textsize
, NULL
) == FALSE
))
426 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(mainview
->buffer
), textdata
, textsize
);
429 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->tools_wordwrap
), ((nd
->flags
& NODEFLAG_WORDWRAP
) > 0)?TRUE
:FALSE
);
430 callback_wordwrap(NULL
, mainview
); /*FIXME:ugly (do we need this? gotta test) */
432 gtk_text_buffer_set_modified(GTK_TEXT_BUFFER(mainview
->buffer
), FALSE
);
434 if (file_edited_backup
==FALSE
) mainview
->file_edited
=FALSE
; /*textview changed event toggles this*/
437 else if (nd
->typ
== NODE_SKETCH
)
439 sketchwidget_wipe_undo(mainview
->sk
);
440 sketchwidget_set_fillmode(mainview
->sk
, FALSE
);
441 sketchwidget_set_shift(mainview
->sk
, FALSE
);
442 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->shapemenuitems
[1]), TRUE
);
443 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->shapemenuitems
[0]), TRUE
);
445 blobsize
= sqlite3_column_bytes(stmt
, 2);
446 blob
= (char *)sqlite3_column_blob(stmt
, 2);
447 gboolean clear
= TRUE
;
453 fprintf(stderr
, "blobsize:%d\n", blobsize
);
454 GdkPixbufLoader
*pl
= gdk_pixbuf_loader_new_with_type("png", NULL
);
457 gdk_pixbuf_loader_write(pl
, (guchar
*) blob
, blobsize
, &err
);
460 fprintf(stderr
, "Error loading sketch! %s\n", err
->message
);
464 gdk_pixbuf_loader_close(pl
, NULL
);
465 GdkPixbuf
*pixbuf
= gdk_pixbuf_loader_get_pixbuf(pl
);
467 if (GDK_IS_PIXBUF(pixbuf
))
469 GtkWidget
*skdr
= sketchwidget_get_drawingarea(mainview
->sk
);
470 GtkPixmap
*skpix
= (GtkPixmap
*) sketchwidget_get_Pixmap(mainview
->sk
);
472 int w
=gdk_pixbuf_get_width(pixbuf
);
473 int h
=gdk_pixbuf_get_height(pixbuf
);
474 if (w
!=skdr
->allocation
.width
|| h
!=skdr
->allocation
.height
)
476 if (w
>skdr
->allocation
.width
) w
=skdr
->allocation
.width
;
477 if (h
>skdr
->allocation
.height
) h
=skdr
->allocation
.height
;
478 sketchwidget_clear_real(mainview
->sk
);
480 gdk_draw_pixbuf(GDK_DRAWABLE(skpix
), NULL
, pixbuf
, 0, 0, 0, 0, w
, h
, GDK_RGB_DITHER_NONE
, 0, 0);
485 if (skpix
&& G_IS_OBJECT(skpix
)) g_object_unref(skpix
);
489 fprintf(stderr
, "error loading pixbuf\n");
495 fprintf(stderr
, "clearing pix area\n");
496 sketchwidget_clear_real(mainview
->sk
);
498 gtk_widget_queue_draw(sketchwidget_get_drawingarea(mainview
->sk
));
501 if ((nd
->flags
& NODEFLAG_SKETCHLINES
) > 0)
502 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->sketchlinesmenuitems
[1]), TRUE
);
503 else if ((nd
->flags
& NODEFLAG_SKETCHGRAPH
) > 0)
504 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->sketchlinesmenuitems
[2]), TRUE
);
507 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->sketchlinesmenuitems
[0]), TRUE
);
508 callback_sketchlines(NULL
, mainview
->sketchlinesmenuitems
[0]); /*FIXME:ugly */
514 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
)
515 fprintf(stderr
, "Error reading (2) %s\n", sqlite3_errmsg(mainview
->db
));
517 sqlite3_finalize(stmt
);
520 setBusy(mainview
, 2);
524 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error loading memo"));
528 gboolean
treeview_canselect(GtkTreeSelection
* selection
, GtkTreeModel
* model
, GtkTreePath
* path
, gboolean path_currently_selected
, gpointer userdata
)
530 MainView
*mainview
= NULL
;
532 mainview
= (MainView
*) userdata
;
533 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
535 if (mainview
->loading
==FALSE
)
537 #ifndef EXPANDING_ROWS
538 if (path_currently_selected
)
542 #ifndef NEW_SEL_LOGIC
543 saveCurrentData(mainview
);
545 if (path_currently_selected
)
548 gtk_tree_model_get_iter(model
, &iter
, path
);
550 gtk_tree_model_get(model
, &iter
, NODE_DATA
, &(mainview
->cansel_node
), -1);
551 mainview
->cansel_time
=time(NULL
);
552 /* fprintf(stderr, "[SELLOGIC] canselect called for node %d\n", nd->sql3id);*/
559 gboolean
newnodedlg_key_press_cb(GtkWidget
* widget
, GdkEventKey
* event
, GtkWidget
* dlg
)
561 SketchWidget
*s
= gtk_object_get_data(GTK_OBJECT(dlg
), "sk");
563 switch (event
->keyval
)
566 sketchwidget_redo(s
);
569 sketchwidget_undo(s
);
576 void new_node_dialog(nodeType typ
, MainView
* mainview
)
578 GtkWidget
*dialog
, *label
, *entry
, *but_ok
, *but_cancel
, *vbox
, *hbox
, *al
, *cb
, *rb1
, *rb2
;
580 dialog
= gtk_dialog_new();
582 g_signal_connect(G_OBJECT(dialog
), "key_press_event", G_CALLBACK(newnodedlg_key_press_cb
), dialog
);
584 GtkWidget
*notebook
= gtk_notebook_new();
586 vbox
= gtk_vbox_new(FALSE
, 0);
587 gtk_container_border_width(GTK_CONTAINER(vbox
), 15);
589 hbox
= gtk_hbox_new(FALSE
, 0);
591 rb1
=gtk_radio_button_new_with_label(NULL
, _("Text memo"));
592 gtk_box_pack_start(GTK_BOX(hbox
), rb1
, FALSE
, FALSE
, 0);
593 gtk_object_set_data(GTK_OBJECT(dialog
), "rbt", rb1
);
595 rb2
=gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(rb1
)), _("Sketch memo"));
596 gtk_box_pack_start(GTK_BOX(hbox
), rb2
, FALSE
, FALSE
, 0);
597 gtk_object_set_data(GTK_OBJECT(dialog
), "rbs", rb2
);
599 if (typ
==NODE_TEXT
) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb1
), TRUE
);
600 else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb2
), TRUE
);
602 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->vbox
), hbox
);
604 label
= gtk_label_new(_("Text name"));
605 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), vbox
, label
);
606 label
= gtk_label_new(_("Please name the memo:"));
607 entry
= gtk_entry_new_with_max_length(64);
608 gtk_entry_set_text(GTK_ENTRY(entry
), _("New memo"));
609 gtk_editable_select_region(GTK_EDITABLE(entry
), 0, -1);
611 gtk_box_pack_start(GTK_BOX(vbox
), label
, FALSE
, FALSE
, 0);
612 gtk_box_pack_start(GTK_BOX(vbox
), entry
, FALSE
, FALSE
, 0);
614 vbox
= gtk_vbox_new(FALSE
, 0);
615 gtk_container_border_width(GTK_CONTAINER(vbox
), 15);
616 label
= gtk_label_new(_("Sketch name"));
617 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), vbox
, label
);
619 label
= gtk_label_new(_("Please name the memo:"));
621 al
= gtk_alignment_new(0.5, 0.5, 0, 0);
623 SketchWidget
*s
= sketchwidget_new(SKETCHNODE_X
, SKETCHNODE_Y
, TRUE
);
625 sketchwidget_set_brushsize(s
, 2);
626 sketchwidget_set_backstyle(s
, SKETCHBACK_GRAPH
);
628 gtk_widget_set_size_request(sketchwidget_get_mainwidget(s
), SKETCHNODE_X
, SKETCHNODE_Y
);
629 gtk_container_add(GTK_CONTAINER(al
), sketchwidget_get_mainwidget(s
));
631 gtk_box_pack_start(GTK_BOX(vbox
), label
, FALSE
, FALSE
, 0);
632 gtk_box_pack_start(GTK_BOX(vbox
), al
, FALSE
, FALSE
, 0);
634 but_ok
= gtk_button_new_with_label(_("Create"));
635 but_cancel
= gtk_button_new_with_label(_("Cancel"));
636 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->action_area
), but_ok
);
637 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->action_area
), but_cancel
);
639 gtk_object_set_user_data(GTK_OBJECT(dialog
), entry
);
640 gtk_object_set_data(GTK_OBJECT(dialog
), "m", mainview
);
641 gtk_object_set_data(GTK_OBJECT(dialog
), "sk", s
);
642 gtk_object_set_data(GTK_OBJECT(dialog
), "n", notebook
);
644 nodeType
*tmp
= g_malloc(sizeof(nodeType
)); /*FIXME memleak:not freed on widget_destroy */
646 gtk_object_set_data(GTK_OBJECT(dialog
), "t", tmp
);
648 gtk_signal_connect_object(GTK_OBJECT(but_cancel
), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy
), dialog
);
649 g_signal_connect(G_OBJECT(but_ok
), "clicked", G_CALLBACK(callback_new_node_real
), dialog
);
651 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->vbox
), notebook
);
653 cb
= gtk_check_button_new_with_label("Create as childnode");
654 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb
), mainview
->newnodedialog_createchild
);
655 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->vbox
), cb
);
656 gtk_object_set_data(GTK_OBJECT(dialog
), "cb", cb
);
658 gtk_widget_grab_focus(entry
);
660 gtk_widget_show_all(dialog
);
661 gtk_window_set_modal(GTK_WINDOW(dialog
), TRUE
);
664 void add_new_node(nodeData
* node
, MainView
* mainview
, gboolean ischild
)
666 GtkTreeIter parentiter
, newiter
;
670 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(mainview
->treeview
));
672 if (gtk_tree_selection_get_selected(selection
, &model
, &parentiter
))
675 GtkTreePath
*path
= NULL
;
677 unsigned int parentnodeid
= 0;
681 path
= gtk_tree_model_get_path(model
, &parentiter
);
683 if (ischild
== FALSE
)
685 gboolean tmp
= gtk_tree_path_up(path
);
687 if (gtk_tree_path_get_depth(path
) > 0)
689 if (gtk_tree_model_get_iter(model
, &parentiter
, path
))
692 else if (tmp
== TRUE
)
694 gtk_tree_path_down(path
); /*restore path so expand() works */
703 gtk_tree_model_get(model
, ptr
, NODE_DATA
, &nd
, -1);
705 parentnodeid
= nd
->sql3id
;
711 sqlite3_stmt
*stmt
= NULL
;
718 snprintf(tq
, sizeof(tq
), "INSERT INTO %s (parent, bodytype, name, nameblob, ord) VALUES (%d, %d, ?, ?, 0);", datatable_tmpname
, parentnodeid
, node
->typ
);
719 int rc
= sqlite3_prepare(mainview
->db
, tq
, strlen(tq
), &stmt
, &dum
);
723 fprintf(stderr
, "Error inserting(1): %s\n", sqlite3_errmsg(mainview
->db
));
726 if (node
->name
!= NULL
)
727 sqlite3_bind_text(stmt
, 1, node
->name
, strlen(node
->name
), SQLITE_TRANSIENT
);
729 sqlite3_bind_text(stmt
, 1, NULL
, 0, SQLITE_TRANSIENT
);
731 if (node
->namepix
!= NULL
)
733 gchar
*namepixdata
= NULL
;
738 if (gdk_pixbuf_save_to_buffer(node
->namepix
, &namepixdata
, &datalen
, "png", &err
, NULL
) == FALSE
)
742 fprintf(stderr
, "Error saving name! %s\n", err
->message
);
745 sqlite3_bind_blob(stmt
, 2, namepixdata
, datalen
, SQLITE_TRANSIENT
);
748 sqlite3_bind_blob(stmt
, 2, NULL
, 0, SQLITE_TRANSIENT
);
751 while(rc
== SQLITE_BUSY
)
753 rc
= sqlite3_step(stmt
);
754 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
757 sqlite3_finalize(stmt
);
758 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
)
760 fprintf(stderr
, "Error inserting(2): %s\n", sqlite3_errmsg(mainview
->db
));
763 node
->sql3id
= sqlite3_last_insert_rowid(mainview
->db
);
767 if (node
->sql3id
== 0)
772 g_object_unref(node
->namepix
);
775 gtk_tree_path_free(path
);
776 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, "Error creating node");
780 fprintf(stderr
, "new node id is %d\n", node
->sql3id
);
783 gtk_tree_store_append(GTK_TREE_STORE(model
), &newiter
, ptr
);
785 gtk_tree_store_set(GTK_TREE_STORE(model
), &newiter
, NODE_NAME
, node
->name
, NODE_PIXBUF
, node
->namepix
, NODE_DATA
, node
, -1);
789 mainview
->loading
=TRUE
; /*only when we have a valid parent*/
790 gtk_tree_view_expand_row(GTK_TREE_VIEW(mainview
->treeview
), path
, FALSE
);
791 gtk_tree_path_free(path
);
794 gtk_tree_selection_select_iter(selection
, &newiter
);
796 mainview
->loading
=FALSE
;
799 void callback_new_node_real(GtkAction
* action
, gpointer data
)
803 GtkWidget
*dialog
= data
;
804 GtkWidget
*entry
= gtk_object_get_user_data(GTK_OBJECT(dialog
));
806 mainview
= gtk_object_get_data(GTK_OBJECT(dialog
), "m");
807 SketchWidget
*s
= gtk_object_get_data(GTK_OBJECT(dialog
), "sk");
808 GtkWidget
*notebook
= gtk_object_get_data(GTK_OBJECT(dialog
), "n");
809 GtkWidget
*cb
= gtk_object_get_data(GTK_OBJECT(dialog
), "cb");
810 /* nodeType *typ = gtk_object_get_data(GTK_OBJECT(dialog), "t");*/
812 nodeType typ
= NODE_TEXT
;
814 /* GtkWidget *rbt = gtk_object_get_data(GTK_OBJECT(dialog), "rbt");*/
815 GtkWidget
*rbs
= gtk_object_get_data(GTK_OBJECT(dialog
), "rbs");
816 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rbs
))) typ
=NODE_SKETCH
;
819 gint t
= gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook
));
822 GdkPixbuf
*pixbuf
= NULL
;
826 txt
= g_strdup(gtk_entry_get_text(GTK_ENTRY(entry
)));
827 if (strcmp(txt
, "") == 0)
835 GtkWidget
*sdr
= sketchwidget_get_drawingarea(s
);
837 GdkPixmap
*spix
= sketchwidget_get_Pixmap(s
);
839 pixbuf
= gdk_pixbuf_get_from_drawable(NULL
, GDK_DRAWABLE(spix
), NULL
, 0, 0, 0, 0, sdr
->allocation
.width
, sdr
->allocation
.height
);
840 g_object_unref(spix
);
842 GdkPixbuf
*pixbuf2
= sketchwidget_trim_image(pixbuf
, SKETCHNODE_X
, SKETCHNODE_Y
, &w
,
844 if (pixbuf2
==NULL
) return;
846 GdkPixbuf
*pixbuf3
= gdk_pixbuf_new(GDK_COLORSPACE_RGB
, FALSE
, 8, SKETCHNODE_RX
,
849 gdk_pixbuf_fill(pixbuf3
, 0xffffffff);
851 if (w
<= SKETCHNODE_RX
&& h
<= SKETCHNODE_RY
)
853 gdk_pixbuf_copy_area(pixbuf2
, 0, 0, w
, h
, pixbuf3
, 0, (SKETCHNODE_RY
- h
) / 2);
861 neww
= SKETCHNODE_RX
;
862 newh
= (h
/ w
) * SKETCHNODE_RX
;
866 newh
= SKETCHNODE_RY
;
867 neww
= (w
/ h
) * SKETCHNODE_RY
;
869 if (newh
> SKETCHNODE_RY
)
870 newh
= SKETCHNODE_RY
; /*FIXME: newh exceeds SKETCHNODE_RY sometimes */
872 GdkPixbuf
*tmpbuf
= gdk_pixbuf_scale_simple(pixbuf2
, neww
, newh
,
873 GDK_INTERP_BILINEAR
);
875 gdk_pixbuf_copy_area(tmpbuf
, 0, 0, neww
, newh
, pixbuf3
, 0, (SKETCHNODE_RY
- newh
) / 2);
877 gdk_pixbuf_unref(tmpbuf
);
881 gdk_pixbuf_unref(pixbuf2
);
886 node
= g_malloc(sizeof(nodeData
));
891 node
->namepix
= NULL
;
899 node
->namepix
= pixbuf
;
906 mainview
->newnodedialog_createchild
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb
));
907 add_new_node(node
, mainview
, mainview
->newnodedialog_createchild
);
909 sketchwidget_destroy(s
);
910 gtk_widget_destroy(dialog
);
911 mainview
->file_edited
= TRUE
;
917 void callback_file_delete_node(GtkAction
* action
, gpointer data
)
919 MainView
*mainview
= NULL
;
921 mainview
= (MainView
*) data
;
922 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
924 if (getSelectedNode(mainview
) == NULL
)
926 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Select a node first"));
930 GtkWidget
*dialog
, *label
, *but_ok
, *but_cancel
;
932 dialog
= gtk_dialog_new();
934 label
= gtk_label_new(_("Are you sure?"));
936 but_ok
= gtk_button_new_with_label(_("Yes, Delete"));
937 but_cancel
= gtk_button_new_with_label(_("Cancel"));
939 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->action_area
), but_ok
);
940 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->action_area
), but_cancel
);
942 gtk_object_set_user_data(GTK_OBJECT(dialog
), mainview
);
944 gtk_signal_connect_object(GTK_OBJECT(but_cancel
), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy
), dialog
);
945 g_signal_connect(G_OBJECT(but_ok
), "clicked", G_CALLBACK(callback_delete_node_real
), dialog
);
947 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->vbox
), label
);
949 gtk_widget_show_all(dialog
);
950 gtk_window_set_modal(GTK_WINDOW(dialog
), TRUE
);
953 void callback_file_expand_collapse_node(GtkAction
* action
, gpointer data
)
955 MainView
*mainview
= NULL
;
957 mainview
= (MainView
*) data
;
958 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
963 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(mainview
->treeview
));
965 if (!gtk_tree_selection_get_selected(selection
, &model
, &iter
))
967 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Select a node first"));
971 GtkTreePath
*path
= gtk_tree_model_get_path(model
, &iter
);
972 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(mainview
->treeview
), path
)==FALSE
)
974 gtk_tree_view_expand_row(GTK_TREE_VIEW(mainview
->treeview
), path
, FALSE
);
978 gtk_tree_view_collapse_row(GTK_TREE_VIEW(mainview
->treeview
), path
);
981 gtk_tree_path_free(path
);
984 void callback_file_export_node(GtkAction
* action
, gpointer data
)
986 MainView
*mainview
= NULL
;
988 mainview
= (MainView
*) data
;
989 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
991 nodeData
*nd
=getSelectedNode(mainview
);
994 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Select a node first"));
998 gchar
*nodename
=nd
->name
;
999 if (nodename
==NULL
) nodename
="saved node";
1001 if (nd
->typ
== NODE_TEXT
)
1003 GtkTextIter begin
, end
;
1004 gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER(mainview
->buffer
), &begin
, &end
);
1005 gchar
*text
= gtk_text_buffer_get_slice(GTK_TEXT_BUFFER(mainview
->buffer
), &begin
, &end
, TRUE
);
1006 if (text
==NULL
|| !strcmp(text
, ""))
1008 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Node is empty"));
1012 gchar
*fn
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_SAVE
, nodename
, "txt");
1015 GnomeVFSResult vfs_result
;
1016 GnomeVFSHandle
*handle
= NULL
;
1017 GnomeVFSFileSize out_bytes
;
1018 vfs_result
= gnome_vfs_create(&handle
, fn
, GNOME_VFS_OPEN_WRITE
, 0, 0600);
1019 if ( vfs_result
!= GNOME_VFS_OK
) {
1020 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Export failed"));
1024 gnome_vfs_write(handle
, text
, strlen(text
), &out_bytes
);
1025 gnome_vfs_close(handle
);
1026 if (out_bytes
==strlen(text
)) hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Exported"));
1027 else hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Export incomplete"));
1034 else if (nd
->typ
== NODE_SKETCH
)
1036 GdkPixmap
*skpix
= sketchwidget_get_Pixmap(mainview
->sk
);
1037 GtkWidget
*skdr
= sketchwidget_get_drawingarea(mainview
->sk
);
1038 GdkPixbuf
*pixbuf
= gdk_pixbuf_get_from_drawable(NULL
, GDK_DRAWABLE(skpix
), NULL
, 0, 0, 0, 0, skdr
->allocation
.width
, skdr
->allocation
.height
);
1041 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Node is empty"));
1045 gchar
*fn
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_SAVE
, nodename
, "png");
1048 if (gdk_pixbuf_save(pixbuf
, fn
, "png", NULL
, NULL
)==FALSE
)
1050 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Export failed"));
1054 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Exported"));
1059 g_object_unref(skpix
);
1063 gboolean
ref2iter(GtkTreeModel
* model
, GtkTreeRowReference
* ref
, GtkTreeIter
* iter
)
1065 gboolean res
= FALSE
;
1066 GtkTreePath
*path
= gtk_tree_row_reference_get_path(ref
);
1068 if (gtk_tree_model_get_iter(model
, iter
, path
))
1072 gtk_tree_path_free(path
);
1076 GtkTreeRowReference
*iter2ref(GtkTreeModel
* model
, GtkTreeIter
* iter
)
1078 GtkTreeRowReference
*ref
;
1080 GtkTreePath
*path
= gtk_tree_model_get_path(model
, iter
);
1082 ref
= gtk_tree_row_reference_new(model
, path
);
1083 gtk_tree_path_free(path
);
1087 void move_nodes_up(GtkTreeModel
* model
, GtkTreeRowReference
* topnode
, GtkTreeRowReference
* newtop
)
1089 GtkTreeIter topiter
;
1091 fprintf(stderr
, "here2\n");
1093 if (ref2iter(model
, topnode
, &topiter
) == FALSE
)
1096 fprintf(stderr
, "here3\n");
1100 if (gtk_tree_model_iter_children(model
, &child
, &topiter
))
1102 fprintf(stderr
, "here4\n");
1103 GtkTreeRowReference
*ref
;
1104 GList
*rr_list
= NULL
, *node
;
1108 ref
= iter2ref(model
, &child
);
1109 rr_list
= g_list_append(rr_list
, ref
);
1111 while(gtk_tree_model_iter_next(model
, &child
));
1114 * got a reflist for all children
1117 fprintf(stderr
, "here5\n");
1118 for(node
= rr_list
; node
; node
= node
->next
)
1120 ref
= (GtkTreeRowReference
*) (node
->data
);
1121 if (ref2iter(model
, ref
, &child
))
1123 GtkTreeIter newtopiter
, newiter
;
1124 GtkTreeIter
*newtopiterptr
;
1126 if (ref2iter(model
, newtop
, &newtopiter
))
1127 newtopiterptr
= &newtopiter
;
1129 newtopiterptr
= NULL
;
1133 gtk_tree_model_get(model
, &child
, NODE_DATA
, &node
, -1);
1135 gtk_tree_store_append(GTK_TREE_STORE(model
), &newiter
, newtopiterptr
);
1136 gtk_tree_store_set(GTK_TREE_STORE(model
), &newiter
, NODE_NAME
, node
->name
, NODE_PIXBUF
, node
->namepix
, NODE_DATA
, node
, -1);
1138 GtkTreeRowReference
*newref
= iter2ref(model
, &newiter
);
1140 move_nodes_up(model
, ref
, newref
);
1141 gtk_tree_row_reference_free(newref
);
1143 gtk_tree_store_remove(GTK_TREE_STORE(model
), &child
);
1145 gtk_tree_row_reference_free(ref
);
1147 fprintf(stderr
, "here6\n");
1149 g_list_free(rr_list
);
1152 fprintf(stderr
, "here7\n");
1156 void callback_delete_node_real(GtkAction
* action
, gpointer data
)
1160 GtkWidget
*dialog
= data
;
1162 mainview
= gtk_object_get_user_data(GTK_OBJECT(dialog
));
1165 GtkTreeModel
*model
;
1167 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(mainview
->treeview
));
1169 if (!gtk_tree_selection_get_selected(selection
, &model
, &iter
))
1174 gtk_tree_model_get(model
, &iter
, NODE_DATA
, &nd
, -1);
1178 mainview
->file_edited
= TRUE
;
1180 unsigned int sql3id
= nd
->sql3id
;
1187 * if (nd->pix) g_object_unref(nd->pix);
1191 fprintf(stderr
, "here1\n");
1192 GtkTreeRowReference
*upref
= NULL
, *ref
= NULL
;
1194 GtkTreePath
*path
= gtk_tree_model_get_path(model
, &iter
);
1196 ref
= gtk_tree_row_reference_new(model
, path
);
1197 if (gtk_tree_path_up(path
))
1198 upref
= gtk_tree_row_reference_new(model
, path
);
1199 gtk_tree_path_free(path
);
1201 g_object_ref(model
);
1202 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), NULL
);
1204 fprintf(stderr
, "here! 1\n");
1205 move_nodes_up(model
, ref
, upref
);
1207 fprintf(stderr
, "here! 2\n");
1208 if (ref2iter(model
, ref
, &iter
))
1212 snprintf(tq
, sizeof(tq
), "SELECT parent FROM %s WHERE nodeid=%d", datatable_tmpname
, sql3id
);
1213 sqlite3_stmt
*stmt
= NULL
;
1215 int rc
= sqlite3_prepare(mainview
->db
, tq
, strlen(tq
), &stmt
, &dum
);
1216 unsigned int sql3parentid
= 0;
1220 fprintf(stderr
, "Error %s\n", sqlite3_errmsg(mainview
->db
));
1225 while(rc
== SQLITE_BUSY
|| rc
== SQLITE_ROW
)
1227 rc
= sqlite3_step(stmt
);
1228 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
1230 else if (rc
== SQLITE_ROW
)
1232 sql3parentid
= sqlite3_column_int(stmt
, 0);
1236 sqlite3_finalize(stmt
);
1238 snprintf(tq
, sizeof(tq
), "UPDATE %s SET parent=%d WHERE parent=%d;", datatable_tmpname
, sql3parentid
, sql3id
);
1239 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
1240 fprintf(stderr
, "ERROR moving nodes up!\n");
1243 snprintf(tq
, sizeof(tq
), "DELETE FROM %s WHERE nodeid=%d;", datatable_tmpname
, sql3id
);
1244 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
1245 fprintf(stderr
, "ERROR deleting node!\n");
1248 gtk_tree_store_remove(GTK_TREE_STORE(model
), &iter
);
1251 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), model
);
1252 g_object_unref(model
);
1254 fprintf(stderr
, "here! 3\n");
1255 gtk_tree_row_reference_free(ref
);
1256 gtk_tree_row_reference_free(upref
);
1258 gtk_tree_view_expand_all(GTK_TREE_VIEW(mainview
->treeview
));
1260 fprintf(stderr
, "here10\n");
1261 gtk_widget_destroy(dialog
);
1264 void callback_edit_clear(GtkAction
* action
, gpointer data
)
1266 MainView
*mainview
= NULL
;
1268 mainview
= (MainView
*) data
;
1269 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1271 nodeData
*nd
= getSelectedNode(mainview
);
1273 if (nd
->typ
== NODE_TEXT
) gtk_text_buffer_set_text(GTK_TEXT_BUFFER(mainview
->buffer
), "", 0);
1274 else if (nd
->typ
== NODE_SKETCH
) sketchwidget_clear(mainview
->sk
);
1280 void callback_edit_cut(GtkAction
* action
, gpointer data
)
1282 MainView
*mainview
= NULL
;
1284 mainview
= (MainView
*) data
;
1285 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1287 nodeData
*nd
= getSelectedNode(mainview
);
1289 if (nd
->typ
== NODE_TEXT
)
1290 gtk_text_buffer_cut_clipboard(GTK_TEXT_BUFFER(mainview
->buffer
), mainview
->clipboard
, TRUE
);
1291 else if (nd
->typ
== NODE_SKETCH
)
1292 if (sketchwidget_cut(mainview
->sk
, mainview
->clipboard
)==FALSE
)
1293 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error cutting"));
1299 void callback_edit_copy(GtkAction
* action
, gpointer data
)
1302 * connect pointer to our MainView struct
1304 MainView
*mainview
= NULL
;
1306 mainview
= (MainView
*) data
;
1307 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1309 nodeData
*nd
= getSelectedNode(mainview
);
1311 if (nd
->typ
== NODE_TEXT
)
1312 gtk_text_buffer_copy_clipboard(GTK_TEXT_BUFFER(mainview
->buffer
), mainview
->clipboard
);
1313 else if (nd
->typ
== NODE_SKETCH
)
1314 if (sketchwidget_copy(mainview
->sk
, mainview
->clipboard
)==FALSE
)
1315 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error copying"));
1321 void callback_edit_paste(GtkAction
* action
, gpointer data
)
1324 * connect pointer to our MainView struct
1326 MainView
*mainview
= NULL
;
1328 mainview
= (MainView
*) data
;
1329 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1331 nodeData
*nd
= getSelectedNode(mainview
);
1333 if (nd
->typ
== NODE_TEXT
)
1334 gtk_text_buffer_paste_clipboard(GTK_TEXT_BUFFER(mainview
->buffer
), mainview
->clipboard
, NULL
, TRUE
);
1335 else if (nd
->typ
== NODE_SKETCH
)
1336 if (sketchwidget_paste(mainview
->sk
, mainview
->clipboard
)==FALSE
)
1337 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error pasting"));
1339 mainview
->file_edited
= TRUE
;
1342 gint
cb_popup(GtkWidget
* widget
, GdkEvent
* event
)
1345 GdkEventButton
*event_button
;
1348 * The "widget" is the menu that was supplied when
1349 * * g_signal_connect_swapped() was called.
1351 menu
= GTK_MENU(widget
);
1352 event_button
= (GdkEventButton
*) event
;
1353 if (event
->type
== GDK_BUTTON_PRESS
&& event_button
->button
== 3)
1355 gtk_menu_popup(menu
, NULL
, NULL
, NULL
, NULL
, event_button
->button
, event_button
->time
);
1364 gboolean
closefile(MainView
* mainview
)
1366 saveCurrentData(mainview
);
1368 if (mainview
->file_edited
)
1370 HildonNote
*hn
= HILDON_NOTE(hildon_note_new_confirmation_add_buttons(GTK_WINDOW(mainview
->data
->main_view
), _("Save changes?"), _("Yes"), CONFRESP_YES
, _("No"), CONFRESP_NO
, _("Cancel"), CONFRESP_CANCEL
, NULL
, NULL
));
1371 gint answer
= gtk_dialog_run(GTK_DIALOG(hn
));
1372 gtk_widget_destroy(GTK_WIDGET(hn
));
1374 if (answer
== CONFRESP_CANCEL
)
1376 else if (answer
== CONFRESP_YES
)
1378 if (mainview
->file_name
== NULL
)
1380 mainview
->file_name
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_SAVE
, "maemopaddata", "db");
1382 write_buffer_to_file(mainview
);
1387 sqlite3_close(mainview
->db
);
1388 mainview
->db
= NULL
;
1392 gboolean
callback_file_close(GtkAction
* action
, gpointer data
)
1395 MainView
*mainview
= NULL
;
1397 mainview
= (MainView
*) data
;
1398 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1399 if (closefile(mainview
) == FALSE
)
1406 void callback_file_new_node(GtkAction
* action
, gpointer data
)
1408 MainView
*mainview
= NULL
;
1410 mainview
= (MainView
*) data
;
1411 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1413 nodeType typ
= NODE_SKETCH
;
1415 nodeData
*nd
= getSelectedNode(mainview
);
1420 new_node_dialog(typ
, mainview
);
1426 void callback_file_new(GtkAction
* action
, gpointer data
)
1428 MainView
*mainview
= NULL
;
1430 mainview
= (MainView
*) data
;
1431 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1433 gchar
*filename
= NULL
;
1435 if (closefile(mainview
) == FALSE
)
1438 filename
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_SAVE
, "memos", "db");
1439 if (filename
== NULL
)
1446 setBusy(mainview
, 1);
1450 rc
= sqlite3_open(filename
, &mainview
->db
);
1453 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error 1"));
1454 fprintf(stderr
, "Can't create database %s: %s\n", filename
, sqlite3_errmsg(mainview
->db
));
1459 snprintf(tq
, sizeof(tq
), "CREATE TABLE %s%s", misctable_name
, misctable
);
1460 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
1462 snprintf(tq
, sizeof(tq
), "CREATE TABLE %s%s", datatable_name
, datatable
);
1463 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
1465 fprintf(stderr
, "ERROR creating data table\n");
1466 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error 2"));
1471 sqlite3_close(mainview
->db
);
1472 mainview
->db
= NULL
;
1474 mainview
->file_name
= filename
;
1475 mainview
->file_edited
= FALSE
;
1476 read_file_to_buffer(mainview
);
1478 /*add a starter memo*/
1480 node
= g_malloc(sizeof(nodeData
));
1481 node
->typ
= NODE_SKETCH
;
1482 node
->name
= _("My first memo");
1483 node
->namepix
= NULL
;
1487 add_new_node(node
, mainview
, TRUE
);
1488 gtk_paned_set_position(GTK_PANED(mainview
->hpaned
), 180);
1489 mainview
->viewflags
= 3;
1490 callback_setview(mainview
, 1);
1491 write_buffer_to_file(mainview
);
1494 setBusy(mainview
, 0);
1497 gboolean
reset_ctree(GtkTreeModel
* model
, GtkTreePath
* path
, GtkTreeIter
* iter
, gpointer data
)
1501 gtk_tree_model_get(model
, iter
, NODE_DATA
, &node
, -1);
1507 g_object_unref(node
->namepix
);
1510 gtk_tree_store_set(GTK_TREE_STORE(model
), iter
, NODE_DATA
, NULL
, -1);
1515 void new_file(MainView
* mainview
)
1517 setBusy(mainview
, 1);
1519 * clear buffer, filename and free buffer text
1521 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(mainview
->buffer
), "", -1);
1522 mainview
->file_name
= NULL
;
1523 mainview
->file_edited
= FALSE
;
1524 mainview
->newnodedialog_createchild
= TRUE
;
1526 GtkTreeModel
*model
= gtk_tree_view_get_model(GTK_TREE_VIEW(mainview
->treeview
));
1528 g_object_ref(model
);
1529 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), NULL
);
1531 gtk_tree_model_foreach(model
, (GtkTreeModelForeachFunc
) reset_ctree
, (gpointer
) mainview
);
1535 * gtk_tree_store_clear(GTK_TREE_STORE(model));
1537 GtkTreePath
*path
= gtk_tree_path_new_from_indices(0, -1);
1540 if (gtk_tree_model_get_iter(model
, &iter
, path
))
1544 gtk_tree_store_remove(GTK_TREE_STORE(model
), &iter
);
1546 while(gtk_tree_store_iter_is_valid(GTK_TREE_STORE(model
), &iter
));
1548 gtk_tree_path_free(path
);
1550 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), model
);
1551 g_object_unref(model
);
1553 prepareUIforNodeChange(mainview
, NODE_UNKNOWN
);
1554 setBusy(mainview
, 2);
1560 void callback_file_open(GtkAction
* action
, gpointer data
)
1562 gchar
*filename
= NULL
;
1563 MainView
*mainview
= NULL
;
1565 mainview
= (MainView
*) data
;
1566 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1568 if (closefile(mainview
) == FALSE
)
1574 filename
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_OPEN
, NULL
, NULL
);
1577 * if we got a file name from chooser -> open file
1579 open_file(filename
, mainview
);
1583 gboolean
open_file(gchar
* filename
, MainView
* mainview
)
1587 setBusy(mainview
, 1);
1589 while(filename
!= NULL
)
1593 if (stat(filename
, &s
) == -1) break;
1595 mainview
->file_name
= g_strdup(filename
);
1596 gboolean res
= read_file_to_buffer(mainview
);
1600 g_free(mainview
->file_name
);
1601 mainview
->file_name
= NULL
;
1604 mainview
->file_edited
= FALSE
;
1609 setBusy(mainview
, 2);
1613 void callback_about_link(GtkAction
* action
, gpointer data
)
1615 MainView
*mainview
= NULL
;
1617 mainview
= (MainView
*) data
;
1618 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1620 osso_rpc_run_with_defaults(mainview
->data
->osso
, "osso_browser", OSSO_BROWSER_OPEN_NEW_WINDOW_REQ
, NULL
,
1621 DBUS_TYPE_STRING
, "http://garage.maemo.org/projects/maemopadplus/", DBUS_TYPE_INVALID
);
1624 void callback_about(GtkAction
* action
, gpointer data
)
1627 MainView
*mainview
= NULL
;
1628 mainview
= (MainView
*) data
;
1632 d
= gtk_dialog_new();
1633 gtk_container_border_width(GTK_CONTAINER(d
), 15);
1637 snprintf(tmp
, sizeof(tmp
), "Maemopad+ %s", VERSION
);
1638 w
= gtk_button_new_with_label(tmp
);
1639 g_object_set(w
, "relief", GTK_RELIEF_NONE
, NULL
);
1640 g_object_set(w
, "focus-on-click", FALSE
, NULL
);
1641 g_signal_connect(G_OBJECT(w
), "clicked", G_CALLBACK(callback_about_link
), mainview
);
1642 gtk_container_add (GTK_CONTAINER(GTK_DIALOG(d
)->vbox
), w
);
1644 w
= gtk_label_new("\nLicense: LGPL\nAuthor: Kemal 'disq' Hadimli <disqkk@gmail.com>\n");
1645 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(d
)->vbox
), w
);
1647 w
= gtk_button_new_with_label(_("Close"));
1648 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(d
)->action_area
), w
);
1649 gtk_signal_connect_object(GTK_OBJECT(w
), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy
), d
);
1651 gtk_widget_show_all(d
);
1652 gtk_window_set_modal(GTK_WINDOW(d
), TRUE
);
1656 MainView
*mainview
=(MainView
*)data
;
1657 const char *authors
[]={"Kemal 'disq' Hadimli <disqkk@gmail.com>", NULL
};
1658 gtk_show_about_dialog(GTK_WINDOW(mainview
->data
->main_view
), "name", "Maemopad+", "authors", authors
, "copyright", "\xc2\xa9 2006 Kemal 'disq' Hadimli <disqkk@gmail.com>", "license", "GPL", "version", VERSION
, "website", "http://garage.maemo.org/projects/maemopadplus/", "comments", "Based on Nokia's MaemoPad", NULL
);
1666 void callback_file_save(GtkAction
* action
, gpointer data
)
1668 gchar
*filename
= NULL
;
1669 MainView
*mainview
= NULL
;
1671 mainview
= (MainView
*) data
;
1672 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1675 * check is we had a new file
1677 if (mainview
->file_name
!= NULL
)
1679 write_buffer_to_file(mainview
);
1683 filename
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_SAVE
, "maemopaddata", "db");
1685 * if we got a file name from chooser -> save file
1687 if (filename
!= NULL
)
1689 mainview
->file_name
= filename
;
1690 write_buffer_to_file(mainview
);
1691 mainview
->file_edited
= FALSE
;
1696 void callback_shapemenu(GtkAction
* action
, GtkWidget
* wid
)
1698 int style
= (int)gtk_object_get_user_data(GTK_OBJECT(wid
));
1699 MainView
*mainview
= gtk_object_get_data(GTK_OBJECT(wid
), "m");
1701 g_assert(mainview
!= NULL
);
1703 if (style
==0) sketchwidget_set_shape(mainview
->sk
, SKETCHSHAPE_FREEHAND
);
1704 else if (style
==1) sketchwidget_set_shape(mainview
->sk
, SKETCHSHAPE_LINE
);
1705 else if (style
==2) sketchwidget_set_shape(mainview
->sk
, SKETCHSHAPE_RECT
);
1706 else if (style
==3) sketchwidget_set_shape(mainview
->sk
, SKETCHSHAPE_ELLIPSE
);
1711 void callback_eraser(GtkAction
* action
, MainView
* mainview
)
1713 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1715 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->eraser_tb
)) == TRUE
)
1723 sketchwidget_set_brushcolor(mainview
->sk
, c2
);
1724 mainview
->brushsize_backup
= sketchwidget_get_brushsize(mainview
->sk
);
1725 guint ers
=(mainview
->brushsize_backup
*4)+4;
1726 sk_set_brushsize(mainview
, ers
);
1727 sketchwidget_set_brushsize(mainview
->sk
, ers
); /*fixme:to override max brush size, not pretty*/
1731 GdkColor
*col
= hildon_color_button_get_color(HILDON_COLOR_BUTTON(mainview
->colorbutton
));
1736 c2
.green
= col
->green
;
1737 c2
.blue
= col
->blue
;
1739 sketchwidget_set_brushcolor(mainview
->sk
, c2
);
1740 sk_set_brushsize(mainview
, mainview
->brushsize_backup
);
1744 void callback_toggletree(GtkAction
* action
, MainView
* mainview
)
1746 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1748 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[0]), gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->toggletree_tb
)));
1750 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->toggletree_tb
))==TRUE
)
1751 mainview
->viewflags
|= 1;
1753 mainview
->viewflags
&= ~1;
1755 callback_setview(mainview
, 0);
1758 void callback_menu(GtkAction
* action
, GtkWidget
* menu
)
1760 gtk_menu_popup(GTK_MENU(menu
), NULL
, NULL
, NULL
, NULL
, 0, GDK_CURRENT_TIME
);
1763 void callback_brushsizetb(GtkAction
* action
, MainView
*mainview
)
1765 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1767 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->eraser_tb
)) == TRUE
)
1769 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->eraser_tb
), FALSE
);
1773 callback_menu(NULL
, mainview
->brushsizemenu
);
1777 void callback_brushsize(GtkAction
* action
, GtkWidget
* wid
)
1779 int bsize
= (int)gtk_object_get_user_data(GTK_OBJECT(wid
));
1780 MainView
*mainview
= gtk_object_get_data(GTK_OBJECT(wid
), "m");
1782 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1784 sketchwidget_set_brushsize(mainview
->sk
, bsize
);
1786 GtkWidget
*pix
= gtk_object_get_data(GTK_OBJECT(wid
), "i");
1788 gtk_widget_show(pix
);
1789 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(mainview
->brushsize_tb
), pix
);
1792 void callback_sketchlines(GtkAction
* action
, GtkWidget
* wid
)
1794 int style
= (int)gtk_object_get_user_data(GTK_OBJECT(wid
));
1795 MainView
*mainview
= gtk_object_get_data(GTK_OBJECT(wid
), "m");
1797 g_assert(mainview
!= NULL
);
1799 nodeData
*nd
= getSelectedNode(mainview
);
1800 gboolean doit
= FALSE
;
1802 if (nd
!= NULL
&& nd
->typ
== NODE_SKETCH
)
1804 nd
->flags
&= ~NODEFLAG_SKETCHLINES
;
1805 nd
->flags
&= ~NODEFLAG_SKETCHGRAPH
;
1806 /* sketchwidget_set_edited(mainview->sk, TRUE);*/ /*we call this on openfile, so this messes things up*/
1812 sketchwidget_set_backstyle(mainview
->sk
, SKETCHBACK_NONE
);
1814 else if (style
== 1)
1816 sketchwidget_set_backstyle(mainview
->sk
, SKETCHBACK_LINES
);
1818 nd
->flags
|= NODEFLAG_SKETCHLINES
;
1820 else if (style
== 2)
1822 sketchwidget_set_backstyle(mainview
->sk
, SKETCHBACK_GRAPH
);
1824 nd
->flags
|= NODEFLAG_SKETCHGRAPH
;
1827 GtkWidget
*pix
= gtk_object_get_data(GTK_OBJECT(wid
), "i");
1829 gtk_widget_show(pix
);
1830 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(mainview
->sketchlines_tb
), pix
);
1833 void callback_color(HildonColorButton
* colorButton
, MainView
* mainview
)
1835 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1837 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->eraser_tb
), FALSE
);
1839 GdkColor
*col
= hildon_color_button_get_color(colorButton
);
1844 c2
.green
= col
->green
;
1845 c2
.blue
= col
->blue
;
1847 sketchwidget_set_brushcolor(mainview
->sk
, c2
);
1850 void callback_color_invoke(GtkAction
* action
, gpointer data
)
1852 MainView
*mainview
= NULL
;
1854 mainview
= (MainView
*) data
;
1855 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1857 HildonColorButton
*hc
= HILDON_COLOR_BUTTON(mainview
->colorbutton
);
1859 gtk_button_clicked(GTK_BUTTON(&hc
->button
));
1863 void callback_wordwrap(GtkAction
* action
, MainView
*mainview
)
1865 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1867 nodeData
*nd
= getSelectedNode(mainview
);
1871 if (nd
->typ
== NODE_SKETCH
)
1874 gboolean act
=gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(mainview
->tools_wordwrap
));
1875 if (act
==TRUE
) nd
->flags
|= NODEFLAG_WORDWRAP
;
1876 else nd
->flags
&= ~NODEFLAG_WORDWRAP
;
1878 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(mainview
->textview
), (act
==TRUE
)?GTK_WRAP_WORD
:GTK_WRAP_NONE
);
1882 void callback_font(GtkAction
* action
, gpointer data
)
1884 MainView
*mainview
= NULL
;
1886 mainview
= (MainView
*) data
;
1887 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1889 nodeData
*nd
= getSelectedNode(mainview
);
1893 if (nd
->typ
== NODE_SKETCH
)
1897 PangoFontDescription *new_font = interface_font_chooser(mainview);
1899 if (new_font != NULL)
1901 gtk_widget_modify_font(mainview->textview, new_font);
1904 HildonFontSelectionDialog
*dialog
= HILDON_FONT_SELECTION_DIALOG(hildon_font_selection_dialog_new(NULL
, NULL
));
1906 GtkTextAttributes
*attrs
= gtk_text_view_get_default_attributes(GTK_TEXT_VIEW(mainview
->textview
));
1908 GtkTextIter iter
, iter2
;
1909 if (gtk_text_buffer_get_selection_bounds(mainview
->buffer
, &iter
, &iter2
)==FALSE
) /*no selection*/
1911 if (gtk_text_iter_is_end(&iter
)) gtk_text_iter_backward_char(&iter
);
1912 gtk_text_iter_get_attributes(&iter
, attrs
);
1916 if (attrs
->appearance
.rise
>0 /*==SUPERSCRIPT_RISE*/) ri
=1;
1917 else if (attrs
->appearance
.rise
<0 /*==SUBSCRIPT_LOW*/) ri
=-1;
1919 g_object_set(G_OBJECT(dialog
),
1920 "family", pango_font_description_get_family(attrs
->font
),
1921 "size", (gint
)(pango_font_description_get_size(attrs
->font
) / PANGO_SCALE
),
1922 /* "color", attrs->appearance.fg_color,*/
1923 "bold", pango_font_description_get_weight(attrs
->font
)==PANGO_WEIGHT_BOLD
,
1924 "italic", pango_font_description_get_style(attrs
->font
)==PANGO_STYLE_ITALIC
,
1925 "underline", attrs
->appearance
.underline
,
1926 "strikethrough", attrs
->appearance
.strikethrough
,
1930 if (attrs->appearance!=NULL && attrs->appearance.fg_color)
1932 g_object_set(G_OBJECT(dialog), "color", attrs->appearance.fg_color, NULL);
1935 gtk_widget_show_all(GTK_WIDGET(dialog
));
1936 if (gtk_dialog_run(GTK_DIALOG(dialog
)) == GTK_RESPONSE_OK
)
1938 gboolean bold
, italic
, underline
, strikethrough
;
1939 gchar
*family
= NULL
;
1940 gint size
, position
;
1942 gboolean set_family
, set_size
, set_bold
, set_italic
, set_underline
, set_strikethrough
, set_color
, set_position
;
1944 g_object_get(G_OBJECT(dialog
), "family", &family
, "size", &size
, "bold", &bold
, "italic", &italic
,
1945 "underline", &underline
, "strikethrough", &strikethrough
,
1946 "family-set", &set_family
, "size-set", &set_size
, "bold-set", &set_bold
, "italic-set", &set_italic
,
1947 "underline-set", &set_underline
, "strikethrough-set", &set_strikethrough
,
1948 "color", &color
, "color-set", &set_color
, "position", &position
, "position-set", &set_position
,
1952 PangoFontDescription
*font
= pango_font_description_new();
1953 gboolean set_font
=FALSE
;
1955 if (set_family
) pango_font_description_set_family(font
, family
);
1956 if (set_size
) pango_font_description_set_size(font
, size
* PANGO_SCALE
);
1957 set_font
=set_family
|| set_size
;
1961 if (bold) pango_font_description_set_weight(font, PANGO_WEIGHT_BOLD);
1962 else pango_font_description_set_weight(font, PANGO_WEIGHT_NORMAL);
1966 if (italic) pango_font_description_set_style(font, PANGO_STYLE_ITALIC);
1967 else pango_font_description_set_style(font, PANGO_STYLE_NORMAL);
1972 if (underline) gtk_text_buffer_apply_tag(mainview->buffer, mainview->tag_underline, &iter, &iter2);
1973 else gtk_text_buffer_remove_tag(mainview->buffer, mainview->tag_underline, &iter, &iter2);
1977 if (set_strikethrough
)
1979 tag
= gtk_text_buffer_create_tag(mainview
->buffer
, NULL
, "strikethrough", strikethrough
, NULL
);
1980 gtk_text_buffer_apply_tag(mainview
->buffer
, tag
, &iter
, &iter2
);
1986 GLIB WARNING ** GLib-GObject - IA__g_object_set_valist: object class `GtkTextTag' has no property named `'
1988 tag
= gtk_text_buffer_create_tag(mainview
->buffer
, NULL
, "foreground-gdk", color
, NULL
);
1989 gtk_text_buffer_apply_tag(mainview
->buffer
, tag
, &iter
, &iter2
);
1994 if (position
==1) ri
=SUPERSCRIPT_RISE
;
1995 else if (position
==-1) ri
=SUBSCRIPT_LOW
;
1998 tag
= gtk_text_buffer_create_tag(mainview
->buffer
, NULL
, "rise", ri
, NULL
);
1999 gtk_text_buffer_apply_tag(mainview
->buffer
, tag
, &iter
, &iter2
);
2004 tag
= gtk_text_buffer_create_tag(mainview
->buffer
, NULL
, "font-desc", font
, NULL
);
2005 gtk_text_buffer_apply_tag(mainview
->buffer
, tag
, &iter
, &iter2
);
2012 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_nobold
, &iter
, &iter2
);
2013 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_bold
, &iter
, &iter2
);
2017 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_bold
, &iter
, &iter2
);
2018 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_nobold
, &iter
, &iter2
);
2025 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_noitalic
, &iter
, &iter2
);
2026 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_italic
, &iter
, &iter2
);
2030 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_italic
, &iter
, &iter2
);
2031 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_noitalic
, &iter
, &iter2
);
2038 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_nounderline
, &iter
, &iter2
);
2039 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_underline
, &iter
, &iter2
);
2043 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_underline
, &iter
, &iter2
);
2044 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_nounderline
, &iter
, &iter2
);
2050 tag = gtk_text_buffer_create_tag (mainview->buffer, NULL, "family", family, NULL);
2051 gtk_text_buffer_apply_tag(mainview->buffer, tag, &iter, &iter2);
2055 tag = gtk_text_buffer_create_tag (mainview->buffer, NULL, "size-points", size, NULL);
2056 gtk_text_buffer_apply_tag(mainview->buffer, tag, &iter, &iter2);
2058 if (set_strikethrough)
2060 tag = gtk_text_buffer_create_tag (mainview->buffer, NULL, "strikethrough", strikethrough, NULL);
2061 gtk_text_buffer_apply_tag(mainview->buffer, tag, &iter, &iter2);
2066 gtk_widget_destroy(GTK_WIDGET(dialog
));
2069 void callback_fontstyle(GtkAction
* action
, GtkWidget
* wid
)
2071 MainView
*mainview
= gtk_object_get_data(GTK_OBJECT(wid
), "m");
2072 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2074 nodeData
*nd
= getSelectedNode(mainview
);
2078 if (nd
->typ
== NODE_SKETCH
)
2081 gboolean act
=gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(wid
));
2083 char *tag
= gtk_object_get_data(GTK_OBJECT(wid
), "s");
2086 fprintf(stderr
, "toggled: %s\n", tag
);
2089 GtkTextIter start
, end
;
2090 gtk_text_buffer_get_selection_bounds (mainview
->buffer
, &start
, &end
);
2093 snprintf(tmp
, 64, "no%s", tag
);
2097 gtk_text_buffer_remove_tag_by_name(mainview
->buffer
, tmp
, &start
, &end
);
2098 gtk_text_buffer_apply_tag_by_name(mainview
->buffer
, tag
, &start
, &end
);
2102 gtk_text_buffer_remove_tag_by_name(mainview
->buffer
, tag
, &start
, &end
);
2103 gtk_text_buffer_apply_tag_by_name(mainview
->buffer
, tmp
, &start
, &end
);
2108 void callback_textbuffer_move(GtkTextBuffer
*textbuffer
, GtkTextIter
*arg1
, GtkTextMark
*arg2
, MainView
*mainview
)
2110 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2111 callback_recalc_stylebuttons(mainview
);
2114 void callback_recalc_stylebuttons(MainView
*mainview
)
2116 GtkTextIter iter
, iter2
;
2117 if (gtk_text_buffer_get_selection_bounds(mainview
->buffer
, &iter
, &iter2
)==TRUE
)
2119 /*we have a selection*/
2123 /* this is probably slower
2127 mark=gtk_text_buffer_get_selection_bound(mainview->buffer);
2128 gtk_text_buffer_get_iter_at_mark(mainview->buffer, &iter, mark);
2129 gint i1=gtk_text_iter_get_offset(&iter);
2131 mark=gtk_text_buffer_get_insert(mainview->buffer);
2132 gtk_text_buffer_get_iter_at_mark(mainview->buffer, &iter, mark);
2133 gint i2=gtk_text_iter_get_offset(&iter);
2140 if (mainview
->textbuffer_ignore_next_mark
>0)
2143 fprintf(stderr
, "ignored\n");
2145 mainview
->textbuffer_ignore_next_mark
--;
2150 fprintf(stderr
, "mark\n");
2153 if (gtk_text_iter_is_end(&iter
)) gtk_text_iter_backward_char(&iter
);
2155 GtkTextAttributes
*attrs
= gtk_text_view_get_default_attributes(GTK_TEXT_VIEW(mainview
->textview
));
2156 gtk_text_iter_get_attributes(&iter
, attrs
);
2158 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->bold_tb
), pango_font_description_get_weight(attrs
->font
)==PANGO_WEIGHT_BOLD
);
2159 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->italic_tb
), pango_font_description_get_style(attrs
->font
)==PANGO_STYLE_ITALIC
);
2160 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->underline_tb
), attrs
->appearance
.underline
==PANGO_UNDERLINE_SINGLE
);
2162 gtk_text_attributes_unref(attrs
);
2165 void callback_textbuffer_inserttext(GtkTextBuffer
*buffer
, GtkTextIter
*pos
, const gchar
*text
, gint length
, MainView
*mainview
)
2167 mainview
->textbuffer_ignore_next_mark
=2;
2170 fprintf(stderr
, "length=%d\n", length
);
2173 GtkTextIter
*iter2
= gtk_text_iter_copy(pos
);
2174 gtk_text_iter_backward_chars(iter2
, length
);
2176 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->bold_tb
)))
2178 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_nobold
, pos
, iter2
);
2179 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_bold
, pos
, iter2
);
2183 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_bold
, pos
, iter2
);
2184 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_nobold
, pos
, iter2
);
2187 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->italic_tb
)))
2189 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_noitalic
, pos
, iter2
);
2190 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_italic
, pos
, iter2
);
2194 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_italic
, pos
, iter2
);
2195 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_noitalic
, pos
, iter2
);
2198 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->underline_tb
)))
2200 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_nounderline
, pos
, iter2
);
2201 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_underline
, pos
, iter2
);
2205 gtk_text_buffer_remove_tag(mainview
->buffer
, mainview
->tag_underline
, pos
, iter2
);
2206 gtk_text_buffer_apply_tag(mainview
->buffer
, mainview
->tag_nounderline
, pos
, iter2
);
2209 gtk_text_iter_free(iter2
);
2213 void callback_undo(GtkAction
* action
, MainView
* mainview
)
2215 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2217 nodeData
*nd
= getSelectedNode(mainview
);
2219 if (nd
== NULL
|| nd
->typ
!= NODE_SKETCH
)
2222 sketchwidget_undo(mainview
->sk
);
2225 void callback_redo(GtkAction
* action
, MainView
* mainview
)
2227 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2229 nodeData
*nd
= getSelectedNode(mainview
);
2231 if (nd
== NULL
|| nd
->typ
!= NODE_SKETCH
)
2234 sketchwidget_redo(mainview
->sk
);
2237 void callback_undotoggle(SketchWidget
* sk
, gboolean st
, MainView
* mainview
)
2239 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2241 gtk_widget_set_sensitive(GTK_WIDGET(mainview
->undo_tb
), st
);
2244 void callback_redotoggle(SketchWidget
* sk
, gboolean st
, MainView
* mainview
)
2246 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2248 gtk_widget_set_sensitive(GTK_WIDGET(mainview
->redo_tb
), st
);
2251 void callback_finger(SketchWidget
* sk
, gint x
, gint y
, gdouble pressure
, MainView
* mainview
)
2253 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2255 if ((mainview
->viewflags
& 2) == 0) mainview
->viewflags
|= 2;
2256 else mainview
->viewflags
&= ~2;
2257 callback_setview(mainview
, 1);
2260 gboolean
close_cb(GtkWidget
* widget
, GdkEventAny
* event
, MainView
* mainview
)
2262 callback_file_close(NULL
, mainview
);
2266 gboolean
key_press_cb(GtkWidget
* widget
, GdkEventKey
* event
, MainView
* mainview
)
2268 switch (event
->keyval
)
2273 * gtk_infoprint(GTK_WINDOW(app), "Navigation Key Up");
2277 * gtk_infoprint(GTK_WINDOW(app), "Navigation Key Down");
2281 * gtk_infoprint(GTK_WINDOW(app), "Navigation Key Left");
2285 * gtk_infoprint(GTK_WINDOW(app), "Navigation Key Right");
2289 * gtk_infoprint(GTK_WINDOW(app), "Navigation Key select");
2292 /*code below messes up when you have a textview*/
2297 gtk_widget_child_focus(widget, event->keyval==GDK_Left?GTK_DIR_TAB_BACKWARD:GTK_DIR_TAB_FORWARD);
2303 nodeData
*selnode
= getSelectedNode(mainview
);
2304 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
2306 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Squared shapes ON"));
2307 sketchwidget_set_shift(mainview
->sk
, TRUE
);
2314 nodeData
*selnode
= getSelectedNode(mainview
);
2315 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
2317 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Squared shapes OFF"));
2318 sketchwidget_set_shift(mainview
->sk
, FALSE
);
2325 nodeData
*selnode
= getSelectedNode(mainview
);
2326 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
2328 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Filled shapes OFF"));
2329 sketchwidget_set_fillmode(mainview
->sk
, FALSE
);
2336 nodeData
*selnode
= getSelectedNode(mainview
);
2337 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
2339 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Filled shapes ON"));
2340 sketchwidget_set_fillmode(mainview
->sk
, TRUE
);
2347 if ((mainview
->viewflags
& 4) == 0) mainview
->viewflags
|= 4;
2348 else mainview
->viewflags
&= ~4;
2349 callback_setview(mainview
, 1);
2354 nodeData
*selnode
= getSelectedNode(mainview
);
2355 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
2357 callback_redo(NULL
, mainview
);
2364 nodeData
*selnode
= getSelectedNode(mainview
);
2365 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
2367 callback_undo(NULL
, mainview
);
2374 if ((mainview
->viewflags
& 1) == 0) mainview
->viewflags
|= 1;
2375 else mainview
->viewflags
&= ~1;
2376 callback_setview(mainview
, 1);
2382 if ((mainview
->viewflags
& 2) == 0) mainview
->viewflags
|= 2;
2383 else mainview
->viewflags
&= ~2;
2384 callback_setview(mainview
, 1);
2393 void callback_viewmenu(GtkAction
* action
, GtkWidget
* wid
)
2395 int flag
= (int)gtk_object_get_user_data(GTK_OBJECT(wid
));
2396 MainView
*mainview
= gtk_object_get_data(GTK_OBJECT(wid
), "m");
2398 g_assert(mainview
!= NULL
);
2400 if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(wid
))) mainview
->viewflags
|= flag
;
2401 else mainview
->viewflags
&= ~flag
;
2405 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->toggletree_tb
), gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(wid
)));
2409 callback_setview(mainview
, 0);
2413 void callback_setview(MainView
*mainview
, int setmenu
)
2417 if ((mainview
->viewflags
&4)>0)
2418 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[2]), TRUE
);
2420 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[2]), FALSE
);
2422 if ((mainview
->viewflags
&2)>0)
2423 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[1]), TRUE
);
2425 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[1]), FALSE
);
2427 if ((mainview
->viewflags
&1)>0)
2429 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[0]), TRUE
);
2430 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->toggletree_tb
), TRUE
);
2434 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[0]), FALSE
);
2435 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->toggletree_tb
), FALSE
);
2441 setBusy(mainview
, 1);
2443 if ((mainview
->viewflags
&4)>0)
2444 gtk_window_fullscreen(GTK_WINDOW(mainview
->data
->main_view
));
2446 gtk_window_unfullscreen(GTK_WINDOW(mainview
->data
->main_view
));
2448 if ((mainview
->viewflags
&2)>0)
2449 gtk_widget_show(mainview
->toolbar
);
2451 gtk_widget_hide(mainview
->toolbar
);
2453 if ((mainview
->viewflags
&1)>0)
2454 gtk_widget_show(mainview
->scrolledtree
);
2456 gtk_widget_hide(mainview
->scrolledtree
);
2458 if (mainview
->viewflags
==4)
2459 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sketchwidget_get_mainwidget(mainview
->sk
)), GTK_POLICY_NEVER
, GTK_POLICY_NEVER
);
2461 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sketchwidget_get_mainwidget(mainview
->sk
)), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
2463 setBusy(mainview
, 2);
2469 void callback_buffer_modified(GtkAction
* action
, gpointer data
)
2472 * connect pointer to our MainView struct
2474 MainView
*mainview
= NULL
;
2476 mainview
= (MainView
*) data
;
2477 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2482 mainview
->file_edited
= TRUE
;
2486 * Callback for exit D-BUS event
2488 void exit_event_handler(gboolean die_now
, gpointer data
)
2490 MainView
*mainview
= NULL
;
2492 mainview
= (MainView
*) data
;
2493 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2497 if (callback_file_close(NULL
, mainview
)==FALSE
) gtk_main_quit(); /*make sure we call gtk_main_quit*/
2504 * application_exit(mainview->data);
2509 * Callback for hardware D-BUS events
2511 void hw_event_handler(osso_hw_state_t
* state
, gpointer data
)
2513 MainView
*mainview
= NULL
;
2515 mainview
= (MainView
*) data
;
2516 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2519 * if (state->shutdown_ind)
2521 * gtk_infoprint(GTK_WINDOW(mainview->data->app),
2522 * "Shutdown event!");
2524 * if (state->memory_low_ind)
2526 * gtk_infoprint(GTK_WINDOW(mainview->data->app),
2527 * "Memory low event!");
2530 if (state
->save_unsaved_data_ind
)
2532 fprintf(stderr
, "Saving unsaved data!\n");
2533 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, "Saving unsaved data!");
2534 callback_file_save(NULL
, mainview
);
2538 * if (state->system_inactivity_ind)
2540 * gtk_infoprint(GTK_WINDOW(mainview->data->app),
2541 * "Minimize application inactivity event!");
2546 GtkTreeRowReference
*read_sqlite3_data(MainView
* mainview
, unsigned int parentid
, GtkTreeRowReference
* parenttree
, unsigned int selected
, GtkTreeStore
* model
)
2548 GtkTreeRowReference
*resref
= NULL
;
2552 snprintf(q
, sizeof(q
), "SELECT nodeid, bodytype, name, nameblob, lastmodified, flags FROM %s WHERE parent=%d ORDER BY ord", datatable_tmpname
, parentid
);
2554 sqlite3_stmt
*stmt
= NULL
;
2556 int rc
= sqlite3_prepare(mainview
->db
, q
, strlen(q
), &stmt
, &dum
);
2560 fprintf(stderr
, "Error %s\n", sqlite3_errmsg(mainview
->db
));
2565 while(rc
== SQLITE_BUSY
|| rc
== SQLITE_ROW
)
2567 rc
= sqlite3_step(stmt
);
2568 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
2570 else if (rc
== SQLITE_ROW
)
2572 int nodeid
= sqlite3_column_int(stmt
, 0);
2573 int typ
= sqlite3_column_int(stmt
, 1);
2574 const unsigned char *name
= sqlite3_column_text(stmt
, 2);
2575 const unsigned char *nameblob
= sqlite3_column_text(stmt
, 3);
2576 int lastmod
= sqlite3_column_int(stmt
, 4);
2577 int flags
= sqlite3_column_int(stmt
, 5);
2580 * fprintf(stderr, "CARD=%s TYPE=%d\n", name, typ);
2582 if ((typ
!= NODE_TEXT
&& typ
!= NODE_SKETCH
) || (name
== NULL
&& nameblob
== NULL
))
2586 * fprintf(stderr, "invalid card, skipping\n");
2591 nodeData
*node
= g_malloc(sizeof(nodeData
));
2593 node
->sql3id
= nodeid
;
2595 node
->flags
= flags
;
2597 node
->namepix
= NULL
;
2599 node
->name
= g_strdup((char *)name
);
2600 if (nameblob
!= NULL
)
2602 int blobsize
= sqlite3_column_bytes(stmt
, 3);
2604 GdkPixbufLoader
*pl
= gdk_pixbuf_loader_new_with_type("png", NULL
);
2607 gdk_pixbuf_loader_write(pl
, (guchar
*) nameblob
, blobsize
, &err
);
2610 fprintf(stderr
, "Error loading nodename! %s\n", err
->message
);
2614 gdk_pixbuf_loader_close(pl
, NULL
);
2615 GdkPixbuf
*pixbuf
= gdk_pixbuf_loader_get_pixbuf(pl
);
2617 if (GDK_IS_PIXBUF(pixbuf
))
2618 node
->namepix
= pixbuf
;
2620 node
->lastMod
= lastmod
;
2622 GtkTreeIter parentiter
, newiter
;
2625 if (parenttree
!= NULL
)
2627 GtkTreePath
*pa
= gtk_tree_row_reference_get_path(parenttree
);
2629 gtk_tree_model_get_iter(GTK_TREE_MODEL(model
), &parentiter
, pa
);
2630 gtk_tree_path_free(pa
);
2634 gtk_tree_store_append(model
, &newiter
, par
);
2635 gtk_tree_store_set(model
, &newiter
, NODE_NAME
, node
->name
, NODE_PIXBUF
, node
->namepix
, NODE_DATA
, node
, -1);
2637 GtkTreePath
*pa
= gtk_tree_model_get_path(GTK_TREE_MODEL(model
), &newiter
);
2639 GtkTreeRowReference
*newref
= gtk_tree_row_reference_new(GTK_TREE_MODEL(model
), pa
);
2641 if (selected
== nodeid
)
2644 gtk_tree_path_free(pa
);
2645 GtkTreeRowReference
*r
= read_sqlite3_data(mainview
, nodeid
, newref
, selected
,
2648 if (resref
!= newref
)
2649 gtk_tree_row_reference_free(newref
);
2656 gtk_tree_row_reference_free(r
); /*safeguard */
2662 sqlite3_finalize(stmt
);
2664 return (resref
); /*ref to supposed-to-be-selected treeitem */
2670 gboolean
read_file_to_buffer(MainView
* mainview
)
2674 g_assert(mainview
!= NULL
);
2675 gboolean res
= FALSE
;
2677 gchar
*filename
= mainview
->file_name
;
2680 mainview
->file_name
= filename
;
2681 mainview
->loading
=TRUE
;
2683 fprintf(stderr
, "read:*%s*\n", filename
);
2686 sqlite3_stmt
*stmt
= NULL
;
2688 rc
= sqlite3_open(filename
, &mainview
->db
);
2693 fprintf(stderr
, "Can't open database %s: %s\n", filename
, sqlite3_errmsg(mainview
->db
));
2697 char *q
= "SELECT skey, sval FROM settings";
2700 rc
= sqlite3_prepare(mainview
->db
, q
, strlen(q
), &stmt
, &dum
);
2703 fprintf(stderr
, "Error %s\n", sqlite3_errmsg(mainview
->db
));
2707 unsigned int selectedCard
= 0;
2710 * fprintf(stderr, "start config\n");
2712 unsigned int curDataVersion
= 0;
2715 while(rc
== SQLITE_BUSY
|| rc
== SQLITE_ROW
)
2717 rc
= sqlite3_step(stmt
);
2718 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
2720 else if (rc
== SQLITE_ROW
)
2722 const unsigned char *col_key
= sqlite3_column_text(stmt
, 0);
2723 const unsigned char *col_val
= sqlite3_column_text(stmt
, 1);
2726 * fprintf(stderr, "%s=%s\n", col_key, col_val);
2728 if (!strcmp(col_key
, "leftPanedPos"))
2730 gint panedPos
= atoi((char *)col_val
);
2733 gtk_paned_set_position(GTK_PANED(mainview
->hpaned
), panedPos
);
2735 if (!strcmp(col_key
, "selectedNode"))
2737 gint tmp
= atoi((char *)col_val
);
2742 if (!strcmp(col_key
, "dataVersion"))
2744 gint tmp
= atoi((char *)col_val
);
2747 curDataVersion
= tmp
;
2749 if (!strcmp(col_key
, "newNodeDlgCreateChild"))
2751 gint tmp
= atoi((char *)col_val
);
2753 mainview
->newnodedialog_createchild
= TRUE
;
2755 mainview
->newnodedialog_createchild
= FALSE
;
2757 if (!strcmp(col_key
, "fullScreen"))
2759 gint tmp
= atoi((char *)col_val
);
2760 if (tmp
<0 || tmp
>4) tmp
=0;
2764 else if (tmp
==1) tmp
=2;
2765 else if (tmp
==2) tmp
=7;
2766 else if (tmp
==3) tmp
=6;
2767 else if (tmp
==4) tmp
=4;
2768 mainview
->viewflags
=tmp
;
2769 callback_setview(mainview
, TRUE
);
2771 if (!strcmp(col_key
, "viewFlags"))
2773 gint tmp
= atoi((char *)col_val
);
2775 mainview
->viewflags
=tmp
;
2776 callback_setview(mainview
, TRUE
);
2778 if (!strcmp(col_key
, "brushSize"))
2780 gint tmp
= atoi((char *)col_val
);
2781 if (tmp
>0) sk_set_brushsize(mainview
, tmp
);
2783 if (!strcmp(col_key
, "brushColor"))
2785 unsigned long tmp
= atol((char *)col_val
);
2788 c2
.red
= ((tmp
& 0xFF0000) >> 16) << 8;
2789 c2
.green
= ((tmp
& 0xFF00) >> 8) << 8;
2790 c2
.blue
= (tmp
& 0xFF) << 8;
2791 /* fprintf(stderr, "READ BRUSHCOLOR is %ul (%d,%d,%d)\n", tmp, c2.red, c2.green, c2.blue);*/
2793 sketchwidget_set_brushcolor(mainview
->sk
, c2
);
2794 hildon_color_button_set_color(HILDON_COLOR_BUTTON(mainview
->colorbutton
), &c2
);
2799 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
)
2801 fprintf(stderr
, "Error2 %s\n", sqlite3_errmsg(mainview
->db
));
2806 * fprintf(stderr, "end config\n");
2809 sqlite3_finalize(stmt
);
2811 gboolean resback
= FALSE
;
2813 while(curDataVersion
< datatableversion
)
2815 if (curDataVersion
== 0)
2817 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", datatable_backupname
);
2818 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2820 snprintf(tq
, sizeof(tq
), "ALTER TABLE %s RENAME TO %s", datatable_name
, datatable_backupname
);
2821 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2823 fprintf(stderr
, "ERROR backing up table!\n");
2828 snprintf(tq
, sizeof(tq
), "CREATE TABLE %s%s", datatable_name
, datatable
);
2829 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2831 fprintf(stderr
, "ERROR creating table!\n");
2834 snprintf(tq
, sizeof(tq
), "INSERT INTO %s SELECT nodeid, parent, bodytype, name, body, nameblob, bodyblob, lastmodified, ord, 0 FROM %s", datatable_name
, datatable_backupname
);
2835 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2837 fprintf(stderr
, "ERROR copying data!\n");
2841 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", datatable_backupname
);
2842 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2844 curDataVersion
= datatableversion
;
2847 if (curDataVersion
!= datatableversion
)
2849 fprintf(stderr
, "Data version mismatch\n");
2851 if (resback
== TRUE
)
2853 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", datatable_name
);
2854 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2855 snprintf(tq
, sizeof(tq
), "ALTER TABLE %s RENAME TO %s", datatable_backupname
, datatable_name
);
2856 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2862 GtkTreeStore
*model
= GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(mainview
->treeview
)));
2864 g_object_ref(model
);
2865 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), NULL
);
2871 snprintf(tq
, sizeof(tq
), "CREATE%s TABLE %s%s", TEMPTABLE_KEYWORD
, datatable_tmpname
, datatable
);
2872 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2874 fprintf(stderr
, "ERROR creating temp table!\n");
2877 snprintf(tq
, sizeof(tq
), "CREATE INDEX %s_index ON %s %s", datatable_tmpname
, datatable_tmpname
, dataindex
);
2878 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2880 fprintf(stderr
, "ERROR creating temp index!\n");
2883 snprintf(tq
, sizeof(tq
), "INSERT INTO %s SELECT * FROM %s", datatable_tmpname
, datatable_name
);
2884 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2886 fprintf(stderr
, "ERROR copying data to temp table!\n");
2892 GtkTreeRowReference
*selectedRef
= read_sqlite3_data(mainview
, 0, NULL
, selectedCard
, model
);
2894 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), GTK_TREE_MODEL(model
));
2895 g_object_unref(model
);
2896 gtk_tree_view_expand_all(GTK_TREE_VIEW(mainview
->treeview
));
2898 if (selectedRef
!= NULL
)
2900 GtkTreeIter seliter
;
2902 if (ref2iter(GTK_TREE_MODEL(model
), selectedRef
, &seliter
) == TRUE
)
2904 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(mainview
->treeview
));
2905 gtk_tree_selection_select_iter(selection
, &seliter
);
2908 gtk_tree_row_reference_free(selectedRef
);
2915 sqlite3_finalize(stmt
);
2918 mainview
->loading
=FALSE
;
2926 void write_buffer_to_file(MainView
* mainview
)
2928 fprintf(stderr
, "write:*%s*\n", mainview
->file_name
);
2929 saveCurrentData(mainview
);
2931 setBusy(mainview
, 1);
2935 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", misctable_name
);
2936 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2938 snprintf(tq
, sizeof(tq
), "CREATE TABLE %s%s", misctable_name
, misctable
);
2939 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2941 gint panedPos
= gtk_paned_get_position(GTK_PANED(mainview
->hpaned
));
2943 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('leftPanedPos', '%d');", misctable_name
, panedPos
);
2944 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2948 if (mainview
->newnodedialog_createchild
== FALSE
)
2950 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('newNodeDlgCreateChild', '%d');", misctable_name
, nndcc
);
2951 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2953 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('viewFlags', '%d');", misctable_name
, mainview
->viewflags
);
2954 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2956 nodeData
*node
= getSelectedNode(mainview
);
2960 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('selectedNode', '%d');", misctable_name
, node
->sql3id
);
2961 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2965 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->eraser_tb
)) == TRUE
)
2967 bsize
=mainview
->brushsize_backup
;
2971 bsize
=sketchwidget_get_brushsize(mainview
->sk
);
2973 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('brushSize', '%d');", misctable_name
, bsize
);
2974 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2976 GdkColor
*col
= hildon_color_button_get_color(HILDON_COLOR_BUTTON(mainview
->colorbutton
));
2977 unsigned long bcol
=((col
->red
>> 8) << 16) | ((col
->green
>> 8) << 8) | (col
->blue
>> 8);
2978 /* fprintf(stderr, "BRUSHCOLOR is %d (%d,%d,%d)\n", bcol, col->red, col->green, col->blue);*/
2979 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('brushColor', '%lu');", misctable_name
, bcol
);
2980 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2982 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('dataVersion', '%d');", misctable_name
, datatableversion
);
2983 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2985 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", datatable_backupname
);
2986 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2987 snprintf(tq
, sizeof(tq
), "CREATE TABLE %s%s", datatable_backupname
, datatable
);
2988 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2990 fprintf(stderr
, "ERROR creating backup table!\n");
2991 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, "Error 1");
2994 snprintf(tq
, sizeof(tq
), "INSERT INTO %s SELECT * FROM %s", datatable_backupname
, datatable_name
);
2995 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2997 fprintf(stderr
, "ERROR backing up table!\n");
2998 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, "Error 2");
3001 snprintf(tq
, sizeof(tq
), "DELETE FROM %s", datatable_name
);
3002 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
3004 snprintf(tq
, sizeof(tq
), "INSERT INTO %s SELECT * FROM %s", datatable_name
, datatable_tmpname
);
3005 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
3007 fprintf(stderr
, "ERROR saving table!\n");
3008 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, "Error 3");
3010 snprintf(tq
, sizeof(tq
), "DELETE FROM %s", datatable_name
);
3011 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
3013 snprintf(tq
, sizeof(tq
), "INSERT INTO %s SELECT * FROM %s", datatable_name
, datatable_backupname
);
3014 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
3016 fprintf(stderr
, "ERROR restoring backup! data lost!\n");
3018 setBusy(mainview
, 2);
3022 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", datatable_backupname
);
3023 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
3025 mainview
->file_edited
= FALSE
;
3026 setBusy(mainview
, 2);
3027 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), GTK_STOCK_SAVE
, _("Saved"));