** it removes 'icons.h' , 'preference.h' and 'history.h' -> they were not being used anymore. ** it restrutures Minimo.cpp , minimo_callbacks files -> In some places of the source code, there were methods in the wrong file, and so on. ** it changes the varibles and methods naming in all files (gFILENAME_NAME e.g. gPreferenceStruct) ** it creates a new file (minimo_support), and add the respective line in the Makefile.in file. ** it improves the bookmark manager, and also adds the FIND feature into its gtk_tree_view. ** it fixes some small bugs. r=antonio.gomes@indt.org.br. git-svn-id: svn://10.0.0.236/trunk@177874 18797224-902f-48f8-a5cc-f745e15eee43
909 lines
28 KiB
C++
909 lines
28 KiB
C++
/* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Christopher Blizzard. Portions created by Christopher Blizzard are Copyright (C) Christopher Blizzard. All Rights Reserved.
|
|
* Portions created by the Initial Developer are Copyright (C) 2001
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* Christopher Blizzard <blizzard@mozilla.org>
|
|
* Doug Turner <dougt@meer.net> Branched from TestGtkEmbed.cpp
|
|
*
|
|
* The 10LE Team (in alphabetical order)
|
|
* -------------------------------------
|
|
*
|
|
* Ilias Biris <ext-ilias.biris@indt.org.br> - Coordinator
|
|
* Afonso Costa <afonso.costa@indt.org.br>
|
|
* Antonio Gomes <antonio.gomes@indt.org.br>
|
|
* Diego Gonzalez <diego.gonzalez@indt.org.br>
|
|
* Raoni Novellino <raoni.novellino@indt.org.br>
|
|
* Andre Pedralho <andre.pedralho@indt.org.br>
|
|
*
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
* the provisions above, a recipient may use your version of this file under
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
*
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
#include "minimo_bookmark.h"
|
|
|
|
/* Bookmark global variables */
|
|
FILE *gBookmarkFilePointer;
|
|
gchar *gBookmarkFilePath;
|
|
GtkMozEmbed *gBookmarkMozEmbed;
|
|
|
|
/* initialize the embed variable */
|
|
void bookmark_moz_embed_initialize(GtkWidget *embed)
|
|
{
|
|
gBookmarkMozEmbed= GTK_MOZ_EMBED(embed);
|
|
}
|
|
|
|
/* Create bookmarks manager window */
|
|
void bookmark_create_dialog ()
|
|
{
|
|
BookmarkWindow *bwin;
|
|
GtkTreeViewColumn *column1, *column2;
|
|
GtkCellRenderer *renderer1,*renderer2;
|
|
|
|
bookmark_open_file ();
|
|
|
|
bwin = g_new0(BookmarkWindow,1);
|
|
|
|
bwin->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
|
g_object_set_data(G_OBJECT(bwin->window),"window",bwin->window);
|
|
gtk_window_set_title(GTK_WINDOW(bwin->window),"Bookmarks");
|
|
gtk_widget_set_usize(bwin->window,230,350);
|
|
gtk_window_set_resizable(GTK_WINDOW(bwin->window),FALSE);
|
|
gtk_window_set_position (GTK_WINDOW(bwin->window),GTK_WIN_POS_CENTER_ON_PARENT);
|
|
gtk_window_set_modal (GTK_WINDOW (bwin->window), TRUE);
|
|
gtk_window_set_keep_above(GTK_WINDOW (bwin->window), TRUE);
|
|
|
|
bwin->vbox1 = gtk_vbox_new(FALSE,0);
|
|
gtk_widget_show(bwin->vbox1);
|
|
gtk_container_add(GTK_CONTAINER(bwin->window),bwin->vbox1);
|
|
|
|
bwin->hbox4 = gtk_hbox_new(FALSE,0);
|
|
gtk_widget_show(bwin->hbox4);
|
|
gtk_box_pack_start(GTK_BOX(bwin->vbox1),bwin->hbox4,FALSE,FALSE,0);
|
|
|
|
bwin->menubar = gtk_menu_bar_new();
|
|
|
|
bwin->menu_item_tools = gtk_menu_item_new_with_label("Tools");
|
|
gtk_menu_bar_append(GTK_MENU_BAR(bwin->menubar), bwin->menu_item_tools);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox4),bwin->menubar,FALSE,FALSE,0);
|
|
gtk_widget_show (bwin->menu_item_tools);
|
|
gtk_widget_show (bwin->menubar);
|
|
|
|
bwin->menu_tools = gtk_menu_new();
|
|
gtk_menu_item_set_submenu(GTK_MENU_ITEM(bwin->menu_item_tools),bwin->menu_tools);
|
|
gtk_widget_show (bwin->menu_tools);
|
|
|
|
bwin->menu_import = gtk_menu_item_new_with_label("Import bookmarks");
|
|
gtk_menu_bar_append(GTK_MENU(bwin->menu_tools), bwin->menu_import);
|
|
gtk_signal_connect (GTK_OBJECT (bwin->menu_import), "activate", GTK_SIGNAL_FUNC(bookmark_import_cb), bwin);
|
|
gtk_widget_show (bwin->menu_import);
|
|
|
|
bwin->menu_export = gtk_menu_item_new_with_label("Export bookmarks");
|
|
gtk_menu_bar_append(GTK_MENU(bwin->menu_tools), bwin->menu_export);
|
|
gtk_signal_connect (GTK_OBJECT (bwin->menu_export), "activate", GTK_SIGNAL_FUNC(bookmark_export_cb), bwin);
|
|
gtk_widget_show (bwin->menu_export);
|
|
|
|
bwin->scrolled_window = gtk_scrolled_window_new(NULL,NULL);
|
|
gtk_widget_show(bwin->scrolled_window);
|
|
gtk_box_pack_start(GTK_BOX(bwin->vbox1),bwin->scrolled_window,TRUE,TRUE,0);
|
|
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(bwin->scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
|
|
|
|
/* mount the bookmark treeview */
|
|
bwin->treev_data = g_new0(BookmarkTreeVData,1);
|
|
bwin->treev_data->treeStore = GTK_TREE_MODEL(gtk_tree_store_new(2,G_TYPE_STRING,G_TYPE_STRING));
|
|
bwin->treev = gtk_tree_view_new_with_model(GTK_TREE_MODEL(bwin->treev_data->treeStore));
|
|
|
|
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (bwin->treev), TRUE);
|
|
gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (bwin->treev), TRUE);
|
|
gtk_tree_view_set_reorderable(GTK_TREE_VIEW (bwin->treev), TRUE);
|
|
gtk_tree_view_set_rules_hint(GTK_TREE_VIEW (bwin->treev), TRUE);
|
|
gtk_widget_show(bwin->treev);
|
|
|
|
gtk_container_add(GTK_CONTAINER(bwin->scrolled_window),bwin->treev);
|
|
|
|
renderer1 = gtk_cell_renderer_text_new();
|
|
gtk_cell_renderer_set_fixed_size (renderer1,100,-1);
|
|
column1 = gtk_tree_view_column_new_with_attributes("Name", renderer1, "text", 0, NULL);
|
|
gtk_tree_view_column_set_resizable (column1, TRUE);
|
|
gtk_tree_view_append_column(GTK_TREE_VIEW(bwin->treev),
|
|
column1);
|
|
gtk_tree_view_set_expander_column(GTK_TREE_VIEW(bwin->treev),column1);
|
|
gtk_tree_view_set_search_column (GTK_TREE_VIEW(bwin->treev),0);
|
|
|
|
renderer2 = gtk_cell_renderer_text_new();
|
|
column2 = gtk_tree_view_column_new_with_attributes("URL", renderer2, "text", 1, NULL);
|
|
gtk_tree_view_append_column(GTK_TREE_VIEW(bwin->treev),
|
|
column2);
|
|
|
|
bwin->treev_data->parentIter = NULL;
|
|
|
|
bookmark_load_from_file(bwin->treev_data);
|
|
|
|
/* expand the main tree */
|
|
gtk_tree_view_expand_row(GTK_TREE_VIEW (bwin->treev),gtk_tree_path_new_from_string("0"),FALSE);
|
|
|
|
/* set selection mode */
|
|
bwin->selection= gtk_tree_view_get_selection(GTK_TREE_VIEW (bwin->treev));
|
|
gtk_tree_selection_set_mode (bwin->selection, GTK_SELECTION_SINGLE);
|
|
|
|
/* set find function */
|
|
gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW(bwin->treev),bookmark_search_function,bwin,NULL);
|
|
|
|
/* set selection signal */
|
|
g_signal_connect(bwin->treev,"cursor-changed",G_CALLBACK(bookmark_on_treev_select_row_cb),bwin);
|
|
|
|
/* hbox1: name label, name entry, url label, url entry and add button */
|
|
bwin->hbox1 = gtk_hbox_new(FALSE,0);
|
|
gtk_widget_show(bwin->hbox1);
|
|
gtk_box_pack_start(GTK_BOX(bwin->vbox1),bwin->hbox1,FALSE,FALSE,0);
|
|
|
|
/* name label */
|
|
bwin->text_label = gtk_label_new("Name ");
|
|
gtk_widget_show(bwin->text_label);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox1),bwin->text_label,FALSE,FALSE,0);
|
|
|
|
/* name entry */
|
|
bwin->text_entry = gtk_entry_new();
|
|
gtk_widget_show(bwin->text_entry);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox1),bwin->text_entry,TRUE,TRUE,0);
|
|
|
|
/* url label */
|
|
bwin->url_label = gtk_label_new(" URL ");
|
|
gtk_widget_show(bwin->url_label);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox1),bwin->url_label,FALSE,FALSE,2);
|
|
|
|
/* url entry */
|
|
bwin->url_entry = gtk_entry_new();
|
|
gtk_widget_show(bwin->url_entry);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox1),bwin->url_entry,TRUE,TRUE,0);
|
|
gtk_entry_set_text(GTK_ENTRY(bwin->url_entry),"");
|
|
|
|
/* hbox 2: add folder button and folder name entry */
|
|
bwin->hbox2 = gtk_hbox_new(FALSE,0);
|
|
gtk_widget_show(bwin->hbox2);
|
|
gtk_box_pack_start(GTK_BOX(bwin->vbox1),bwin->hbox2,FALSE,FALSE,0);
|
|
|
|
/* folder name label */
|
|
bwin->text_label = gtk_label_new("Folder ");
|
|
gtk_widget_show(bwin->text_label);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox2),bwin->text_label,FALSE,FALSE,0);
|
|
|
|
/* folder name entry */
|
|
bwin->folder_entry = gtk_entry_new();
|
|
gtk_widget_show(bwin->folder_entry);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox2),bwin->folder_entry,TRUE,TRUE,0);
|
|
|
|
/* add button */
|
|
bwin->add_button = gtk_button_new_with_label("Add");
|
|
gtk_widget_show(bwin->add_button);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox2),bwin->add_button,FALSE,FALSE,0);
|
|
g_signal_connect(G_OBJECT(bwin->add_button),"clicked",G_CALLBACK(bookmark_add_button_cb),bwin);
|
|
|
|
/* edit button */
|
|
bwin->edit_button = gtk_button_new_with_label("Edit");
|
|
gtk_widget_show(bwin->edit_button);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox2),bwin->edit_button,FALSE,FALSE,0);
|
|
g_signal_connect(G_OBJECT(bwin->edit_button),"clicked",G_CALLBACK(bookmark_edit_button_cb),bwin);
|
|
|
|
/* hbox 3: go, ok, remove buttons */
|
|
bwin->hbox3 = gtk_hbox_new(FALSE,0);
|
|
gtk_widget_show(bwin->hbox3);
|
|
gtk_box_pack_start(GTK_BOX(bwin->vbox1),bwin->hbox3,FALSE,FALSE,0);
|
|
|
|
/* go button */
|
|
bwin->go_button = gtk_button_new_with_label("Go");
|
|
gtk_widget_show(bwin->go_button);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox3),bwin->go_button,FALSE,FALSE,0);
|
|
g_signal_connect(G_OBJECT(bwin->go_button),"clicked",G_CALLBACK(bookmark_go_button_cb),bwin);
|
|
|
|
/* ok button */
|
|
bwin->ok_button = gtk_button_new_with_label("Ok");
|
|
gtk_widget_show(bwin->ok_button);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox3),bwin->ok_button,FALSE,FALSE,0);
|
|
g_signal_connect(G_OBJECT(bwin->ok_button),"clicked",G_CALLBACK(bookmark_ok_button_cb),bwin);
|
|
|
|
/* remove button */
|
|
bwin->remove_button = gtk_button_new_with_label("Remove");
|
|
gtk_widget_show(bwin->remove_button);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox3),bwin->remove_button,FALSE,FALSE,0);
|
|
g_signal_connect(G_OBJECT(bwin->remove_button),"clicked",G_CALLBACK(bookmark_remove_button_cb),bwin);
|
|
|
|
/* cancel button*/
|
|
bwin->cancel_button = gtk_button_new_with_label("Cancel");
|
|
gtk_widget_show(bwin->cancel_button);
|
|
gtk_box_pack_start(GTK_BOX(bwin->hbox3),bwin->cancel_button,FALSE,FALSE,0);
|
|
g_signal_connect(G_OBJECT(bwin->cancel_button),"clicked",G_CALLBACK(bookmark_cancel_button_cb),bwin);
|
|
|
|
gtk_widget_show(bwin->window);
|
|
}
|
|
|
|
/* verify if there is a bookmark file */
|
|
void bookmark_open_file ()
|
|
{
|
|
gBookmarkFilePath = g_strconcat(g_get_home_dir(),"/.Minimo/bookmarks",NULL);
|
|
|
|
if (!(g_file_test(gBookmarkFilePath,G_FILE_TEST_EXISTS)))
|
|
{
|
|
gBookmarkFilePointer = fopen(gBookmarkFilePath,"w+");
|
|
fprintf(gBookmarkFilePointer, "folder Bookmarks\n");
|
|
fclose(gBookmarkFilePointer);
|
|
bookmark_open_file ();
|
|
}
|
|
else
|
|
{
|
|
gBookmarkFilePointer = fopen(gBookmarkFilePath,"r");
|
|
}
|
|
}
|
|
|
|
/* load the treeview from the file */
|
|
void bookmark_load_from_file(BookmarkTreeVData *treev_data)
|
|
{
|
|
gchar *line = (gchar *)g_malloc(1024);
|
|
BookmarkData *data= g_new0(BookmarkData,1);
|
|
GtkTreeIter *parentIter= g_new0(GtkTreeIter,1);
|
|
|
|
while(fgets(line,1023,gBookmarkFilePointer)!= NULL)
|
|
{
|
|
line = g_strstrip(line);
|
|
|
|
if (g_strncasecmp(line,"folder",6) == 0)
|
|
{
|
|
data->label = g_strdup(line+7);
|
|
data->url = "";
|
|
bookmark_insert_folder_on_treeview(data,treev_data);
|
|
|
|
continue;
|
|
}
|
|
|
|
if (g_strncasecmp(line,"url",3) == 0)
|
|
{
|
|
gchar **temp;
|
|
|
|
temp = g_strsplit(line+4," ",2);
|
|
data->url = g_strdup(temp[0]);
|
|
|
|
if (temp[1] != NULL)
|
|
data->label = g_strdup(temp[1]);
|
|
else
|
|
data->label = g_strdup(temp[0]);
|
|
g_strfreev(temp);
|
|
|
|
bookmark_insert_item_on_treeview(data,treev_data);
|
|
|
|
continue;
|
|
}
|
|
|
|
if (g_strncasecmp(line,"/folder",7) == 0)
|
|
{
|
|
if (gtk_tree_model_iter_parent(treev_data->treeStore, parentIter, treev_data->parentIter))
|
|
{
|
|
treev_data->parentIter= gtk_tree_iter_copy(parentIter);
|
|
}
|
|
}
|
|
}
|
|
|
|
g_free(line);
|
|
g_free(data);
|
|
g_free(parentIter);
|
|
}
|
|
|
|
/* the treeview internal search function */
|
|
gboolean bookmark_search_function(GtkTreeModel *tree_view, gint column, const gchar *key, GtkTreeIter *iter,void *bwin)
|
|
{
|
|
BookmarkData *bmark = g_new0(BookmarkData,1);
|
|
|
|
gtk_tree_model_get(GTK_TREE_MODEL(tree_view), iter, 0, &bmark->label, 1, &bmark->url, -1);
|
|
|
|
if (g_str_has_prefix(g_ascii_strdown ((char *)(bmark->label),-1),g_ascii_strdown ((char *)key,-1)))
|
|
{
|
|
gtk_tree_selection_select_iter (((BookmarkWindow *)bwin)->selection, iter);
|
|
bookmark_on_treev_select_row_cb (NULL, (BookmarkWindow *)bwin);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* insert a new folder on treeview */
|
|
void bookmark_insert_folder_on_treeview(BookmarkData *data, BookmarkTreeVData *treev_data)
|
|
{
|
|
GtkTreeIter *newIter= g_new0(GtkTreeIter,1);
|
|
|
|
gtk_tree_store_append(GTK_TREE_STORE(treev_data->treeStore),newIter,treev_data->parentIter);
|
|
gtk_tree_store_set(GTK_TREE_STORE(treev_data->treeStore), newIter, 0, data->label, 1, data->url, -1);
|
|
|
|
treev_data->parentIter= newIter;
|
|
}
|
|
|
|
/* insert a new url on treeview */
|
|
void bookmark_insert_item_on_treeview(BookmarkData *data, BookmarkTreeVData *treev_data)
|
|
{
|
|
GtkTreeIter *newIter= g_new0(GtkTreeIter,1);
|
|
|
|
gtk_tree_store_append(GTK_TREE_STORE(treev_data->treeStore),newIter,treev_data->parentIter);
|
|
gtk_tree_store_set(GTK_TREE_STORE(treev_data->treeStore), newIter, 0, data->label, 1, data->url, -1);
|
|
}
|
|
|
|
/* get selected data */
|
|
void bookmark_on_treev_select_row_cb (GtkTreeView *view, BookmarkWindow *bwin)
|
|
{
|
|
BookmarkData *bmark;
|
|
|
|
bookmark_clear_all_entries(bwin);
|
|
|
|
bmark = g_new0(BookmarkData,1);
|
|
|
|
gtk_tree_selection_get_selected(bwin->selection, &bwin->treev_data->treeStore, &bwin->iter);
|
|
gtk_tree_model_get(bwin->treev_data->treeStore, &bwin->iter, 0, &bmark->label, 1, &bmark->url, -1);
|
|
|
|
if (g_ascii_strcasecmp(bmark->url,"") == 0)
|
|
{
|
|
gtk_entry_set_text(GTK_ENTRY(bwin->folder_entry), g_strstrip(bmark->label));
|
|
gtk_entry_set_text(GTK_ENTRY(bwin->url_entry), "");
|
|
}
|
|
else
|
|
{
|
|
gtk_entry_set_text(GTK_ENTRY(bwin->text_entry), g_strstrip(bmark->label));
|
|
gtk_entry_set_text(GTK_ENTRY(bwin->url_entry), g_strstrip(bmark->url));
|
|
}
|
|
|
|
bwin->treev_data->parentIter= &bwin->iter;
|
|
g_free(bmark);
|
|
}
|
|
|
|
/* add a bookmark */
|
|
void bookmark_add_button_cb(GtkWidget *button,BookmarkWindow *bwin)
|
|
{
|
|
BookmarkData *data;
|
|
GtkTreeIter *iter;
|
|
|
|
iter= g_new0(GtkTreeIter,1);
|
|
data = g_new0(BookmarkData,1);
|
|
|
|
data->url = g_strdup(gtk_entry_get_text(GTK_ENTRY(bwin->url_entry)));
|
|
|
|
/* it's a url */
|
|
if (g_ascii_strcasecmp(data->url,"")!=0)
|
|
{
|
|
data->label = g_strstrip(g_strdup(gtk_entry_get_text(GTK_ENTRY(bwin->text_entry))));
|
|
gtk_tree_store_append(GTK_TREE_STORE(bwin->treev_data->treeStore),iter,bwin->treev_data->parentIter);
|
|
gtk_tree_store_set(GTK_TREE_STORE(bwin->treev_data->treeStore), iter, 0, data->label, 1, data->url, -1);
|
|
}
|
|
else /* it's a folder */
|
|
{
|
|
data->label = g_strstrip(g_strdup(gtk_entry_get_text(GTK_ENTRY(bwin->folder_entry))));
|
|
if (g_ascii_strcasecmp(data->label,"")==0)
|
|
data->label = g_strstrip(g_strdup(gtk_entry_get_text(GTK_ENTRY(bwin->text_entry))));
|
|
gtk_tree_store_append(GTK_TREE_STORE(bwin->treev_data->treeStore),iter,bwin->treev_data->parentIter);
|
|
gtk_tree_store_set(GTK_TREE_STORE(bwin->treev_data->treeStore), iter, 0, data->label, 1, "", -1);
|
|
}
|
|
|
|
g_free(iter);
|
|
bookmark_clear_all_entries(bwin);
|
|
}
|
|
|
|
/* edit a url or a folder */
|
|
void bookmark_edit_button_cb (GtkWidget *button,BookmarkWindow *bwin)
|
|
{
|
|
BookmarkData *data;
|
|
|
|
data = g_new0(BookmarkData,1);
|
|
|
|
data->label = g_strstrip(g_strdup(gtk_entry_get_text(GTK_ENTRY(bwin->text_entry))));
|
|
data->url = g_strstrip(g_strdup(gtk_entry_get_text(GTK_ENTRY(bwin->url_entry))));
|
|
|
|
/* it's a folder */
|
|
if (g_ascii_strcasecmp(data->url,"")==0)
|
|
{
|
|
data->label = g_strstrip(g_strdup(gtk_entry_get_text(GTK_ENTRY(bwin->folder_entry))));
|
|
if (g_ascii_strcasecmp(data->label,"")==0)
|
|
data->label= g_strstrip(g_strdup(gtk_entry_get_text(GTK_ENTRY(bwin->text_entry))));
|
|
gtk_tree_store_set(GTK_TREE_STORE(bwin->treev_data->treeStore), &bwin->iter, 0, data->label, 1, "", -1);
|
|
}
|
|
else /* it's a url */
|
|
{
|
|
data->label = g_strstrip(g_strdup(gtk_entry_get_text(GTK_ENTRY(bwin->text_entry))));
|
|
gtk_tree_store_set(GTK_TREE_STORE(bwin->treev_data->treeStore), &bwin->iter, 0, data->label, 1, data->url, -1);
|
|
}
|
|
|
|
bookmark_clear_all_entries(bwin);
|
|
}
|
|
|
|
/* a button to go to a selected url */
|
|
void bookmark_go_button_cb (GtkButton *button,BookmarkWindow *bwin)
|
|
{
|
|
gchar *url;
|
|
|
|
/* do not open folders */
|
|
if ((url= g_strdup(gtk_entry_get_text(GTK_ENTRY(bwin->url_entry)))))
|
|
{
|
|
gtk_moz_embed_stop_load(GTK_MOZ_EMBED(gBookmarkMozEmbed));
|
|
gtk_moz_embed_load_url(GTK_MOZ_EMBED(gBookmarkMozEmbed), url);
|
|
}
|
|
|
|
g_free(url);
|
|
bookmark_clear_all_entries(bwin);
|
|
}
|
|
|
|
/* accept new edit configurations and update bookmark menu */
|
|
void bookmark_ok_button_cb (GtkWidget *button,BookmarkWindow *bwin)
|
|
{
|
|
bookmark_write_on_file (bwin);
|
|
bookmark_close_dialog(bwin);
|
|
}
|
|
|
|
/* cancel user's operations */
|
|
void bookmark_cancel_button_cb (GtkWidget *button,BookmarkWindow *bwin)
|
|
{
|
|
bookmark_close_dialog(bwin);
|
|
}
|
|
|
|
/* remove a selected bookmark */
|
|
void bookmark_remove_button_cb (GtkWidget *button,BookmarkWindow *bwin)
|
|
{
|
|
BookmarkData *data;
|
|
|
|
gtk_tree_selection_get_selected(bwin->selection, &bwin->treev_data->treeStore, &bwin->iter);
|
|
|
|
data = g_new0(BookmarkData,1);
|
|
gtk_tree_model_get(bwin->treev_data->treeStore, &bwin->iter, 0, &data->label, 1, &data->url, -1);
|
|
|
|
gtk_tree_store_remove(GTK_TREE_STORE(bwin->treev_data->treeStore), &bwin->iter);
|
|
|
|
bookmark_clear_all_entries(bwin);
|
|
}
|
|
|
|
/* write bookmarks on file */
|
|
void bookmark_write_on_file (BookmarkWindow *bwin)
|
|
{
|
|
fclose(gBookmarkFilePointer);
|
|
gBookmarkFilePointer = fopen(gBookmarkFilePath,"w");
|
|
GtkTreeIter *iter= g_new0(GtkTreeIter,1);
|
|
|
|
if (!gtk_tree_model_get_iter_first(bwin->treev_data->treeStore,iter)) return;
|
|
|
|
bookmark_write_node_data_on_file(bwin->treev_data->treeStore, iter);
|
|
|
|
g_free(iter);
|
|
}
|
|
|
|
/* print node data on file */
|
|
void bookmark_write_node_data_on_file (GtkTreeModel *treeStore, GtkTreeIter *iter)
|
|
{
|
|
BookmarkData *data= g_new0(BookmarkData,1);
|
|
GtkTreeIter *newIter= g_new0(GtkTreeIter,1);
|
|
|
|
gtk_tree_model_get(treeStore, iter, 0, &data->label, 1, &data->url, -1);
|
|
|
|
/* it's a folder */
|
|
if (g_ascii_strcasecmp(data->url,"") == 0)
|
|
{
|
|
fprintf(gBookmarkFilePointer,"folder %s\n",data->label);
|
|
if (!gtk_tree_model_iter_children(treeStore,newIter,iter)) return;
|
|
bookmark_write_node_data_on_file(treeStore, newIter);
|
|
if (gtk_tree_model_iter_next(treeStore,newIter))
|
|
bookmark_write_node_data_on_file(treeStore, newIter);
|
|
if(g_ascii_strcasecmp(data->label,"Bookmarks") != 0)
|
|
fprintf(gBookmarkFilePointer,"/folder\n");
|
|
}
|
|
else /* it's a url */
|
|
{
|
|
fprintf(gBookmarkFilePointer,"url %s %s\n",data->url, data->label);
|
|
if (gtk_tree_model_iter_next(treeStore,iter))
|
|
{
|
|
newIter= gtk_tree_iter_copy(iter);
|
|
bookmark_write_node_data_on_file(treeStore, newIter);
|
|
}
|
|
}
|
|
|
|
g_free(data);
|
|
g_free(newIter);
|
|
}
|
|
|
|
/* clear all the bookmarks entries */
|
|
void bookmark_clear_all_entries(BookmarkWindow *bwin)
|
|
{
|
|
gtk_entry_set_text(GTK_ENTRY(bwin->url_entry),"");
|
|
gtk_editable_delete_text(GTK_EDITABLE(bwin->text_entry),0 ,-1);
|
|
gtk_editable_delete_text(GTK_EDITABLE(bwin->folder_entry),0 ,-1);
|
|
}
|
|
|
|
/* close the bookmark window */
|
|
void bookmark_close_dialog(BookmarkWindow *bwin)
|
|
{
|
|
/* close bookmark file*/
|
|
fclose(gBookmarkFilePointer);
|
|
|
|
gtk_widget_destroy(bwin->window);
|
|
g_free(bwin);
|
|
}
|
|
|
|
/* function used for importing bookmarks */
|
|
void bookmark_import_cb(GtkButton *button,BookmarkWindow *bwin)
|
|
{
|
|
FILE *inFile;
|
|
BookmarkData *data= g_new0(BookmarkData,1);
|
|
gchar *parsedname;
|
|
gchar *line = (gchar *)g_malloc(1024);
|
|
gchar *filename= g_strconcat(g_get_home_dir(),"/bookmarks.html",NULL);
|
|
GString *name = g_string_new (NULL);
|
|
GString *url = g_string_new (NULL);
|
|
|
|
fclose(gBookmarkFilePointer);
|
|
|
|
if (!(inFile = fopen(filename,"r"))) return;
|
|
if (!(gBookmarkFilePointer = fopen(gBookmarkFilePath,"a"))) return;
|
|
|
|
if(fgets(line, 256, inFile) != NULL)
|
|
if(!strstr(line, "NETSCAPE-Bookmark-file")) return;
|
|
|
|
while (!feof (inFile))
|
|
{
|
|
switch (bookmark_get_ns_item (inFile, name, url)) {
|
|
case NS_FOLDER: //While selected line is Folder
|
|
data->label = g_strdup (g_strstrip(name->str));
|
|
fprintf(gBookmarkFilePointer,"folder %s\n",data->label);
|
|
g_free (data->label);
|
|
break;
|
|
case NS_SITE://While selected line in Bookmark
|
|
parsedname = bookmark_ns_parse_item (name);
|
|
data->label = g_strdup (g_strstrip(parsedname));
|
|
if (url->str)
|
|
data->url = g_strdup(g_strstrip(url->str));
|
|
else
|
|
data->url = NULL;
|
|
fprintf(gBookmarkFilePointer,"url %s %s\n",data->url,data->label);
|
|
g_free (data->label);
|
|
g_free (data->url);
|
|
g_free (parsedname);
|
|
break;
|
|
case NS_FOLDER_END://While selected line is end of Folder.
|
|
fprintf(gBookmarkFilePointer,"/folder\n");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
bookmark_close_dialog(bwin);
|
|
|
|
g_string_free (name, TRUE);
|
|
g_string_free (url, TRUE);
|
|
g_free(data);
|
|
g_free(filename);
|
|
}
|
|
|
|
NSItemType bookmark_get_ns_item (FILE *inFile, GString *name, GString *url)
|
|
{
|
|
gchar *line = NULL;
|
|
gchar *found;
|
|
gchar *temp = NULL;
|
|
gchar *bm_temp = NULL;
|
|
GString *nick = g_string_new (NULL);
|
|
|
|
line = bookmark_read_line_from_html_file (inFile);
|
|
|
|
if ((found = (char *) bookmark_string_strcasestr (line, "<A HREF=")))
|
|
{ // declare site?
|
|
g_string_assign (url, found+9); // url=URL+ ADD_DATE ...
|
|
g_string_truncate (url, strstr(url->str, "\"") - url->str);
|
|
found = (char *) strstr (found+9+url->len, "\">");
|
|
if (!found)
|
|
{
|
|
g_free (line);
|
|
return NS_UNKNOWN;
|
|
}
|
|
g_string_assign (name, found+2);
|
|
temp = (char *) bookmark_string_strcasestr(name->str,"</A>");
|
|
g_string_truncate (name, temp - (name->str));
|
|
if ((found = (char *) bookmark_string_strcasestr (line,"SHORTCUTURL=")))
|
|
{
|
|
g_string_assign (nick, found+13);
|
|
g_string_truncate (nick, strstr(nick->str, "\"") - nick->str);
|
|
}
|
|
else
|
|
g_string_assign (nick, "");
|
|
g_free (line);
|
|
return NS_SITE;
|
|
}
|
|
else if ((found = (char *) bookmark_string_strcasestr (line, "<DT><H3")))
|
|
{ //declare folder?
|
|
found = (char *) strstr(found+7, ">");
|
|
if (!found) return NS_UNKNOWN;
|
|
g_string_assign (name, found+1);
|
|
bm_temp = (char *) bookmark_string_strcasestr (name->str, "</H3>");
|
|
g_string_truncate (name, bm_temp - (name->str));
|
|
g_free (line);
|
|
return NS_FOLDER;
|
|
}
|
|
else if ((found = (char *) bookmark_string_strcasestr (line, "</DL>")))
|
|
{ // end folder?
|
|
g_free (line);
|
|
return NS_FOLDER_END;
|
|
}
|
|
else if ((found = (char *) bookmark_string_strcasestr (line, "<HR>")))
|
|
{ // separator
|
|
g_free (line);
|
|
return NS_SEPARATOR;
|
|
}
|
|
else if ((found = (char *) bookmark_string_strcasestr (line, "<DD>")))
|
|
{ // comments
|
|
g_string_assign (name, found+4);
|
|
g_free (line);
|
|
return NS_NOTES;
|
|
}
|
|
else if (strchr(line, '<')==NULL && strchr(line, '>')==NULL)
|
|
{ // continued comments (probably)
|
|
g_string_assign (name, line);
|
|
g_free (line);
|
|
return NS_NOTES;
|
|
}
|
|
g_free (line);
|
|
g_string_free (nick, TRUE);
|
|
return NS_UNKNOWN;
|
|
}
|
|
|
|
/**
|
|
* bookmark_read_line_from_html_file: reads a line from an opened file and
|
|
* returns it in a new allocated string
|
|
*/
|
|
gchar *bookmark_read_line_from_html_file (FILE *inFile)
|
|
{
|
|
gchar *line = g_strdup ("");
|
|
gchar *t;
|
|
gchar *buf = g_new0 (gchar, 256);
|
|
|
|
/* Read from the file unles endoffile has reached or newline has encountered */
|
|
while (!(strchr (buf, '\n') || feof (inFile)))
|
|
{
|
|
fgets(buf, 256, inFile);
|
|
t = line;
|
|
line = g_strconcat (line, buf, NULL);
|
|
g_free (t);
|
|
}
|
|
g_free (buf);
|
|
return line;
|
|
}
|
|
|
|
/**
|
|
* bookmark_string_strcasestr: test if a string b is a substring of string a,
|
|
* independent of case.
|
|
*/
|
|
const gchar *bookmark_string_strcasestr (const gchar *a, const gchar *b)
|
|
{
|
|
gchar *down_a;
|
|
gchar *down_b;
|
|
gchar *ptr;
|
|
// copy and lower case the strings
|
|
down_a = g_strdup (a);
|
|
down_b = g_strdup (b);
|
|
//down_a = g_utf8_strdown (down_a, strlen (down_a))
|
|
g_strdown (down_a);
|
|
g_strdown (down_b);
|
|
ptr = strstr (down_a, down_b);
|
|
|
|
g_free (down_a);
|
|
g_free (down_b);
|
|
|
|
return ptr == NULL ? NULL : (a + (ptr - down_a));
|
|
}
|
|
|
|
/**
|
|
* This function replaces some weird elements
|
|
* like & ≤, etc..
|
|
* More info : http://www.w3.org/TR/html4/charset.html#h-5.3.2
|
|
*/
|
|
char *bookmark_ns_parse_item (GString *string)
|
|
{
|
|
char *iterator, *temp;
|
|
int cnt = 0;
|
|
GString *result = g_string_new (NULL);
|
|
|
|
|
|
iterator = string->str;
|
|
|
|
for (cnt = 0, iterator = string->str;cnt <= (int)(strlen (string->str));cnt++, iterator++)
|
|
{
|
|
if (*iterator == '&')
|
|
{
|
|
int jump = 0;
|
|
int i;
|
|
if (g_strncasecmp (iterator, "&", 5) == 0)
|
|
{
|
|
|
|
g_string_append_c (result, '&');
|
|
jump = 5;
|
|
}
|
|
else if (g_strncasecmp (iterator, "<", 4) == 0)
|
|
{
|
|
g_string_append_c (result, '<');
|
|
jump = 4;
|
|
}
|
|
else if (g_strncasecmp (iterator, ">", 4) == 0)
|
|
{
|
|
g_string_append_c (result, '>');
|
|
jump = 4;
|
|
}
|
|
else if (g_strncasecmp (iterator, """, 6) == 0)
|
|
{
|
|
g_string_append_c (result, '\"');
|
|
jump = 6;
|
|
}
|
|
else
|
|
{
|
|
// It must be some numeric thing now
|
|
iterator++;
|
|
if (iterator && *iterator == '#')
|
|
{
|
|
int val;
|
|
char *num, *tmp;
|
|
|
|
iterator++;
|
|
|
|
val = atoi (iterator);
|
|
|
|
tmp = g_strdup_printf ("%d", val);
|
|
jump = strlen (tmp);
|
|
g_free (tmp);
|
|
|
|
num = g_strdup_printf ("%c", (char) val);
|
|
g_string_append (result, num);
|
|
g_free (num);
|
|
}
|
|
}
|
|
for (i = jump - 1; i > 0; i--)
|
|
{
|
|
iterator++;
|
|
if (iterator == NULL) break;
|
|
}
|
|
}
|
|
else
|
|
g_string_append_c (result, *iterator);
|
|
}
|
|
temp = result->str;
|
|
g_string_free (result, FALSE);
|
|
return temp;
|
|
}
|
|
|
|
/* function used for exporting bookmarks */
|
|
void bookmark_export_cb (GtkButton *button,BookmarkWindow *bwin)
|
|
{
|
|
gchar *filename= g_strconcat(g_get_home_dir(),"/bookmarks.html",NULL);
|
|
BookmarkData *data= g_new0(BookmarkData,1);
|
|
gchar *line = (gchar *)g_malloc(1024);
|
|
gboolean isFolder= TRUE;
|
|
FILE *outFile;
|
|
|
|
if (!(outFile = fopen (filename, "w"))) return;
|
|
|
|
fputs ("<!DOCTYPE NETSCAPE-Bookmark-file-1>\n", outFile);
|
|
fputs ("<!-- This file was automatically generated by Minimo\n", outFile);
|
|
fputs ("It will be read and overwritten.\n", outFile);
|
|
fputs ("Do Not Edit! -->\n", outFile);
|
|
fputs ("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;"
|
|
" charset=UTF-8\">\n", outFile);
|
|
fputs ("<TITLE>Bookmarks</TITLE>\n", outFile);
|
|
fputs ("<H1>Minimo Bookmarks</H1>\n", outFile);
|
|
fputs ("\n", outFile);
|
|
fputs ("<DL><p>\n", outFile);
|
|
|
|
rewind(gBookmarkFilePointer);
|
|
|
|
while(fgets(line,1023,gBookmarkFilePointer)!= NULL)
|
|
{
|
|
line = g_strstrip(line);
|
|
|
|
if (g_strncasecmp(line,"folder",6) == 0)
|
|
{
|
|
data->label = g_strdup(line+7);
|
|
data->url = "";
|
|
isFolder = TRUE;
|
|
}
|
|
|
|
if (g_strncasecmp(line,"url",3) == 0)
|
|
{
|
|
gchar **temp;
|
|
|
|
temp = g_strsplit(line+4," ",2);
|
|
data->url = g_strdup(temp[0]);
|
|
|
|
if (temp[1] != NULL)
|
|
data->label = g_strdup(temp[1]);
|
|
else
|
|
data->label = g_strdup(temp[0]);
|
|
g_strfreev(temp);
|
|
isFolder = FALSE;
|
|
|
|
}
|
|
|
|
if (g_strncasecmp(line,"/folder",7) == 0)
|
|
{
|
|
fputs ("</DL><p>\n", outFile);
|
|
}
|
|
|
|
bookmark_export_items (outFile, data, isFolder);
|
|
}
|
|
fputs ("</DL><p>\n", outFile);
|
|
fputs ("</DL><p>\n", outFile);
|
|
|
|
fclose (outFile);
|
|
g_free(data);
|
|
g_free(line);
|
|
g_free(filename);
|
|
}
|
|
|
|
void bookmark_export_items (FILE *file, BookmarkData *data, gboolean isFolder)
|
|
{
|
|
|
|
gchar *str;
|
|
|
|
/* it is a url */
|
|
if (isFolder == FALSE) {
|
|
fputs ("\t<DT><A HREF=\"", file);
|
|
fputs (data->url, file);
|
|
fputs ("\"", file);
|
|
fputs (">", file);
|
|
str = g_strdup(data->label);
|
|
fputs (str, file);
|
|
fputs ("</A>\n", file);
|
|
} /* it is a folder */
|
|
else
|
|
{
|
|
fputs ("<DT><H3 ADD_DATE=\"0\">", file);
|
|
str = g_strdup(data->label);
|
|
fputs (str, file);
|
|
fputs ("</H3>\n", file);
|
|
fputs ("<DL><p>\n", file);
|
|
}
|
|
}
|
|
|
|
void bookmark_add_url_directly_cb (GtkWidget *menu_item,GtkWidget *embed)
|
|
{
|
|
gchar *url;
|
|
gchar *title;
|
|
|
|
bookmark_open_file ();
|
|
fclose(gBookmarkFilePointer);
|
|
|
|
if (!(gBookmarkFilePointer = fopen(gBookmarkFilePath,"a+"))) return;
|
|
|
|
if (!(url= gtk_moz_embed_get_location(gBookmarkMozEmbed))) return;
|
|
|
|
/* doesn't add an empty url or about:blank */
|
|
if ((g_ascii_strcasecmp(url,"") != 0) && (g_ascii_strcasecmp(url,"about:blank") != 0))
|
|
{
|
|
title= gtk_moz_embed_get_title (gBookmarkMozEmbed);
|
|
fprintf(gBookmarkFilePointer, "url %s %s\n", url, title);
|
|
g_free(title);
|
|
}
|
|
|
|
fclose(gBookmarkFilePointer);
|
|
g_free(url);
|
|
g_free(gBookmarkFilePath);
|
|
}
|