Merge lp:~aauzi/midori/fix-1179624 into lp:midori

Proposed by André Auzi
Status: Superseded
Proposed branch: lp:~aauzi/midori/fix-1179624
Merge into: lp:midori
Diff against target: 762 lines (+563/-20) (has conflicts)
6 files modified
katze/katze-item.c (+9/-3)
midori/midori-array.c (+150/-0)
midori/midori-array.h (+7/-0)
midori/midori-browser.c (+78/-9)
midori/midori-view.c (+6/-0)
panels/midori-bookmarks.c (+313/-8)
Text conflict in midori/midori-view.c
To merge this branch: bzr merge lp:~aauzi/midori/fix-1179624
Reviewer Review Type Date Requested Status
Cris Dywan Needs Fixing
Review via email: mp+164982@code.launchpad.net

This proposal has been superseded by a proposal from 2013-05-30.

To post a comment you must log in.
Revision history for this message
Cris Dywan (kalikiana) wrote :

385 + else if (!child_bookmarks_count && child_folders_count)
386 + text = g_strdup_printf(
387 + _("%s : folder, %d subfolders and no bookmark"),
388 + name, child_folders_count);

This should be done using ngettext, leaving gettext to figure out plural forms (there may be a dual form or other grammatical implications the code can't handle).

Is it necessary to implement midori_array_count_recursive using midori_array_query_recursive rather than asking SQlite to count rows? This seems a bit wasteful.

review: Needs Fixing
Revision history for this message
André Auzi (aauzi) wrote :

> 385 + else if (!child_bookmarks_count && child_folders_count)
> 386 + text = g_strdup_printf(
> 387 + _("%s : folder, %d subfolders and no bookmark"),
> 388 + name, child_folders_count);
>
> This should be done using ngettext, leaving gettext to figure out plural forms
> (there may be a dual form or other grammatical implications the code can't
> handle).

Interesting. I was not aware of ngettext existence. I will give it a try.

> Is it necessary to implement midori_array_count_recursive using
> midori_array_query_recursive rather than asking SQlite to count rows? This
> seems a bit wasteful.

Well, the count within a folder is done using a COUNT(*) sql statement but SQLite does not implement recursive queries therefore I had to implement recursion within the code.

I nevertheless agree, midori_array_query_recursive was the easy path and this has to be changed.
Especially if we consider the fact that I not only retrieve the sub folder id but also its *uri* (!!!goof!!!)

This being noticed I still have doubts about the feature, initially I thought we could need to implement fancy stuff like giving the counts for the whole tree depth if the user press the 'alt' or 'ctrl' modifiers but the feedback I get with one child level actually suits my needs, I wonder if the need of such feature would come up one day.

If nobody needs it, it's the whole idea of recursion that's wasteful and we could just get rid of it and stick to one child level count which is achieved with a single SQL statement.

I wonder if it was the meaning of the remark?

lp:~aauzi/midori/fix-1179624 updated
6171. By André Auzi

Take into account review comments

Implements:
 * use of ngettext for plural translations
 * use pure SGLite commands for midori_array_count_recursive_by

6172. By André Auzi

Take into account review remarks

6173. By André Auzi

Merge with lp:midori.

1 conflict solved:
 * remove of Open link as web application in link popup context menu

6174. By André Auzi

Fix potential memory leak in:

489 +static KatzeItem*
490 +midori_bookmarks_get_item_at_pos (GtkTreeView *treeview,
491 + gint x, gint y)
492 +{
493 + GtkTreeModel* model = gtk_tree_view_get_model (treeview);
494 + GtkTreePath* path;
495 + GtkTreeIter iter;
496 + KatzeItem* item;
497 +
498 + gtk_tree_view_get_path_at_pos (treeview, x, y,
499 + &path, NULL, NULL, NULL);
500 +
501 + if (!path)
502 + return NULL;
503 +
504 + if (!gtk_tree_model_get_iter (model, &iter, path))
505 + return NULL;
506 +
507 + gtk_tree_model_get (model, &iter, 0, &item, -1);
508 +
509 + gtk_tree_path_free (path); <= can leak if gtk_tree_model_get_iter returned FALSE
510 +
511 + return item;
512 +}

6175. By André Auzi

Complete remove of "app" related code

Take pfor's comments into account: texts simplifications and redundancy
reduced

6176. By André Auzi

Merge lp:midori

6177. By André Auzi

Remove change in midori_browser_bookmark_open_activate_cb

6178. By André Auzi

Change code style

6179. By André Auzi

merge lp:midori

6180. By André Auzi

Take into account review comments + merge lp:midori

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'katze/katze-item.c'
--- katze/katze-item.c 2013-02-21 21:36:30 +0000
+++ katze/katze-item.c 2013-05-30 22:02:27 +0000
@@ -445,8 +445,13 @@
445445
446 g_return_val_if_fail (KATZE_IS_ITEM (item), NULL);446 g_return_val_if_fail (KATZE_IS_ITEM (item), NULL);
447447
448 if (widget && KATZE_ITEM_IS_FOLDER (item))448 if (widget)
449 return gtk_widget_render_icon (widget, GTK_STOCK_DIRECTORY, GTK_ICON_SIZE_MENU, NULL);449 {
450 if (KATZE_ITEM_IS_FOLDER (item))
451 return gtk_widget_render_icon (widget, GTK_STOCK_DIRECTORY, GTK_ICON_SIZE_MENU, NULL);
452 if (KATZE_ITEM_IS_BOOKMARK (item) && katze_item_get_meta_boolean (item, "app"))
453 return gtk_widget_render_icon (widget, GTK_STOCK_EXECUTE, GTK_ICON_SIZE_MENU, NULL);
454 }
450 if ((pixbuf = midori_paths_get_icon (katze_item_get_icon (item), NULL)))455 if ((pixbuf = midori_paths_get_icon (katze_item_get_icon (item), NULL)))
451 return pixbuf;456 return pixbuf;
452 if ((pixbuf = midori_paths_get_icon (item->uri, widget)))457 if ((pixbuf = midori_paths_get_icon (item->uri, widget)))
@@ -526,7 +531,8 @@
526 gtk_widget_show (image);531 gtk_widget_show (image);
527 if (pixbuf != NULL)532 if (pixbuf != NULL)
528 g_object_unref (pixbuf);533 g_object_unref (pixbuf);
529 if (KATZE_ITEM_IS_FOLDER (item))534 if (KATZE_ITEM_IS_FOLDER (item)
535 || (KATZE_ITEM_IS_BOOKMARK (item) && katze_item_get_meta_boolean (item, "app")))
530 return image;536 return image;
531 g_object_set_data (G_OBJECT (image), "KatzeItem", g_object_ref (item));537 g_object_set_data (G_OBJECT (image), "KatzeItem", g_object_ref (item));
532 g_signal_connect (image, "destroy",538 g_signal_connect (image, "destroy",
533539
=== modified file 'midori/midori-array.c'
--- midori/midori-array.c 2013-04-16 23:16:24 +0000
+++ midori/midori-array.c 2013-05-30 22:02:27 +0000
@@ -1194,3 +1194,153 @@
1194 return midori_array_query_recursive (bookmarks, fields, condition, value, FALSE);1194 return midori_array_query_recursive (bookmarks, fields, condition, value, FALSE);
1195}1195}
11961196
1197static gint64
1198count_from_sqlite (sqlite3* db,
1199 const gchar* sqlcmd)
1200{
1201 gint64 count = -1;
1202 sqlite3_stmt* stmt;
1203 gint result;
1204
1205 result = sqlite3_prepare_v2 (db, sqlcmd, -1, &stmt, NULL);
1206 if (result != SQLITE_OK)
1207 return -1;
1208
1209 g_assert (sqlite3_column_count (stmt) == 1);
1210
1211 if ((result = sqlite3_step (stmt)) == SQLITE_ROW)
1212 count = sqlite3_column_int64(stmt, 0);
1213
1214 sqlite3_clear_bindings (stmt);
1215 sqlite3_reset (stmt);
1216
1217 return count;
1218}
1219
1220static gint64
1221midori_array_count_recursive_by_id (KatzeArray* bookmarks,
1222 const gchar* condition,
1223 const gchar* value,
1224 gint64 id,
1225 gboolean recursive)
1226{
1227 gint64 count = -1;
1228 sqlite3* db;
1229 gchar* sqlcmd;
1230 char* sqlcmd_value;
1231 sqlite3_stmt* stmt;
1232 gint result;
1233 GList* ids;
1234 GList* iter_ids;
1235
1236 g_return_val_if_fail (condition, -1);
1237 g_return_val_if_fail (KATZE_IS_ARRAY (bookmarks), -1);
1238 db = g_object_get_data (G_OBJECT (bookmarks), "db");
1239 g_return_val_if_fail (db != NULL, -1);
1240
1241 g_assert(!strstr("parentid", condition));
1242
1243 if (id > 0)
1244 sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks "
1245 "WHERE parentid = %" G_GINT64_FORMAT " AND %s",
1246 id,
1247 condition);
1248 else
1249 sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks "
1250 "WHERE parentid IS NULL AND %s ",
1251 condition);
1252
1253 if (strstr (condition, "%q"))
1254 {
1255 sqlcmd_value = sqlite3_mprintf (sqlcmd, value ? value : "");
1256 count = count_from_sqlite (db, sqlcmd_value);
1257 sqlite3_free (sqlcmd_value);
1258 }
1259 else
1260 count = count_from_sqlite (db, sqlcmd);
1261
1262 g_free (sqlcmd);
1263
1264 if (!recursive || (count < 0))
1265 return count;
1266
1267 ids = NULL;
1268
1269 if (id > 0)
1270 sqlcmd_value = sqlite3_mprintf (
1271 "SELECT id FROM bookmarks "
1272 "WHERE parentid = %" G_GINT64_FORMAT " AND uri = ''", id);
1273 else
1274 sqlcmd_value = sqlite3_mprintf (
1275 "SELECT id FROM bookmarks "
1276 "WHERE parentid IS NULL AND uri = ''");
1277
1278 if (sqlite3_prepare_v2 (db, sqlcmd_value, -1, &stmt, NULL) == SQLITE_OK)
1279 {
1280 g_assert (sqlite3_column_count (stmt) == 1);
1281
1282 if ((result = sqlite3_step (stmt)) == SQLITE_ROW)
1283 {
1284 gint64* pid = g_new (gint64, 1);
1285
1286 *pid = sqlite3_column_int64(stmt, 0);
1287 ids = g_list_append (ids, pid);
1288 }
1289
1290 sqlite3_clear_bindings (stmt);
1291 sqlite3_reset (stmt);
1292 }
1293
1294 sqlite3_free (sqlcmd_value);
1295
1296 iter_ids = ids;
1297 while (iter_ids)
1298 {
1299 gint64 sub_count = midori_array_count_recursive_by_id (bookmarks,
1300 condition,
1301 value,
1302 *(gint64*)(iter_ids->data),
1303 recursive);
1304
1305 if (sub_count < 0)
1306 {
1307 g_list_free_full (ids, g_free);
1308 return -1;
1309 }
1310
1311 count += sub_count;
1312 iter_ids = g_list_next (iter_ids);
1313 }
1314
1315 g_list_free_full (ids, g_free);
1316 return count;
1317}
1318
1319/**
1320 * midori_array_count_recursive:
1321 * @array: the main bookmark array
1322 * @condition: condition, like "folder = '%q'"
1323 * @value: a value to be inserted if @condition contains %q
1324 * @recursive: if %TRUE include children
1325 *
1326 * Return value: the number of elements on success, -1 otherwise
1327 *
1328 * Since: 0.5.2
1329 **/
1330gint64
1331midori_array_count_recursive (KatzeArray* bookmarks,
1332 const gchar* condition,
1333 const gchar* value,
1334 KatzeItem* folder,
1335 gboolean recursive)
1336{
1337 gint64 id = -1;
1338
1339 g_return_val_if_fail (!folder || KATZE_ITEM_IS_FOLDER (folder), -1);
1340
1341 id = folder ? katze_item_get_meta_integer (folder, "id") : 0;
1342
1343 return midori_array_count_recursive_by_id (bookmarks, condition,
1344 value, id,
1345 recursive);
1346}
11971347
=== modified file 'midori/midori-array.h'
--- midori/midori-array.h 2012-01-03 20:15:19 +0000
+++ midori/midori-array.h 2013-05-30 22:02:27 +0000
@@ -47,4 +47,11 @@
47katze_array_from_sqlite (sqlite3* db,47katze_array_from_sqlite (sqlite3* db,
48 const gchar* sqlcmd);48 const gchar* sqlcmd);
4949
50gint64
51midori_array_count_recursive (KatzeArray* bookmarks,
52 const gchar* condition,
53 const gchar* value,
54 KatzeItem* folder,
55 gboolean recursive);
56
50#endif /* !__MIDORI_ARRAY_H__ */57#endif /* !__MIDORI_ARRAY_H__ */
5158
=== modified file 'midori/midori-browser.c'
--- midori/midori-browser.c 2013-05-28 20:02:29 +0000
+++ midori/midori-browser.c 2013-05-30 22:02:27 +0000
@@ -4132,7 +4132,10 @@
4132 else if (!KATZE_IS_ARRAY (item) && strcmp (stock_id, GTK_STOCK_DELETE))4132 else if (!KATZE_IS_ARRAY (item) && strcmp (stock_id, GTK_STOCK_DELETE))
4133 gtk_widget_set_sensitive (menuitem, uri != NULL);4133 gtk_widget_set_sensitive (menuitem, uri != NULL);
4134 g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item);4134 g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item);
4135 g_signal_connect (menuitem, "activate", G_CALLBACK (callback), userdata);4135 if (callback)
4136 g_signal_connect (menuitem, "activate", G_CALLBACK (callback), userdata);
4137 else
4138 gtk_widget_set_sensitive (menuitem, FALSE);
4136 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);4139 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4137 gtk_widget_show (menuitem);4140 gtk_widget_show (menuitem);
4138}4141}
@@ -4141,8 +4144,43 @@
4141midori_browser_bookmark_open_activate_cb (GtkWidget* menuitem,4144midori_browser_bookmark_open_activate_cb (GtkWidget* menuitem,
4142 MidoriBrowser* browser)4145 MidoriBrowser* browser)
4143{4146{
4144 KatzeItem* item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem");4147 KatzeItem* item;
4145 midori_browser_open_bookmark (browser, item);4148 const gchar* uri;
4149
4150 item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem");
4151
4152 if ((uri = katze_item_get_uri (item)) && *uri)
4153 {
4154 gchar* uri_fixed = sokoke_magic_uri (uri, TRUE, FALSE);
4155 if (!uri_fixed)
4156 uri_fixed = g_strdup (uri);
4157
4158 midori_browser_set_current_uri (browser, uri_fixed);
4159 gtk_widget_grab_focus (midori_browser_get_current_tab (browser));
4160
4161 g_free (uri_fixed);
4162 }
4163}
4164
4165static void
4166midori_browser_bookmark_run_web_application_cb (GtkWidget* menuitem,
4167 MidoriBrowser* browser)
4168{
4169 KatzeItem* item;
4170 const gchar* uri;
4171
4172 item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem");
4173
4174 if ((uri = katze_item_get_uri (item)) && *uri)
4175 {
4176 gchar* uri_fixed = sokoke_magic_uri (uri, TRUE, FALSE);
4177 if (!uri_fixed)
4178 uri_fixed = g_strdup (uri);
4179
4180 sokoke_spawn_app (uri_fixed, FALSE);
4181
4182 g_free (uri_fixed);
4183 }
4146}4184}
41474185
4148static void4186static void
@@ -4222,14 +4260,43 @@
4222 GtkWidget* menuitem;4260 GtkWidget* menuitem;
42234261
4224 menu = gtk_menu_new ();4262 menu = gtk_menu_new ();
4225 if (!katze_item_get_uri (item))4263 if (KATZE_ITEM_IS_FOLDER (item))
4226 midori_browser_bookmark_popup_item (menu,4264 {
4227 STOCK_TAB_NEW, _("Open all in _Tabs"),4265 gint child_bookmarks_count = midori_array_count_recursive(
4228 item, midori_browser_bookmark_open_in_tab_activate_cb, browser);4266 browser->bookmarks,
4267 "uri <> ''",
4268 NULL,
4269 item,
4270 FALSE);
4271
4272 if (!child_bookmarks_count)
4273 midori_browser_bookmark_popup_item (
4274 menu,
4275 STOCK_TAB_NEW, _("Open all in _Tabs"),
4276 item, NULL, browser);
4277 else
4278 midori_browser_bookmark_popup_item (
4279 menu,
4280 STOCK_TAB_NEW, _("Open all in _Tabs"),
4281 item, midori_browser_bookmark_open_in_tab_activate_cb, browser);
4282 }
4229 else4283 else
4230 {4284 {
4231 midori_browser_bookmark_popup_item (menu, GTK_STOCK_OPEN, NULL,4285 if (katze_item_get_meta_boolean (item, "app"))
4232 item, midori_browser_bookmark_open_activate_cb, browser);4286 {
4287 midori_browser_bookmark_popup_item (menu, GTK_STOCK_EXECUTE, _("Open as Web A_pplication"),
4288 item, midori_browser_bookmark_run_web_application_cb, browser);
4289 midori_browser_bookmark_popup_item (menu, GTK_STOCK_OPEN, NULL,
4290 item, midori_browser_bookmark_open_activate_cb, browser);
4291 }
4292 else
4293 {
4294 midori_browser_bookmark_popup_item (menu, GTK_STOCK_OPEN, NULL,
4295 item, midori_browser_bookmark_open_activate_cb, browser);
4296 midori_browser_bookmark_popup_item (menu, GTK_STOCK_EXECUTE, _("Open as Web A_pplication"),
4297 item, midori_browser_bookmark_run_web_application_cb, browser);
4298 }
4299
4233 midori_browser_bookmark_popup_item (menu,4300 midori_browser_bookmark_popup_item (menu,
4234 STOCK_TAB_NEW, _("Open in New _Tab"),4301 STOCK_TAB_NEW, _("Open in New _Tab"),
4235 item, midori_browser_bookmark_open_in_tab_activate_cb, browser);4302 item, midori_browser_bookmark_open_in_tab_activate_cb, browser);
@@ -4237,9 +4304,11 @@
4237 STOCK_WINDOW_NEW, _("Open in New _Window"),4304 STOCK_WINDOW_NEW, _("Open in New _Window"),
4238 item, midori_browser_bookmark_open_in_window_activate_cb, browser);4305 item, midori_browser_bookmark_open_in_window_activate_cb, browser);
4239 }4306 }
4307
4240 menuitem = gtk_separator_menu_item_new ();4308 menuitem = gtk_separator_menu_item_new ();
4241 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);4309 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
4242 gtk_widget_show (menuitem);4310 gtk_widget_show (menuitem);
4311
4243 midori_browser_bookmark_popup_item (menu, GTK_STOCK_EDIT, NULL,4312 midori_browser_bookmark_popup_item (menu, GTK_STOCK_EDIT, NULL,
4244 item, midori_browser_bookmark_edit_activate_cb, widget);4313 item, midori_browser_bookmark_edit_activate_cb, widget);
4245 midori_browser_bookmark_popup_item (menu, GTK_STOCK_DELETE, NULL,4314 midori_browser_bookmark_popup_item (menu, GTK_STOCK_DELETE, NULL,
42464315
=== modified file 'midori/midori-view.c'
--- midori/midori-view.c 2013-05-30 16:40:15 +0000
+++ midori/midori-view.c 2013-05-30 22:02:27 +0000
@@ -2747,6 +2747,12 @@
2747 midori_view_insert_menu_item (menu_shell, -1,2747 midori_view_insert_menu_item (menu_shell, -1,
2748 _("Open Link in New _Window"), STOCK_WINDOW_NEW,2748 _("Open Link in New _Window"), STOCK_WINDOW_NEW,
2749 G_CALLBACK (midori_web_view_menu_new_window_activate_cb), widget);2749 G_CALLBACK (midori_web_view_menu_new_window_activate_cb), widget);
2750<<<<<<< TREE
2751=======
2752 midori_view_insert_menu_item (menu_shell, -1,
2753 _("Open Link as Web A_pplication"), GTK_STOCK_EXECUTE,
2754 G_CALLBACK (midori_web_view_menu_web_app_activate_cb), widget);
2755>>>>>>> MERGE-SOURCE
2750 }2756 }
27512757
2752 midori_view_insert_menu_item (menu_shell, -1,2758 midori_view_insert_menu_item (menu_shell, -1,
27532759
=== modified file 'panels/midori-bookmarks.c'
--- panels/midori-bookmarks.c 2013-02-11 21:49:41 +0000
+++ panels/midori-bookmarks.c 2013-05-30 22:02:27 +0000
@@ -39,7 +39,6 @@
39struct _MidoriBookmarks39struct _MidoriBookmarks
40{40{
41 GtkVBox parent_instance;41 GtkVBox parent_instance;
42
43 GtkWidget* toolbar;42 GtkWidget* toolbar;
44 GtkWidget* edit;43 GtkWidget* edit;
45 GtkWidget* delete;44 GtkWidget* delete;
@@ -49,6 +48,8 @@
4948
50 gint filter_timeout;49 gint filter_timeout;
51 gchar* filter;50 gchar* filter;
51
52 KatzeItem* hovering_item;
52};53};
5354
54struct _MidoriBookmarksClass55struct _MidoriBookmarksClass
@@ -86,6 +87,9 @@
86 GParamSpec* pspec);87 GParamSpec* pspec);
8788
88static void89static void
90midori_bookmarks_statusbar_update (MidoriBookmarks *bookmarks);
91
92static void
89midori_bookmarks_class_init (MidoriBookmarksClass* class)93midori_bookmarks_class_init (MidoriBookmarksClass* class)
90{94{
91 GObjectClass* gobject_class;95 GObjectClass* gobject_class;
@@ -441,6 +445,140 @@
441 gtk_widget_set_sensitive (GTK_WIDGET (bookmarks->edit), selected);445 gtk_widget_set_sensitive (GTK_WIDGET (bookmarks->edit), selected);
442}446}
443447
448static gchar*
449midori_bookmarks_statusbar_bookmarks_str (gint count)
450{
451 if (!count)
452 return NULL;
453
454 return g_strdup_printf (ngettext ("%d bookmark", "%d bookmarks", count), count);
455}
456
457static gchar*
458midori_bookmarks_statusbar_subfolder_str (gint count)
459{
460 if (!count)
461 return NULL;
462
463 return g_strdup_printf (ngettext ("%d subfolder", "%d subfolders", count), count);
464}
465
466static void
467midori_bookmarks_statusbar_update (MidoriBookmarks *bookmarks)
468{
469 gchar* text = NULL;
470 GtkTreeModel* model;
471 GtkTreeIter iter;
472 gboolean selected;
473
474 if (bookmarks->hovering_item)
475 {
476 KatzeItem* item = bookmarks->hovering_item;
477 const gchar* name;
478
479 g_assert (!KATZE_ITEM_IS_SEPARATOR (item));
480
481 name = katze_item_get_name (item);
482
483 if (KATZE_ITEM_IS_FOLDER (item))
484 {
485 gint child_folders_count = midori_array_count_recursive (
486 bookmarks->array,
487 "uri = ''",
488 NULL,
489 item,
490 FALSE);
491 gint child_bookmarks_count = midori_array_count_recursive (
492 bookmarks->array,
493 "uri <> ''",
494 NULL,
495 item,
496 FALSE);
497 gchar* child_folders_str = midori_bookmarks_statusbar_subfolder_str (child_folders_count);
498 gchar* child_bookmarks_str = midori_bookmarks_statusbar_bookmarks_str (child_bookmarks_count);
499
500 if (!child_bookmarks_count && !child_folders_count)
501 text = g_strdup_printf(
502 _("%s : empty folder"),
503 name);
504 else if (!child_bookmarks_count && (child_folders_count >= 1))
505 text = g_strdup_printf(
506 _("%s : folder, %s and no bookmark"),
507 name,
508 child_folders_str);
509 else if ((child_bookmarks_count >= 1) && !child_folders_count)
510 text = g_strdup_printf(
511 _("%s : folder, %s"),
512 name,
513 child_bookmarks_str);
514 else if ((child_bookmarks_count >= 1) && (child_folders_count >= 1))
515 text = g_strdup_printf(
516 _("%s : folder, %s and %s"),
517 name,
518 child_bookmarks_str,
519 child_folders_str);
520
521 g_free (child_folders_str);
522 g_free (child_bookmarks_str);
523 }
524 else if (KATZE_ITEM_IS_BOOKMARK (item))
525 {
526 const gchar* uri = katze_item_get_uri (item);
527
528 if (katze_item_get_meta_boolean (item, "app"))
529 text = g_strdup_printf (_("%s : web application bookmark to : %s"), name, uri);
530 else
531 text = g_strdup_printf (_("%s : bookmark to : %s"), name, uri);
532 }
533 }
534 else
535 {
536 gint child_folders_count = midori_array_count_recursive (
537 bookmarks->array,
538 "uri = ''",
539 NULL,
540 NULL,
541 FALSE);
542 gint child_bookmarks_count = midori_array_count_recursive (
543 bookmarks->array,
544 "uri <> ''",
545 NULL,
546 NULL,
547 FALSE);
548 gchar* child_folders_str = midori_bookmarks_statusbar_subfolder_str (child_folders_count);
549 gchar* child_bookmarks_str = midori_bookmarks_statusbar_bookmarks_str (child_bookmarks_count);
550
551 if (!child_bookmarks_count && !child_folders_count)
552 text = g_strdup_printf(
553 _("Bookmarks : empty"));
554 else if (!child_bookmarks_count && (child_folders_count >= 1))
555 text = g_strdup_printf(
556 _("Bookmarks : %s and no bookmark"),
557 child_folders_str);
558 else if ((child_bookmarks_count >= 1) && !child_folders_count)
559 text = g_strdup_printf(
560 _("Bookmarks : %s"),
561 child_bookmarks_str);
562 else if ((child_bookmarks_count >= 1) && (child_folders_count >= 1))
563 text = g_strdup_printf(
564 _("Bookmarks : %s and %s"),
565 child_bookmarks_str,
566 child_folders_str);
567
568 g_free (child_folders_str);
569 g_free (child_bookmarks_str);
570 }
571
572 if (text)
573 {
574 MidoriBrowser* browser = midori_browser_get_for_widget (bookmarks->treeview);
575
576 g_object_set (browser, "statusbar-text", text, NULL);
577
578 g_free(text);
579 }
580}
581
444gboolean582gboolean
445midori_bookmarks_update_item_db (sqlite3* db,583midori_bookmarks_update_item_db (sqlite3* db,
446 KatzeItem* item)584 KatzeItem* item)
@@ -547,6 +685,7 @@
547 gtk_widget_show (GTK_WIDGET (toolitem));685 gtk_widget_show (GTK_WIDGET (toolitem));
548 bookmarks->delete = GTK_WIDGET (toolitem);686 bookmarks->delete = GTK_WIDGET (toolitem);
549 midori_bookmarks_toolbar_update (bookmarks);687 midori_bookmarks_toolbar_update (bookmarks);
688 midori_bookmarks_statusbar_update (bookmarks);
550 toolitem = gtk_separator_tool_item_new ();689 toolitem = gtk_separator_tool_item_new ();
551 gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (toolitem), FALSE);690 gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (toolitem), FALSE);
552 gtk_tool_item_set_expand (toolitem, TRUE);691 gtk_tool_item_set_expand (toolitem, TRUE);
@@ -745,7 +884,10 @@
745 else if (!KATZE_ITEM_IS_FOLDER (item) && strcmp (stock_id, GTK_STOCK_DELETE))884 else if (!KATZE_ITEM_IS_FOLDER (item) && strcmp (stock_id, GTK_STOCK_DELETE))
746 gtk_widget_set_sensitive (menuitem, uri != NULL);885 gtk_widget_set_sensitive (menuitem, uri != NULL);
747 g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item);886 g_object_set_data (G_OBJECT (menuitem), "KatzeItem", item);
748 g_signal_connect (menuitem, "activate", G_CALLBACK (callback), bookmarks);887 if (callback)
888 g_signal_connect (menuitem, "activate", G_CALLBACK (callback), bookmarks);
889 else
890 gtk_widget_set_sensitive (menuitem, FALSE);
749 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);891 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
750 gtk_widget_show (menuitem);892 gtk_widget_show (menuitem);
751}893}
@@ -767,6 +909,27 @@
767}909}
768910
769static void911static void
912midori_bookmarks_run_web_application_cb (GtkWidget* menuitem,
913 MidoriBookmarks* bookmarks)
914{
915 KatzeItem* item;
916 const gchar* uri;
917
918 item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem");
919
920 if ((uri = katze_item_get_uri (item)) && *uri)
921 {
922 gchar* uri_fixed = sokoke_magic_uri (uri, TRUE, FALSE);
923 if (!uri_fixed)
924 uri_fixed = g_strdup (uri);
925
926 sokoke_spawn_app (uri_fixed, FALSE);
927
928 g_free (uri_fixed);
929 }
930}
931
932static void
770midori_bookmarks_open_in_tab_activate_cb (GtkWidget* menuitem,933midori_bookmarks_open_in_tab_activate_cb (GtkWidget* menuitem,
771 MidoriBookmarks* bookmarks)934 MidoriBookmarks* bookmarks)
772{935{
@@ -831,21 +994,52 @@
831994
832 menu = gtk_menu_new ();995 menu = gtk_menu_new ();
833 if (KATZE_ITEM_IS_FOLDER (item))996 if (KATZE_ITEM_IS_FOLDER (item))
834 midori_bookmarks_popup_item (menu,997 {
835 STOCK_TAB_NEW, _("Open all in _Tabs"),998 gint child_bookmarks_count = midori_array_count_recursive(
836 item, midori_bookmarks_open_in_tab_activate_cb, bookmarks);999 bookmarks->array,
1000 "uri <> ''",
1001 NULL,
1002 item,
1003 FALSE);
1004
1005 if (!child_bookmarks_count)
1006 midori_bookmarks_popup_item (menu,
1007 STOCK_TAB_NEW, _("Open all in _Tabs"),
1008 item, NULL, bookmarks);
1009 else
1010 midori_bookmarks_popup_item (menu,
1011 STOCK_TAB_NEW, _("Open all in _Tabs"),
1012 item, midori_bookmarks_open_in_tab_activate_cb, bookmarks);
1013 }
837 else1014 else
838 {1015 {
839 midori_bookmarks_popup_item (menu, GTK_STOCK_OPEN, NULL,1016 if (katze_item_get_meta_boolean (item, "app"))
840 item, midori_bookmarks_open_activate_cb, bookmarks);1017 {
1018 midori_bookmarks_popup_item (menu,
1019 GTK_STOCK_EXECUTE, _("Open as Web A_pplication"),
1020 item, midori_bookmarks_run_web_application_cb, bookmarks);
1021 midori_bookmarks_popup_item (menu, GTK_STOCK_OPEN, NULL,
1022 item, midori_bookmarks_open_activate_cb, bookmarks);
1023 }
1024 else
1025 {
1026 midori_bookmarks_popup_item (menu, GTK_STOCK_OPEN, NULL,
1027 item, midori_bookmarks_open_activate_cb, bookmarks);
1028 midori_bookmarks_popup_item (menu,
1029 GTK_STOCK_EXECUTE, _("Open as Web A_pplication"),
1030 item, midori_bookmarks_run_web_application_cb, bookmarks);
1031 }
1032
841 midori_bookmarks_popup_item (menu, STOCK_TAB_NEW, _("Open in New _Tab"),1033 midori_bookmarks_popup_item (menu, STOCK_TAB_NEW, _("Open in New _Tab"),
842 item, midori_bookmarks_open_in_tab_activate_cb, bookmarks);1034 item, midori_bookmarks_open_in_tab_activate_cb, bookmarks);
843 midori_bookmarks_popup_item (menu, STOCK_WINDOW_NEW, _("Open in New _Window"),1035 midori_bookmarks_popup_item (menu, STOCK_WINDOW_NEW, _("Open in New _Window"),
844 item, midori_bookmarks_open_in_window_activate_cb, bookmarks);1036 item, midori_bookmarks_open_in_window_activate_cb, bookmarks);
845 }1037 }
1038
846 menuitem = gtk_separator_menu_item_new ();1039 menuitem = gtk_separator_menu_item_new ();
847 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);1040 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
848 gtk_widget_show (menuitem);1041 gtk_widget_show (menuitem);
1042
849 midori_bookmarks_popup_item (menu, GTK_STOCK_EDIT, NULL,1043 midori_bookmarks_popup_item (menu, GTK_STOCK_EDIT, NULL,
850 item, midori_bookmarks_edit_clicked_cb, bookmarks);1044 item, midori_bookmarks_edit_clicked_cb, bookmarks);
851 midori_bookmarks_popup_item (menu, GTK_STOCK_DELETE, NULL,1045 midori_bookmarks_popup_item (menu, GTK_STOCK_DELETE, NULL,
@@ -960,6 +1154,105 @@
960 midori_bookmarks_toolbar_update (bookmarks);1154 midori_bookmarks_toolbar_update (bookmarks);
961}1155}
9621156
1157static KatzeItem*
1158midori_bookmarks_get_item_at_pos (GtkTreeView *treeview,
1159 gint x, gint y)
1160{
1161 GtkTreeModel* model = gtk_tree_view_get_model (treeview);
1162 GtkTreePath* path;
1163 GtkTreeIter iter;
1164 KatzeItem* item;
1165
1166 gtk_tree_view_get_path_at_pos (treeview, x, y,
1167 &path, NULL, NULL, NULL);
1168
1169 if (!path)
1170 return NULL;
1171
1172 if (!gtk_tree_model_get_iter (model, &iter, path))
1173 return NULL;
1174
1175 gtk_tree_model_get (model, &iter, 0, &item, -1);
1176
1177 gtk_tree_path_free (path);
1178
1179 return item;
1180}
1181
1182static gboolean
1183midori_bookmarks_enter_notify_event_cb (GtkTreeView *treeview,
1184 GdkEventCrossing *event,
1185 MidoriBookmarks *bookmarks)
1186{
1187 KatzeItem* item = midori_bookmarks_get_item_at_pos (treeview, event->x, event->y);
1188
1189 if (bookmarks->hovering_item)
1190 g_object_unref (bookmarks->hovering_item);
1191
1192 bookmarks->hovering_item = item;
1193
1194 midori_bookmarks_statusbar_update (bookmarks);
1195
1196 return FALSE;
1197}
1198
1199static gboolean
1200midori_bookmarks_motion_notify_event_cb (GtkTreeView *treeview,
1201 GdkEventMotion *event,
1202 MidoriBookmarks *bookmarks)
1203{
1204 gboolean item_changed;
1205 KatzeItem* item;
1206 gint x;
1207 gint y;
1208
1209 if (event->is_hint)
1210 gtk_widget_get_pointer (GTK_WIDGET (treeview), &x, &y);
1211 else
1212 {
1213 x = event->x;
1214 y = event->y;
1215 }
1216
1217 item = midori_bookmarks_get_item_at_pos (treeview, x, y);
1218
1219 item_changed = (bookmarks->hovering_item != item) ? TRUE : FALSE;
1220
1221 if (!item_changed)
1222 {
1223 if (item)
1224 g_object_unref (item);
1225 }
1226 else
1227 {
1228 if (bookmarks->hovering_item)
1229 g_object_unref (bookmarks->hovering_item);
1230
1231 bookmarks->hovering_item = item;
1232
1233 midori_bookmarks_statusbar_update (bookmarks);
1234 }
1235
1236 return FALSE;
1237}
1238
1239static gboolean
1240midori_bookmarks_leave_notify_event_cb (GtkTreeView *treeview,
1241 GdkEventCrossing *event,
1242 MidoriBookmarks *bookmarks)
1243{
1244 MidoriBrowser* browser = midori_browser_get_for_widget (bookmarks->treeview);
1245
1246 if (bookmarks->hovering_item)
1247 g_object_unref (bookmarks->hovering_item);
1248
1249 bookmarks->hovering_item = NULL;
1250
1251 g_object_set (browser, "statusbar-text", "", NULL);
1252
1253 return FALSE;
1254}
1255
963static gboolean1256static gboolean
964midori_bookmarks_filter_timeout_cb (gpointer data)1257midori_bookmarks_filter_timeout_cb (gpointer data)
965{1258{
@@ -1047,7 +1340,17 @@
1047 midori_bookmarks_row_expanded_cb, bookmarks,1340 midori_bookmarks_row_expanded_cb, bookmarks,
1048 "signal::row-collapsed",1341 "signal::row-collapsed",
1049 midori_bookmarks_row_collapsed_cb, bookmarks,1342 midori_bookmarks_row_collapsed_cb, bookmarks,
1343 "signal::enter-notify-event",
1344 midori_bookmarks_enter_notify_event_cb, bookmarks,
1345 "signal::motion-notify-event",
1346 midori_bookmarks_motion_notify_event_cb, bookmarks,
1347 "signal::leave-notify-event",
1348 midori_bookmarks_leave_notify_event_cb, bookmarks,
1050 NULL);1349 NULL);
1350 gtk_widget_add_events (GTK_WIDGET (treeview),
1351 GDK_POINTER_MOTION_MASK
1352 | GDK_POINTER_MOTION_HINT_MASK);
1353
1051 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));1354 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
1052 g_signal_connect_after (selection, "changed",1355 g_signal_connect_after (selection, "changed",
1053 G_CALLBACK (midori_bookmarks_selection_changed_cb),1356 G_CALLBACK (midori_bookmarks_selection_changed_cb),
@@ -1055,6 +1358,7 @@
1055 gtk_widget_show (treeview);1358 gtk_widget_show (treeview);
1056 gtk_box_pack_start (GTK_BOX (bookmarks), treeview, TRUE, TRUE, 0);1359 gtk_box_pack_start (GTK_BOX (bookmarks), treeview, TRUE, TRUE, 0);
1057 bookmarks->treeview = treeview;1360 bookmarks->treeview = treeview;
1361 bookmarks->hovering_item = NULL;
1058}1362}
10591363
1060static void1364static void
@@ -1064,5 +1368,6 @@
10641368
1065 if (bookmarks->app)1369 if (bookmarks->app)
1066 g_object_unref (bookmarks->app);1370 g_object_unref (bookmarks->app);
1371 if (bookmarks->hovering_item)
1372 g_object_unref (bookmarks->hovering_item);
1067}1373}
1068

Subscribers

People subscribed via source and target branches

to all changes: