static void check_insert_create_zeitgeist (BijiNoteObj *note) { gchar *uri; ZeitgeistLog *log; GPtrArray *templates; ZeitgeistEvent *event; ZeitgeistSubject *subject; uri = g_strdup_printf ("file://%s", biji_item_get_uuid (BIJI_ITEM (note))); log = biji_note_book_get_zg_log (biji_item_get_book (BIJI_ITEM (note))); templates = g_ptr_array_new (); event = zeitgeist_event_new_full (ZEITGEIST_ZG_CREATE_EVENT, NULL, "application://bijiben.desktop", NULL, NULL); subject = zeitgeist_subject_new (); zeitgeist_subject_set_uri (subject, uri); zeitgeist_event_add_subject (event, subject); g_ptr_array_add (templates, event); zeitgeist_log_find_events (log, zeitgeist_time_range_new_to_now (), templates, ZEITGEIST_STORAGE_STATE_ANY, 10, ZEITGEIST_RESULT_TYPE_LEAST_RECENT_EVENTS, NULL, (GAsyncReadyCallback) on_find_create_event, note); }
void insert_zeitgeist (BijiNoteObj *note, gchar *zg_interpretation) { gchar *uri; const gchar *title; ZeitgeistEvent *event; ZeitgeistSubject *subject; ZeitgeistLog *log; /* Make sure that only notes with a title log their events. If a note is closed without a title, it is deleted. This section prevents the ACCESS_EVENT being called immediately after the note is created and the note is empty */ title = biji_item_get_title (BIJI_ITEM (note)); if (title == NULL || g_utf8_strlen (title, -1) <= 0) return; /* Insert requested log */ log = biji_note_book_get_zg_log (biji_item_get_book (BIJI_ITEM (note))); uri = g_strdup_printf ("file://%s", biji_item_get_uuid (BIJI_ITEM (note))); subject = zeitgeist_subject_new_full (uri, ZEITGEIST_NFO_DOCUMENT, ZEITGEIST_NFO_FILE_DATA_OBJECT, "application/x-note", "", title, ""); event = zeitgeist_event_new_full (zg_interpretation, ZEITGEIST_ZG_USER_ACTIVITY, "application://bijiben.desktop", "", subject, NULL); if (g_strcmp0 (zg_interpretation, ZEITGEIST_ZG_CREATE_EVENT) ==0) zeitgeist_event_set_timestamp (event, biji_note_obj_get_create_date (note)/1000); zeitgeist_log_insert_event_no_reply (log, event, NULL); g_free (uri); /* * Check if the note * was already created into zeitgeist */ if (g_strcmp0 (zg_interpretation, ZEITGEIST_ZG_MODIFY_EVENT) ==0) check_insert_create_zeitgeist (note); }
static void on_biji_note_obj_closed_cb (BijiNoteObj *note) { BijiNoteObjPrivate *priv; BijiItem *item; const gchar *title; priv = note->priv; item = BIJI_ITEM (note); priv->editor = NULL; title = biji_item_get_title (item); #ifdef BUILD_ZEITGEIST insert_zeitgeist (note, ZEITGEIST_ZG_LEAVE_EVENT); #endif /* BUILD_ZEITGEIST */ /* * Delete (not _trash_ if note is totaly blank * A Cancellable would be better than needs->save */ if (biji_note_id_get_content (priv->id) == NULL) { priv->needs_save = FALSE; biji_item_delete (item); } /* If the note has no title */ else if (title == NULL) { title = biji_note_obj_get_raw_text (note); biji_note_obj_set_title (note, title); } }
/* TODO find EOL for xdg-email */ gboolean on_email_note_callback(GtkWidget *widget, BijiNoteObj *note) { GError *error; error = NULL; gchar *title_mail, *text_mail; title_mail = mail_str ((gchar*) biji_item_get_title (BIJI_ITEM (note))); text_mail = mail_str (biji_note_obj_get_raw_text (note)); gchar *execute[7] = { "xdg-email", "--utf8", "--subject", title_mail, "--body", text_mail, NULL } ; g_spawn_async ( NULL, execute, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error); if ( error != NULL ) g_message("error :%s",error->message); g_free (title_mail); g_free (text_mail); return TRUE ; }
/* * TODO : move this to local provider. */ static BijiNoteObj * biji_note_book_local_note_new (BijiNoteBook *book, gchar *str) { BijiNoteObj *ret = get_note_skeleton (book); if (str) { gchar *unique, *html; unique = biji_note_book_get_unique_title (book, str); html = html_from_plain_text (str); biji_note_obj_set_title (ret, unique); biji_note_obj_set_raw_text (ret, str); biji_note_obj_set_html (ret, html); g_free (unique); g_free (html); } biji_note_obj_save_note (ret); biji_note_book_add_item (book, BIJI_ITEM (ret), TRUE); return ret; }
static void action_delete_selected_items (GtkWidget *w, BjbSelectionToolbar *self) { GList *l, *selection; BijiNoteBook *book; selection = bjb_main_view_get_selected_items (self->priv->view); book = bjb_window_base_get_book (bjb_main_view_get_window (self->priv->view)); for (l=selection; l !=NULL; l=l->next) { biji_note_book_remove_item (book, BIJI_ITEM (l->data)); } g_list_free (selection); }
/* No matter if icon is saved or not. * We just try */ void biji_note_obj_save_icon (BijiNoteObj *note) { gchar *filename; GError *error = NULL; /* Png */ filename = biji_note_obj_get_icon_file (note); gdk_pixbuf_save (biji_item_get_icon (BIJI_ITEM (note)), filename, "png", &error, NULL); if (error) { g_warning ("%s", error->message); g_error_free (error); } g_free (filename); }
static gboolean title_is_unique (BijiNoteBook *book, gchar *title) { gboolean is_unique = TRUE; BijiItem *iter; GList *items, *l; items = g_hash_table_get_values (book->priv->items); for ( l=items ; l != NULL ; l = l->next) { iter = BIJI_ITEM (l->data); if (g_strcmp0 (biji_item_get_title (iter), title) == 0) { is_unique = FALSE; break; } } g_list_free (items); return is_unique; }
/* If already a title, then note is renamed */ gboolean biji_note_obj_set_title (BijiNoteObj *note, const gchar *proposed_title) { gchar *old_title, *title; gboolean retval; title = NULL; old_title = g_strdup (biji_note_id_get_title (note->priv->id)); if (g_strcmp0 (proposed_title, old_title) == 0) { retval = FALSE; goto out; } title = biji_manager_get_unique_title ( biji_item_get_manager (BIJI_ITEM (note)), proposed_title); biji_note_id_set_last_metadata_change_date (note->priv->id, g_get_real_time () / G_USEC_PER_SEC); /* Emit signal even if initial title, just to let know */ biji_note_id_set_title (note->priv->id, title); g_signal_emit (G_OBJECT (note), biji_obj_signals[NOTE_RENAMED], 0); retval = TRUE; out: if (old_title != NULL) g_free (old_title); if (title != NULL) g_free (title); return retval; }
gboolean biji_lazy_serialize_internal (BijiLazySerializer *self) { BijiLazySerializerPrivate *priv = self->priv; GList *tags; GdkRGBA color; gchar *date, *color_str; gboolean retval; const gchar *path; GTimeVal time = {0, 0}; priv->writer = xmlNewTextWriterMemory(priv->buf, 0); // Header xmlTextWriterStartDocument (priv->writer,"1.0","utf-8",NULL); xmlTextWriterStartElement (priv->writer, BAD_CAST "note"); xmlTextWriterWriteAttributeNS (priv->writer, NULL, BAD_CAST "version",NULL, BAD_CAST "1"); xmlTextWriterWriteAttributeNS (priv->writer, BAD_CAST "xmlns", BAD_CAST "link", NULL, BAD_CAST "http://projects.gnome.org/bijiben/link"); xmlTextWriterWriteAttributeNS (priv->writer, BAD_CAST "xmlns", BAD_CAST "size", NULL, BAD_CAST "http://projects.gnome.org/bijiben/size"); xmlTextWriterWriteAttributeNS (priv->writer, NULL, BAD_CAST "xmlns", NULL, BAD_CAST "http://projects.gnome.org/bijiben"); // <Title> serialize_node (priv->writer, "title", (gchar*) biji_item_get_title (BIJI_ITEM (priv->note))); // <text> xmlTextWriterWriteRaw(priv->writer, BAD_CAST "\n "); xmlTextWriterStartElement(priv->writer, BAD_CAST "text"); xmlTextWriterWriteAttributeNS(priv->writer, BAD_CAST "xml", BAD_CAST "space", NULL, BAD_CAST "preserve"); serialize_html (self); // </text> xmlTextWriterEndElement(priv->writer); // <last-change-date> time.tv_sec = biji_item_get_mtime (BIJI_ITEM (priv->note)); date = g_time_val_to_iso8601 (&time); if (date) { serialize_node (priv->writer, "last-change-date", date); g_free (date); } time.tv_sec = biji_note_obj_get_last_metadata_change_date (priv->note); date = g_time_val_to_iso8601 (&time); if (date) { serialize_node (priv->writer, "last-metadata-change-date", date); g_free (date); } time.tv_sec = biji_note_obj_get_create_date (priv->note); date = g_time_val_to_iso8601 (&time); if (date) { serialize_node (priv->writer, "create-date", date); g_free (date); } serialize_node (priv->writer, "cursor-position", "0"); serialize_node (priv->writer, "selection-bound-position", "0"); serialize_node (priv->writer, "width", "0"); serialize_node (priv->writer, "height", "0"); serialize_node (priv->writer, "x", "0"); serialize_node (priv->writer, "y", "0"); if (biji_note_obj_get_rgba (priv->note, &color)) { color_str = gdk_rgba_to_string (&color); serialize_node (priv->writer, "color", color_str); g_free (color_str); } //<tags> xmlTextWriterWriteRaw(priv->writer, BAD_CAST "\n "); xmlTextWriterStartElement (priv->writer, BAD_CAST "tags"); tags = biji_note_obj_get_notebooks (priv->note); g_list_foreach (tags, (GFunc) serialize_tags, priv->writer); xmlTextWriterEndElement (priv->writer); g_list_free (tags); // <open-on-startup> serialize_node (priv->writer, "open-on-startup", "False"); // <note> xmlTextWriterWriteRaw(priv->writer, BAD_CAST "\n "); xmlTextWriterEndElement(priv->writer); xmlFreeTextWriter(priv->writer); path = biji_item_get_uuid (BIJI_ITEM (priv->note)); retval = g_file_set_contents (path, (gchar*) priv->buf->content, -1, NULL); return retval; }
/* Gobj */ static void bjb_window_base_constructed (GObject *obj) { BjbWindowBase *self = BJB_WINDOW_BASE (obj); BjbWindowBasePriv *priv; gboolean maximized; const gint32 *position; const gint32 *size; gsize n_elements; GVariant *variant; G_OBJECT_CLASS (bjb_window_base_parent_class)->constructed (obj); priv = self->priv; priv->settings = bjb_app_get_settings ((gpointer) g_application_get_default ()); gtk_window_set_position (GTK_WINDOW (self),GTK_WIN_POS_CENTER); gtk_window_set_title (GTK_WINDOW (self), _(BIJIBEN_MAIN_WIN_TITLE)); variant = g_settings_get_value (G_SETTINGS (priv->settings), "window-size"); size = g_variant_get_fixed_array (variant, &n_elements, sizeof (gint32)); if (n_elements == 2) gtk_window_set_default_size (GTK_WINDOW (self), size[0], size[1]); g_variant_unref (variant); variant = g_settings_get_value (G_SETTINGS (priv->settings), "window-position"); position = g_variant_get_fixed_array (variant, &n_elements, sizeof (gint32)); if (n_elements == 2) gtk_window_move (GTK_WINDOW (self), position[0], position[1]); g_variant_unref (variant); maximized = g_settings_get_boolean (G_SETTINGS (priv->settings), "window-maximized"); if (maximized) gtk_window_maximize (GTK_WINDOW (self)); /* We probably want to offer a no entry window at first (startup) */ priv->entry = NULL ; priv->controller = bjb_controller_new (bijiben_get_manager (BIJIBEN_APPLICATION(g_application_get_default())), GTK_WINDOW (obj), priv->entry ); /* Shared toolbar */ priv->view = bjb_main_view_new (GTK_WIDGET (obj), priv->controller); priv->main_toolbar = bjb_main_toolbar_new (priv->view, priv->controller); gtk_window_set_titlebar (GTK_WINDOW (self), GTK_WIDGET (priv->main_toolbar)); /* Search entry toolbar */ priv->search_bar = bjb_search_toolbar_new (GTK_WIDGET (obj), priv->controller); gtk_box_pack_start (GTK_BOX (priv->vbox), GTK_WIDGET (priv->search_bar), FALSE, FALSE, 0); /* UI : stack for different views */ priv->stack = GTK_STACK (gtk_stack_new ()); gtk_box_pack_start (GTK_BOX (priv->vbox), GTK_WIDGET (priv->stack), TRUE, TRUE, 0); priv->spinner = gtk_spinner_new (); gtk_stack_add_named (priv->stack, priv->spinner, "spinner"); gtk_stack_set_visible_child_name (priv->stack, "spinner"); gtk_widget_show (priv->spinner); gtk_spinner_start (GTK_SPINNER (priv->spinner)); priv->no_note = bjb_empty_results_box_new (); gtk_stack_add_named (priv->stack, priv->no_note, "empty"); gtk_stack_add_named (priv->stack, GTK_WIDGET (priv->view), "main-view"); gtk_widget_show (GTK_WIDGET (priv->stack)); /* Connection to window signals */ g_signal_connect (GTK_WIDGET (self), "destroy", G_CALLBACK (bjb_window_base_destroy), self); g_signal_connect (self, "window-state-event", G_CALLBACK (bjb_application_window_state_changed), priv->settings); g_signal_connect (self, "configure-event", G_CALLBACK (bjb_application_window_configured), self); /* Keys */ g_signal_connect (GTK_WIDGET (self), "key-press-event", G_CALLBACK(on_key_pressed_cb), self); /* If a note is requested at creation, show it * This is a specific type of window not associated with any view */ if (priv->note == NULL) { bjb_window_base_switch_to (self, BJB_WINDOW_BASE_MAIN_VIEW); } else { priv->detached = TRUE; bjb_window_base_switch_to_item (self, BIJI_ITEM (priv->note)); } /* For some reason, do not gtk_widget_show _self_ * or gtk_application_get_menu_bar will run, * fire a warning, while app menu will not show up * you have been warned! * * This is probably due to the fact that, * at startup, we still are * inside... drums... gapplication startup () */ gtk_widget_show (priv->vbox); }
void switch_to_note_view (BjbMainView *self, BijiNoteObj *note) { bjb_main_view_disconnect_handlers (self); bjb_window_base_switch_to_item (BJB_WINDOW_BASE (self->priv->window), BIJI_ITEM (note)); }
static void book_on_item_icon_changed_cb (BijiNoteObj *note, BijiNoteBook *book) { biji_note_book_notify_changed (book, BIJI_BOOK_ITEM_ICON_CHANGED, BIJI_ITEM (note)); }
void book_on_note_changed_cb (BijiNoteObj *note, BijiNoteBook *book) { biji_note_book_notify_changed (book, BIJI_BOOK_NOTE_AMENDED, BIJI_ITEM (note)); }
gboolean biji_lazy_deserialize_internal (BijiLazyDeserializer *self) { BijiNoteObj* n = self->priv->note; const gchar *path; xmlDocPtr doc; xmlNodePtr cur; xmlChar *version; path = biji_item_get_uuid (BIJI_ITEM (n)); doc = xmlParseFile (path); if (doc == NULL ) { g_warning ("File not parsed successfully"); return FALSE; } cur = xmlDocGetRootElement (doc); if (cur == NULL) { g_warning ("File empty"); xmlFreeDoc(doc); return FALSE; } if (xmlStrcmp(cur->name, (const xmlChar *) "note")) { g_message ("document of the wrong type, root node != note"); xmlFreeDoc(doc); return FALSE; } /* Switch there for note type * Despite not yet handled */ version = xmlGetNoNsProp (cur, BAD_CAST "version"); /* Bijiben type */ if (g_strcmp0 ((gchar*) cur->ns->href, BIJI_NS) ==0) { self->priv->type = BIJIBEN_1; } /* Tomboy type */ else { if (g_strcmp0 ((gchar*) cur->ns->href, TOMBOY_NS) == 0) { if (g_strcmp0 ((const gchar*) version, "0.1") == 0) self->priv->type = TOMBOY_1; if (g_strcmp0 ((const gchar*) version, "0.2") == 0) self->priv->type = TOMBOY_2; if (g_strcmp0 ((const gchar*) version, "0.3") == 0) self->priv->type = TOMBOY_3; } /* Wow this note won't be loaded i guess */ else { self->priv->type = NO_TYPE; } } xmlFree (version); path = biji_item_get_uuid (BIJI_ITEM (n)); self->priv->r = xmlNewTextReaderFilename (path); biji_parse_file (self); xmlFreeDoc (doc); return TRUE ; }
/* Common XML format for both Bijiben / Tomboy */ static void processNode (BijiLazyDeserializer *self) { xmlTextReaderPtr r = self->priv->r; BijiNoteObj * n = self->priv->note; xmlChar *name; GdkRGBA color; gchar *tag, *color_str; GString *norm; name = xmlTextReaderName (r); if ( g_strcmp0((gchar*)name,"title") == 0 ) biji_process_string (r, (BijiReaderFunc*) biji_note_obj_set_title, n); if ( g_strcmp0((gchar*)name,"text") == 0 ) { if (self->priv->type == BIJIBEN_1) { process_bijiben_html_content (self, r); } else if (self->priv->type == TOMBOY_1 || self->priv->type == TOMBOY_2 || self->priv->type == TOMBOY_3 ) { self->priv->content = (gchar*) xmlTextReaderReadInnerXml (r); process_tomboy_xml_content (self); } } if (g_strcmp0 ((gchar*) name, "last-change-date") == 0) { gchar *result = (gchar*) xmlTextReaderReadString (r); biji_note_obj_set_mtime (n, iso8601_to_gint64 (result)); free (result); } if (g_strcmp0 ((gchar*) name, "last-metadata-change-date") == 0) { gchar *result = (gchar*) xmlTextReaderReadString (r); biji_note_obj_set_last_metadata_change_date (n, iso8601_to_gint64 (result)); free (result); } if (g_strcmp0 ((gchar*) name, "create-date") == 0) { gchar *result = (gchar*) xmlTextReaderReadString (r); biji_note_obj_set_create_date (n, iso8601_to_gint64 (result)); free (result); } if (g_strcmp0 ((gchar*) name, "color") == 0 ) { color_str = (gchar*) xmlTextReaderReadString (r); if (gdk_rgba_parse (&color, color_str)) biji_note_obj_set_rgba (n, &color); else g_warning ("color invalid:%s", color_str); free (color_str); } if ( g_strcmp0((gchar*)name,"tag") == 0 ) { tag = (gchar*) xmlTextReaderReadString(r); if (g_str_has_prefix (tag,"system:template")) { note_obj_set_is_template(n,TRUE); } else if (g_str_has_prefix (tag,"system:notebook:")) { norm = g_string_new (tag); g_string_erase (norm,0,16); biji_item_add_notebook (BIJI_ITEM (n), NULL, norm->str); g_string_free (norm, TRUE); } free (tag); } xmlFree(name); }