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 <libgnomevfs/gnome-vfs.h>
39 #include <osso-browser-interface.h>
46 gboolean
read_file_to_buffer(MainView
* mainview
);
47 void write_buffer_to_file(MainView
* mainview
);
48 void new_node_dialog(nodeType typ
, MainView
* mainview
);
51 st==0: turn off/zero refcount
52 st==1: turn on/increase ref
53 st==2: decrease refcount and turn off if necessary
55 void setBusy(MainView
*mainview
, gchar st
)
57 if (st
==0) mainview
->busyrefcount
=0;
58 else if (st
==1) mainview
->busyrefcount
++;
59 else if (st
==2 && mainview
->busyrefcount
>0) mainview
->busyrefcount
--;
60 gdk_window_set_cursor(GTK_WIDGET(mainview
->data
->main_view
)->window
, (mainview
->busyrefcount
>0)?mainview
->cursorBusy
:NULL
);
63 gboolean
isBusy(MainView
*mainview
)
65 if (mainview
->busyrefcount
>0) return(TRUE
);
69 void prepareUIforNodeChange(MainView
* mainview
, nodeType typ
)
73 gtk_widget_show(GTK_WIDGET(mainview
->font_tb
));
74 gtk_widget_show(mainview
->tools_font
);
78 gtk_widget_hide(GTK_WIDGET(mainview
->font_tb
));
79 gtk_widget_hide(mainview
->tools_font
);
82 if (typ
== NODE_SKETCH
)
84 gtk_widget_show(GTK_WIDGET(mainview
->colorbutton_tb
));
85 gtk_widget_show(GTK_WIDGET(mainview
->eraser_tb
));
86 gtk_widget_show(GTK_WIDGET(mainview
->brushsize_tb
));
87 gtk_widget_show(GTK_WIDGET(mainview
->sketchlines_tb
));
88 gtk_widget_show(GTK_WIDGET(mainview
->shape_tb
));
89 gtk_widget_show(GTK_WIDGET(mainview
->undo_tb
));
90 gtk_widget_show(GTK_WIDGET(mainview
->redo_tb
));
91 gtk_widget_show(mainview
->tools_color
);
92 gtk_widget_show(mainview
->tools_brushsize
);
93 gtk_widget_show(mainview
->tools_pagestyle
);
94 gtk_widget_show(mainview
->tools_shape
);
98 gtk_widget_hide(GTK_WIDGET(mainview
->colorbutton_tb
));
99 gtk_widget_hide(GTK_WIDGET(mainview
->eraser_tb
));
100 gtk_widget_hide(GTK_WIDGET(mainview
->brushsize_tb
));
101 gtk_widget_hide(GTK_WIDGET(mainview
->sketchlines_tb
));
102 gtk_widget_hide(GTK_WIDGET(mainview
->shape_tb
));
103 gtk_widget_hide(GTK_WIDGET(mainview
->undo_tb
));
104 gtk_widget_hide(GTK_WIDGET(mainview
->redo_tb
));
105 gtk_widget_hide(mainview
->tools_color
);
106 gtk_widget_hide(mainview
->tools_brushsize
);
107 gtk_widget_hide(mainview
->tools_pagestyle
);
108 gtk_widget_hide(mainview
->tools_shape
);
111 if (typ
== NODE_TEXT
)
113 gtk_widget_hide(sketchwidget_get_mainwidget(mainview
->sk
));
114 gtk_widget_show(GTK_WIDGET(mainview
->scrolledwindow
));
115 gtk_widget_show(mainview
->tools_item
);
117 else if (typ
== NODE_SKETCH
)
119 gtk_widget_hide(GTK_WIDGET(mainview
->scrolledwindow
));
120 gtk_widget_show(sketchwidget_get_mainwidget(mainview
->sk
));
121 gtk_widget_show(mainview
->tools_item
);
125 gtk_widget_hide(GTK_WIDGET(mainview
->scrolledwindow
));
126 gtk_widget_hide(sketchwidget_get_mainwidget(mainview
->sk
));
127 gtk_widget_hide(mainview
->tools_item
);
131 nodeData
*getSelectedNode(MainView
* mainview
)
138 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(mainview
->treeview
));
140 if (!gtk_tree_selection_get_selected(selection
, &model
, &iter
))
143 gtk_tree_model_get(model
, &iter
, NODE_DATA
, &nd
, -1);
148 void saveCurrentData(MainView
* mainview
)
150 nodeData
*selnode
= getSelectedNode(mainview
);
151 saveDataToNode(mainview
, selnode
);
154 void saveDataToNode(MainView
* mainview
, nodeData
*selnode
)
159 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
))
161 fprintf(stderr
, "node not edited, not saving\n");
165 mainview
->file_edited
= TRUE
;
167 setBusy(mainview
, 1);
168 fprintf(stderr
, "savecurrentdata!\n");
170 gboolean goterr
= TRUE
;
171 gchar
*textdata
= NULL
;
172 GdkPixbuf
*pixbuf
= NULL
;
173 gchar
*sketchdata
= NULL
;
177 if (selnode
->typ
== NODE_TEXT
)
179 GtkTextIter start
, end
;
181 gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(mainview
->buffer
), &start
, &end
);
182 textdata
= gtk_text_buffer_get_slice(GTK_TEXT_BUFFER(mainview
->buffer
), &start
, &end
, TRUE
);
184 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
);
186 else if (selnode
->typ
== NODE_SKETCH
)
189 GdkPixmap
*skpix
= sketchwidget_get_Pixmap(mainview
->sk
);
190 GtkWidget
*skdr
= sketchwidget_get_drawingarea(mainview
->sk
);
192 pixbuf
= gdk_pixbuf_get_from_drawable(NULL
, GDK_DRAWABLE(skpix
), NULL
, 0, 0, 0, 0, skdr
->allocation
.width
, skdr
->allocation
.height
);
195 fprintf(stderr
, "Error saving: pixbuf is null\n");
200 GdkPixbuf
*pixbuf2
= sketchwidget_trim_image(pixbuf
, skdr
->allocation
.width
, skdr
->allocation
.height
, &w
, &h
, FALSE
);
204 if (gdk_pixbuf_save_to_buffer(pixbuf2
, &sketchdata
, &datalen
, "png", &err
, NULL
) == FALSE
)
208 fprintf(stderr
, "Error saving sketch! %s\n", err
->message
);
211 gdk_pixbuf_unref(pixbuf2
);
214 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
);
215 fprintf(stderr
, "datalen:%d\n", datalen
);
216 if (skpix
&& G_IS_OBJECT(skpix
)) g_object_unref(skpix
);
220 * fprintf(stderr, "query is *%s*\n", tq);
225 sqlite3_stmt
*stmt
= NULL
;
227 int rc
= sqlite3_prepare(mainview
->db
, tq
, strlen(tq
), &stmt
, &dum
);
231 fprintf(stderr
, "Error updating: %s\n", sqlite3_errmsg(mainview
->db
));
234 if (selnode
->typ
== NODE_TEXT
)
235 sqlite3_bind_text(stmt
, 1, textdata
, strlen(textdata
), SQLITE_TRANSIENT
);
236 else if (selnode
->typ
== NODE_SKETCH
)
237 sqlite3_bind_blob(stmt
, 1, sketchdata
, datalen
, SQLITE_TRANSIENT
);
240 while(rc
== SQLITE_BUSY
)
242 rc
= sqlite3_step(stmt
);
243 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
246 sqlite3_finalize(stmt
);
247 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
)
249 fprintf(stderr
, "Error saving node: %s\n", sqlite3_errmsg(mainview
->db
));
253 if (selnode
->typ
== NODE_TEXT
)
254 gtk_text_buffer_set_modified(GTK_TEXT_BUFFER(mainview
->buffer
), FALSE
);
255 else if (selnode
->typ
== NODE_SKETCH
)
256 sketchwidget_set_edited(mainview
->sk
, FALSE
);
268 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error saving memo"));
270 setBusy(mainview
, 2);
273 void callback_treeview_celldatafunc(GtkTreeViewColumn
* tree_column
, GtkCellRenderer
* cell
, GtkTreeModel
* tree_model
, GtkTreeIter
* iter
, gpointer data
)
275 MainView
*mainview
= NULL
;
276 mainview
= ( MainView
* ) data
;
277 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
281 gtk_tree_model_get(tree_model
, iter
, NODE_DATA
, &nd
, -1);
285 if (nd
->namepix
== NULL
)
287 g_object_set(cell
, "visible", FALSE
, NULL
);
291 g_object_set(cell
, "visible", TRUE
, NULL
);
292 g_object_set(cell
, "width", SKETCHNODE_RX
, NULL
);
293 g_object_set(cell
, "height", SKETCHNODE_RY
, NULL
);
297 gboolean
callback_treeview_testcollapse(GtkTreeView
* treeview
, GtkTreeIter
* arg1
, GtkTreePath
* arg2
, gpointer user_data
)
302 void callback_treeview_change(GtkTreeSelection
* selection
, gpointer data
)
304 MainView
*mainview
= NULL
;
306 mainview
= (MainView
*) data
;
307 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
309 nodeData
*nd
= getSelectedNode(mainview
);
313 fprintf(stderr, "changed called but no selectednode\n");
315 fprintf(stderr, "changed called, selectednode is %d\n", nd->sql3id);
319 if (mainview
->cansel_time
>0 && mainview
->cansel_time
+1.0<tm
) mainview
->cansel_node
=NULL
;
323 if (mainview
->cansel_node
!=NULL
)
325 fprintf(stderr
, "[SELLOGIC] saving %d to unselect all nodes\n", (mainview
->cansel_node
)->sql3id
);
326 saveDataToNode(mainview
, (mainview
->cansel_node
));
327 mainview
->cansel_node
=NULL
;
332 if (mainview
->cansel_node
!=NULL
)
334 if (nd
->sql3id
== (mainview
->cansel_node
)->sql3id
)
336 mainview
->cansel_node
=NULL
;
337 fprintf(stderr
, "[SELLOGIC] doubly selected %d, doing nothing\n", nd
->sql3id
);
342 fprintf(stderr
, "[SELLOGIC] saving %d to load new node\n", (mainview
->cansel_node
)->sql3id
);
343 saveDataToNode(mainview
, (mainview
->cansel_node
));
344 mainview
->cansel_node
=NULL
;
349 if (nd
== NULL
) return;
351 setBusy(mainview
, 1);
353 gboolean goterr
= TRUE
;
354 char *textdata
= NULL
;
360 snprintf(tq
, sizeof(tq
), "SELECT bodytype, body, bodyblob, flags FROM %s WHERE nodeid=%d", datatable_tmpname
, nd
->sql3id
);
361 sqlite3_stmt
*stmt
= NULL
;
363 int rc
= sqlite3_prepare(mainview
->db
, tq
, strlen(tq
), &stmt
, &dum
);
367 fprintf(stderr
, "Error reading (1) %s\n", sqlite3_errmsg(mainview
->db
));
372 while(rc
== SQLITE_BUSY
|| rc
== SQLITE_ROW
)
374 rc
= sqlite3_step(stmt
);
375 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
377 else if (rc
== SQLITE_ROW
)
379 nd
->typ
= sqlite3_column_int(stmt
, 0);
380 nd
->flags
= sqlite3_column_int(stmt
, 3);
382 prepareUIforNodeChange(mainview
, nd
->typ
);
383 if (nd
->typ
== NODE_TEXT
)
385 gboolean file_edited_backup
= mainview
->file_edited
;
387 textdata
= (char *)sqlite3_column_text(stmt
, 1);
388 blobsize
= sqlite3_column_bytes(stmt
, 1);
390 if (textdata
== NULL
|| g_utf8_validate(textdata
, blobsize
, NULL
) == FALSE
)
391 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(mainview
->buffer
), "", -1);
394 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(mainview
->buffer
), textdata
, blobsize
);
397 gtk_text_buffer_set_modified(GTK_TEXT_BUFFER(mainview
->buffer
), FALSE
);
399 if (file_edited_backup
==FALSE
) mainview
->file_edited
=FALSE
; /*textview changed event toggles this*/
402 else if (nd
->typ
== NODE_SKETCH
)
404 sketchwidget_wipe_undo(mainview
->sk
);
405 sketchwidget_set_fillmode(mainview
->sk
, FALSE
);
406 sketchwidget_set_shift(mainview
->sk
, FALSE
);
407 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->shapemenuitems
[1]), TRUE
);
408 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->shapemenuitems
[0]), TRUE
);
410 blobsize
= sqlite3_column_bytes(stmt
, 2);
411 blob
= (char *)sqlite3_column_blob(stmt
, 2);
412 gboolean clear
= TRUE
;
418 fprintf(stderr
, "blobsize:%d\n", blobsize
);
419 GdkPixbufLoader
*pl
= gdk_pixbuf_loader_new_with_type("png", NULL
);
422 gdk_pixbuf_loader_write(pl
, (guchar
*) blob
, blobsize
, &err
);
425 fprintf(stderr
, "Error loading sketch! %s\n", err
->message
);
429 gdk_pixbuf_loader_close(pl
, NULL
);
430 GdkPixbuf
*pixbuf
= gdk_pixbuf_loader_get_pixbuf(pl
);
432 if (GDK_IS_PIXBUF(pixbuf
))
434 GtkWidget
*skdr
= sketchwidget_get_drawingarea(mainview
->sk
);
435 GtkPixmap
*skpix
= (GtkPixmap
*) sketchwidget_get_Pixmap(mainview
->sk
);
437 int w
=gdk_pixbuf_get_width(pixbuf
);
438 int h
=gdk_pixbuf_get_height(pixbuf
);
439 if (w
!=skdr
->allocation
.width
|| h
!=skdr
->allocation
.height
)
441 if (w
>skdr
->allocation
.width
) w
=skdr
->allocation
.width
;
442 if (h
>skdr
->allocation
.height
) h
=skdr
->allocation
.height
;
443 sketchwidget_clear_real(mainview
->sk
);
445 gdk_draw_pixbuf(GDK_DRAWABLE(skpix
), NULL
, pixbuf
, 0, 0, 0, 0, w
, h
, GDK_RGB_DITHER_NONE
, 0, 0);
450 if (skpix
&& G_IS_OBJECT(skpix
)) g_object_unref(skpix
);
454 fprintf(stderr
, "error loading pixbuf\n");
460 fprintf(stderr
, "clearing pix area\n");
461 sketchwidget_clear_real(mainview
->sk
);
463 gtk_widget_queue_draw(sketchwidget_get_drawingarea(mainview
->sk
));
466 if ((nd
->flags
& NODEFLAG_SKETCHLINES
) > 0)
467 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->sketchlinesmenuitems
[1]), TRUE
);
468 else if ((nd
->flags
& NODEFLAG_SKETCHGRAPH
) > 0)
469 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->sketchlinesmenuitems
[2]), TRUE
);
472 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->sketchlinesmenuitems
[0]), TRUE
);
473 callback_sketchlines(NULL
, mainview
->sketchlinesmenuitems
[0]); /*FIXME:ugly */
479 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
)
480 fprintf(stderr
, "Error reading (2) %s\n", sqlite3_errmsg(mainview
->db
));
482 sqlite3_finalize(stmt
);
485 setBusy(mainview
, 2);
489 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error loading memo"));
493 gboolean
treeview_canselect(GtkTreeSelection
* selection
, GtkTreeModel
* model
, GtkTreePath
* path
, gboolean path_currently_selected
, gpointer userdata
)
495 MainView
*mainview
= NULL
;
497 mainview
= (MainView
*) userdata
;
498 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
500 if (mainview
->loading
==FALSE
)
502 #ifndef EXPANDING_ROWS
503 if (path_currently_selected
)
507 #ifndef NEW_SEL_LOGIC
508 saveCurrentData(mainview
);
510 if (path_currently_selected
)
513 gtk_tree_model_get_iter(model
, &iter
, path
);
515 gtk_tree_model_get(model
, &iter
, NODE_DATA
, &(mainview
->cansel_node
), -1);
516 mainview
->cansel_time
=time(NULL
);
517 /* fprintf(stderr, "[SELLOGIC] canselect called for node %d\n", nd->sql3id);*/
524 gboolean
newnodedlg_key_press_cb(GtkWidget
* widget
, GdkEventKey
* event
, GtkWidget
* dlg
)
526 SketchWidget
*s
= gtk_object_get_data(GTK_OBJECT(dlg
), "sk");
528 switch (event
->keyval
)
531 sketchwidget_redo(s
);
534 sketchwidget_undo(s
);
541 void new_node_dialog(nodeType typ
, MainView
* mainview
)
543 GtkWidget
*dialog
, *label
, *entry
, *but_ok
, *but_cancel
, *vbox
, *hbox
, *al
, *cb
, *rb1
, *rb2
;
545 dialog
= gtk_dialog_new();
547 g_signal_connect(G_OBJECT(dialog
), "key_press_event", G_CALLBACK(newnodedlg_key_press_cb
), dialog
);
549 GtkWidget
*notebook
= gtk_notebook_new();
551 vbox
= gtk_vbox_new(FALSE
, 0);
552 gtk_container_border_width(GTK_CONTAINER(vbox
), 15);
554 hbox
= gtk_hbox_new(FALSE
, 0);
556 rb1
=gtk_radio_button_new_with_label(NULL
, _("Text memo"));
557 gtk_box_pack_start(GTK_BOX(hbox
), rb1
, FALSE
, FALSE
, 0);
558 gtk_object_set_data(GTK_OBJECT(dialog
), "rbt", rb1
);
560 rb2
=gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(rb1
)), _("Sketch memo"));
561 gtk_box_pack_start(GTK_BOX(hbox
), rb2
, FALSE
, FALSE
, 0);
562 gtk_object_set_data(GTK_OBJECT(dialog
), "rbs", rb2
);
564 if (typ
==NODE_TEXT
) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb1
), TRUE
);
565 else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rb2
), TRUE
);
567 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->vbox
), hbox
);
569 label
= gtk_label_new(_("Text name"));
570 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), vbox
, label
);
571 label
= gtk_label_new(_("Please name the memo:"));
572 entry
= gtk_entry_new_with_max_length(64);
573 gtk_entry_set_text(GTK_ENTRY(entry
), _("New memo"));
574 gtk_editable_select_region(GTK_EDITABLE(entry
), 0, -1);
576 gtk_box_pack_start(GTK_BOX(vbox
), label
, FALSE
, FALSE
, 0);
577 gtk_box_pack_start(GTK_BOX(vbox
), entry
, FALSE
, FALSE
, 0);
579 vbox
= gtk_vbox_new(FALSE
, 0);
580 gtk_container_border_width(GTK_CONTAINER(vbox
), 15);
581 label
= gtk_label_new(_("Sketch name"));
582 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), vbox
, label
);
584 label
= gtk_label_new(_("Please name the memo:"));
586 al
= gtk_alignment_new(0.5, 0.5, 0, 0);
588 SketchWidget
*s
= sketchwidget_new(SKETCHNODE_X
, SKETCHNODE_Y
, TRUE
);
590 sketchwidget_set_brushsize(s
, 2);
591 sketchwidget_set_backstyle(s
, SKETCHBACK_GRAPH
);
593 gtk_widget_set_size_request(sketchwidget_get_mainwidget(s
), SKETCHNODE_X
, SKETCHNODE_Y
);
594 gtk_container_add(GTK_CONTAINER(al
), sketchwidget_get_mainwidget(s
));
596 gtk_box_pack_start(GTK_BOX(vbox
), label
, FALSE
, FALSE
, 0);
597 gtk_box_pack_start(GTK_BOX(vbox
), al
, FALSE
, FALSE
, 0);
599 but_ok
= gtk_button_new_with_label(_("Create"));
600 but_cancel
= gtk_button_new_with_label(_("Cancel"));
601 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->action_area
), but_ok
);
602 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->action_area
), but_cancel
);
604 gtk_object_set_user_data(GTK_OBJECT(dialog
), entry
);
605 gtk_object_set_data(GTK_OBJECT(dialog
), "mainview", mainview
);
606 gtk_object_set_data(GTK_OBJECT(dialog
), "sk", s
);
607 gtk_object_set_data(GTK_OBJECT(dialog
), "n", notebook
);
609 nodeType
*tmp
= g_malloc(sizeof(nodeType
)); /*FIXME memleak:not freed on widget_destroy */
611 gtk_object_set_data(GTK_OBJECT(dialog
), "t", tmp
);
613 gtk_signal_connect_object(GTK_OBJECT(but_cancel
), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy
), dialog
);
614 g_signal_connect(G_OBJECT(but_ok
), "clicked", G_CALLBACK(callback_new_node_real
), dialog
);
616 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->vbox
), notebook
);
618 cb
= gtk_check_button_new_with_label("Create as childnode");
619 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb
), mainview
->newnodedialog_createchild
);
620 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->vbox
), cb
);
621 gtk_object_set_data(GTK_OBJECT(dialog
), "cb", cb
);
623 gtk_widget_grab_focus(entry
);
625 gtk_widget_show_all(dialog
);
626 gtk_window_set_modal(GTK_WINDOW(dialog
), TRUE
);
629 void add_new_node(nodeData
* node
, MainView
* mainview
, gboolean ischild
)
631 GtkTreeIter parentiter
, newiter
;
635 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(mainview
->treeview
));
637 if (gtk_tree_selection_get_selected(selection
, &model
, &parentiter
))
640 GtkTreePath
*path
= NULL
;
642 unsigned int parentnodeid
= 0;
646 path
= gtk_tree_model_get_path(model
, &parentiter
);
648 if (ischild
== FALSE
)
650 gboolean tmp
= gtk_tree_path_up(path
);
652 if (gtk_tree_path_get_depth(path
) > 0)
654 if (gtk_tree_model_get_iter(model
, &parentiter
, path
))
657 else if (tmp
== TRUE
)
659 gtk_tree_path_down(path
); /*restore path so expand() works */
668 gtk_tree_model_get(model
, ptr
, NODE_DATA
, &nd
, -1);
670 parentnodeid
= nd
->sql3id
;
676 sqlite3_stmt
*stmt
= NULL
;
683 snprintf(tq
, sizeof(tq
), "INSERT INTO %s (parent, bodytype, name, nameblob, ord) VALUES (%d, %d, ?, ?, 0);", datatable_tmpname
, parentnodeid
, node
->typ
);
684 int rc
= sqlite3_prepare(mainview
->db
, tq
, strlen(tq
), &stmt
, &dum
);
688 fprintf(stderr
, "Error inserting(1): %s\n", sqlite3_errmsg(mainview
->db
));
691 if (node
->name
!= NULL
)
692 sqlite3_bind_text(stmt
, 1, node
->name
, strlen(node
->name
), SQLITE_TRANSIENT
);
694 sqlite3_bind_text(stmt
, 1, NULL
, 0, SQLITE_TRANSIENT
);
696 if (node
->namepix
!= NULL
)
698 gchar
*namepixdata
= NULL
;
703 if (gdk_pixbuf_save_to_buffer(node
->namepix
, &namepixdata
, &datalen
, "png", &err
, NULL
) == FALSE
)
707 fprintf(stderr
, "Error saving name! %s\n", err
->message
);
710 sqlite3_bind_blob(stmt
, 2, namepixdata
, datalen
, SQLITE_TRANSIENT
);
713 sqlite3_bind_blob(stmt
, 2, NULL
, 0, SQLITE_TRANSIENT
);
716 while(rc
== SQLITE_BUSY
)
718 rc
= sqlite3_step(stmt
);
719 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
722 sqlite3_finalize(stmt
);
723 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
)
725 fprintf(stderr
, "Error inserting(2): %s\n", sqlite3_errmsg(mainview
->db
));
728 node
->sql3id
= sqlite3_last_insert_rowid(mainview
->db
);
732 if (node
->sql3id
== 0)
737 g_object_unref(node
->namepix
);
740 gtk_tree_path_free(path
);
741 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, "Error creating node");
745 fprintf(stderr
, "new node id is %d\n", node
->sql3id
);
748 gtk_tree_store_append(GTK_TREE_STORE(model
), &newiter
, ptr
);
750 gtk_tree_store_set(GTK_TREE_STORE(model
), &newiter
, NODE_NAME
, node
->name
, NODE_PIXBUF
, node
->namepix
, NODE_DATA
, node
, -1);
754 mainview
->loading
=TRUE
; /*only when we have a valid parent*/
755 gtk_tree_view_expand_row(GTK_TREE_VIEW(mainview
->treeview
), path
, FALSE
);
756 gtk_tree_path_free(path
);
759 gtk_tree_selection_select_iter(selection
, &newiter
);
761 mainview
->loading
=FALSE
;
764 void callback_new_node_real(GtkAction
* action
, gpointer data
)
768 GtkWidget
*dialog
= data
;
769 GtkWidget
*entry
= gtk_object_get_user_data(GTK_OBJECT(dialog
));
771 mainview
= gtk_object_get_data(GTK_OBJECT(dialog
), "mainview");
772 SketchWidget
*s
= gtk_object_get_data(GTK_OBJECT(dialog
), "sk");
773 GtkWidget
*notebook
= gtk_object_get_data(GTK_OBJECT(dialog
), "n");
774 GtkWidget
*cb
= gtk_object_get_data(GTK_OBJECT(dialog
), "cb");
775 /* nodeType *typ = gtk_object_get_data(GTK_OBJECT(dialog), "t");*/
777 nodeType typ
= NODE_TEXT
;
779 /* GtkWidget *rbt = gtk_object_get_data(GTK_OBJECT(dialog), "rbt");*/
780 GtkWidget
*rbs
= gtk_object_get_data(GTK_OBJECT(dialog
), "rbs");
781 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rbs
))) typ
=NODE_SKETCH
;
784 gint t
= gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook
));
787 GdkPixbuf
*pixbuf
= NULL
;
791 txt
= g_strdup(gtk_entry_get_text(GTK_ENTRY(entry
)));
792 if (strcmp(txt
, "") == 0)
800 GtkWidget
*sdr
= sketchwidget_get_drawingarea(s
);
802 GdkPixmap
*spix
= sketchwidget_get_Pixmap(s
);
804 pixbuf
= gdk_pixbuf_get_from_drawable(NULL
, GDK_DRAWABLE(spix
), NULL
, 0, 0, 0, 0, sdr
->allocation
.width
, sdr
->allocation
.height
);
805 g_object_unref(spix
);
807 GdkPixbuf
*pixbuf2
= sketchwidget_trim_image(pixbuf
, SKETCHNODE_X
, SKETCHNODE_Y
, &w
,
809 if (pixbuf2
==NULL
) return;
811 GdkPixbuf
*pixbuf3
= gdk_pixbuf_new(GDK_COLORSPACE_RGB
, FALSE
, 8, SKETCHNODE_RX
,
814 gdk_pixbuf_fill(pixbuf3
, 0xffffffff);
816 if (w
<= SKETCHNODE_RX
&& h
<= SKETCHNODE_RY
)
818 gdk_pixbuf_copy_area(pixbuf2
, 0, 0, w
, h
, pixbuf3
, 0, (SKETCHNODE_RY
- h
) / 2);
826 neww
= SKETCHNODE_RX
;
827 newh
= (h
/ w
) * SKETCHNODE_RX
;
831 newh
= SKETCHNODE_RY
;
832 neww
= (w
/ h
) * SKETCHNODE_RY
;
834 if (newh
> SKETCHNODE_RY
)
835 newh
= SKETCHNODE_RY
; /*FIXME: newh exceeds SKETCHNODE_RY sometimes */
837 GdkPixbuf
*tmpbuf
= gdk_pixbuf_scale_simple(pixbuf2
, neww
, newh
,
838 GDK_INTERP_BILINEAR
);
840 gdk_pixbuf_copy_area(tmpbuf
, 0, 0, neww
, newh
, pixbuf3
, 0, (SKETCHNODE_RY
- newh
) / 2);
842 gdk_pixbuf_unref(tmpbuf
);
846 gdk_pixbuf_unref(pixbuf2
);
851 node
= g_malloc(sizeof(nodeData
));
856 node
->namepix
= NULL
;
864 node
->namepix
= pixbuf
;
871 mainview
->newnodedialog_createchild
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb
));
872 add_new_node(node
, mainview
, mainview
->newnodedialog_createchild
);
874 sketchwidget_destroy(s
);
875 gtk_widget_destroy(dialog
);
876 mainview
->file_edited
= TRUE
;
882 void callback_file_delete_node(GtkAction
* action
, gpointer data
)
884 MainView
*mainview
= NULL
;
886 mainview
= (MainView
*) data
;
887 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
889 if (getSelectedNode(mainview
) == NULL
)
891 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Select a node first"));
895 GtkWidget
*dialog
, *label
, *but_ok
, *but_cancel
;
897 dialog
= gtk_dialog_new();
899 label
= gtk_label_new(_("Are you sure?"));
901 but_ok
= gtk_button_new_with_label(_("Yes, Delete"));
902 but_cancel
= gtk_button_new_with_label(_("Cancel"));
904 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->action_area
), but_ok
);
905 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->action_area
), but_cancel
);
907 gtk_object_set_user_data(GTK_OBJECT(dialog
), mainview
);
909 gtk_signal_connect_object(GTK_OBJECT(but_cancel
), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy
), dialog
);
910 g_signal_connect(G_OBJECT(but_ok
), "clicked", G_CALLBACK(callback_delete_node_real
), dialog
);
912 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog
)->vbox
), label
);
914 gtk_widget_show_all(dialog
);
915 gtk_window_set_modal(GTK_WINDOW(dialog
), TRUE
);
918 void callback_file_expand_collapse_node(GtkAction
* action
, gpointer data
)
920 MainView
*mainview
= NULL
;
922 mainview
= (MainView
*) data
;
923 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
928 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(mainview
->treeview
));
930 if (!gtk_tree_selection_get_selected(selection
, &model
, &iter
))
932 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Select a node first"));
936 GtkTreePath
*path
= gtk_tree_model_get_path(model
, &iter
);
937 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(mainview
->treeview
), path
)==FALSE
)
939 gtk_tree_view_expand_row(GTK_TREE_VIEW(mainview
->treeview
), path
, FALSE
);
943 gtk_tree_view_collapse_row(GTK_TREE_VIEW(mainview
->treeview
), path
);
946 gtk_tree_path_free(path
);
949 void callback_file_export_node(GtkAction
* action
, gpointer data
)
951 MainView
*mainview
= NULL
;
953 mainview
= (MainView
*) data
;
954 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
956 nodeData
*nd
=getSelectedNode(mainview
);
959 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Select a node first"));
963 gchar
*nodename
=nd
->name
;
964 if (nodename
==NULL
) nodename
="saved node";
966 if (nd
->typ
== NODE_TEXT
)
968 GtkTextIter begin
, end
;
969 gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER(mainview
->buffer
), &begin
, &end
);
970 gchar
*text
= gtk_text_buffer_get_slice(GTK_TEXT_BUFFER(mainview
->buffer
), &begin
, &end
, TRUE
);
971 if (text
==NULL
|| !strcmp(text
, ""))
973 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Node is empty"));
977 gchar
*fn
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_SAVE
, nodename
, "txt");
980 GnomeVFSResult vfs_result
;
981 GnomeVFSHandle
*handle
= NULL
;
982 GnomeVFSFileSize out_bytes
;
983 vfs_result
= gnome_vfs_create(&handle
, fn
, GNOME_VFS_OPEN_WRITE
, 0, 0600);
984 if ( vfs_result
!= GNOME_VFS_OK
) {
985 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Export failed"));
989 gnome_vfs_write(handle
, text
, strlen(text
), &out_bytes
);
990 gnome_vfs_close(handle
);
991 if (out_bytes
==strlen(text
)) hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Exported"));
992 else hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Export incomplete"));
999 else if (nd
->typ
== NODE_SKETCH
)
1001 GdkPixmap
*skpix
= sketchwidget_get_Pixmap(mainview
->sk
);
1002 GtkWidget
*skdr
= sketchwidget_get_drawingarea(mainview
->sk
);
1003 GdkPixbuf
*pixbuf
= gdk_pixbuf_get_from_drawable(NULL
, GDK_DRAWABLE(skpix
), NULL
, 0, 0, 0, 0, skdr
->allocation
.width
, skdr
->allocation
.height
);
1006 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Node is empty"));
1010 gchar
*fn
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_SAVE
, nodename
, "png");
1013 if (gdk_pixbuf_save(pixbuf
, fn
, "png", NULL
, NULL
)==FALSE
)
1015 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Export failed"));
1019 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Exported"));
1024 g_object_unref(skpix
);
1028 gboolean
ref2iter(GtkTreeModel
* model
, GtkTreeRowReference
* ref
, GtkTreeIter
* iter
)
1030 gboolean res
= FALSE
;
1031 GtkTreePath
*path
= gtk_tree_row_reference_get_path(ref
);
1033 if (gtk_tree_model_get_iter(model
, iter
, path
))
1037 gtk_tree_path_free(path
);
1041 GtkTreeRowReference
*iter2ref(GtkTreeModel
* model
, GtkTreeIter
* iter
)
1043 GtkTreeRowReference
*ref
;
1045 GtkTreePath
*path
= gtk_tree_model_get_path(model
, iter
);
1047 ref
= gtk_tree_row_reference_new(model
, path
);
1048 gtk_tree_path_free(path
);
1052 void move_nodes_up(GtkTreeModel
* model
, GtkTreeRowReference
* topnode
, GtkTreeRowReference
* newtop
)
1054 GtkTreeIter topiter
;
1056 fprintf(stderr
, "here2\n");
1058 if (ref2iter(model
, topnode
, &topiter
) == FALSE
)
1061 fprintf(stderr
, "here3\n");
1065 if (gtk_tree_model_iter_children(model
, &child
, &topiter
))
1067 fprintf(stderr
, "here4\n");
1068 GtkTreeRowReference
*ref
;
1069 GList
*rr_list
= NULL
, *node
;
1073 ref
= iter2ref(model
, &child
);
1074 rr_list
= g_list_append(rr_list
, ref
);
1076 while(gtk_tree_model_iter_next(model
, &child
));
1079 * got a reflist for all children
1082 fprintf(stderr
, "here5\n");
1083 for(node
= rr_list
; node
; node
= node
->next
)
1085 ref
= (GtkTreeRowReference
*) (node
->data
);
1086 if (ref2iter(model
, ref
, &child
))
1088 GtkTreeIter newtopiter
, newiter
;
1089 GtkTreeIter
*newtopiterptr
;
1091 if (ref2iter(model
, newtop
, &newtopiter
))
1092 newtopiterptr
= &newtopiter
;
1094 newtopiterptr
= NULL
;
1098 gtk_tree_model_get(model
, &child
, NODE_DATA
, &node
, -1);
1100 gtk_tree_store_append(GTK_TREE_STORE(model
), &newiter
, newtopiterptr
);
1101 gtk_tree_store_set(GTK_TREE_STORE(model
), &newiter
, NODE_NAME
, node
->name
, NODE_PIXBUF
, node
->namepix
, NODE_DATA
, node
, -1);
1103 GtkTreeRowReference
*newref
= iter2ref(model
, &newiter
);
1105 move_nodes_up(model
, ref
, newref
);
1106 gtk_tree_row_reference_free(newref
);
1108 gtk_tree_store_remove(GTK_TREE_STORE(model
), &child
);
1110 gtk_tree_row_reference_free(ref
);
1112 fprintf(stderr
, "here6\n");
1114 g_list_free(rr_list
);
1117 fprintf(stderr
, "here7\n");
1121 void callback_delete_node_real(GtkAction
* action
, gpointer data
)
1125 GtkWidget
*dialog
= data
;
1127 mainview
= gtk_object_get_user_data(GTK_OBJECT(dialog
));
1130 GtkTreeModel
*model
;
1132 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(mainview
->treeview
));
1134 if (!gtk_tree_selection_get_selected(selection
, &model
, &iter
))
1139 gtk_tree_model_get(model
, &iter
, NODE_DATA
, &nd
, -1);
1143 mainview
->file_edited
= TRUE
;
1145 unsigned int sql3id
= nd
->sql3id
;
1152 * if (nd->pix) g_object_unref(nd->pix);
1156 fprintf(stderr
, "here1\n");
1157 GtkTreeRowReference
*upref
= NULL
, *ref
= NULL
;
1159 GtkTreePath
*path
= gtk_tree_model_get_path(model
, &iter
);
1161 ref
= gtk_tree_row_reference_new(model
, path
);
1162 if (gtk_tree_path_up(path
))
1163 upref
= gtk_tree_row_reference_new(model
, path
);
1164 gtk_tree_path_free(path
);
1166 g_object_ref(model
);
1167 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), NULL
);
1169 fprintf(stderr
, "here! 1\n");
1170 move_nodes_up(model
, ref
, upref
);
1172 fprintf(stderr
, "here! 2\n");
1173 if (ref2iter(model
, ref
, &iter
))
1177 snprintf(tq
, sizeof(tq
), "SELECT parent FROM %s WHERE nodeid=%d", datatable_tmpname
, sql3id
);
1178 sqlite3_stmt
*stmt
= NULL
;
1180 int rc
= sqlite3_prepare(mainview
->db
, tq
, strlen(tq
), &stmt
, &dum
);
1181 unsigned int sql3parentid
= 0;
1185 fprintf(stderr
, "Error %s\n", sqlite3_errmsg(mainview
->db
));
1190 while(rc
== SQLITE_BUSY
|| rc
== SQLITE_ROW
)
1192 rc
= sqlite3_step(stmt
);
1193 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
1195 else if (rc
== SQLITE_ROW
)
1197 sql3parentid
= sqlite3_column_int(stmt
, 0);
1201 sqlite3_finalize(stmt
);
1203 snprintf(tq
, sizeof(tq
), "UPDATE %s SET parent=%d WHERE parent=%d;", datatable_tmpname
, sql3parentid
, sql3id
);
1204 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
1205 fprintf(stderr
, "ERROR moving nodes up!\n");
1208 snprintf(tq
, sizeof(tq
), "DELETE FROM %s WHERE nodeid=%d;", datatable_tmpname
, sql3id
);
1209 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
1210 fprintf(stderr
, "ERROR deleting node!\n");
1213 gtk_tree_store_remove(GTK_TREE_STORE(model
), &iter
);
1216 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), model
);
1217 g_object_unref(model
);
1219 fprintf(stderr
, "here! 3\n");
1220 gtk_tree_row_reference_free(ref
);
1221 gtk_tree_row_reference_free(upref
);
1223 gtk_tree_view_expand_all(GTK_TREE_VIEW(mainview
->treeview
));
1225 fprintf(stderr
, "here10\n");
1226 gtk_widget_destroy(dialog
);
1229 void callback_edit_clear(GtkAction
* action
, gpointer data
)
1231 MainView
*mainview
= NULL
;
1233 mainview
= (MainView
*) data
;
1234 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1236 nodeData
*nd
= getSelectedNode(mainview
);
1238 if (nd
->typ
== NODE_TEXT
) gtk_text_buffer_set_text(GTK_TEXT_BUFFER(mainview
->buffer
), "", 0);
1239 else if (nd
->typ
== NODE_SKETCH
) sketchwidget_clear(mainview
->sk
);
1245 void callback_edit_cut(GtkAction
* action
, gpointer data
)
1247 MainView
*mainview
= NULL
;
1249 mainview
= (MainView
*) data
;
1250 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1252 nodeData
*nd
= getSelectedNode(mainview
);
1254 if (nd
->typ
== NODE_TEXT
)
1255 gtk_text_buffer_cut_clipboard(GTK_TEXT_BUFFER(mainview
->buffer
), mainview
->clipboard
, TRUE
);
1256 else if (nd
->typ
== NODE_SKETCH
)
1257 if (sketchwidget_cut(mainview
->sk
, mainview
->clipboard
)==FALSE
)
1258 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error cutting"));
1264 void callback_edit_copy(GtkAction
* action
, gpointer data
)
1267 * connect pointer to our MainView struct
1269 MainView
*mainview
= NULL
;
1271 mainview
= (MainView
*) data
;
1272 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1274 nodeData
*nd
= getSelectedNode(mainview
);
1276 if (nd
->typ
== NODE_TEXT
)
1277 gtk_text_buffer_copy_clipboard(GTK_TEXT_BUFFER(mainview
->buffer
), mainview
->clipboard
);
1278 else if (nd
->typ
== NODE_SKETCH
)
1279 if (sketchwidget_copy(mainview
->sk
, mainview
->clipboard
)==FALSE
)
1280 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error copying"));
1286 void callback_edit_paste(GtkAction
* action
, gpointer data
)
1289 * connect pointer to our MainView struct
1291 MainView
*mainview
= NULL
;
1293 mainview
= (MainView
*) data
;
1294 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1296 nodeData
*nd
= getSelectedNode(mainview
);
1298 if (nd
->typ
== NODE_TEXT
)
1299 gtk_text_buffer_paste_clipboard(GTK_TEXT_BUFFER(mainview
->buffer
), mainview
->clipboard
, NULL
, TRUE
);
1300 else if (nd
->typ
== NODE_SKETCH
)
1301 if (sketchwidget_paste(mainview
->sk
, mainview
->clipboard
)==FALSE
)
1302 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error pasting"));
1304 mainview
->file_edited
= TRUE
;
1307 gint
cb_popup(GtkWidget
* widget
, GdkEvent
* event
)
1310 GdkEventButton
*event_button
;
1313 * The "widget" is the menu that was supplied when
1314 * * g_signal_connect_swapped() was called.
1316 menu
= GTK_MENU(widget
);
1317 event_button
= (GdkEventButton
*) event
;
1318 if (event
->type
== GDK_BUTTON_PRESS
&& event_button
->button
== 3)
1320 gtk_menu_popup(menu
, NULL
, NULL
, NULL
, NULL
, event_button
->button
, event_button
->time
);
1329 gboolean
closefile(MainView
* mainview
)
1331 saveCurrentData(mainview
);
1333 if (mainview
->file_edited
)
1335 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
));
1336 gint answer
= gtk_dialog_run(GTK_DIALOG(hn
));
1337 gtk_widget_destroy(GTK_WIDGET(hn
));
1339 if (answer
== CONFRESP_CANCEL
)
1341 else if (answer
== CONFRESP_YES
)
1343 if (mainview
->file_name
== NULL
)
1345 mainview
->file_name
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_SAVE
, "maemopaddata", "db");
1347 write_buffer_to_file(mainview
);
1352 sqlite3_close(mainview
->db
);
1353 mainview
->db
= NULL
;
1357 gboolean
callback_file_close(GtkAction
* action
, gpointer data
)
1360 MainView
*mainview
= NULL
;
1362 mainview
= (MainView
*) data
;
1363 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1364 if (closefile(mainview
) == FALSE
)
1371 void callback_file_new_node(GtkAction
* action
, gpointer data
)
1373 MainView
*mainview
= NULL
;
1375 mainview
= (MainView
*) data
;
1376 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1378 nodeType typ
= NODE_SKETCH
;
1380 nodeData
*nd
= getSelectedNode(mainview
);
1385 new_node_dialog(typ
, mainview
);
1391 void callback_file_new(GtkAction
* action
, gpointer data
)
1393 MainView
*mainview
= NULL
;
1395 mainview
= (MainView
*) data
;
1396 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1398 gchar
*filename
= NULL
;
1400 if (closefile(mainview
) == FALSE
)
1403 filename
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_SAVE
, "memos", "db");
1404 if (filename
== NULL
)
1411 setBusy(mainview
, 1);
1415 rc
= sqlite3_open(filename
, &mainview
->db
);
1418 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error 1"));
1419 fprintf(stderr
, "Can't create database %s: %s\n", filename
, sqlite3_errmsg(mainview
->db
));
1424 snprintf(tq
, sizeof(tq
), "CREATE TABLE %s%s", misctable_name
, misctable
);
1425 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
1427 snprintf(tq
, sizeof(tq
), "CREATE TABLE %s%s", datatable_name
, datatable
);
1428 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
1430 fprintf(stderr
, "ERROR creating data table\n");
1431 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Error 2"));
1436 sqlite3_close(mainview
->db
);
1437 mainview
->db
= NULL
;
1439 mainview
->file_name
= filename
;
1440 mainview
->file_edited
= FALSE
;
1441 read_file_to_buffer(mainview
);
1443 /*add a starter memo*/
1445 node
= g_malloc(sizeof(nodeData
));
1446 node
->typ
= NODE_SKETCH
;
1447 node
->name
= _("My first memo");
1448 node
->namepix
= NULL
;
1452 add_new_node(node
, mainview
, TRUE
);
1453 gtk_paned_set_position(GTK_PANED(mainview
->hpaned
), 180);
1454 mainview
->viewflags
= 3;
1455 callback_setview(mainview
, 1);
1456 write_buffer_to_file(mainview
);
1459 setBusy(mainview
, 0);
1462 gboolean
reset_ctree(GtkTreeModel
* model
, GtkTreePath
* path
, GtkTreeIter
* iter
, gpointer data
)
1466 gtk_tree_model_get(model
, iter
, NODE_DATA
, &node
, -1);
1472 g_object_unref(node
->namepix
);
1475 gtk_tree_store_set(GTK_TREE_STORE(model
), iter
, NODE_DATA
, NULL
, -1);
1480 void new_file(MainView
* mainview
)
1482 setBusy(mainview
, 1);
1484 * clear buffer, filename and free buffer text
1486 gtk_text_buffer_set_text(GTK_TEXT_BUFFER(mainview
->buffer
), "", -1);
1487 mainview
->file_name
= NULL
;
1488 mainview
->file_edited
= FALSE
;
1489 mainview
->newnodedialog_createchild
= TRUE
;
1491 GtkTreeModel
*model
= gtk_tree_view_get_model(GTK_TREE_VIEW(mainview
->treeview
));
1493 g_object_ref(model
);
1494 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), NULL
);
1496 gtk_tree_model_foreach(model
, (GtkTreeModelForeachFunc
) reset_ctree
, (gpointer
) mainview
);
1500 * gtk_tree_store_clear(GTK_TREE_STORE(model));
1502 GtkTreePath
*path
= gtk_tree_path_new_from_indices(0, -1);
1505 if (gtk_tree_model_get_iter(model
, &iter
, path
))
1509 gtk_tree_store_remove(GTK_TREE_STORE(model
), &iter
);
1511 while(gtk_tree_store_iter_is_valid(GTK_TREE_STORE(model
), &iter
));
1513 gtk_tree_path_free(path
);
1515 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), model
);
1516 g_object_unref(model
);
1518 prepareUIforNodeChange(mainview
, NODE_UNKNOWN
);
1519 setBusy(mainview
, 2);
1525 void callback_file_open(GtkAction
* action
, gpointer data
)
1527 gchar
*filename
= NULL
;
1528 MainView
*mainview
= NULL
;
1530 mainview
= (MainView
*) data
;
1531 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1533 if (closefile(mainview
) == FALSE
)
1539 filename
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_OPEN
, NULL
, NULL
);
1542 * if we got a file name from chooser -> open file
1544 open_file(filename
, mainview
);
1548 gboolean
open_file(gchar
* filename
, MainView
* mainview
)
1552 setBusy(mainview
, 1);
1554 while(filename
!= NULL
)
1558 if (stat(filename
, &s
) == -1) break;
1560 mainview
->file_name
= g_strdup(filename
);
1561 gboolean res
= read_file_to_buffer(mainview
);
1565 g_free(mainview
->file_name
);
1566 mainview
->file_name
= NULL
;
1569 mainview
->file_edited
= FALSE
;
1574 setBusy(mainview
, 2);
1578 void callback_about_link(GtkAction
* action
, gpointer data
)
1580 MainView
*mainview
= NULL
;
1582 mainview
= (MainView
*) data
;
1583 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1585 osso_rpc_run_with_defaults(mainview
->data
->osso
, "osso_browser", OSSO_BROWSER_OPEN_NEW_WINDOW_REQ
, NULL
,
1586 DBUS_TYPE_STRING
, "http://garage.maemo.org/projects/maemopadplus/", DBUS_TYPE_INVALID
);
1589 void callback_about(GtkAction
* action
, gpointer data
)
1592 MainView
*mainview
= NULL
;
1593 mainview
= (MainView
*) data
;
1597 d
= gtk_dialog_new();
1598 gtk_container_border_width(GTK_CONTAINER(d
), 15);
1602 snprintf(tmp
, sizeof(tmp
), "Maemopad+ %s", VERSION
);
1603 w
= gtk_button_new_with_label(tmp
);
1604 g_object_set(w
, "relief", GTK_RELIEF_NONE
, NULL
);
1605 g_object_set(w
, "focus-on-click", FALSE
, NULL
);
1606 g_signal_connect(G_OBJECT(w
), "clicked", G_CALLBACK(callback_about_link
), mainview
);
1607 gtk_container_add (GTK_CONTAINER(GTK_DIALOG(d
)->vbox
), w
);
1609 w
= gtk_label_new("\nLicense: LGPL\nAuthor: Kemal 'disq' Hadimli <disqkk@gmail.com>\n");
1610 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(d
)->vbox
), w
);
1612 w
= gtk_button_new_with_label(_("Close"));
1613 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(d
)->action_area
), w
);
1614 gtk_signal_connect_object(GTK_OBJECT(w
), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy
), d
);
1616 gtk_widget_show_all(d
);
1617 gtk_window_set_modal(GTK_WINDOW(d
), TRUE
);
1621 MainView
*mainview
=(MainView
*)data
;
1622 const char *authors
[]={"Kemal 'disq' Hadimli <disqkk@gmail.com>", NULL
};
1623 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
);
1631 void callback_file_save(GtkAction
* action
, gpointer data
)
1633 gchar
*filename
= NULL
;
1634 MainView
*mainview
= NULL
;
1636 mainview
= (MainView
*) data
;
1637 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1640 * check is we had a new file
1642 if (mainview
->file_name
!= NULL
)
1644 write_buffer_to_file(mainview
);
1648 filename
= interface_file_chooser(mainview
, GTK_FILE_CHOOSER_ACTION_SAVE
, "maemopaddata", "db");
1650 * if we got a file name from chooser -> save file
1652 if (filename
!= NULL
)
1654 mainview
->file_name
= filename
;
1655 write_buffer_to_file(mainview
);
1656 mainview
->file_edited
= FALSE
;
1661 void callback_shapemenu(GtkAction
* action
, GtkWidget
* wid
)
1663 int style
= (int)gtk_object_get_user_data(GTK_OBJECT(wid
));
1664 MainView
*mainview
= gtk_object_get_data(GTK_OBJECT(wid
), "mainview");
1666 g_assert(mainview
!= NULL
);
1668 if (style
==0) sketchwidget_set_shape(mainview
->sk
, SKETCHSHAPE_FREEHAND
);
1669 else if (style
==1) sketchwidget_set_shape(mainview
->sk
, SKETCHSHAPE_LINE
);
1670 else if (style
==2) sketchwidget_set_shape(mainview
->sk
, SKETCHSHAPE_RECT
);
1671 else if (style
==3) sketchwidget_set_shape(mainview
->sk
, SKETCHSHAPE_ELLIPSE
);
1676 void callback_eraser(GtkAction
* action
, MainView
* mainview
)
1678 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1680 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->eraser_tb
)) == TRUE
)
1688 sketchwidget_set_brushcolor(mainview
->sk
, c2
);
1689 mainview
->brushsize_backup
= sketchwidget_get_brushsize(mainview
->sk
);
1690 guint ers
=(mainview
->brushsize_backup
*4)+4;
1691 sk_set_brushsize(mainview
, ers
);
1692 sketchwidget_set_brushsize(mainview
->sk
, ers
); /*fixme:to override max brush size, not pretty*/
1696 GdkColor
*col
= hildon_color_button_get_color(HILDON_COLOR_BUTTON(mainview
->colorbutton
));
1701 c2
.green
= col
->green
;
1702 c2
.blue
= col
->blue
;
1704 sketchwidget_set_brushcolor(mainview
->sk
, c2
);
1705 sk_set_brushsize(mainview
, mainview
->brushsize_backup
);
1709 void callback_toggletree(GtkAction
* action
, MainView
* mainview
)
1711 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1713 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
)));
1715 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->toggletree_tb
))==TRUE
)
1716 mainview
->viewflags
|= 1;
1718 mainview
->viewflags
&= ~1;
1720 callback_setview(mainview
, 0);
1723 void callback_menu(GtkAction
* action
, GtkWidget
* menu
)
1725 gtk_menu_popup(GTK_MENU(menu
), NULL
, NULL
, NULL
, NULL
, 0, GDK_CURRENT_TIME
);
1728 void callback_brushsizetb(GtkAction
* action
, MainView
*mainview
)
1730 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1732 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->eraser_tb
)) == TRUE
)
1734 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->eraser_tb
), FALSE
);
1738 callback_menu(NULL
, mainview
->brushsizemenu
);
1742 void callback_brushsize(GtkAction
* action
, GtkWidget
* wid
)
1744 int bsize
= (int)gtk_object_get_user_data(GTK_OBJECT(wid
));
1745 MainView
*mainview
= gtk_object_get_data(GTK_OBJECT(wid
), "mainview");
1747 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1749 sketchwidget_set_brushsize(mainview
->sk
, bsize
);
1751 GtkWidget
*pix
= gtk_object_get_data(GTK_OBJECT(wid
), "icon");
1753 gtk_widget_show(pix
);
1754 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(mainview
->brushsize_tb
), pix
);
1757 void callback_sketchlines(GtkAction
* action
, GtkWidget
* wid
)
1759 int style
= (int)gtk_object_get_user_data(GTK_OBJECT(wid
));
1760 MainView
*mainview
= gtk_object_get_data(GTK_OBJECT(wid
), "mainview");
1762 g_assert(mainview
!= NULL
);
1764 nodeData
*nd
= getSelectedNode(mainview
);
1765 gboolean doit
= FALSE
;
1767 if (nd
!= NULL
&& nd
->typ
== NODE_SKETCH
)
1769 nd
->flags
&= ~NODEFLAG_SKETCHLINES
;
1770 nd
->flags
&= ~NODEFLAG_SKETCHGRAPH
;
1771 /* sketchwidget_set_edited(mainview->sk, TRUE);*/ /*we call this on openfile, so this messes things up*/
1777 sketchwidget_set_backstyle(mainview
->sk
, SKETCHBACK_NONE
);
1779 else if (style
== 1)
1781 sketchwidget_set_backstyle(mainview
->sk
, SKETCHBACK_LINES
);
1783 nd
->flags
|= NODEFLAG_SKETCHLINES
;
1785 else if (style
== 2)
1787 sketchwidget_set_backstyle(mainview
->sk
, SKETCHBACK_GRAPH
);
1789 nd
->flags
|= NODEFLAG_SKETCHGRAPH
;
1792 GtkWidget
*pix
= gtk_object_get_data(GTK_OBJECT(wid
), "icon");
1794 gtk_widget_show(pix
);
1795 gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(mainview
->sketchlines_tb
), pix
);
1798 void callback_color(HildonColorButton
* colorButton
, MainView
* mainview
)
1800 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1802 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->eraser_tb
), FALSE
);
1804 GdkColor
*col
= hildon_color_button_get_color(colorButton
);
1809 c2
.green
= col
->green
;
1810 c2
.blue
= col
->blue
;
1812 sketchwidget_set_brushcolor(mainview
->sk
, c2
);
1815 void callback_color_invoke(GtkAction
* action
, gpointer data
)
1817 MainView
*mainview
= NULL
;
1819 mainview
= (MainView
*) data
;
1820 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1822 HildonColorButton
*hc
= HILDON_COLOR_BUTTON(mainview
->colorbutton
);
1824 gtk_button_clicked(GTK_BUTTON(&hc
->button
));
1830 void callback_font(GtkAction
* action
, gpointer data
)
1832 PangoFontDescription
*new_font
= NULL
;
1833 MainView
*mainview
= NULL
;
1835 mainview
= (MainView
*) data
;
1836 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1838 nodeData
*nd
= getSelectedNode(mainview
);
1842 if (nd
->typ
== NODE_SKETCH
)
1845 new_font
= interface_font_chooser(mainview
);
1848 * if we got a new font from chooser -> change font
1850 if (new_font
!= NULL
)
1852 mainview
->font_desc
= new_font
;
1853 gtk_widget_modify_font(mainview
->textview
, mainview
->font_desc
);
1857 void callback_undo(GtkAction
* action
, MainView
* mainview
)
1859 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1861 nodeData
*nd
= getSelectedNode(mainview
);
1863 if (nd
== NULL
|| nd
->typ
!= NODE_SKETCH
)
1866 sketchwidget_undo(mainview
->sk
);
1869 void callback_redo(GtkAction
* action
, MainView
* mainview
)
1871 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1873 nodeData
*nd
= getSelectedNode(mainview
);
1875 if (nd
== NULL
|| nd
->typ
!= NODE_SKETCH
)
1878 sketchwidget_redo(mainview
->sk
);
1881 void callback_undotoggle(SketchWidget
* sk
, gboolean st
, MainView
* mainview
)
1883 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1885 gtk_widget_set_sensitive(GTK_WIDGET(mainview
->undo_tb
), st
);
1888 void callback_redotoggle(SketchWidget
* sk
, gboolean st
, MainView
* mainview
)
1890 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
1892 gtk_widget_set_sensitive(GTK_WIDGET(mainview
->redo_tb
), st
);
1895 gboolean
close_cb(GtkWidget
* widget
, GdkEventAny
* event
, MainView
* mainview
)
1897 callback_file_close(NULL
, mainview
);
1901 gboolean
key_press_cb(GtkWidget
* widget
, GdkEventKey
* event
, MainView
* mainview
)
1903 switch (event
->keyval
)
1908 * gtk_infoprint(GTK_WINDOW(app), "Navigation Key Up");
1912 * gtk_infoprint(GTK_WINDOW(app), "Navigation Key Down");
1916 * gtk_infoprint(GTK_WINDOW(app), "Navigation Key Left");
1920 * gtk_infoprint(GTK_WINDOW(app), "Navigation Key Right");
1924 * gtk_infoprint(GTK_WINDOW(app), "Navigation Key select");
1927 /*code below messes up when you have a textview*/
1932 gtk_widget_child_focus(widget, event->keyval==GDK_Left?GTK_DIR_TAB_BACKWARD:GTK_DIR_TAB_FORWARD);
1938 nodeData
*selnode
= getSelectedNode(mainview
);
1939 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
1941 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Squared shapes ON"));
1942 sketchwidget_set_shift(mainview
->sk
, TRUE
);
1949 nodeData
*selnode
= getSelectedNode(mainview
);
1950 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
1952 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Squared shapes OFF"));
1953 sketchwidget_set_shift(mainview
->sk
, FALSE
);
1960 nodeData
*selnode
= getSelectedNode(mainview
);
1961 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
1963 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Filled shapes OFF"));
1964 sketchwidget_set_fillmode(mainview
->sk
, FALSE
);
1971 nodeData
*selnode
= getSelectedNode(mainview
);
1972 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
1974 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, _("Filled shapes ON"));
1975 sketchwidget_set_fillmode(mainview
->sk
, TRUE
);
1981 if ((mainview
->viewflags
& 4) == 0) mainview
->viewflags
|= 4;
1982 else mainview
->viewflags
&= ~4;
1983 callback_setview(mainview
, 1);
1987 nodeData
*selnode
= getSelectedNode(mainview
);
1988 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
1990 callback_redo(NULL
, mainview
);
1997 nodeData
*selnode
= getSelectedNode(mainview
);
1998 if (selnode
!=NULL
&& selnode
->typ
==NODE_SKETCH
)
2000 callback_undo(NULL
, mainview
);
2006 if ((mainview
->viewflags
& 1) == 0) mainview
->viewflags
|= 1;
2007 else mainview
->viewflags
&= ~1;
2008 callback_setview(mainview
, 1);
2016 void callback_viewmenu(GtkAction
* action
, GtkWidget
* wid
)
2018 int flag
= (int)gtk_object_get_user_data(GTK_OBJECT(wid
));
2019 MainView
*mainview
= gtk_object_get_data(GTK_OBJECT(wid
), "mainview");
2021 g_assert(mainview
!= NULL
);
2023 if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(wid
))) mainview
->viewflags
|= flag
;
2024 else mainview
->viewflags
&= ~flag
;
2028 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->toggletree_tb
), gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(wid
)));
2032 callback_setview(mainview
, 0);
2036 void callback_setview(MainView
*mainview
, int setmenu
)
2040 if ((mainview
->viewflags
&4)>0)
2041 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[2]), TRUE
);
2043 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[2]), FALSE
);
2045 if ((mainview
->viewflags
&2)>0)
2046 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[1]), TRUE
);
2048 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[1]), FALSE
);
2050 if ((mainview
->viewflags
&1)>0)
2052 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[0]), TRUE
);
2053 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->toggletree_tb
), TRUE
);
2057 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mainview
->viewmenuitems
[0]), FALSE
);
2058 gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->toggletree_tb
), FALSE
);
2064 setBusy(mainview
, 1);
2066 if ((mainview
->viewflags
&4)>0)
2067 gtk_window_fullscreen(GTK_WINDOW(mainview
->data
->main_view
));
2069 gtk_window_unfullscreen(GTK_WINDOW(mainview
->data
->main_view
));
2071 if ((mainview
->viewflags
&2)>0)
2072 gtk_widget_show(mainview
->toolbar
);
2074 gtk_widget_hide(mainview
->toolbar
);
2076 if ((mainview
->viewflags
&1)>0)
2077 gtk_widget_show(mainview
->scrolledtree
);
2079 gtk_widget_hide(mainview
->scrolledtree
);
2081 if (mainview
->viewflags
==4)
2082 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sketchwidget_get_mainwidget(mainview
->sk
)), GTK_POLICY_NEVER
, GTK_POLICY_NEVER
);
2084 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sketchwidget_get_mainwidget(mainview
->sk
)), GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
2086 setBusy(mainview
, 2);
2092 void callback_buffer_modified(GtkAction
* action
, gpointer data
)
2095 * connect pointer to our MainView struct
2097 MainView
*mainview
= NULL
;
2099 mainview
= (MainView
*) data
;
2100 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2105 mainview
->file_edited
= TRUE
;
2109 * Callback for exit D-BUS event
2111 void exit_event_handler(gboolean die_now
, gpointer data
)
2113 MainView
*mainview
= NULL
;
2115 mainview
= (MainView
*) data
;
2116 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2120 if (callback_file_close(NULL
, mainview
)==FALSE
) gtk_main_quit(); /*make sure we call gtk_main_quit*/
2127 * application_exit(mainview->data);
2132 * Callback for hardware D-BUS events
2134 void hw_event_handler(osso_hw_state_t
* state
, gpointer data
)
2136 MainView
*mainview
= NULL
;
2138 mainview
= (MainView
*) data
;
2139 g_assert(mainview
!= NULL
&& mainview
->data
!= NULL
);
2142 * if (state->shutdown_ind)
2144 * gtk_infoprint(GTK_WINDOW(mainview->data->app),
2145 * "Shutdown event!");
2147 * if (state->memory_low_ind)
2149 * gtk_infoprint(GTK_WINDOW(mainview->data->app),
2150 * "Memory low event!");
2153 if (state
->save_unsaved_data_ind
)
2155 fprintf(stderr
, "Saving unsaved data!\n");
2156 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, "Saving unsaved data!");
2157 callback_file_save(NULL
, mainview
);
2161 * if (state->system_inactivity_ind)
2163 * gtk_infoprint(GTK_WINDOW(mainview->data->app),
2164 * "Minimize application inactivity event!");
2169 GtkTreeRowReference
*read_sqlite3_data(MainView
* mainview
, unsigned int parentid
, GtkTreeRowReference
* parenttree
, unsigned int selected
, GtkTreeStore
* model
)
2171 GtkTreeRowReference
*resref
= NULL
;
2175 snprintf(q
, sizeof(q
), "SELECT nodeid, bodytype, name, nameblob, lastmodified, flags FROM %s WHERE parent=%d ORDER BY ord", datatable_tmpname
, parentid
);
2177 sqlite3_stmt
*stmt
= NULL
;
2179 int rc
= sqlite3_prepare(mainview
->db
, q
, strlen(q
), &stmt
, &dum
);
2183 fprintf(stderr
, "Error %s\n", sqlite3_errmsg(mainview
->db
));
2188 while(rc
== SQLITE_BUSY
|| rc
== SQLITE_ROW
)
2190 rc
= sqlite3_step(stmt
);
2191 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
2193 else if (rc
== SQLITE_ROW
)
2195 int nodeid
= sqlite3_column_int(stmt
, 0);
2196 int typ
= sqlite3_column_int(stmt
, 1);
2197 const unsigned char *name
= sqlite3_column_text(stmt
, 2);
2198 const unsigned char *nameblob
= sqlite3_column_text(stmt
, 3);
2199 int lastmod
= sqlite3_column_int(stmt
, 4);
2200 int flags
= sqlite3_column_int(stmt
, 5);
2203 * fprintf(stderr, "CARD=%s TYPE=%d\n", name, typ);
2205 if ((typ
!= NODE_TEXT
&& typ
!= NODE_SKETCH
) || (name
== NULL
&& nameblob
== NULL
))
2209 * fprintf(stderr, "invalid card, skipping\n");
2214 nodeData
*node
= g_malloc(sizeof(nodeData
));
2216 node
->sql3id
= nodeid
;
2218 node
->flags
= flags
;
2220 node
->namepix
= NULL
;
2222 node
->name
= g_strdup((char *)name
);
2223 if (nameblob
!= NULL
)
2225 int blobsize
= sqlite3_column_bytes(stmt
, 3);
2227 GdkPixbufLoader
*pl
= gdk_pixbuf_loader_new_with_type("png", NULL
);
2230 gdk_pixbuf_loader_write(pl
, (guchar
*) nameblob
, blobsize
, &err
);
2233 fprintf(stderr
, "Error loading nodename! %s\n", err
->message
);
2237 gdk_pixbuf_loader_close(pl
, NULL
);
2238 GdkPixbuf
*pixbuf
= gdk_pixbuf_loader_get_pixbuf(pl
);
2240 if (GDK_IS_PIXBUF(pixbuf
))
2241 node
->namepix
= pixbuf
;
2243 node
->lastMod
= lastmod
;
2245 GtkTreeIter parentiter
, newiter
;
2248 if (parenttree
!= NULL
)
2250 GtkTreePath
*pa
= gtk_tree_row_reference_get_path(parenttree
);
2252 gtk_tree_model_get_iter(GTK_TREE_MODEL(model
), &parentiter
, pa
);
2253 gtk_tree_path_free(pa
);
2257 gtk_tree_store_append(model
, &newiter
, par
);
2258 gtk_tree_store_set(model
, &newiter
, NODE_NAME
, node
->name
, NODE_PIXBUF
, node
->namepix
, NODE_DATA
, node
, -1);
2260 GtkTreePath
*pa
= gtk_tree_model_get_path(GTK_TREE_MODEL(model
), &newiter
);
2262 GtkTreeRowReference
*newref
= gtk_tree_row_reference_new(GTK_TREE_MODEL(model
), pa
);
2264 if (selected
== nodeid
)
2267 gtk_tree_path_free(pa
);
2268 GtkTreeRowReference
*r
= read_sqlite3_data(mainview
, nodeid
, newref
, selected
,
2271 if (resref
!= newref
)
2272 gtk_tree_row_reference_free(newref
);
2279 gtk_tree_row_reference_free(r
); /*safeguard */
2285 sqlite3_finalize(stmt
);
2287 return (resref
); /*ref to supposed-to-be-selected treeitem */
2293 gboolean
read_file_to_buffer(MainView
* mainview
)
2297 g_assert(mainview
!= NULL
);
2298 gboolean res
= FALSE
;
2300 gchar
*filename
= mainview
->file_name
;
2303 mainview
->file_name
= filename
;
2304 mainview
->loading
=TRUE
;
2306 fprintf(stderr
, "read:*%s*\n", filename
);
2309 sqlite3_stmt
*stmt
= NULL
;
2311 rc
= sqlite3_open(filename
, &mainview
->db
);
2316 fprintf(stderr
, "Can't open database %s: %s\n", filename
, sqlite3_errmsg(mainview
->db
));
2320 char *q
= "SELECT skey, sval FROM settings";
2323 rc
= sqlite3_prepare(mainview
->db
, q
, strlen(q
), &stmt
, &dum
);
2326 fprintf(stderr
, "Error %s\n", sqlite3_errmsg(mainview
->db
));
2330 unsigned int selectedCard
= 0;
2333 * fprintf(stderr, "start config\n");
2335 unsigned int curDataVersion
= 0;
2338 while(rc
== SQLITE_BUSY
|| rc
== SQLITE_ROW
)
2340 rc
= sqlite3_step(stmt
);
2341 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
|| rc
== SQLITE_DONE
)
2343 else if (rc
== SQLITE_ROW
)
2345 const unsigned char *col_key
= sqlite3_column_text(stmt
, 0);
2346 const unsigned char *col_val
= sqlite3_column_text(stmt
, 1);
2349 * fprintf(stderr, "%s=%s\n", col_key, col_val);
2351 if (!strcmp(col_key
, "leftPanedPos"))
2353 gint panedPos
= atoi((char *)col_val
);
2356 gtk_paned_set_position(GTK_PANED(mainview
->hpaned
), panedPos
);
2358 if (!strcmp(col_key
, "selectedNode"))
2360 gint tmp
= atoi((char *)col_val
);
2365 if (!strcmp(col_key
, "dataVersion"))
2367 gint tmp
= atoi((char *)col_val
);
2370 curDataVersion
= tmp
;
2372 if (!strcmp(col_key
, "newNodeDlgCreateChild"))
2374 gint tmp
= atoi((char *)col_val
);
2376 mainview
->newnodedialog_createchild
= TRUE
;
2378 mainview
->newnodedialog_createchild
= FALSE
;
2380 if (!strcmp(col_key
, "fullScreen"))
2382 gint tmp
= atoi((char *)col_val
);
2383 if (tmp
<0 || tmp
>4) tmp
=0;
2387 else if (tmp
==1) tmp
=2;
2388 else if (tmp
==2) tmp
=7;
2389 else if (tmp
==3) tmp
=6;
2390 else if (tmp
==4) tmp
=4;
2391 mainview
->viewflags
=tmp
;
2392 callback_setview(mainview
, TRUE
);
2394 if (!strcmp(col_key
, "viewFlags"))
2396 gint tmp
= atoi((char *)col_val
);
2398 mainview
->viewflags
=tmp
;
2399 callback_setview(mainview
, TRUE
);
2401 if (!strcmp(col_key
, "brushSize"))
2403 gint tmp
= atoi((char *)col_val
);
2404 if (tmp
>0) sk_set_brushsize(mainview
, tmp
);
2406 if (!strcmp(col_key
, "brushColor"))
2408 unsigned long tmp
= atol((char *)col_val
);
2411 c2
.red
= ((tmp
& 0xFF0000) >> 16) << 8;
2412 c2
.green
= ((tmp
& 0xFF00) >> 8) << 8;
2413 c2
.blue
= (tmp
& 0xFF) << 8;
2414 /* fprintf(stderr, "READ BRUSHCOLOR is %ul (%d,%d,%d)\n", tmp, c2.red, c2.green, c2.blue);*/
2416 sketchwidget_set_brushcolor(mainview
->sk
, c2
);
2417 hildon_color_button_set_color(HILDON_COLOR_BUTTON(mainview
->colorbutton
), &c2
);
2422 if (rc
== SQLITE_ERROR
|| rc
== SQLITE_MISUSE
)
2424 fprintf(stderr
, "Error2 %s\n", sqlite3_errmsg(mainview
->db
));
2429 * fprintf(stderr, "end config\n");
2432 sqlite3_finalize(stmt
);
2434 gboolean resback
= FALSE
;
2436 while(curDataVersion
< datatableversion
)
2438 if (curDataVersion
== 0)
2440 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", datatable_backupname
);
2441 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2443 snprintf(tq
, sizeof(tq
), "ALTER TABLE %s RENAME TO %s", datatable_name
, datatable_backupname
);
2444 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2446 fprintf(stderr
, "ERROR backing up table!\n");
2451 snprintf(tq
, sizeof(tq
), "CREATE TABLE %s%s", datatable_name
, datatable
);
2452 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2454 fprintf(stderr
, "ERROR creating table!\n");
2457 snprintf(tq
, sizeof(tq
), "INSERT INTO %s SELECT nodeid, parent, bodytype, name, body, nameblob, bodyblob, lastmodified, ord, 0 FROM %s", datatable_name
, datatable_backupname
);
2458 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2460 fprintf(stderr
, "ERROR copying data!\n");
2464 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", datatable_backupname
);
2465 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2467 curDataVersion
= datatableversion
;
2470 if (curDataVersion
!= datatableversion
)
2472 fprintf(stderr
, "Data version mismatch\n");
2474 if (resback
== TRUE
)
2476 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", datatable_name
);
2477 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2478 snprintf(tq
, sizeof(tq
), "ALTER TABLE %s RENAME TO %s", datatable_backupname
, datatable_name
);
2479 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2485 GtkTreeStore
*model
= GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(mainview
->treeview
)));
2487 g_object_ref(model
);
2488 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), NULL
);
2494 snprintf(tq
, sizeof(tq
), "CREATE%s TABLE %s%s", TEMPTABLE_KEYWORD
, datatable_tmpname
, datatable
);
2495 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2497 fprintf(stderr
, "ERROR creating temp table!\n");
2500 snprintf(tq
, sizeof(tq
), "CREATE INDEX %s_index ON %s %s", datatable_tmpname
, datatable_tmpname
, dataindex
);
2501 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2503 fprintf(stderr
, "ERROR creating temp index!\n");
2506 snprintf(tq
, sizeof(tq
), "INSERT INTO %s SELECT * FROM %s", datatable_tmpname
, datatable_name
);
2507 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2509 fprintf(stderr
, "ERROR copying data to temp table!\n");
2515 GtkTreeRowReference
*selectedRef
= read_sqlite3_data(mainview
, 0, NULL
, selectedCard
, model
);
2517 gtk_tree_view_set_model(GTK_TREE_VIEW(mainview
->treeview
), GTK_TREE_MODEL(model
));
2518 g_object_unref(model
);
2519 gtk_tree_view_expand_all(GTK_TREE_VIEW(mainview
->treeview
));
2521 if (selectedRef
!= NULL
)
2523 GtkTreeIter seliter
;
2525 if (ref2iter(GTK_TREE_MODEL(model
), selectedRef
, &seliter
) == TRUE
)
2527 GtkTreeSelection
*selection
= gtk_tree_view_get_selection(GTK_TREE_VIEW(mainview
->treeview
));
2528 gtk_tree_selection_select_iter(selection
, &seliter
);
2531 gtk_tree_row_reference_free(selectedRef
);
2538 sqlite3_finalize(stmt
);
2541 mainview
->loading
=FALSE
;
2549 void write_buffer_to_file(MainView
* mainview
)
2551 fprintf(stderr
, "write:*%s*\n", mainview
->file_name
);
2552 saveCurrentData(mainview
);
2554 setBusy(mainview
, 1);
2558 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", misctable_name
);
2559 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2561 snprintf(tq
, sizeof(tq
), "CREATE TABLE %s%s", misctable_name
, misctable
);
2562 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2564 gint panedPos
= gtk_paned_get_position(GTK_PANED(mainview
->hpaned
));
2566 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('leftPanedPos', '%d');", misctable_name
, panedPos
);
2567 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2571 if (mainview
->newnodedialog_createchild
== FALSE
)
2573 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('newNodeDlgCreateChild', '%d');", misctable_name
, nndcc
);
2574 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2576 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('viewFlags', '%d');", misctable_name
, mainview
->viewflags
);
2577 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2579 nodeData
*node
= getSelectedNode(mainview
);
2583 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('selectedNode', '%d');", misctable_name
, node
->sql3id
);
2584 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2588 if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(mainview
->eraser_tb
)) == TRUE
)
2590 bsize
=mainview
->brushsize_backup
;
2594 bsize
=sketchwidget_get_brushsize(mainview
->sk
);
2596 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('brushSize', '%d');", misctable_name
, bsize
);
2597 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2599 GdkColor
*col
= hildon_color_button_get_color(HILDON_COLOR_BUTTON(mainview
->colorbutton
));
2600 unsigned long bcol
=((col
->red
>> 8) << 16) | ((col
->green
>> 8) << 8) | (col
->blue
>> 8);
2601 /* fprintf(stderr, "BRUSHCOLOR is %d (%d,%d,%d)\n", bcol, col->red, col->green, col->blue);*/
2602 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('brushColor', '%lu');", misctable_name
, bcol
);
2603 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2605 snprintf(tq
, sizeof(tq
), "INSERT INTO %s VALUES('dataVersion', '%d');", misctable_name
, datatableversion
);
2606 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2608 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", datatable_backupname
);
2609 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2610 snprintf(tq
, sizeof(tq
), "CREATE TABLE %s%s", datatable_backupname
, datatable
);
2611 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2613 fprintf(stderr
, "ERROR creating backup table!\n");
2614 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, "Error 1");
2617 snprintf(tq
, sizeof(tq
), "INSERT INTO %s SELECT * FROM %s", datatable_backupname
, datatable_name
);
2618 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2620 fprintf(stderr
, "ERROR backing up table!\n");
2621 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, "Error 2");
2624 snprintf(tq
, sizeof(tq
), "DELETE FROM %s", datatable_name
);
2625 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2627 snprintf(tq
, sizeof(tq
), "INSERT INTO %s SELECT * FROM %s", datatable_name
, datatable_tmpname
);
2628 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2630 fprintf(stderr
, "ERROR saving table!\n");
2631 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), NULL
, "Error 3");
2633 snprintf(tq
, sizeof(tq
), "DELETE FROM %s", datatable_name
);
2634 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2636 snprintf(tq
, sizeof(tq
), "INSERT INTO %s SELECT * FROM %s", datatable_name
, datatable_backupname
);
2637 if (sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
) != 0)
2639 fprintf(stderr
, "ERROR restoring backup! data lost!\n");
2641 setBusy(mainview
, 2);
2645 snprintf(tq
, sizeof(tq
), "DROP TABLE %s", datatable_backupname
);
2646 sqlite3_exec(mainview
->db
, tq
, NULL
, NULL
, NULL
);
2648 mainview
->file_edited
= FALSE
;
2649 setBusy(mainview
, 2);
2650 hildon_banner_show_information(GTK_WIDGET(mainview
->data
->main_view
), GTK_STOCK_SAVE
, _("Saved"));