2
* Copyright (C) Pierre-Yves LUYTEN 2012 <py@luyten.fr>
4
* bijiben is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU General Public License as published by the
6
* Free Software Foundation, either version 3 of the License, or
7
* (at your option) any later version.
9
* bijiben is distributed in the hope that it will be useful, but
10
* WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
* See the GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License along
15
* with this program. If not, see <http://www.gnu.org/licenses/>.
18
#include <glib/gprintf.h>
20
#include <libbiji/libbiji.h>
21
#include <libgd/gd-main-view.h>
23
#include "utils/bjb-icons-colors.h"
25
#include "bjb-app-menu.h"
26
#include "bjb-bijiben.h"
27
#include "bjb-controller.h"
28
#include "bjb-main-toolbar.h"
29
#include "bjb-main-view.h"
30
#include "bjb-note-tag-dialog.h"
31
#include "bjb-note-view.h"
32
#include "bjb-rename-note.h"
33
#include "bjb-search-toolbar.h"
34
#include "bjb-selection-toolbar.h"
35
#include "bjb-window-base.h"
37
#define DEFAULT_VIEW GD_MAIN_VIEW_ICON
47
static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
49
/************************** Gobject ***************************/
51
struct _BjbMainViewPriv {
56
BjbMainToolbar *main_toolbar;
59
BjbSelectionToolbar *select_bar;
62
BjbSearchToolbar *search_bar;
64
/* View Notes , model */
66
BjbController *controller ;
75
G_DEFINE_TYPE (BjbMainView, bjb_main_view, GTK_TYPE_BOX);
78
bjb_main_view_init (BjbMainView *object)
81
G_TYPE_INSTANCE_GET_PRIVATE(object,BJB_TYPE_MAIN_VIEW,BjbMainViewPriv);
85
bjb_main_view_finalize (GObject *object)
87
G_OBJECT_CLASS (bjb_main_view_parent_class)->finalize (object);
91
bjb_main_view_disconnect_handlers (BjbMainView *self)
93
BjbMainViewPriv *priv = self->priv;
95
g_signal_handler_disconnect (priv->window, priv->key);
96
g_signal_handler_disconnect (priv->view, priv->button);
97
g_signal_handler_disconnect (priv->view, priv->activated);
98
g_signal_handler_disconnect (priv->view, priv->data);
102
bjb_main_view_set_controller ( BjbMainView *self, BjbController *controller)
104
self->priv->controller = controller ;
108
bjb_main_view_get_property ( GObject *object,
113
BjbMainView *self = BJB_MAIN_VIEW (object);
118
g_value_set_object (value, self->priv->window);
120
case PROP_BJB_CONTROLLER:
121
g_value_set_object (value, self->priv->controller);
124
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
130
bjb_main_view_set_property ( GObject *object,
135
BjbMainView *self = BJB_MAIN_VIEW (object);
140
self->priv->window = g_value_get_object(value);
142
case PROP_BJB_CONTROLLER:
143
bjb_main_view_set_controller(self,g_value_get_object(value));
146
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
152
biji_main_view_constructor (GType gtype,
154
GObjectConstructParam *properties)
158
obj = G_OBJECT_CLASS (bjb_main_view_parent_class)->constructor (gtype, n_properties, properties);
166
switch_to_note_view (BjbMainView *self, BijiNoteObj *note)
168
bjb_search_toolbar_disconnect (self->priv->search_bar);
169
bjb_main_view_disconnect_handlers (self);
170
bjb_window_base_switch_to_note (BJB_WINDOW_BASE (self->priv->window), note);
174
show_window_if_note (gpointer data, gpointer user_data)
176
BjbWindowBase *window = data;
177
BijiNoteObj *to_open = user_data;
178
BijiNoteObj *cur = NULL;
180
cur = bjb_window_base_get_note (window);
182
if (cur && biji_note_obj_are_same (to_open, cur))
183
gtk_window_present (data);
187
switch_to_note (BjbMainView *view, BijiNoteObj *to_open)
189
/* If the note is already opened in another window, just show it. */
190
if (biji_note_obj_is_opened (to_open))
194
notes = gtk_application_get_windows(GTK_APPLICATION(g_application_get_default()));
195
g_list_foreach (notes, show_window_if_note, to_open);
199
/* Otherwise, leave main view */
200
switch_to_note_view(view,to_open);
204
get_selected_paths(BjbMainView *self)
206
return gd_main_view_get_selection ( self->priv->view ) ;
210
get_note_url_from_tree_path(GtkTreePath *path, BjbMainView *self)
214
GtkTreeModel *model ;
216
model = bjb_controller_get_model(self->priv->controller);
217
gtk_tree_model_get_iter (model,&iter, path);
218
gtk_tree_model_get (model, &iter,GD_MAIN_COLUMN_URI, ¬e_path,-1);
224
action_tag_selected_notes (GtkWidget *w, BjbMainView *view)
230
paths = get_selected_paths(view);
232
for (l=paths ; l != NULL ; l=l->next)
234
gchar *url = get_note_url_from_tree_path (l->data, view) ;
235
notes = g_list_prepend (notes, note_book_get_note_at_path
236
(bjb_window_base_get_book(view->priv->window),url));
240
g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
241
bjb_note_tag_dialog_new (GTK_WINDOW (view->priv->window), notes);
246
bjb_main_view_get_selected_notes_color (BjbMainView *view, GdkRGBA *color)
253
paths = get_selected_paths(view);
254
url = get_note_url_from_tree_path (paths->data, view) ;
255
note = note_book_get_note_at_path (bjb_window_base_get_book(view->priv->window), url);
257
g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
259
return biji_note_obj_get_rgba (note, color);
263
action_color_selected_notes (GtkWidget *w, BjbMainView *view)
265
GList *notes = NULL ;
269
gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (w), &color);
272
paths = get_selected_paths(view);
274
for (l=paths ; l != NULL ; l=l->next)
276
gchar *url = get_note_url_from_tree_path (l->data, view) ;
277
notes = g_list_prepend (notes, note_book_get_note_at_path
278
(bjb_window_base_get_book(view->priv->window),url));
282
g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
284
for (l=notes ; l != NULL ; l=l->next)
286
biji_note_obj_set_rgba (BIJI_NOTE_OBJ (l->data), &color);
293
action_delete_selected_notes(GtkWidget *w,BjbMainView *view)
299
paths = get_selected_paths(view);
301
for (l=paths ; l != NULL ; l=l->next)
303
gchar *url = get_note_url_from_tree_path (l->data, view) ;
304
notes = g_list_prepend (notes, note_book_get_note_at_path
305
(bjb_window_base_get_book(view->priv->window),url));
309
g_list_free_full (paths, (GDestroyNotify) gtk_tree_path_free);
311
for (l=notes ; l != NULL ; l=l->next)
313
biji_note_book_remove_note (bjb_window_base_get_book (view->priv->window),
314
BIJI_NOTE_OBJ (l->data));
320
/* Select all, escape */
322
on_key_press_event_cb (GtkWidget *widget,
326
BjbMainView *self = BJB_MAIN_VIEW (user_data);
327
BjbMainViewPriv *priv = self->priv;
329
switch (event->key.keyval)
333
if (gd_main_view_get_selection_mode (priv->view) && event->key.state & GDK_CONTROL_MASK)
335
gd_main_view_select_all (priv->view);
341
if (gd_main_view_get_selection_mode (priv->view))
343
gd_main_view_set_selection_mode (priv->view, FALSE);
344
on_selection_mode_changed (priv->main_toolbar);
355
/* Go to selection mode with right-click */
357
on_button_press_event_cb (GtkWidget *widget,
361
BjbMainView *self = BJB_MAIN_VIEW (user_data);
362
BjbMainViewPriv *priv = self->priv;
364
switch (event->button.button)
368
if (!gd_main_view_get_selection_mode (priv->view))
370
gd_main_view_set_selection_mode (priv->view, TRUE);
371
on_selection_mode_changed (priv->main_toolbar);
382
on_item_activated(GdMainView * gd,
384
const GtkTreePath * path,
387
BijiNoteBook * book ;
388
BijiNoteObj * to_open ;
391
GtkTreeModel * model ;
394
model = gd_main_view_get_model (gd);
395
gtk_tree_model_get_iter (model, &iter, (GtkTreePath*) path);
396
gtk_tree_model_get (model, &iter,COL_URI, ¬e_path,-1);
398
/* Switch to that note */
399
book = bjb_window_base_get_book (view->priv->window);
400
to_open = note_book_get_note_at_path (book, note_path);
402
switch_to_note (view, to_open);
407
static GtkTargetEntry target_list[] = {
408
{ "text/plain", 0, 2}
412
on_drag_data_received (GtkWidget *widget,
413
GdkDragContext *context,
416
GtkSelectionData *data,
421
gint length = gtk_selection_data_get_length (data) ;
425
guchar *text = gtk_selection_data_get_text(data);
431
BjbMainView *self = BJB_MAIN_VIEW (user_data);
433
/* FIXME Text is guchar utf 8, conversion to perform */
434
book = bjb_window_base_get_book (self->priv->window);
435
ret = biji_note_book_new_note_with_text (book, (gchar*) text);
436
switch_to_note_view (self, ret); // maybe AFTER drag finish?
442
/* Return false to ensure text is not removed from source
443
* We just want to create a note. */
444
gtk_drag_finish (context, FALSE, FALSE, time);
448
bjb_main_view_connect_signals (BjbMainView *self)
450
BjbMainViewPriv *priv = self->priv;
452
bjb_controller_connect (priv->controller);
453
bjb_search_toolbar_connect (priv->search_bar);
455
priv->key = g_signal_connect (priv->window, "key-press-event",
456
G_CALLBACK (on_key_press_event_cb), self);
457
priv->button = g_signal_connect (priv->view, "button-press-event",
458
G_CALLBACK (on_button_press_event_cb), self);
459
priv->activated = g_signal_connect(priv->view,"item-activated",
460
G_CALLBACK(on_item_activated),self);
461
priv->data = g_signal_connect (priv->view, "drag-data-received",
462
G_CALLBACK (on_drag_data_received), self);
466
bjb_main_view_constructed(GObject *o)
469
GtkBox *vbox; //self, too
470
BjbMainViewPriv *priv;
472
GdRevealer *revealer;
474
G_OBJECT_CLASS (bjb_main_view_parent_class)->constructed(G_OBJECT(o));
476
self = BJB_MAIN_VIEW(o);
478
vbox = GTK_BOX (self);
480
gtk_box_set_homogeneous (vbox, FALSE);
481
gtk_box_set_spacing (vbox, 0);
482
gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
484
priv->view = gd_main_view_new (DEFAULT_VIEW);
485
bjb_controller_set_main_view (priv->controller, priv->view);
488
priv->main_toolbar = bjb_main_toolbar_new (priv->view, self, priv->controller);
489
gtk_box_pack_start (vbox, GTK_WIDGET (priv->main_toolbar), FALSE, FALSE, 0);
491
/* Search entry toolbar */
492
priv->search_bar = bjb_search_toolbar_new (priv->window, priv->controller);
493
revealer = bjb_search_toolbar_get_revealer (priv->search_bar);
494
gtk_box_pack_start (vbox, GTK_WIDGET (revealer), FALSE, FALSE, 0);
497
overlay = GTK_OVERLAY (gtk_overlay_new ());
499
gd_main_view_set_selection_mode (priv->view, FALSE);
500
gd_main_view_set_model (priv->view, bjb_controller_get_model(priv->controller));
502
gtk_container_add (GTK_CONTAINER (overlay), GTK_WIDGET (priv->view));
503
gtk_box_pack_start (vbox, GTK_WIDGET (overlay), TRUE, TRUE, 0);
505
/* Selection Panel */
506
priv->select_bar = bjb_selection_toolbar_new (priv->view, self);
507
gtk_overlay_add_overlay (overlay, GTK_WIDGET (priv->select_bar));
510
gtk_drag_dest_set (GTK_WIDGET (priv->view), GTK_DEST_DEFAULT_ALL,
511
target_list, 1, GDK_ACTION_COPY);
513
bjb_main_view_connect_signals (self);
514
gtk_widget_show_all (GTK_WIDGET (self));
518
bjb_main_view_class_init (BjbMainViewClass *klass)
520
GObjectClass *object_class = G_OBJECT_CLASS (klass);
522
object_class->finalize = bjb_main_view_finalize;
523
object_class->get_property = bjb_main_view_get_property;
524
object_class->set_property = bjb_main_view_set_property;
525
object_class->constructor = biji_main_view_constructor;
526
object_class->constructed = bjb_main_view_constructed;
528
g_type_class_add_private (klass, sizeof (BjbMainViewPriv));
530
properties[PROP_WINDOW] = g_param_spec_object ("window",
536
G_PARAM_STATIC_STRINGS);
538
properties[PROP_BJB_CONTROLLER] = g_param_spec_object ("controller",
544
G_PARAM_STATIC_STRINGS);
546
g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
550
bjb_main_view_new(GtkWidget *win,
551
BjbController *controller)
553
return g_object_new( BJB_TYPE_MAIN_VIEW,
555
"controller", controller,
560
bjb_main_view_get_window(BjbMainView *view)
562
return view->priv->window ;
566
bjb_main_view_update_model (BjbMainView *self)
568
BjbMainViewPriv *priv = self->priv;
570
bjb_controller_set_main_view (priv->controller,priv->view);
571
gd_main_view_set_model(priv->view,bjb_controller_get_model(priv->controller));