From 195f0fa4ffe53f60a29bd3be846c3ebc683e084d Mon Sep 17 00:00:00 2001 From: "karol@jagiello.it" <1cyfraikilkaliter> Date: Tue, 22 May 2018 02:11:29 +0200 Subject: [PATCH] bump to 1.6 --- ..TODO/TODO.txt | 21 +- ..Themes/DarkMozVetTabTheme.tt_theme | 1 + ..Themes/Vivaldi Human.tt_theme | 1 + ...dark flat 2 with colors by kroppy.tt_theme | 1 + ..Themes/opera dark.tt_theme | 1 + ..files_ForTesting/background.html | 1 + ..files_ForTesting/init.js | 16 + ..files_ForTesting/manifest.json | 2 +- ..files_firefox/background.html | 1 + ..files_firefox/init.js | 12 + ..files_firefox/manifest.json | 6 +- ..files_opera/background.html | 1 + ..files_opera/init.js | 11 + ..files_opera/manifest.json | 4 +- ..files_vivaldi/background.html | 1 + ..files_vivaldi/init.js | 10 + ..files_vivaldi/manifest.json | 4 +- ..legacy when needed/legacy.js | 290 ++----- _locales/en/messages.json | 495 ++++++++--- background.html | 1 + bg_ch.js | 189 +++-- bg_ff.js | 189 +++-- download.html | 9 - download.js | 18 - init.js | 16 + legacy.js | 290 ++----- manifest.json | 2 +- options.html | 467 ++++++++-- options/options overwrite.css | 224 +++++ options/options.css | 121 ++- options/options.js | 681 +++++++++++---- options/refresh.js | 4 + options/sample_tabs.js | 7 +- options/theme.js | 251 ------ scripts/backup.js | 595 ++++++++----- scripts/chrome.js | 401 ++++++--- scripts/events.js | 597 ++++++------- scripts/folders.js | 359 ++++---- scripts/global.js | 350 +++----- scripts/groups.js | 254 ++++-- scripts/manager.js | 373 ++++++++ scripts/menu.js | 84 +- scripts/refresh.js | 143 +++- scripts/tabs.js | 566 ++++++++----- scripts/theme.js | 393 +++++++++ scripts/toolbar.js | 225 +++-- scripts/utils.js | 97 ++- sidebar.html | 59 +- sidebar.js | 214 +++-- theme/close.svg | 10 +- theme/theme.css | 799 +++++++++--------- theme/theme_colors.css | 29 +- theme/theme_manager.css | 317 +++++++ theme/theme_size_preset_0.css | 10 +- theme/theme_size_preset_1.css | 16 +- theme/theme_size_preset_2.css | 12 +- theme/theme_size_preset_3.css | 12 +- theme/theme_size_preset_4.css | 6 +- theme/theme_tabs_margin_0.css | 43 +- theme/theme_tabs_margin_1.css | 43 +- theme/theme_tabs_margin_2.css | 41 +- theme/toolbar_alert.svg | 69 ++ theme/toolbar_window.svg | 81 ++ 63 files changed, 6167 insertions(+), 3379 deletions(-) create mode 100644 ..Themes/DarkMozVetTabTheme.tt_theme create mode 100644 ..Themes/Vivaldi Human.tt_theme create mode 100644 ..Themes/dark flat 2 with colors by kroppy.tt_theme create mode 100644 ..Themes/opera dark.tt_theme create mode 100644 ..files_ForTesting/init.js create mode 100644 ..files_firefox/init.js create mode 100644 ..files_opera/init.js create mode 100644 ..files_vivaldi/init.js delete mode 100644 download.html delete mode 100644 download.js create mode 100644 init.js create mode 100644 options/options overwrite.css delete mode 100644 options/theme.js create mode 100644 scripts/manager.js create mode 100644 scripts/theme.js create mode 100644 theme/theme_manager.css create mode 100644 theme/toolbar_alert.svg create mode 100644 theme/toolbar_window.svg diff --git a/..TODO/TODO.txt b/..TODO/TODO.txt index b29d007..209d79e 100644 --- a/..TODO/TODO.txt +++ b/..TODO/TODO.txt @@ -1,5 +1,24 @@ +FIXES: +deny Drag&drop tab to root of folders +"Never show close button" option was breaking theme preview/editor +closing pinned tabs did not resize area of pinned tabs, leaving empty space below +added "bookmark" menu for single tab +clone pinned tab was added as not pinned (only in Firefox) +Shortcut changed to Ctrl+F2 +export session file has now date as a name + + + + +instruction to add popup +line for children hierarchy (like at the beggining) +"undo close" as a possible action with middle click on empty space + + +DRAG&DROP TO ANOTHER WINDOW OF THE ENTIRE GROUP + undo close to restore trees (will work ONLY in firefox) Close tab on Middle mouse click and not On Middle mouse down Split Pin size in theme @@ -23,8 +42,6 @@ menu: Unload other sort tabs/tree maybe filter tabs on search -make tabs border width configurable, including size 0 -make tab spacing configurable, including 0 size font size hibernate group diff --git a/..Themes/DarkMozVetTabTheme.tt_theme b/..Themes/DarkMozVetTabTheme.tt_theme new file mode 100644 index 0000000..eefe7fa --- /dev/null +++ b/..Themes/DarkMozVetTabTheme.tt_theme @@ -0,0 +1 @@ +{"ToolbarShow":true,"ColorsSet":{"group_list_button_hover_background":"#000000","tab_list_background":"#000000","group_list_background":"#000000","attention_background":"#ffd6ce","pin_list_background":"#000000","tab_background":"#1e1e1e","tab_hover_border":"#878787","tab_border":"#bebebe","tab_title_font_style":"italic","tab_title_font_color":"#b7b7b7","close_x":"#7d7d7d","tab_hover_background":"#717171","tab_hover_title_font_color":"#ffffff","tab_discarded_background":"#4c4c4c","tab_discarded_title_font_color":"#b9b9b9"},"TabsSizeSetNumber":2,"TabsMargins":"2","theme_name":"Dark","theme_version":3,"toolbar":"
","unused_buttons":""} \ No newline at end of file diff --git a/..Themes/Vivaldi Human.tt_theme b/..Themes/Vivaldi Human.tt_theme new file mode 100644 index 0000000..487c01b --- /dev/null +++ b/..Themes/Vivaldi Human.tt_theme @@ -0,0 +1 @@ +{"ColorsSet":{"attention_background":"#cf4010","attention_border":"#cf4010","button_background":"#3b3a35","button_border":"#3b3a35","button_hover_background":"#35342f","button_hover_border":"#35342f","button_icons":"#9e9e9e","button_icons_hover":"#9e9e9e","button_on_background":"#494843","button_on_icons":"#9e9e9e","button_shelf_background":"#494843","button_shelf_border":"#494843","button_shelf_hover_background":"#41403b","button_shelf_hover_border":"#41403b","button_shelf_icons":"#9e9e9e","button_shelf_icons_hover":"#9e9e9e","children_padding_left":"11px","close_hover_background":"#656460","close_hover_border":"#656460","close_hover_x":"#fbfcfe","close_x":"#dddddd","drag_indicator":"#ffa500","expand_closed_background":"#dbdbdb","expand_hover_background":"#f08e60","expand_open_background":"#9e9e9e","filter_box_background":"#35342f","filter_box_border":"#2b2a26","filter_box_font":"#adadad","filter_clear_icon":"#adadad","folder_icon_closed":"#818181","folder_icon_hover":"#f08e60","folder_icon_open":"#9e9e9e","group_list_background":"#3b3a35","group_list_borders":"#2b2a26","group_list_button_hover_background":"#35342f","group_list_default_font_color":"#b1b1b1","pin_list_background":"#494843","pin_list_border_bottom":"#292929","scrollbar_height":"11px","scrollbar_thumb":"#525049","scrollbar_thumb_hover":"#2b2a26","scrollbar_track":"#45443f","scrollbar_width":"12px","tab_active_background":"#ed773d","tab_active_border":"#ed773d","tab_active_hover_background":"#e95421","tab_active_hover_border":"#e95421","tab_active_hover_title_font_color":"#e5e5e5","tab_active_hover_title_font_weight":"bold","tab_active_selected_background":"#3f7ebe","tab_active_selected_border":"#3f7ebe","tab_active_selected_title_font_color":"#e8e8e8","tab_active_selected_title_font_weight":"normal","tab_active_title_font_color":"#e5e5e5","tab_active_title_font_weight":"bold","tab_background":"#52514b","tab_border":"#52514b","tab_discarded_background":"#52514b","tab_discarded_border":"#52514b","tab_discarded_hover_background":"#41403b","tab_discarded_hover_border":"#41403b","tab_discarded_hover_title_font_color":"#9e9e9e","tab_filtered":"#827e00","tab_filtered_active_border":"#d2cb00","tab_filtered_active_highlighted_search_border":"#ed9900","tab_filtered_active_highlighted_search_hover_border":"#c68100","tab_filtered_active_hover_border":"#d2cb00","tab_filtered_active_hover_title_font_color":"#919191","tab_filtered_active_hover_title_font_weight":"normal","tab_filtered_active_title_font_color":"#919191","tab_filtered_active_title_font_weight":"normal","tab_filtered_border":"#e8e000","tab_filtered_highlighted":"#b37400","tab_filtered_highlighted_search_border":"#ed9900","tab_filtered_highlighted_search_hover_border":"#c68100","tab_filtered_hover_border":"#d2cb00","tab_filtered_selected":"#0f8079","tab_filtered_selected_active":"#1299a9","tab_filtered_selected_active_border":"#0f8079","tab_filtered_selected_active_highlighted_search_border":"#ed9900","tab_filtered_selected_active_highlighted_search_hover_background":"#c68100","tab_filtered_selected_active_highlighted_search_hover_border":"#c68100","tab_filtered_selected_active_hover_border":"#0d6d67","tab_filtered_selected_active_hover_title_font_color":"#cfcfcf","tab_filtered_selected_active_hover_title_font_weight":"normal","tab_filtered_selected_active_title_font_color":"#cfcfcf","tab_filtered_selected_active_title_font_weight":"normal","tab_filtered_selected_border":"#0f8079","tab_filtered_selected_highlighted_search_border":"#ed9900","tab_filtered_selected_highlighted_search_hover_border":"#c68100","tab_filtered_selected_hover_border":"#0d6d67","tab_header_border_radius":"0px","tab_hover_background":"#41403b","tab_hover_border":"#41403b","tab_hover_title_font_color":"#c1c1c1","tab_hover_title_font_weight":"normal","tab_list_background":"#494843","tab_selected_active_hover_background":"#356a9f","tab_selected_active_hover_border":"#356a9f","tab_selected_active_hover_title_font_color":"#e8e8e8","tab_selected_active_hover_title_font_weight":"normal","tab_selected_background":"#3f7ebe","tab_selected_border":"#3f7ebe","tab_selected_discarded_background":"#2e5c8b","tab_selected_discarded_border":"#2e5c8b","tab_selected_discarded_hover_background":"#25496d","tab_selected_discarded_hover_border":"#25496d","tab_selected_discarded_title_font_color":"#9e9e9e","tab_selected_hover_background":"#356a9f","tab_selected_hover_border":"#356a9f","tab_selected_hover_title_font_color":"#c7c7c7","tab_selected_hover_title_font_weight":"normal","tab_selected_title_font_color":"#c1c1c1","tab_selected_title_font_weight":"normal","tab_title":"#adadad","tab_title_active":"#cacaca","tab_title_discarded":"#7e7e7e","tab_title_font_color":"#c1c1c1","tab_title_font_style":"normal","tab_title_font_weight":"normal","tabs_menu_background":"#494843","tabs_menu_border":"#3b3a35","tabs_menu_font":"#bfbfbf","tabs_menu_hover_background":"#41403b","tabs_menu_hover_border":"#41403b","tabs_menu_separator":"#3b3a35","toolbar_background":"#3b3a35","toolbar_border_bottom":"#2b2a26","toolbar_shelf_background":"#494843"},"TabsMargins":"2","TabsSizeSetNumber":3,"ToolbarShow":true,"theme_name":"Vivaldi Human","theme_version":4} \ No newline at end of file diff --git a/..Themes/dark flat 2 with colors by kroppy.tt_theme b/..Themes/dark flat 2 with colors by kroppy.tt_theme new file mode 100644 index 0000000..2436115 --- /dev/null +++ b/..Themes/dark flat 2 with colors by kroppy.tt_theme @@ -0,0 +1 @@ +{"ColorsSet":{"attention_background":"#cf4010","attention_border":"#cf4010","button_background":"#303030","button_border":"#303030","button_hover_background":"#414141","button_hover_border":"#414141","button_icons":"#9e9e9e","button_icons_hover":"#ffa500","button_on_background":"#3b3b3b","button_on_icons":"#339bf3","button_shelf_background":"#3b3b3b","button_shelf_border":"#3b3b3b","button_shelf_hover_background":"#2e2e2e","button_shelf_hover_border":"#2e2e2e","button_shelf_icons":"#9e9e9e","button_shelf_icons_hover":"#ffa500","children_padding_left":"11px","close_hover_background":"#ffa500","close_hover_border":"#ffa500","close_hover_x":"#fbfcfe","close_x":"#dddddd","drag_indicator":"#ffa500","expand_closed_background":"#818181","expand_open_background":"#339bf3","filter_box_background":"#303030","filter_box_border":"#3b3b3b","filter_box_font":"#adadad","filter_clear_icon":"#adadad","folder_icon_closed":"#818181","folder_icon_open":"#339bf3","group_list_background":"#303030","group_list_borders":"#292929","group_list_button_hover_background":"#414141","group_list_default_font_color":"#b1b1b1","pin_list_background":"#3b3b3b","pin_list_border_bottom":"#292929","scrollbar_height":"11px","scrollbar_thumb":"#484848","scrollbar_thumb_hover":"#ffa500","scrollbar_track":"#303030","scrollbar_width":"12px","tab_active_background":"#339bf3","tab_active_border":"#339bf3","tab_active_hover_background":"#378dec","tab_active_hover_border":"#378dec","tab_active_hover_title_font_color":"#e5e5e5","tab_active_hover_title_font_weight":"bold","tab_active_selected_background":"#3f7ebe","tab_active_selected_border":"#3f7ebe","tab_active_selected_title_font_color":"#e8e8e8","tab_active_selected_title_font_weight":"normal","tab_active_title_font_color":"#e5e5e5","tab_active_title_font_weight":"bold","tab_background":"#3b3b3b","tab_border":"#3b3b3b","tab_discarded_background":"#3b3b3b","tab_discarded_border":"#3b3b3b","tab_discarded_hover_background":"#353535","tab_discarded_hover_border":"#353535","tab_discarded_hover_title_font_color":"#9e9e9e","tab_filtered":"#827e00","tab_filtered_active_border":"#d2cb00","tab_filtered_active_highlighted_search_border":"#ed9900","tab_filtered_active_highlighted_search_hover_border":"#c68100","tab_filtered_active_hover_border":"#d2cb00","tab_filtered_active_hover_title_font_color":"#919191","tab_filtered_active_hover_title_font_weight":"normal","tab_filtered_active_title_font_color":"#919191","tab_filtered_active_title_font_weight":"normal","tab_filtered_border":"#e8e000","tab_filtered_highlighted":"#b37400","tab_filtered_highlighted_search_border":"#ed9900","tab_filtered_highlighted_search_hover_border":"#c68100","tab_filtered_hover_border":"#d2cb00","tab_filtered_selected":"#0f8079","tab_filtered_selected_active":"#1299a9","tab_filtered_selected_active_border":"#0f8079","tab_filtered_selected_active_highlighted_search_border":"#ed9900","tab_filtered_selected_active_highlighted_search_hover_background":"#c68100","tab_filtered_selected_active_highlighted_search_hover_border":"#c68100","tab_filtered_selected_active_hover_border":"#0d6d67","tab_filtered_selected_active_hover_title_font_color":"#cfcfcf","tab_filtered_selected_active_hover_title_font_weight":"normal","tab_filtered_selected_active_title_font_color":"#cfcfcf","tab_filtered_selected_active_title_font_weight":"normal","tab_filtered_selected_border":"#0f8079","tab_filtered_selected_highlighted_search_border":"#ed9900","tab_filtered_selected_highlighted_search_hover_border":"#c68100","tab_filtered_selected_hover_border":"#0d6d67","tab_header_border_radius":"0px","tab_hover_background":"#353535","tab_hover_border":"#353535","tab_hover_title_font_color":"#c1c1c1","tab_hover_title_font_weight":"normal","tab_list_background":"#3b3b3b","tab_selected_active_hover_background":"#356a9f","tab_selected_active_hover_border":"#356a9f","tab_selected_active_hover_title_font_color":"#e8e8e8","tab_selected_active_hover_title_font_weight":"normal","tab_selected_background":"#3f7ebe","tab_selected_border":"#3f7ebe","tab_selected_discarded_background":"#2e5c8b","tab_selected_discarded_border":"#2e5c8b","tab_selected_discarded_hover_background":"#25496d","tab_selected_discarded_hover_border":"#25496d","tab_selected_discarded_title_font_color":"#9e9e9e","tab_selected_hover_background":"#356a9f","tab_selected_hover_border":"#356a9f","tab_selected_hover_title_font_color":"#c7c7c7","tab_selected_hover_title_font_weight":"normal","tab_selected_title_font_color":"#c1c1c1","tab_selected_title_font_weight":"normal","tab_title":"#adadad","tab_title_active":"#cacaca","tab_title_discarded":"#7e7e7e","tab_title_font_color":"#c1c1c1","tab_title_font_style":"normal","tab_title_font_weight":"normal","tabs_menu_background":"#484848","tabs_menu_border":"#616161","tabs_menu_font":"#bfbfbf","tabs_menu_hover_background":"#353535","tabs_menu_hover_border":"#353535","tabs_menu_separator":"#616161","toolbar_background":"#303030","toolbar_border_bottom":"#292929","toolbar_shelf_background":"#3b3b3b"},"TabsMargins":"1","TabsSizeSetNumber":2,"ToolbarShow":true,"theme_name":"dark flat 2 with colors by kroppy","theme_version":4} \ No newline at end of file diff --git a/..Themes/opera dark.tt_theme b/..Themes/opera dark.tt_theme new file mode 100644 index 0000000..d04df07 --- /dev/null +++ b/..Themes/opera dark.tt_theme @@ -0,0 +1 @@ +{"ToolbarShow":true,"ColorsSet":{"attention_background":"#b7b7b7","attention_border":"#b7b7b7","button_background":"#333333","button_border":"#333333","button_hover_background":"#4f4f4f","button_hover_border":"#4f4f4f","button_icons":"#c3c3c3","button_icons_hover":"#c3c3c3","button_on_background":"#555555","button_on_icons":"#c3c3c3","button_shelf_background":"#555555","button_shelf_border":"#555555","button_shelf_hover_background":"#4a4a4a","button_shelf_hover_border":"#4a4a4a","button_shelf_icons":"#c3c3c3","button_shelf_icons_hover":"#c3c3c3","children_padding_left":"11px","close_hover_background":"#939394","close_hover_border":"#757676","close_hover_x":"#fbfcfe","close_x":"#dddddd","drag_indicator":"#acacac","expand_closed_background":"#ebebeb","expand_closed_border":"#818181","expand_hover_background":"#ebebeb","expand_lines":"#9d9d9d","expand_open_background":"#bfbfbf","expand_open_border":"#339bf3","filter_box_background":"#333333","filter_box_border":"#797979","filter_box_font":"#adadad","filter_clear_icon":"#adadad","folder_icon_closed":"#d2d2d2","folder_icon_hover":"#ebebeb","folder_icon_open":"#d2d2d2","group_list_background":"#333333","group_list_borders":"#282828","group_list_button_hover_background":"#4f4f4f","group_list_default_font_color":"#dfdfdf","pin_list_background":"#555555","pin_list_border_bottom":"#1f1f1f","scrollbar_height":"11px","scrollbar_thumb":"#5c5c5c","scrollbar_thumb_hover":"#2e2e2e","scrollbar_track":"#3e3e3e","scrollbar_width":"12px","tab_active_background":"#a0a0a0","tab_active_border":"#969696","tab_active_hover_background":"#747474","tab_active_hover_border":"#747474","tab_active_hover_title_font_color":"#f8f8f8","tab_active_hover_title_font_weight":"bold","tab_active_selected_background":"#858585","tab_active_selected_border":"#858585","tab_active_selected_title_font_color":"#e8e8e8","tab_active_selected_title_font_weight":"bold","tab_active_title_font_color":"#f7f7f7","tab_active_title_font_style":"normal","tab_active_title_font_weight":"bold","tab_background":"#626262","tab_border":"#626262","tab_discarded_background":"#626262","tab_discarded_border":"#626262","tab_discarded_hover_background":"#353535","tab_discarded_hover_border":"#353535","tab_discarded_hover_title_font_color":"#9e9e9e","tab_filtered":"#827e00","tab_filtered_active_border":"#d2cb00","tab_filtered_active_highlighted_search_border":"#ed9900","tab_filtered_active_highlighted_search_hover_border":"#c68100","tab_filtered_active_hover_border":"#d2cb00","tab_filtered_active_hover_title_font_color":"#919191","tab_filtered_active_hover_title_font_weight":"normal","tab_filtered_active_title_font_color":"#919191","tab_filtered_active_title_font_weight":"normal","tab_filtered_border":"#e8e000","tab_filtered_highlighted":"#b37400","tab_filtered_highlighted_search_border":"#ed9900","tab_filtered_highlighted_search_hover_border":"#c68100","tab_filtered_hover_border":"#d2cb00","tab_filtered_selected":"#0f8079","tab_filtered_selected_active":"#1299a9","tab_filtered_selected_active_border":"#0f8079","tab_filtered_selected_active_highlighted_search_border":"#ed9900","tab_filtered_selected_active_highlighted_search_hover_background":"#c68100","tab_filtered_selected_active_highlighted_search_hover_border":"#c68100","tab_filtered_selected_active_hover_border":"#0d6d67","tab_filtered_selected_active_hover_title_font_color":"#cfcfcf","tab_filtered_selected_active_hover_title_font_weight":"normal","tab_filtered_selected_active_title_font_color":"#cfcfcf","tab_filtered_selected_active_title_font_weight":"normal","tab_filtered_selected_border":"#0f8079","tab_filtered_selected_highlighted_search_border":"#ed9900","tab_filtered_selected_highlighted_search_hover_border":"#c68100","tab_filtered_selected_hover_border":"#0d6d67","tab_header_border_radius":"0px","tab_hover_background":"#353535","tab_hover_border":"#353535","tab_hover_title_font_color":"#d1d1d1","tab_hover_title_font_weight":"normal","tab_list_background":"#555555","tab_selected_active_hover_background":"#4f4f4f","tab_selected_active_hover_border":"#4f4f4f","tab_selected_active_hover_title_font_color":"#e8e8e8","tab_selected_active_hover_title_font_weight":"bold","tab_selected_background":"#858585","tab_selected_border":"#858585","tab_selected_discarded_background":"#858585","tab_selected_discarded_border":"#858585","tab_selected_discarded_hover_background":"#747474","tab_selected_discarded_hover_border":"#747474","tab_selected_discarded_hover_title_font_color":"#282828","tab_selected_discarded_title_font_color":"#444444","tab_selected_hover_background":"#4f4f4f","tab_selected_hover_border":"#4f4f4f","tab_selected_hover_title_font_color":"#d1d1d1","tab_selected_hover_title_font_weight":"normal","tab_selected_title_font_color":"#d1d1d1","tab_selected_title_font_weight":"normal","tab_title":"#adadad","tab_title_active":"#cacaca","tab_title_discarded":"#7e7e7e","tab_title_font_color":"#d1d1d1","tab_title_font_style":"normal","tab_title_font_weight":"normal","tabs_menu_background":"#484848","tabs_menu_border":"#616161","tabs_menu_font":"#bfbfbf","tabs_menu_hover_background":"#353535","tabs_menu_hover_border":"#353535","tabs_menu_separator":"#616161","toolbar_background":"#333333","toolbar_border_bottom":"#282828","toolbar_shelf_background":"#555555","tab_discarded_title_font_color":"#1a1a1a"},"TabsSizeSetNumber":2,"TabsMargins":"2","theme_name":"opera dark","theme_version":4} \ No newline at end of file diff --git a/..files_ForTesting/background.html b/..files_ForTesting/background.html index a6cc030..0816c92 100644 --- a/..files_ForTesting/background.html +++ b/..files_ForTesting/background.html @@ -6,4 +6,5 @@ + \ No newline at end of file diff --git a/..files_ForTesting/init.js b/..files_ForTesting/init.js new file mode 100644 index 0000000..af2398d --- /dev/null +++ b/..files_ForTesting/init.js @@ -0,0 +1,16 @@ +// Copyright (c) 2017 kroppy. All rights reserved. +// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license +// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + +document.addEventListener("DOMContentLoaded", Init(), false); + +function Init() { + if (browserId == "F") { + FirefoxMessageListeners(); + FirefoxStart(0); + } else { + // ConvertLegacyStorage(); + ChromeMessageListeners(); + ChromeLoadTabs(0); + } +} diff --git a/..files_ForTesting/manifest.json b/..files_ForTesting/manifest.json index 925573d..76dcbba 100644 --- a/..files_ForTesting/manifest.json +++ b/..files_ForTesting/manifest.json @@ -14,7 +14,7 @@ "19": "icons/16.png", "16": "icons/16.png" }, - "permissions": [ "tabs", "sessions", "", "storage", "bookmarks" ], + "permissions": [ "tabs", "sessions", "", "storage", "unlimitedStorage", "bookmarks", "tabHide" ], "sidebar_action": { "default_icon": { diff --git a/..files_firefox/background.html b/..files_firefox/background.html index f1c0516..c7bbc40 100644 --- a/..files_firefox/background.html +++ b/..files_firefox/background.html @@ -4,4 +4,5 @@ + \ No newline at end of file diff --git a/..files_firefox/init.js b/..files_firefox/init.js new file mode 100644 index 0000000..326732f --- /dev/null +++ b/..files_firefox/init.js @@ -0,0 +1,12 @@ +// Copyright (c) 2017 kroppy. All rights reserved. +// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license +// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + +document.addEventListener("DOMContentLoaded", Init(), false); + +function Init() { + setTimeout(function() { + FirefoxMessageListeners(); + FirefoxStart(0); + }, 500); +} \ No newline at end of file diff --git a/..files_firefox/manifest.json b/..files_firefox/manifest.json index 5cb5b19..4ac47a9 100644 --- a/..files_firefox/manifest.json +++ b/..files_firefox/manifest.json @@ -14,7 +14,7 @@ "19": "icons/16.png", "16": "icons/16.png" }, - "permissions": [ "tabs", "sessions", "", "storage", "bookmarks" ], + "permissions": [ "tabs", "sessions", "", "storage", "unlimitedStorage", "bookmarks", "tabHide" ], "sidebar_action": { "default_icon": { "16": "icons/16.png", @@ -30,7 +30,7 @@ }, "commands": { "_execute_browser_action": { - "suggested_key": { "default": "F2" }, + "suggested_key": { "default": "Ctrl+F2" }, "description": "toggle Tree Tabs" } }, @@ -44,5 +44,5 @@ "page": "options.html", "open_in_tab": true }, - "version": "1.5.1" + "version": "1.6.0" } \ No newline at end of file diff --git a/..files_opera/background.html b/..files_opera/background.html index c97bdfc..1d3aa75 100644 --- a/..files_opera/background.html +++ b/..files_opera/background.html @@ -5,4 +5,5 @@ + \ No newline at end of file diff --git a/..files_opera/init.js b/..files_opera/init.js new file mode 100644 index 0000000..27fe083 --- /dev/null +++ b/..files_opera/init.js @@ -0,0 +1,11 @@ +// Copyright (c) 2017 kroppy. All rights reserved. +// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license +// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + +document.addEventListener("DOMContentLoaded", Init(), false); + +function Init() { + ConvertLegacyStorage(); + ChromeMessageListeners(); + ChromeLoadTabs(0); +} diff --git a/..files_opera/manifest.json b/..files_opera/manifest.json index 9c297d5..4de32b3 100644 --- a/..files_opera/manifest.json +++ b/..files_opera/manifest.json @@ -15,7 +15,7 @@ "19": "icons/16.png", "16": "icons/16.png" }, - "permissions": [ "tabs", "sessions", "", "storage", "bookmarks" ], + "permissions": [ "tabs", "sessions", "", "storage", "unlimitedStorage", "bookmarks" ], "sidebar_action": { "default_icon": { "19": "icons/16.png", @@ -25,5 +25,5 @@ "default_title": "Tree Tabs" }, "options_page": "options.html", - "version": "1.0" + "version": "1.6.0" } diff --git a/..files_vivaldi/background.html b/..files_vivaldi/background.html index 0a8ace6..1215d3f 100644 --- a/..files_vivaldi/background.html +++ b/..files_vivaldi/background.html @@ -4,4 +4,5 @@ + \ No newline at end of file diff --git a/..files_vivaldi/init.js b/..files_vivaldi/init.js new file mode 100644 index 0000000..afe0210 --- /dev/null +++ b/..files_vivaldi/init.js @@ -0,0 +1,10 @@ +// Copyright (c) 2017 kroppy. All rights reserved. +// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license +// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + +document.addEventListener("DOMContentLoaded", Init(), false); + +function Init() { + ChromeMessageListeners(); + ChromeLoadTabs(0); +} diff --git a/..files_vivaldi/manifest.json b/..files_vivaldi/manifest.json index 9cf5c9f..883d3b5 100644 --- a/..files_vivaldi/manifest.json +++ b/..files_vivaldi/manifest.json @@ -14,10 +14,10 @@ "19": "icons/16.png", "16": "icons/16.png" }, - "permissions": [ "tabs", "sessions", "", "storage", "bookmarks" ], + "permissions": [ "tabs", "sessions", "", "storage", "unlimitedStorage", "bookmarks" ], "options_ui": { "page": "options.html", "open_in_tab": false }, - "version": "1.5" + "version": "1.6.0" } diff --git a/..legacy when needed/legacy.js b/..legacy when needed/legacy.js index ae4358b..93a1aed 100644 --- a/..legacy when needed/legacy.js +++ b/..legacy when needed/legacy.js @@ -2,6 +2,13 @@ // Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + +if (localStorage.getItem("t0") != null){ + LoadV015(0); +} + + + function OldHashTab(tab){ if (tabs[tab.id] == undefined){ tabs[tab.id] = {ttid: "", hash: 0, h: 0, parent: tab.pinned ? "pin_list" : "tab_list", index: tab.index, expand: ""}; @@ -77,23 +84,15 @@ function LoadV015(retry){ } } - if (browserId == "F") { - // append ids to firefox tabs - qtabs.forEach(function(Tab){ - AppendTabTTId(Tab.id); - }); - qtabs.forEach(function(Tab){ - tabs_to_save.push({id: Tab.id, ttid: tabs[tabId].ttid, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand}); - }); - } else { - // create new hashes - qtabs.forEach(function(Tab){ - ChromeHashURL(Tab); - }); - qtabs.forEach(function(Tab){ - tabs_to_save.push({id: Tab.id, hash: tabs[Tab.id].hash, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand}); - }); - } + + // create new hashes + qtabs.forEach(function(Tab){ + ChromeHashURL(Tab); + }); + qtabs.forEach(function(Tab){ + tabs_to_save.push({id: Tab.id, hash: tabs[Tab.id].hash, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand}); + }); + localStorage["t_count"] = JSON.stringify(qtabs.length); localStorage["tabs"] = JSON.stringify(tabs_to_save); for (var t = 0; t < 9999; t++){ @@ -101,152 +100,7 @@ function LoadV015(retry){ localStorage.removeItem("t"+t); } } - window.location.reload(); - }); -} - -function FirefoxLoadV100(retry) { - chrome.windows.getAll({windowTypes: ["normal"], populate: true}, function(w) { - - var refTabs = {}; - var tabs_matched = 0; - var tabs_count = 0; - for (var wIndex = 0; wIndex < w.length; wIndex++) { - tabs_count += w[wIndex].tabs.length; - } - - // load tabs and windows from hdd - var LoadedWindows = LoadData("windows", []); - var LoadedTabs = LoadData("tabs", []); - - // if loaded tabs mismatch by 50%, then try to load back - if (LoadedTabs.length < tabs_count*0.5 || retry > 0) { - LoadedTabs = LoadData("tabs_BAK"+retry, []); - } - // if loaded windows mismatch, then try to load back - if (LoadedWindows.length < w.length || retry > 0) { - LoadedWindows = LoadData("windows_BAK"+retry, []); - } - // CACHED COUNTS AND STUFF - var lastWinId = w[w.length-1].id; - var lastTabId = w[w.length-1].tabs[w[w.length-1].tabs.length-1].id; - var LoadedWinCount = LoadedWindows.length; - var LoadedTabsCount = LoadedTabs.length; - var WinCount = w.length; - - for (var wIndex = 0; wIndex < WinCount; wIndex++) { - let winIndex = wIndex; - let winId = w[winIndex].id; - let tabsCount = w[winIndex].tabs.length; - - let win = Promise.resolve(browser.sessions.getWindowValue(winId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET WINDOW VALUE - if (TTId != undefined) { - windows[winId] = {ttid: TTId, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, activetab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; - } else { - windows[winId] = {ttid: "", group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, activetab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; - } - for (var tIndex = 0; tIndex < tabsCount; tIndex++) { - - let tabIndex = tIndex; - let tabId = w[winIndex].tabs[tabIndex].id; - let tabPinned = w[winIndex].tabs[tabIndex].pinned; - - let tab = Promise.resolve(browser.sessions.getTabValue(tabId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET TAB VALUE - if (TTId != undefined) { - tabs[tabId] = {ttid: TTId, parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: ""}; - } else { - tabs[tabId] = {ttid: "", parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: ""}; - } - // IF ON LAST TAB AND LAST WINDOW, START MATCHING LOADED DATA - if (tabId == lastTabId && winId == lastWinId) { - for (var ThisSessonWinId in windows) { - if (windows[ThisSessonWinId].ttid != ""){ - for (var LwIndex = 0; LwIndex < LoadedWinCount; LwIndex++) { - if (LoadedWindows[LwIndex].ttid == windows[ThisSessonWinId].ttid) { - if (LoadedWindows[LwIndex].group_bar) { windows[ThisSessonWinId].group_bar = LoadedWindows[LwIndex].group_bar; } - if (LoadedWindows[LwIndex].search_filter) { windows[ThisSessonWinId].search_filter = LoadedWindows[LwIndex].search_filter; } - if (LoadedWindows[LwIndex].active_shelf) { windows[winId].active_shelf = LoadedWindows[LwIndex].active_shelf; } - if (LoadedWindows[LwIndex].active_group) { windows[ThisSessonWinId].active_group = LoadedWindows[LwIndex].active_group; } - if (Object.keys(LoadedWindows[LwIndex].groups).length > 0) { windows[ThisSessonWinId].groups = Object.assign({}, LoadedWindows[LwIndex].groups); } - if (Object.keys(LoadedWindows[LwIndex].folders).length > 0) { windows[ThisSessonWinId].folders = Object.assign({}, LoadedWindows[LwIndex].folders); } - LoadedWindows[LwIndex].ttid = ""; - break; - } - } - } else { - AppendWinTTId(parseInt(ThisSessonWinId)); - } - } - // OK, DONE WITH WINDOWS, START TABS LOOP - for (var ThisSessonTabId in tabs) { - if (tabs[ThisSessonTabId].ttid != ""){ - for (var LtabIndex = 0; LtabIndex < LoadedTabsCount; LtabIndex++) { - if (LoadedTabs[LtabIndex].ttid == tabs[ThisSessonTabId].ttid) { - refTabs[LoadedTabs[LtabIndex].id] = ThisSessonTabId; - if (LoadedTabs[LtabIndex].parent) { tabs[ThisSessonTabId].parent = LoadedTabs[LtabIndex].parent; } - if (LoadedTabs[LtabIndex].index) { tabs[ThisSessonTabId].index = LoadedTabs[LtabIndex].index; } - if (LoadedTabs[LtabIndex].expand) { tabs[ThisSessonTabId].expand = LoadedTabs[LtabIndex].expand; } - LoadedTabs[LtabIndex].ttid = ""; - tabs_matched++; - break; - } - } - } else { - AppendTabTTId(parseInt(ThisSessonTabId)); - } - } - // OK, DONE, NOW REPLACE OLD PARENTS IDS WITH THIS SESSION IDS - for (var ThisSessonTabId in tabs) { - if (refTabs[tabs[ThisSessonTabId].parent] != undefined) { - tabs[ThisSessonTabId].parent = refTabs[tabs[ThisSessonTabId].parent]; - } - } - // OK, SAME THING FOR ACTIVE TABS IN GROUPS - - for (var ThisSessonWinId in windows) { - for (var group in windows[ThisSessonWinId].groups) { - if (refTabs[windows[ThisSessonWinId].groups[group].activetab]) { - windows[ThisSessonWinId].groups[group].activetab = refTabs[windows[ThisSessonWinId].groups[group].activetab]; - } - } - } - - - if (localStorage.getItem("t_count") !== null){ - localStorage.removeItem("t_count"); - } - if (localStorage.getItem("tabs_BAK1") !== null){ - localStorage.removeItem("tabs_BAK1"); - } - if (localStorage.getItem("tabs_BAK2") !== null){ - localStorage.removeItem("tabs_BAK2"); - } - if (localStorage.getItem("tabs_BAK3") !== null){ - localStorage.removeItem("tabs_BAK3"); - } - if (localStorage.getItem("tabs") !== null){ - localStorage.removeItem("tabs"); - } - if (localStorage.getItem("windows") !== null){ - localStorage.removeItem(windows); - } - - - // will try to find tabs for 3 times - if (opt.skip_load == true || retry > 2 || (tabs_matched > tabs_count*0.5)) { - - running = true; - FirefoxAutoSaveData(); - FirefoxListeners(); - } else { - setTimeout(function() {FirefoxLoadTabs(retry+1);}, 2000); - } - - } - }); - } - }); - } + ConvertLegacyStorage(); }); } @@ -272,62 +126,62 @@ function ConvertLegacyStorage() { LSpreferences = LoadData("preferences", {}); } - if (browserId != "F") { - let LStabs = {}; - if (localStorage.getItem("tabs") != null) { - LStabs = LoadData("tabs", {}); - } - let LSwindows = {}; - if (localStorage.getItem("windows") != null) { - LSwindows = LoadData("windows", {}); - } - let LStabs_BAK1 = {}; - if (localStorage.getItem("tabs_BAK1") != null) { - LStabs_BAK1 = LoadData("tabs_BAK1", {}); - } - let LStabs_BAK2 = {}; - if (localStorage.getItem("tabs_BAK2") != null) { - LStabs_BAK2 = LoadData("tabs_BAK2", {}); - } - let LStabs_BAK3 = {}; - if (localStorage.getItem("tabs_BAK3") != null) { - LStabs_BAK3 = LoadData("tabs_BAK3", {}); - } - - let LSwindows_BAK1 = {}; - if (localStorage.getItem("windows_BAK1") != null) { - LSwindows_BAK1 = LoadData("windows_BAK1", {}); - } - let LSwindows_BAK2 = {}; - if (localStorage.getItem("windows_BAK2") != null) { - LSwindows_BAK2 = LoadData("windows_BAK2", {}); - } - let LSwindows_BAK3 = {}; - if (localStorage.getItem("windows_BAK3") != null) { - LSwindows_BAK3 = LoadData("windows_BAK3", {}); - } - - - let LSt_count = 0; - if (localStorage.getItem("t_count") != null) { - LSt_count = LoadData("t_count", {}); - } - let LSw_count = 0; - if (localStorage.getItem("w_count") != null) { - LSw_count = LoadData("w_count", {}); - } - chrome.storage.local.set({tabs: LStabs}); - chrome.storage.local.set({windows: LSwindows}); - chrome.storage.local.set({tabs_BAK1: LStabs_BAK1}); - chrome.storage.local.set({tabs_BAK2: LStabs_BAK2}); - chrome.storage.local.set({tabs_BAK3: LStabs_BAK3}); - - chrome.storage.local.set({windows_BAK1: LSwindows_BAK1}); - chrome.storage.local.set({windows_BAK2: LSwindows_BAK2}); - chrome.storage.local.set({windows_BAK3: LSwindows_BAK3}); - chrome.storage.local.set({t_count: LSt_count}); - chrome.storage.local.set({w_count: LSw_count}); + let LStabs = {}; + if (localStorage.getItem("tabs") != null) { + LStabs = LoadData("tabs", {}); } + let LSwindows = {}; + if (localStorage.getItem("windows") != null) { + LSwindows = LoadData("windows", {}); + } + let LStabs_BAK1 = {}; + if (localStorage.getItem("tabs_BAK1") != null) { + LStabs_BAK1 = LoadData("tabs_BAK1", {}); + } + let LStabs_BAK2 = {}; + if (localStorage.getItem("tabs_BAK2") != null) { + LStabs_BAK2 = LoadData("tabs_BAK2", {}); + } + let LStabs_BAK3 = {}; + if (localStorage.getItem("tabs_BAK3") != null) { + LStabs_BAK3 = LoadData("tabs_BAK3", {}); + } + + let LSwindows_BAK1 = {}; + if (localStorage.getItem("windows_BAK1") != null) { + LSwindows_BAK1 = LoadData("windows_BAK1", {}); + } + let LSwindows_BAK2 = {}; + if (localStorage.getItem("windows_BAK2") != null) { + LSwindows_BAK2 = LoadData("windows_BAK2", {}); + } + let LSwindows_BAK3 = {}; + if (localStorage.getItem("windows_BAK3") != null) { + LSwindows_BAK3 = LoadData("windows_BAK3", {}); + } + + + let LSt_count = 0; + if (localStorage.getItem("t_count") != null) { + LSt_count = LoadData("t_count", {}); + } + let LSw_count = 0; + if (localStorage.getItem("w_count") != null) { + LSw_count = LoadData("w_count", {}); + } + chrome.storage.local.set({tabs: LStabs}); + chrome.storage.local.set({windows: LSwindows}); + chrome.storage.local.set({tabs_BAK1: LStabs_BAK1}); + chrome.storage.local.set({tabs_BAK2: LStabs_BAK2}); + chrome.storage.local.set({tabs_BAK3: LStabs_BAK3}); + + chrome.storage.local.set({windows_BAK1: LSwindows_BAK1}); + chrome.storage.local.set({windows_BAK2: LSwindows_BAK2}); + chrome.storage.local.set({windows_BAK3: LSwindows_BAK3}); + chrome.storage.local.set({t_count: LSt_count}); + chrome.storage.local.set({w_count: LSw_count}); + + chrome.storage.local.set({preferences: LSpreferences}); chrome.storage.local.set({current_theme: current_theme}); chrome.storage.local.set({themes: SLThemes}); diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 1513461..34bc0d0 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -19,6 +19,9 @@ "button_undo": { "message": "Reopen last closed" }, + "button_reboot": { + "message": "Reload Tree Tabs. Try this in case your tree hierarchy is lost after restart." + }, "button_detach": { "message": "Detach tab" }, @@ -118,20 +121,19 @@ "button_folders": { "message": "Folders" }, - "button_new_folder": { "message": "New folder" }, - "button_remove_folder": { "message": "Remove selected folder/s" }, - "button_edit_folder": { "message": "Rename folder" }, + + "menu_expand_all": { @@ -205,7 +207,7 @@ }, "menu_bookmark_tree": { - "message": "Bookmark tree" + "message": "Bookmark" }, @@ -224,21 +226,24 @@ "message": "New group" }, "menu_rename_group": { - "message": "Rename group" + "message": "Rename" }, "menu_delete_group": { - "message": "Delete group" + "message": "Delete" }, "menu_delete_group_tabs_close": { - "message": "Delete group with tabs" + "message": "Delete with tabs" }, - "groups_menu_unload": { - "message": "Unload group" + "menu_groups_unload": { + "message": "Unload" }, "menu_bookmark_group": { - "message": "Bookmark group" + "message": "Bookmark" + }, + "menu_groups_hibernate": { + "message": "Hibernate" }, @@ -273,6 +278,37 @@ "message": "Switch tabs with mouse wheel" }, + "options_tab_group_regex": { + "message": "Tab group assignments (Items matching the given pattern will be moved to the designated group. Pattern accepts regular expressions.)" + }, + "option_tab_match": { + "message": "Pattern" + }, + "option_tab_group": { + "message": "Group" + }, + "options_orphaned_tabs_to_ungrouped": { + "message": "Always place orphan tabs in the 'ungrouped' group" + }, + "options_move_on_url_change": { + "message": "Move tabs that match regexes" + }, + "options_move_on_url_change_never": { + "message": "never" + }, + "options_move_on_url_change_from_empty": { + "message": "when URL changes in Home tab (only Home tab created externally, for example, ctrl+t shortcut)" + }, + "options_move_on_url_change_from_empty_b": { + "message": "when URL changes in Home tab" + }, + "options_move_on_url_change_all_new": { + "message": "when tab is created with a matching URL" + }, + "options_move_on_url_change_always": { + "message": "always when URL changes to a matching pattern" + }, + "options_always_show_close": { "message": "Show close button on all tabs and folders" }, @@ -326,6 +362,9 @@ "options_action_tab_activate_previous_active": { "message": "go back to previous active tab (works only on unpinned tabs)" }, + "options_action_tab_undo_close": { + "message": "reopen last closed tab" + }, @@ -336,15 +375,18 @@ "options_dbclick_group": { "message": "Action for double click on empty space on the left side or below the tabs" }, - "options_action__group_none": { + "options_action_group_none": { "message": "nothing" }, - "options_action__group_new": { + "options_action_group_new": { "message": "open new tab" }, - "options_action__group_activate_previous_active": { + "options_action_group_activate_previous_active": { "message": "go back to previous active tab (works only on unpinned tabs)" }, + "options_action_group_undo_close_tab": { + "message": "reopen last closed tab" + }, @@ -443,6 +485,10 @@ "message": "Synchronize browser tabs order after drag&drop of the group tabs. Tabs will sort for a long time, if browser has a lot of tabs open. This option is needed for correct ctrl+tab switching. You can disable this option if you don't use keyboard shortcuts." }, + "options_hide_other_groups_tabs_firefox": { + "message": "Show Firefox tabs from current group only. Requires change in about:config, find 'extensions.webextensions.tabhide.enabled' and set it to true." + }, + @@ -537,16 +583,110 @@ "message": "Reset toolbar" }, + "options_export_debug": { + "message": "Export log file" + }, + "options_print_debug": { + "message": "Load log from file" + }, + + "options_toolbar_look": { + "message": " Toolbar's look " + }, + + + + "button_background": { + "message": "Toolbar buttons background" + }, + "button_hover_background": { + "message": "Toolbar buttons background, on mouse hover" + }, + "button_on_background": { + "message": "Toolbar active buttons background" + }, + + + "button_icons": { + "message": "Toolbar buttons icon color" + }, + "button_icons_hover": { + "message": "Toolbar buttons icon color, on mouse hover" + }, + "button_on_icons": { + "message": "Toolbar active buttons icon color" + }, + "button_border": { + "message": "Toolbar buttons border color" + }, + "button_hover_border": { + "message": "Toolbar buttons border color, on mouse hover" + }, + + + "filter_box_font": { + "message": "Search box, font color" + }, + "filter_box_background": { + "message": "Search box, font background color" + }, + "filter_box_border": { + "message": "Search box, border color" + }, + "filter_clear_icon": { + "message": "Clear search result x button color" + }, + + + "toolbar_background": { + "message": "Toolbar background color" + }, + "toolbar_shelf_background": { + "message": "Toolbar's shelf background color" + }, + "toolbar_border_bottom": { + "message": "Toolbar borders color" + }, + + + + "button_shelf_background": { + "message": "Toolbar's shelf buttons background color" + }, + "button_shelf_hover_background": { + "message": "Toolbar's shelf buttons background color, on mouse hover" + }, + "button_shelf_icons": { + "message": "Toolbar's shelf buttons icon color" + }, + "button_shelf_icons_hover": { + "message": "Toolbar's shelf buttons icon color, on mouse hover" + }, + "button_shelf_border": { + "message": "Toolbar's shelf buttons border color" + }, + "button_shelf_hover_border": { + "message": "Toolbar's shelf buttons border color, on mouse hover" + }, + + + + + + + + + "options_theme_tabs": { "message": " Tabs look " }, - + "options_tabs_margin_overlap": { "message": "Tabs spacing:\nOverlap 1px, best for themes with borders" @@ -558,8 +698,48 @@ "message": "Tabs spacing:\nDefault, 1px between tabs" }, + + + "options_tab_list_scrollbar_width_down": { + "message": "Decrease scrollbars width" + }, + "options_tab_list_scrollbar_width_up": { + "message": "Increase scrollbars width" + }, + "options_tab_list_scrollbar_height_down": { + "message": "Decrease scrollbars height" + }, + "options_tab_list_scrollbar_height_up": { + "message": "Increase scrollbars height" + }, + + + "options_tabs_indentation_down": { + "message": "Decrease tabs indentation" + }, + "options_tabs_indentation_up": { + "message": "Increase tabs indentation" + }, + + + "options_tabs_roundness_down": { + "message": "Make tabs corners more square" + }, + "options_tabs_roundness_up": { + "message": "Make tabs rounder" + }, + + + "options_tabs_size_down": { + "message": "Decrease tabs size" + }, + "options_tabs_size_up": { + "message": "Increase tabs size" + }, + + "options_theme_tabs_sample_text_normal": { "message": "Normal" @@ -639,11 +819,8 @@ "options_theme_tabs_sample_text_search_result_highlighted_active_hover": { "message": "Search result highlighted, active, mouse hover over" }, - - - - + "options_theme_tabs_sample_text_search_result_highlighted_selected": { "message": "Search result highlighted, selected" }, @@ -660,64 +837,6 @@ - - - - - - - - "close_x": { - "message": "x inside the close button" - }, - "close_hover_x": { - "message": "x inside the close button, on mouse hover" - }, - - - "button_background": { - "message": "Toolbar buttons background" - }, - "button_hover_background": { - "message": "Toolbar buttons background, on mouse hover" - }, - - - "button_icons": { - "message": "Toolbar buttons icon color" - }, - "button_icons_hover": { - "message": "Toolbar buttons icon color, on mouse hover" - }, - "button_border": { - "message": "Toolbar buttons border color" - }, - "button_hover_border": { - "message": "Toolbar buttons border color, on mouse hover" - }, - - - "filter_box_font": { - "message": "Search box, font color" - }, - "filter_box_background": { - "message": "Search box, font background color" - }, - "filter_box_border": { - "message": "Search box, border color" - }, - "filter_clear_icon": { - "message": "Clear search result x button color" - }, - - - "toolbar_background": { - "message": "Toolbar background color" - }, - "toolbar_border_bottom": { - "message": "Toolbar borders color" - }, - "attention_background": { @@ -726,8 +845,6 @@ "attention_border": { "message": "Tabs blinking for attention, border color" }, - - "pin_list_border_bottom": { "message": "Pinned tabs list, border at the bottom color" }, @@ -735,43 +852,112 @@ "message": "Pinned tabs list, background color" }, - - "options_color_pick_hover": { - "message": "On hover" + + "folder_icon_open": { + "message": "Open folder icon" + }, + "folder_icon_closed": { + "message": "Empty or closed folder icon" + }, + "folder_icon_hover": { + "message": "Folder icon on mouse hover" + }, + + + "expand_open_background": { + "message": "Open tree indicator" + }, + "expand_closed_background": { + "message": "Closed tree indicator" + }, + "expand_hover_background": { + "message": "Tree indicator on mouse hover" + }, + + + "group_list_button_hover_background": { + "message": "Group on mouse hover" + }, + "group_list_borders": { + "message": "Group list border" + }, + "group_list_default_font_color": { + "message": "Group list default font color" + }, + + "group_list_background": { + "message": "Group list background color" + }, + "tab_list_background": { + "message": "Tabs background color" + }, + + + "drag_indicator": { + "message": "Drag&Drop indicator" }, - "options_color_pick_border": { - "message": "Border color" - }, - "options_color_pick_background": { - "message": "Fill color" - }, - "options_color_pick_font": { - "message": "Font color" - }, - "options_tabs_indentation_down": { - "message": "Decrease tabs indentation" - }, - "options_tabs_indentation_up": { - "message": "Increase tabs indentation" - }, - "options_tabs_roundness_down": { - "message": "Make tabs corners more square" + + "close_x": { + "message": "x inside the close button" }, - "options_tabs_roundness_up": { - "message": "Make tabs rounder" + "close_hover_x": { + "message": "x inside the close button, on mouse hover" }, - - "options_tabs_size_down": { - "message": "Decrease tabs size" + "close_hover_border": { + "message": "close button border, on mouse hover" }, - "options_tabs_size_up": { - "message": "Increase tabs size" + "close_hover_background": { + "message": "close button box color, on mouse hover" }, + + + + "scrollbar_thumb": { + "message": "Scrollbar thumb" + }, + "scrollbar_thumb_hover": { + "message": "Scrollbar thumb, on mouse hover" + }, + "scrollbar_track": { + "message": "Scrollbar track" + }, + + + + + + "options_example_menu_item": { + "message": "menu item" + }, + "options_menu": { + "message": " Menu " + }, + + + "tabs_menu_hover_border": { + "message": "menu item border, on mouse hover" + }, + "tabs_menu_hover_background": { + "message": "menu item background, on mouse hover" + }, + "tabs_menu_separator": { + "message": "menu separator" + }, + "tabs_menu_font": { + "message": "menu text color" + }, + "tabs_menu_border": { + "message": "menu border" + }, + "tabs_menu_background": { + "message": "menu background" + }, + @@ -781,26 +967,6 @@ - "options_tab_list_scrollbar_width_down": { - "message": "Decrease scrollbars width" - }, - "options_tab_list_scrollbar_width_up": { - "message": "Increase scrollbars width" - }, - "options_tab_list_scrollbar_height_down": { - "message": "Decrease scrollbars height" - }, - "options_tab_list_scrollbar_height_up": { - "message": "Increase scrollbars height" - }, - - - - - - - - "options_there_is_a_theme_with_this_name": { "message": "Theme with this name already exists, try a new name" @@ -826,14 +992,6 @@ - "options_example_menu_item": { - "message": "menu item" - }, - "options_menu": { - "message": " Menu " - }, - - @@ -887,14 +1045,23 @@ }, - - - - - - "warning_exporting_big_amount_of_tabs": { - "message": "Importing big amount of tabs can make your browser unresponsive even for hours! Consider dividing your tabs to groups and exporting each group separately." + "manager_window_button_label_import_group": { + "message": "Import group" }, + + "manager_window_button_label_import_session": { + "message": "Import session" + }, + "manager_window_button_label_save_current_session": { + "message": "Save current session" + }, + + + + + + + "caption_ungrouped_group": { "message": "Ungrouped" }, @@ -910,6 +1077,54 @@ }, "caption_searchbox": { "message": " Search tabs..." + }, + + "manager_window_header_title": { + "message": "Manager" + }, + + "menu_manager_window": { + "message": "Open manager" + }, + + "button_manager_window": { + "message": "Open manager window" + }, + + "manager_window_groups_button": { + "message": "Hibernated groups" + }, + "manager_window_sessions_button": { + "message": "Saved sessions" + }, + "manager_window_autosave_button": { + "message": "Auto saved sessions" + }, + "manager_window_button_label_hibernate_group": { + "message": "Hibernate current group" + }, + + "manager_window_autosessions_maximum_saves_label": { + "message": "Number of autosaves to keep:" + }, + + "manager_window_autosessions_save_timer_label": { + "message": "Autosave every (minutes):" + }, + + "manager_window_delete_icon": { + "message": "Remove" + }, + + "manager_window_savetofile_icon": { + "message": "Save to file" + }, + "manager_window_merge_icon": { + "message": "Load and merge" + }, + + "manager_window_load_icon": { + "message": "Load" } diff --git a/background.html b/background.html index a6cc030..0816c92 100644 --- a/background.html +++ b/background.html @@ -6,4 +6,5 @@ + \ No newline at end of file diff --git a/bg_ch.js b/bg_ch.js index 4d14af1..754fe19 100644 --- a/bg_ch.js +++ b/bg_ch.js @@ -2,55 +2,58 @@ // Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ -if (browserId != "F") { - // ConvertLegacyStorage(); - ChromeLoadTabs(0); - ChromeMessageListeners(); -} + function ChromeLoadTabs(retry) { chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) { chrome.storage.local.get(null, function(storage) { // LOAD PREFERENCES - opt = Object.assign({}, DefaultPreferences); - if (storage["preferences"]) { - for (var parameter in storage["preferences"]) { - if (opt[parameter] != undefined) { - opt[parameter] = storage["preferences"][parameter]; - } - } - } - // LOAD THEME - if (storage["current_theme"] && storage["themes"] && storage["themes"][storage["current_theme"]]) { - theme = storage["themes"][storage["current_theme"]]; - } else { - theme = Object.assign({}, DefaultTheme); - } + GetCurrentPreferences(storage); + // load tabs and windows from storage - var refTabs = {}; - var tabs_matched = 0; - var w_count = storage.w_count ? storage.w_count : 0; - var t_count = storage.t_count ? storage.t_count : 0; - var LoadedWindows = storage.windows ? storage.windows : []; - var LoadedTabs = storage.tabs ? storage.tabs : []; + let refTabs = {}; + let tabs_matched = 0; + let w_count = storage.w_count ? storage.w_count : 0; + let t_count = storage.t_count ? storage.t_count : 0; + let LoadedWindows = storage.windows ? storage.windows : []; + let LoadedTabs = storage.tabs ? storage.tabs : []; + + let bak = (1 + retry) <= 3 ? (1 + retry) : 3; + // if loaded tabs mismatch by 50%, then try to load back - if (LoadedTabs.length < t_count*0.5 || retry > 0) { - LoadedTabs = storage["tabs_BAK"+retry] ? storage["tabs_BAK"+retry] : []; + if (LoadedTabs.length < t_count*0.5) { + LoadedTabs = storage["tabs_BAK"+bak] ? storage["tabs_BAK"+bak] : []; } // if loaded windows mismatch, then try to load back - if (LoadedWindows.length < w_count || retry > 0) { - LoadedWindows = storage["windows_BAK"+retry] ? storage["windows_BAK"+retry] : []; + if (LoadedWindows.length < w_count) { + LoadedWindows = storage["windows_BAK"+bak] ? storage["windows_BAK"+bak] : []; } + + if (opt.debug == true) { + if (storage.debug_log != undefined) { + debug = storage.debug_log; + } + if (retry == 0) { + pushlog("TreeTabs background start"); + } + } + // CACHED COUNTS - var WinCount = w.length; - var LoadedWinCount = LoadedWindows.length; - var LoadedTabsCount = LoadedTabs.length; - for (var wIndex = 0; wIndex < WinCount; wIndex++) { + let WinCount = w.length; + let LoadedWinCount = LoadedWindows.length; + let LoadedTabsCount = LoadedTabs.length; + + let CurrentTabsCount = 0; + for (let wIndex = 0; wIndex < w.length; wIndex++) { + CurrentTabsCount += w[wIndex].tabs.length; + } + + for (let wIndex = 0; wIndex < WinCount; wIndex++) { if (w[wIndex].tabs[0].url != "chrome://videopopout/") { // this is for opera for their extra video popup, which is weirdly queried as a "normal" window let winId = w[wIndex].id; let url1 = w[wIndex].tabs[0].url; let url2 = w[wIndex].tabs[w[wIndex].tabs.length-1].url; windows[winId] = {group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, active_tab: 0, prev_active_tab: 0, name: caption_ungrouped_group, font: ""}}, folders: {}}; - for (var LwIndex = 0; LwIndex < LoadedWinCount; LwIndex++) { + for (let LwIndex = 0; LwIndex < LoadedWinCount; LwIndex++) { if (LoadedWindows[LwIndex].url1 == url1 || LoadedWindows[LwIndex].url2 == url2) { if (LoadedWindows[LwIndex].group_bar) { windows[winId].group_bar = LoadedWindows[LwIndex].group_bar; } if (LoadedWindows[LwIndex].search_filter) { windows[winId].search_filter = LoadedWindows[LwIndex].search_filter; } @@ -65,17 +68,18 @@ function ChromeLoadTabs(retry) { } } } - for (var wIndex = 0; wIndex < WinCount; wIndex++) { - var TabsCount = w[wIndex].tabs.length; - for (var tabIndex = 0; tabIndex < TabsCount; tabIndex++) { + for (let wIndex = 0; wIndex < WinCount; wIndex++) { + let TabsCount = w[wIndex].tabs.length; + for (let tabIndex = 0; tabIndex < TabsCount; tabIndex++) { ChromeHashURL(w[wIndex].tabs[tabIndex]); } } + if (opt.skip_load == false && LoadedTabs.length > 0) { // compare saved tabs from storage to current session tabs, but can be skipped if set in options - for (var wIndex = 0; wIndex < WinCount; wIndex++) { // match loaded tabs - var TabsCount = w[wIndex].tabs.length; - for (var tabIndex = 0; tabIndex < TabsCount; tabIndex++) { - for (var LtabIndex = 0; LtabIndex < LoadedTabsCount; LtabIndex++) { + for (let wIndex = 0; wIndex < WinCount; wIndex++) { // match loaded tabs + let TabsCount = w[wIndex].tabs.length; + for (let tabIndex = 0; tabIndex < TabsCount; tabIndex++) { + for (let LtabIndex = 0; LtabIndex < LoadedTabsCount; LtabIndex++) { let tabId = w[wIndex].tabs[tabIndex].id; if (LoadedTabs[LtabIndex].hash == tabs[tabId].hash && refTabs[LoadedTabs[LtabIndex].id] == undefined) { refTabs[LoadedTabs[LtabIndex].id] = tabId; @@ -90,15 +94,15 @@ function ChromeLoadTabs(retry) { } } // replace parents tabIds for new ones, for that purpose refTabs was made before - for (var tabId in tabs) { + for (let tabId in tabs) { if (refTabs[tabs[tabId].parent] != undefined) { tabs[tabId].parent = refTabs[tabs[tabId].parent]; } } } // replace active tab ids for each group using refTabs - for (var windowId in windows) { - for (var group in windows[windowId].groups) { + for (let windowId in windows) { + for (let group in windows[windowId].groups) { if (refTabs[windows[windowId].groups[group].active_tab]) { windows[windowId].groups[group].active_tab = refTabs[windows[windowId].groups[group].active_tab]; } @@ -107,19 +111,59 @@ function ChromeLoadTabs(retry) { } } } - // will try to find tabs for 3 times - if (opt.skip_load == true || retry > 2 || (tabs_matched > t_count*0.5)) { - schedule_save = 1; + + if (opt.debug){ + pushlog("ChromeLoadTabs, retry: "+retry); + pushlog("Current windows count is: "+w.length); + pushlog("Saved windows count is: "+LoadedWindows.length); + pushlog("Current tabs count is: "+CurrentTabsCount); + pushlog("Loaded tabs count is: "+LoadedTabsCount); + pushlog("Matching tabs: "+tabs_matched); + pushlog("Current windows:"); + pushlog(w); + } + + // will loop trying to find tabs + if (opt.skip_load == true || retry >= 5 || (tabs_matched > t_count*0.5)) { running = true; ChromeAutoSaveData(0, 1000); ChromeAutoSaveData(1, 300000); ChromeAutoSaveData(2, 600000); ChromeAutoSaveData(3, 1800000); ChromeListeners(); + + delete schedule_update_data; + delete schedule_rearrange_tabs; + delete DragNodeClass; + delete DragOverTimer; + delete DragTreeDepth; + delete menuItemNode; + delete CurrentWindowId; + delete SearchIndex; + delete active_group; + delete browserId; + delete bggroups; + delete bgfolders; + delete caption_clear_filter; + delete caption_loading; + delete caption_searchbox; + delete DefaultToolbar; + delete DefaultTheme; + delete DefaultPreferences; + + delete newTabUrl; + delete EmptyTabs; + + delete tt_ids; + + schedule_save = -1; // 2 operations must be made to start saving data } else { + if (opt.debug){ + pushlog("Attempt "+retry+" failed, matched tabs was below 50%"); + } setTimeout(function() { ChromeLoadTabs(retry+1); - }, 2000); + }, 5000); } }); }); @@ -133,21 +177,21 @@ async function ChromeAutoSaveData(BAK, LoopTimer) { } if (running && schedule_save > 0 && Object.keys(tabs).length > 1) { chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) { - var WinCount = w.length; - var t_count = 0; - var counter = 0; - var Windows = []; - var Tabs = []; - for (var wIndex = 0; wIndex < WinCount; wIndex++) { + let WinCount = w.length; + let t_count = 0; + let counter = 0; + let Windows = []; + let Tabs = []; + for (let wIndex = 0; wIndex < WinCount; wIndex++) { t_count += w[wIndex].tabs.length; } - for (var wIndex = 0; wIndex < WinCount; wIndex++) { + for (let wIndex = 0; wIndex < WinCount; wIndex++) { let winId = w[wIndex].id; if (windows[winId] != undefined && windows[winId].group_bar != undefined && windows[winId].search_filter != undefined && windows[winId].active_shelf != undefined && windows[winId].active_group != undefined && windows[winId].groups != undefined && windows[winId].folders != undefined) { Windows.push({url1: w[wIndex].tabs[0].url, url2: w[wIndex].tabs[w[wIndex].tabs.length-1].url, group_bar: windows[winId].group_bar, search_filter: windows[winId].search_filter, active_shelf: windows[winId].active_shelf, active_group: windows[winId].active_group, groups: windows[winId].groups, folders: windows[winId].folders}); } let TabsCount = w[wIndex].tabs.length; - for (var tabIndex = 0; tabIndex < TabsCount; tabIndex++) { + for (let tabIndex = 0; tabIndex < TabsCount; tabIndex++) { let tabId = w[wIndex].tabs[tabIndex].id; if (tabs[tabId] != undefined && tabs[tabId].hash != undefined && tabs[tabId].parent != undefined && tabs[tabId].index != undefined && tabs[tabId].expand != undefined) { Tabs.push({id: tabId, hash: tabs[tabId].hash, parent: tabs[tabId].parent, index: tabs[tabId].index, expand: tabs[tabId].expand}); @@ -182,20 +226,25 @@ async function ChromeAutoSaveData(BAK, LoopTimer) { schedule_save--; }); } + + if (opt.debug == true) { + chrome.storage.local.set({debug_log: debug}); + } + }, LoopTimer); } function ChromeHashURL(tab) { if (tabs[tab.id] == undefined) { tabs[tab.id] = {hash: 0, parent: tab.pinned ? "pin_list" : (windows[tab.windowId] ? windows[tab.windowId].active_group : "tab_list"), index: tab.index, expand: "n"}; } - var hash = 0; - for (var charIndex = 0; charIndex < tab.url.length; charIndex++) { + let hash = 0; + for (let charIndex = 0; charIndex < tab.url.length; charIndex++) { hash += tab.url.charCodeAt(charIndex); } tabs[tab.id].hash = hash; } function ReplaceParents(oldTabId, newTabId) { - for (var tabId in tabs) { + for (let tabId in tabs) { if (tabs[tabId].parent == oldTabId) { tabs[tabId].parent = newTabId; } @@ -204,7 +253,7 @@ function ReplaceParents(oldTabId, newTabId) { function ChromeListeners() { // start all listeners chrome.tabs.onCreated.addListener(function(tab) { ChromeHashURL(tab); - chrome.runtime.sendMessage({command: "tab_created", windowId: tab.windowId, tab: tab, tabId: tab.id}); + chrome.runtime.sendMessage({command: "tab_created", windowId: tab.windowId, tabId: tab.id}); schedule_save++; }); chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) { @@ -275,21 +324,11 @@ function ChromeListeners() { // start all listeners } function ChromeMessageListeners() { chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { - if (opt.debug) console.log("message to background:"); - if (opt.debug) console.log(message); + if (message.command == "reload") { window.location.reload(); return; } - if (message.command == "get_preferences") { - sendResponse(opt); - return; - } - if (message.command == "save_preferences") { - opt = Object.assign({}, message.opt); - chrome.storage.local.set({preferences: message.opt}); - return; - } if (message.command == "get_windows") { sendResponse(windows); return; @@ -413,12 +452,8 @@ function ChromeMessageListeners() { schedule_save++; return; } - if (message.command == "get_theme") { - sendResponse(theme); - return; - } - if (message.command == "reload_theme") { - GetCurrentTheme(); + if (message.command == "debug") { + pushlog(message.log); return; } }); diff --git a/bg_ff.js b/bg_ff.js index ba3703a..43c44ba 100644 --- a/bg_ff.js +++ b/bg_ff.js @@ -2,18 +2,14 @@ // Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ -if (browserId == "F") { - FirefoxStart(0); - FirefoxMessageListeners(); -} function FirefoxStart(retry) { chrome.windows.getAll({windowTypes: ["normal"], populate: true}, function(w) { - FirefoxLoadTabs(0); if (w[0].tabs.length == 1 && (w[0].tabs[0].url == "about:blank" || w[0].tabs[0].url == "about:sessionrestore")) { setTimeout(function() { FirefoxStart(retry+1); }, 2000); } else { + FirefoxLoadTabs(0); if (retry > 0) { chrome.runtime.sendMessage({command: "reload_sidebar"}); } @@ -27,31 +23,29 @@ function FirefoxLoadTabs(retry) { chrome.windows.getAll({windowTypes: ["normal"], populate: true}, function(w) { chrome.storage.local.get(null, function(storage) { // LOAD PREFERENCES - opt = Object.assign({}, DefaultPreferences); - if (storage["preferences"]) { - for (var parameter in storage["preferences"]) { - if (opt[parameter] != undefined) { - opt[parameter] = storage["preferences"][parameter]; - } - } - } - // LOAD THEME - if (storage["current_theme"] && storage["themes"] && storage["themes"][storage["current_theme"]]) { - theme = storage["themes"][storage["current_theme"]]; - } else { - theme = Object.assign({}, DefaultTheme); - } + GetCurrentPreferences(storage); + // CACHED COUNTS AND STUFF - // var tt_ids = {}; - var tabs_matched = 0; - var tabs_count = 0; - for (var wIndex = 0; wIndex < w.length; wIndex++) { + // let tt_ids = {}; + let tabs_matched = 0; + let tabs_count = 0; + for (let wIndex = 0; wIndex < w.length; wIndex++) { tabs_count += w[wIndex].tabs.length; } - var lastWinId = w[w.length-1].id; - var lastTabId = w[w.length-1].tabs[w[w.length-1].tabs.length-1].id; - var WinCount = w.length; - for (var wIndex = 0; wIndex < WinCount; wIndex++) { + let lastWinId = w[w.length-1].id; + let lastTabId = w[w.length-1].tabs[w[w.length-1].tabs.length-1].id; + let WinCount = w.length; + + if (opt.debug == true) { + if (storage.debug_log != undefined) { + debug = storage.debug_log; + } + if (retry == 0) { + pushlog("TreeTabs background start"); + } + } + + for (let wIndex = 0; wIndex < WinCount; wIndex++) { let winIndex = wIndex; let winId = w[winIndex].id; let tabsCount = w[winIndex].tabs.length; @@ -63,7 +57,7 @@ function FirefoxLoadTabs(retry) { } else { windows[winId] = {ttid: "", group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, active_tab: 0, active_tab_ttid: "", prev_active_tab: 0, prev_active_tab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; } - for (var tIndex = 0; tIndex < tabsCount; tIndex++) { + for (let tIndex = 0; tIndex < tabsCount; tIndex++) { let tabIndex = tIndex; let tabId = w[winIndex].tabs[tabIndex].id; let tabPinned = w[winIndex].tabs[tabIndex].pinned; @@ -78,26 +72,26 @@ function FirefoxLoadTabs(retry) { } // IF ON LAST TAB AND LAST WINDOW, START MATCHING LOADED DATA if (tabId == lastTabId && winId == lastWinId) { - for (var ThisSessonWinId in windows) { + for (let ThisSessonWinId in windows) { if (windows[ThisSessonWinId].ttid == "") { AppendWinTTId(parseInt(ThisSessonWinId)); } } // OK, DONE WITH WINDOWS, START TABS LOOP - for (var ThisSessonTabId in tabs) { + for (let ThisSessonTabId in tabs) { if (tabs[ThisSessonTabId].ttid == "") { AppendTabTTId(parseInt(ThisSessonTabId)); } } // OK, DONE, NOW REPLACE OLD PARENTS IDS WITH THIS SESSION IDS - for (var ThisSessonTabId in tabs) { + for (let ThisSessonTabId in tabs) { if (tt_ids[tabs[ThisSessonTabId].parent_ttid] != undefined) { tabs[ThisSessonTabId].parent = tt_ids[tabs[ThisSessonTabId].parent_ttid]; } } // OK, SAME THING FOR ACTIVE TABS IN GROUPS - for (var ThisSessonWinId in windows) { - for (var group in windows[ThisSessonWinId].groups) { + for (let ThisSessonWinId in windows) { + for (let group in windows[ThisSessonWinId].groups) { if (tt_ids[windows[ThisSessonWinId].groups[group].active_tab_ttid] != undefined) { windows[ThisSessonWinId].groups[group].active_tab = tt_ids[windows[ThisSessonWinId].groups[group].active_tab_ttid]; } @@ -106,14 +100,48 @@ function FirefoxLoadTabs(retry) { } } } + + if (opt.debug){ + pushlog("FirefoxLoadTabs, retry: "+retry); + pushlog("Current windows count is: "+w.length); + pushlog("Current tabs count is: "+tabs_count); + pushlog("Matching tabs: "+tabs_matched); + pushlog("Current windows:"); + pushlog(w); + } + + // will try to find tabs for 3 times if (opt.skip_load == true || retry > 2 || (tabs_matched > tabs_count*0.5)) { running = true; - // setInterval(function() { FirefoxAutoSaveData(); - // }, 10000); FirefoxListeners(); + + delete schedule_update_data; + delete schedule_rearrange_tabs; + delete DragNodeClass; + delete DragOverTimer; + delete DragTreeDepth; + delete menuItemNode; + delete CurrentWindowId; + delete SearchIndex; + delete active_group; + delete browserId; + delete bggroups; + delete bgfolders; + delete caption_clear_filter; + delete caption_loading; + delete caption_searchbox; + delete DefaultToolbar; + delete DefaultTheme; + delete DefaultPreferences; + + delete newTabUrl; + delete EmptyTabs; } else { + if (opt.debug){ + pushlog("Attempt "+retry+" failed, matched tabs was below 50%"); + } setTimeout(function() { FirefoxLoadTabs(retry+1); }, 2000); @@ -121,7 +149,7 @@ function FirefoxLoadTabs(retry) { } }); } - }); + }); } }); }); @@ -134,14 +162,14 @@ async function FirefoxAutoSaveData() { } if (running && schedule_save > 0 && Object.keys(tabs).length > 1) { chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) { - var WinCount = w.length; - for (var wIndex = 0; wIndex < WinCount; wIndex++) { + let WinCount = w.length; + for (let wIndex = 0; wIndex < WinCount; wIndex++) { let winId = w[wIndex].id; if (windows[winId] != undefined && windows[winId].ttid != undefined && windows[winId].group_bar != undefined && windows[winId].search_filter != undefined && windows[winId].active_shelf != undefined && windows[winId].active_group != undefined && windows[winId].groups != undefined && windows[winId].folders != undefined) { browser.sessions.setWindowValue(winId, "TTdata", windows[winId] ); } let TabsCount = w[wIndex].tabs.length; - for (var tabIndex = 0; tabIndex < TabsCount; tabIndex++) { + for (let tabIndex = 0; tabIndex < TabsCount; tabIndex++) { let tabId = w[wIndex].tabs[tabIndex].id; if (tabs[tabId] != undefined && tabs[tabId].ttid != undefined && tabs[tabId].parent != undefined && tabs[tabId].index != undefined && tabs[tabId].expand != undefined) { browser.sessions.setTabValue( tabId, "TTdata", tabs[tabId] ); @@ -151,12 +179,15 @@ async function FirefoxAutoSaveData() { schedule_save--; }); } + if (opt.debug == true) { + chrome.storage.local.set({debug_log: debug}); + } }, 1000); } function GenerateNewWindowID() { - var newID = "w_"+GenerateRandomID(); - var newIdAvailable = true; - for (var windowId in windows) { + let newID = "w_"+GenerateRandomID(); + let newIdAvailable = true; + for (let windowId in windows) { if (windows[windowId].ttid == newID) { newIdAvailable = false; } @@ -168,9 +199,9 @@ function GenerateNewWindowID() { } } function GenerateNewTabID() { - var newID = "t_"+GenerateRandomID(); - var newIdAvailable = true; - // for (var tabId in tabs) { + let newID = "t_"+GenerateRandomID(); + let newIdAvailable = true; + // for (let tabId in tabs) { // if (tabs[tabId].ttid == newID) { // newIdAvailable = false; // } @@ -206,13 +237,13 @@ function AppendWinTTId(windowId) { // if (schedule_save > 0) browser.sessions.setWindowValue( windowId, "TTdata", windows[windowId] ); } function ReplaceParents(oldTabId, newTabId) { - for (var tabId in tabs) { + for (let tabId in tabs) { if (tabs[tabId].parent == oldTabId) { tabs[tabId].parent = newTabId; } } } -var DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA = {}; // MOZILLA BUG 1398272 +let DETACHED_TABS___Bug1398272___WTF_ARE_YOU_DOING_MOZILLA = {}; // MOZILLA BUG 1398272 // start all listeners function FirefoxListeners() { browser.browserAction.onClicked.addListener(function() { @@ -220,18 +251,16 @@ function FirefoxListeners() { browser.sidebarAction.open(); }); chrome.tabs.onCreated.addListener(function(tab) { - chrome.tabs.get(tab.id, function(NewTab) { // for some reason firefox sends tab with "active == false" even if tab is active (THIS IS POSSIBLY A NEW BUG IN FF 60.01!) - let t = Promise.resolve(browser.sessions.getTabValue(NewTab.id, "TTdata")).then(function(TabData) { - if (TabData != undefined) { - tabs[NewTab.id] = Object.assign({}, TabData); - let originalParent = TabData.parent_ttid == "" ? undefined : (tt_ids[TabData.parent_ttid] ? tt_ids[TabData.parent_ttid] : TabData.parent_ttid); - chrome.runtime.sendMessage({command: "tab_created", windowId: NewTab.windowId, tab: NewTab, tabId: NewTab.id, parentTabId: originalParent, index: TabData.index}); - } else { - AppendTabTTId(NewTab.id); - chrome.runtime.sendMessage({command: "tab_created", windowId: NewTab.windowId, tab: NewTab, tabId: NewTab.id}); - } - schedule_save++; - }); + let t = Promise.resolve(browser.sessions.getTabValue(tab.id, "TTdata")).then(function(TabData) { + if (TabData != undefined) { + tabs[tab.id] = Object.assign({}, TabData); + let originalParent = TabData.parent_ttid == "" ? undefined : (tt_ids[TabData.parent_ttid] ? tt_ids[TabData.parent_ttid] : TabData.parent_ttid); + chrome.runtime.sendMessage({command: "tab_created", windowId: tab.windowId, tabId: tab.id, parentTabId: originalParent, index: TabData.index}); + } else { + AppendTabTTId(tab.id); + chrome.runtime.sendMessage({command: "tab_created", windowId: tab.windowId, tabId: tab.id}); + } + schedule_save++; }); }); chrome.tabs.onAttached.addListener(function(tabId, attachInfo) { @@ -320,24 +349,32 @@ function FirefoxListeners() { // delete windows[windowId]; schedule_save++; }); + chrome.sessions.onChanged.addListener(function(session) { + chrome.windows.getAll({windowTypes: ['normal'], populate: false}, function(w) { + chrome.tabs.query({}, function(t) { + for (let wiInd = 0; wiInd < w.length; wiInd++) { + if (windows[w[wiInd].id] == undefined) { + chrome.runtime.sendMessage({command: "reload_sidebar"}); + window.location.reload(); + } + } + for (let tbInd = 0; tbInd < t.length; tbInd++) { + if (tabs[t[tbInd].id] == undefined) { + chrome.runtime.sendMessage({command: "reload_sidebar"}); + window.location.reload(); + } + } + }); + }); + }); } function FirefoxMessageListeners() { chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { - if (opt.debug) console.log("message to background:"); - if (opt.debug) console.log(message); + if (message.command == "reload") { window.location.reload(); return; } - if (message.command == "get_preferences") { - sendResponse(opt); - return; - } - if (message.command == "save_preferences") { - opt = Object.assign({}, message.opt); - chrome.storage.local.set({preferences: message.opt}); - return; - } if (message.command == "get_windows") { sendResponse(windows); return; @@ -364,7 +401,7 @@ function FirefoxMessageListeners() { if (message.command == "save_groups") { if (windows[message.windowId]) { windows[message.windowId].groups = Object.assign({}, message.groups); - for (var group in windows[message.windowId].groups) { + for (let group in windows[message.windowId].groups) { if (tabs[windows[message.windowId].groups[group].active_tab]) { windows[message.windowId].groups[group].active_tab_ttid = tabs[windows[message.windowId].groups[group].active_tab].ttid; } @@ -473,19 +510,15 @@ function FirefoxMessageListeners() { if (tabs[message.tabs[j].parent]) { tabs[message.tabs[j].id].parent_ttid = tabs[message.tabs[j].parent].ttid; } else { - tabs[message.tabs[j].id].parent_ttid = AppendTabTTId(message.tabs[j].parent); + tabs[message.tabs[j].id].parent_ttid = ""; } } } schedule_save++; return; } - if (message.command == "get_theme") { - sendResponse(theme); - return; - } - if (message.command == "reload_theme") { - GetCurrentTheme(); + if (message.command == "debug") { + pushlog(message.log); return; } }); diff --git a/download.html b/download.html deleted file mode 100644 index 004bf9d..0000000 --- a/download.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/download.js b/download.js deleted file mode 100644 index 4aeb12b..0000000 --- a/download.js +++ /dev/null @@ -1,18 +0,0 @@ -chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { - if (message.command == "show_save_file_dialog") { - let file = new File([JSON.stringify(message.data)], message.filename, {type: "text/csv;charset=utf-8"} ); - let body = document.getElementById("body"); - let savelink = document.createElement("a"); - savelink.target = "_blank"; - savelink.style.display = "none"; - savelink.type = "file"; - savelink.download = message.filename; - savelink.href = URL.createObjectURL(file); - body.appendChild(savelink); - savelink.click(); - setTimeout(function() { - chrome.tabs.update(message.currentTabId, { active: true }); - chrome.tabs.remove(message.selfTabId, null); - }, 50); - } -}); diff --git a/init.js b/init.js new file mode 100644 index 0000000..af2398d --- /dev/null +++ b/init.js @@ -0,0 +1,16 @@ +// Copyright (c) 2017 kroppy. All rights reserved. +// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license +// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + +document.addEventListener("DOMContentLoaded", Init(), false); + +function Init() { + if (browserId == "F") { + FirefoxMessageListeners(); + FirefoxStart(0); + } else { + // ConvertLegacyStorage(); + ChromeMessageListeners(); + ChromeLoadTabs(0); + } +} diff --git a/legacy.js b/legacy.js index ae4358b..93a1aed 100644 --- a/legacy.js +++ b/legacy.js @@ -2,6 +2,13 @@ // Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + +if (localStorage.getItem("t0") != null){ + LoadV015(0); +} + + + function OldHashTab(tab){ if (tabs[tab.id] == undefined){ tabs[tab.id] = {ttid: "", hash: 0, h: 0, parent: tab.pinned ? "pin_list" : "tab_list", index: tab.index, expand: ""}; @@ -77,23 +84,15 @@ function LoadV015(retry){ } } - if (browserId == "F") { - // append ids to firefox tabs - qtabs.forEach(function(Tab){ - AppendTabTTId(Tab.id); - }); - qtabs.forEach(function(Tab){ - tabs_to_save.push({id: Tab.id, ttid: tabs[tabId].ttid, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand}); - }); - } else { - // create new hashes - qtabs.forEach(function(Tab){ - ChromeHashURL(Tab); - }); - qtabs.forEach(function(Tab){ - tabs_to_save.push({id: Tab.id, hash: tabs[Tab.id].hash, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand}); - }); - } + + // create new hashes + qtabs.forEach(function(Tab){ + ChromeHashURL(Tab); + }); + qtabs.forEach(function(Tab){ + tabs_to_save.push({id: Tab.id, hash: tabs[Tab.id].hash, parent: tabs[Tab.id].parent, index: tabs[Tab.id].index, expand: tabs[Tab.id].expand}); + }); + localStorage["t_count"] = JSON.stringify(qtabs.length); localStorage["tabs"] = JSON.stringify(tabs_to_save); for (var t = 0; t < 9999; t++){ @@ -101,152 +100,7 @@ function LoadV015(retry){ localStorage.removeItem("t"+t); } } - window.location.reload(); - }); -} - -function FirefoxLoadV100(retry) { - chrome.windows.getAll({windowTypes: ["normal"], populate: true}, function(w) { - - var refTabs = {}; - var tabs_matched = 0; - var tabs_count = 0; - for (var wIndex = 0; wIndex < w.length; wIndex++) { - tabs_count += w[wIndex].tabs.length; - } - - // load tabs and windows from hdd - var LoadedWindows = LoadData("windows", []); - var LoadedTabs = LoadData("tabs", []); - - // if loaded tabs mismatch by 50%, then try to load back - if (LoadedTabs.length < tabs_count*0.5 || retry > 0) { - LoadedTabs = LoadData("tabs_BAK"+retry, []); - } - // if loaded windows mismatch, then try to load back - if (LoadedWindows.length < w.length || retry > 0) { - LoadedWindows = LoadData("windows_BAK"+retry, []); - } - // CACHED COUNTS AND STUFF - var lastWinId = w[w.length-1].id; - var lastTabId = w[w.length-1].tabs[w[w.length-1].tabs.length-1].id; - var LoadedWinCount = LoadedWindows.length; - var LoadedTabsCount = LoadedTabs.length; - var WinCount = w.length; - - for (var wIndex = 0; wIndex < WinCount; wIndex++) { - let winIndex = wIndex; - let winId = w[winIndex].id; - let tabsCount = w[winIndex].tabs.length; - - let win = Promise.resolve(browser.sessions.getWindowValue(winId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET WINDOW VALUE - if (TTId != undefined) { - windows[winId] = {ttid: TTId, group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, activetab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; - } else { - windows[winId] = {ttid: "", group_bar: opt.groups_toolbar_default, search_filter: "url", active_shelf: "", active_group: "tab_list", groups: {tab_list: {id: "tab_list", index: 0, activetab: 0, activetab_ttid: "", name: caption_ungrouped_group, font: ""}}, folders: {}}; - } - for (var tIndex = 0; tIndex < tabsCount; tIndex++) { - - let tabIndex = tIndex; - let tabId = w[winIndex].tabs[tabIndex].id; - let tabPinned = w[winIndex].tabs[tabIndex].pinned; - - let tab = Promise.resolve(browser.sessions.getTabValue(tabId, "TTId")).then(function(TTId) { // LOAD TTID FROM FIREFOX GET TAB VALUE - if (TTId != undefined) { - tabs[tabId] = {ttid: TTId, parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: ""}; - } else { - tabs[tabId] = {ttid: "", parent_ttid: "", parent: tabPinned ? "pin_list" : "tab_list", index: tabIndex, expand: ""}; - } - // IF ON LAST TAB AND LAST WINDOW, START MATCHING LOADED DATA - if (tabId == lastTabId && winId == lastWinId) { - for (var ThisSessonWinId in windows) { - if (windows[ThisSessonWinId].ttid != ""){ - for (var LwIndex = 0; LwIndex < LoadedWinCount; LwIndex++) { - if (LoadedWindows[LwIndex].ttid == windows[ThisSessonWinId].ttid) { - if (LoadedWindows[LwIndex].group_bar) { windows[ThisSessonWinId].group_bar = LoadedWindows[LwIndex].group_bar; } - if (LoadedWindows[LwIndex].search_filter) { windows[ThisSessonWinId].search_filter = LoadedWindows[LwIndex].search_filter; } - if (LoadedWindows[LwIndex].active_shelf) { windows[winId].active_shelf = LoadedWindows[LwIndex].active_shelf; } - if (LoadedWindows[LwIndex].active_group) { windows[ThisSessonWinId].active_group = LoadedWindows[LwIndex].active_group; } - if (Object.keys(LoadedWindows[LwIndex].groups).length > 0) { windows[ThisSessonWinId].groups = Object.assign({}, LoadedWindows[LwIndex].groups); } - if (Object.keys(LoadedWindows[LwIndex].folders).length > 0) { windows[ThisSessonWinId].folders = Object.assign({}, LoadedWindows[LwIndex].folders); } - LoadedWindows[LwIndex].ttid = ""; - break; - } - } - } else { - AppendWinTTId(parseInt(ThisSessonWinId)); - } - } - // OK, DONE WITH WINDOWS, START TABS LOOP - for (var ThisSessonTabId in tabs) { - if (tabs[ThisSessonTabId].ttid != ""){ - for (var LtabIndex = 0; LtabIndex < LoadedTabsCount; LtabIndex++) { - if (LoadedTabs[LtabIndex].ttid == tabs[ThisSessonTabId].ttid) { - refTabs[LoadedTabs[LtabIndex].id] = ThisSessonTabId; - if (LoadedTabs[LtabIndex].parent) { tabs[ThisSessonTabId].parent = LoadedTabs[LtabIndex].parent; } - if (LoadedTabs[LtabIndex].index) { tabs[ThisSessonTabId].index = LoadedTabs[LtabIndex].index; } - if (LoadedTabs[LtabIndex].expand) { tabs[ThisSessonTabId].expand = LoadedTabs[LtabIndex].expand; } - LoadedTabs[LtabIndex].ttid = ""; - tabs_matched++; - break; - } - } - } else { - AppendTabTTId(parseInt(ThisSessonTabId)); - } - } - // OK, DONE, NOW REPLACE OLD PARENTS IDS WITH THIS SESSION IDS - for (var ThisSessonTabId in tabs) { - if (refTabs[tabs[ThisSessonTabId].parent] != undefined) { - tabs[ThisSessonTabId].parent = refTabs[tabs[ThisSessonTabId].parent]; - } - } - // OK, SAME THING FOR ACTIVE TABS IN GROUPS - - for (var ThisSessonWinId in windows) { - for (var group in windows[ThisSessonWinId].groups) { - if (refTabs[windows[ThisSessonWinId].groups[group].activetab]) { - windows[ThisSessonWinId].groups[group].activetab = refTabs[windows[ThisSessonWinId].groups[group].activetab]; - } - } - } - - - if (localStorage.getItem("t_count") !== null){ - localStorage.removeItem("t_count"); - } - if (localStorage.getItem("tabs_BAK1") !== null){ - localStorage.removeItem("tabs_BAK1"); - } - if (localStorage.getItem("tabs_BAK2") !== null){ - localStorage.removeItem("tabs_BAK2"); - } - if (localStorage.getItem("tabs_BAK3") !== null){ - localStorage.removeItem("tabs_BAK3"); - } - if (localStorage.getItem("tabs") !== null){ - localStorage.removeItem("tabs"); - } - if (localStorage.getItem("windows") !== null){ - localStorage.removeItem(windows); - } - - - // will try to find tabs for 3 times - if (opt.skip_load == true || retry > 2 || (tabs_matched > tabs_count*0.5)) { - - running = true; - FirefoxAutoSaveData(); - FirefoxListeners(); - } else { - setTimeout(function() {FirefoxLoadTabs(retry+1);}, 2000); - } - - } - }); - } - }); - } + ConvertLegacyStorage(); }); } @@ -272,62 +126,62 @@ function ConvertLegacyStorage() { LSpreferences = LoadData("preferences", {}); } - if (browserId != "F") { - let LStabs = {}; - if (localStorage.getItem("tabs") != null) { - LStabs = LoadData("tabs", {}); - } - let LSwindows = {}; - if (localStorage.getItem("windows") != null) { - LSwindows = LoadData("windows", {}); - } - let LStabs_BAK1 = {}; - if (localStorage.getItem("tabs_BAK1") != null) { - LStabs_BAK1 = LoadData("tabs_BAK1", {}); - } - let LStabs_BAK2 = {}; - if (localStorage.getItem("tabs_BAK2") != null) { - LStabs_BAK2 = LoadData("tabs_BAK2", {}); - } - let LStabs_BAK3 = {}; - if (localStorage.getItem("tabs_BAK3") != null) { - LStabs_BAK3 = LoadData("tabs_BAK3", {}); - } - - let LSwindows_BAK1 = {}; - if (localStorage.getItem("windows_BAK1") != null) { - LSwindows_BAK1 = LoadData("windows_BAK1", {}); - } - let LSwindows_BAK2 = {}; - if (localStorage.getItem("windows_BAK2") != null) { - LSwindows_BAK2 = LoadData("windows_BAK2", {}); - } - let LSwindows_BAK3 = {}; - if (localStorage.getItem("windows_BAK3") != null) { - LSwindows_BAK3 = LoadData("windows_BAK3", {}); - } - - - let LSt_count = 0; - if (localStorage.getItem("t_count") != null) { - LSt_count = LoadData("t_count", {}); - } - let LSw_count = 0; - if (localStorage.getItem("w_count") != null) { - LSw_count = LoadData("w_count", {}); - } - chrome.storage.local.set({tabs: LStabs}); - chrome.storage.local.set({windows: LSwindows}); - chrome.storage.local.set({tabs_BAK1: LStabs_BAK1}); - chrome.storage.local.set({tabs_BAK2: LStabs_BAK2}); - chrome.storage.local.set({tabs_BAK3: LStabs_BAK3}); - - chrome.storage.local.set({windows_BAK1: LSwindows_BAK1}); - chrome.storage.local.set({windows_BAK2: LSwindows_BAK2}); - chrome.storage.local.set({windows_BAK3: LSwindows_BAK3}); - chrome.storage.local.set({t_count: LSt_count}); - chrome.storage.local.set({w_count: LSw_count}); + let LStabs = {}; + if (localStorage.getItem("tabs") != null) { + LStabs = LoadData("tabs", {}); } + let LSwindows = {}; + if (localStorage.getItem("windows") != null) { + LSwindows = LoadData("windows", {}); + } + let LStabs_BAK1 = {}; + if (localStorage.getItem("tabs_BAK1") != null) { + LStabs_BAK1 = LoadData("tabs_BAK1", {}); + } + let LStabs_BAK2 = {}; + if (localStorage.getItem("tabs_BAK2") != null) { + LStabs_BAK2 = LoadData("tabs_BAK2", {}); + } + let LStabs_BAK3 = {}; + if (localStorage.getItem("tabs_BAK3") != null) { + LStabs_BAK3 = LoadData("tabs_BAK3", {}); + } + + let LSwindows_BAK1 = {}; + if (localStorage.getItem("windows_BAK1") != null) { + LSwindows_BAK1 = LoadData("windows_BAK1", {}); + } + let LSwindows_BAK2 = {}; + if (localStorage.getItem("windows_BAK2") != null) { + LSwindows_BAK2 = LoadData("windows_BAK2", {}); + } + let LSwindows_BAK3 = {}; + if (localStorage.getItem("windows_BAK3") != null) { + LSwindows_BAK3 = LoadData("windows_BAK3", {}); + } + + + let LSt_count = 0; + if (localStorage.getItem("t_count") != null) { + LSt_count = LoadData("t_count", {}); + } + let LSw_count = 0; + if (localStorage.getItem("w_count") != null) { + LSw_count = LoadData("w_count", {}); + } + chrome.storage.local.set({tabs: LStabs}); + chrome.storage.local.set({windows: LSwindows}); + chrome.storage.local.set({tabs_BAK1: LStabs_BAK1}); + chrome.storage.local.set({tabs_BAK2: LStabs_BAK2}); + chrome.storage.local.set({tabs_BAK3: LStabs_BAK3}); + + chrome.storage.local.set({windows_BAK1: LSwindows_BAK1}); + chrome.storage.local.set({windows_BAK2: LSwindows_BAK2}); + chrome.storage.local.set({windows_BAK3: LSwindows_BAK3}); + chrome.storage.local.set({t_count: LSt_count}); + chrome.storage.local.set({w_count: LSw_count}); + + chrome.storage.local.set({preferences: LSpreferences}); chrome.storage.local.set({current_theme: current_theme}); chrome.storage.local.set({themes: SLThemes}); diff --git a/manifest.json b/manifest.json index 925573d..76dcbba 100644 --- a/manifest.json +++ b/manifest.json @@ -14,7 +14,7 @@ "19": "icons/16.png", "16": "icons/16.png" }, - "permissions": [ "tabs", "sessions", "", "storage", "bookmarks" ], + "permissions": [ "tabs", "sessions", "", "storage", "unlimitedStorage", "bookmarks", "tabHide" ], "sidebar_action": { "default_icon": { diff --git a/options.html b/options.html index 92f7e26..0352545 100644 --- a/options.html +++ b/options.html @@ -19,6 +19,10 @@ + + + + @@ -76,22 +80,29 @@ - + + + - + +
@@ -148,6 +159,7 @@ + @@ -160,6 +172,7 @@ + @@ -176,6 +189,11 @@ - + + + - + +
  • @@ -213,6 +231,27 @@
  • +
  • +
    +
    + + + + + +
    + +
  • +
  • + + +
@@ -289,6 +328,23 @@ +
+ + + + + + + +
+
+ +
+
+ + + +
@@ -298,81 +354,346 @@ - + - +

-
+ +
- - + - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+ +
+
+ +
+
+
+ +
- - -
-
+
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -461,11 +782,11 @@ @@ -482,7 +803,9 @@
- +
+ + @@ -491,12 +814,14 @@ + + + - diff --git a/options/options overwrite.css b/options/options overwrite.css new file mode 100644 index 0000000..7b08b41 --- /dev/null +++ b/options/options overwrite.css @@ -0,0 +1,224 @@ + + +/* OVERWRITE TOOLBAR COLORS */ + +#toolbar { + background-color: #f2f2f2; + border-bottom: 1px solid #cccccc; +} +#toolbar_main { + border-bottom: 1px solid #cccccc; + background-color: #f2f2f2; +} +.toolbar_shelf { + border-bottom: 1px solid #cccccc; + background-color: #f2f2f2; +} + +.toolbar_shelf .button_img, +.button.on .button_img, +.button_img { + background-color: #808080; +} + +.toolbar_shelf .button:not(.on), +.button:not(.on) { + background-color: #f2f2f2; + border: 1px solid #f2f2f2; +} + +.button:hover:not(.on) { + background-color: #dcdcdc; + border: 1px solid #dcdcdc; +} + +.toolbar_shelf .button:hover>.button_img, +.button:hover:not(.on)>.button_img { + background-color: #808080; +} + +.button.on { + background-color: #f2f2f2; + border: 1px solid #cccccc; +} + +/* MAIN TOOLBAR SEARCHBOX */ +#filter_box { + background-color: #fafafa; + border: solid 1px #cccccc; + color: #808080; +} +#button_filter_clear { + background-color: #808080; +} + + + + + + + + + + + + + + + + + + + + + +#menu_hover_sample { + border: 1px solid var(--tabs_menu_hover_border); + background-color: var(--tabs_menu_hover_background); +} + + + + +/* TOOLBAR THEME COLOR EDIT */ + +/* toolbar main */ +#toolbar_theme { + position: absolute; + top: 0px; + left: 0px; + width: 100%; + background-color: var(--toolbar_background); + border-bottom: 1px solid var(--toolbar_border_bottom); +} + +#toolbar_main_theme { + position: relative; + width: 100%; + height: 26px; + top: 0px; + background-color: var(--toolbar_background); + border-bottom: 1px solid var(--toolbar_border_bottom); +} + +/* toolbar shelf */ +#toolbar_search_input_box_theme { + position: relative; + width: 100%; + top: 0px; + height: 26px; + background-color: var(--toolbar_shelf_background); + overflow: hidden; +} + + + +/* toolbar buttons */ + + +#button_theme_plus { + background-color: var(--button_background); + border: 1px solid var(--button_border); +} +#button_theme_plus_img { + background-color: var(--button_icons); + -webkit-mask-image: url(../theme/toolbar_plus_big.svg); + mask-image: url(../theme/toolbar_plus_big.svg); +} +#button_theme_plus:hover { + border: 1px solid var(--button_hover_border); + background-color: var(--button_hover_background); +} +#button_theme_plus:hover>#button_theme_plus_img { + background-color: var(--button_icons_hover); +} + + +#button_theme_search_img { + background-color: var(--button_on_icons); + -webkit-mask-image: url(../theme/toolbar_search.svg); + mask-image: url(../theme/toolbar_search.svg); + border: 1px solid var(--button_border); +} + + +#button_theme_pen { + background-color: var(--button_shelf_background); + border: 1px solid var(--button_shelf_border); +} +#button_theme_pen_img { + background-color: var(--button_shelf_icons); + -webkit-mask-image: url(../theme/toolbar_edit.svg); + mask-image: url(../theme/toolbar_edit.svg); +} + +#button_theme_pen:hover { + border: 1px solid var(--button_shelf_hover_border); + background-color: var(--button_shelf_hover_background); +} +#button_theme_pen:hover>#button_theme_pen_img { + border: 1px solid var(--button_shelf_hover_border); + background-color: var(--button_shelf_icons_hover); +} + + +/* searchbox */ +#filter_box_theme { + position: relative; + display: inline-block; + vertical-align: top; + left: 2px; + top: 2px; + padding-left: 6px; + width: calc(100% - 42px); + height: 18px; + background-color: var(--filter_box_background); + border: solid 1px var(--filter_box_border); + color: var(--filter_box_font); +} + +#filter_box_theme:focus { + outline: none; +} + +#button_filter_clear_theme { + display: inline-block; + vertical-align: top; + -webkit-mask-image: url(../theme/toolbar_filter_clear.svg); + mask-image: url(../theme/toolbar_filter_clear.svg); + top: 5.5px; + right: 34px; + width: 16px; + height: 16px; + background-color: var(--filter_clear_icon); +} + +#button_theme_plus, +#button_theme_search, +#button_theme_pen { + position: relative; + display: inline-block; + vertical-align: top; + width: 24px; + height: 24px; +} + + +#button_theme_plus_img, +#button_theme_search_img, +#button_theme_pen_img { + position: absolute; + top: 1px; + left: 1px; + width: 24px; + height: 24px; + -webkit-mask-size: 24px 24px; + mask-size: 24px 24px; +} + +#button_theme_search { + height: 26px; + left: -3px; + background-color: var(--button_on_background); + border: 1px solid var(--toolbar_border_bottom); +} diff --git a/options/options.css b/options/options.css index 0b8bdf5..b843ec7 100644 --- a/options/options.css +++ b/options/options.css @@ -115,6 +115,11 @@ ul:not(.menu) li { padding-right: 6px; } +.regexLabel { + width:200px; + display:inline-block; + font-weight:bold +} @@ -136,8 +141,6 @@ ul:not(.menu) li { /* THEME DEPARTMENT */ - - /* OPTIONS IMAGES */ .font_color, .font_weight_normal, @@ -157,7 +160,25 @@ ul:not(.menu) li { height: 20px; width: 20px; background-size: 20px 20px; -} +} + + +#toolbar_colors_pick_block .pick_col { + display: inline-block; + position: relative; + top: 0px; + left: 0px; +} +#toolbar_colors_pick_block .spacer { + display: inline-block; + position: relative; + top: 0px; + left: 0px; + height: 20px; + width: 20px; +} + + .font_color { background-image: url(../options/options_font_color.svg); @@ -236,6 +257,11 @@ ul:not(.menu) li { background-image: url(../options/options_scale_plus_hover.svg); } + + + +/* COLOR PREVIEWS */ + @keyframes hover_blinking { 0% {background-color: transparent;} 100% {background-color: blue;} @@ -252,58 +278,7 @@ ul:not(.menu) li { animation: hover_border_blinking 1s infinite; } -/* MAIN TOOLBAR */ -#toolbar_background { - top: 0px; - left: 307px; -} -#toolbar_border_bottom { - top: 0px; - left: 328px; -} -#button_icons { - top: 0px; - left: 59px; -} -#button_icons_hover { - top: 0px; - left: 80px; -} - -#button_background { - top: 0px; - left: 4px; -} -#button_hover_background { - top: 0px; - left: 25px; -} - -#button_border { - top: 0px; - left: 115px; -} -#button_hover_border { - top: 0px; left: 136px; -} - -#filter_box_font { - top: 0px; - left: 175px; -} -#filter_clear_icon { - top: 0px; - left: 238px; -} -#filter_box_background { - top: 0px; - left: 196px; -} -#filter_box_border { - top: 0px; - left: 217px; -} /* BIG OPTIONS BUTTONS */ @@ -385,7 +360,7 @@ ul:not(.menu) li { #pin_list { position: absolute; height: calc(var(--scrollbar_height) + var(--pin_height) + 2px - var(--pin_list_padding_top) - var(--pin_list_padding_bottom)); - width: 788px; + width: 790px; top: 30px; left: 20px; padding: none; @@ -450,7 +425,7 @@ ul:not(.menu) li { /* TAB LIST AND SCROLLBAR */ #groups { position: absolute; - height: 800px; + height: 850px; width: calc(771px - var(--scrollbar_width)); top: calc(var(--scrollbar_height) + var(--pin_height) + 33px); left: 40px; @@ -459,7 +434,7 @@ ul:not(.menu) li { #group_scrollbar { position: absolute; - height: 800px; + height: 850px; width: var(--scrollbar_width); top: calc(var(--scrollbar_height) + var(--pin_height) + 33px); left: calc(810px - var(--scrollbar_width)); @@ -509,9 +484,10 @@ ul:not(.menu) li { .tab_color_options_row { z-index: 2000; position:relative; - margin-top: var(--margin_top_tab); + margin-top: var(--margin_tab_top); width: 740px; height: calc(var(--tab_height) + 2px); + pointer-events: none; /* background:rgba(255,0,0,0.1); */ } .tab_color_options_row .color_x, @@ -523,6 +499,7 @@ ul:not(.menu) li { .tab_color_options_row .font_weight_bold, .tab_color_options_row .font_style_normal, .tab_color_options_row .font_style_italic { + pointer-events: all; top: 0px; height: var(--tab_height); width: var(--tab_height); @@ -552,8 +529,24 @@ ul:not(.menu) li { } +/* FOLDERS ICONS */ +#folder_icon_open { + top: 0px; + left: -30px; +} +#folder_icon_closed { + top: 0px; + left: -30px; +} +#folder_icon_hover { + top: 0px; + left: -30px; +} + + /* DRAG AND DROP INDICATOR */ #dd19 { + z-index: 9999; display: inline-block; border-bottom: 2px solid var(--drag_indicator); } @@ -585,14 +578,15 @@ ul:not(.menu) li { /* CLOSE TAB BUTTON OPTIONS */ #expand_hover_background { top: 0px; - left: calc(var(--children_padding_left) - 18px); + left: -30px; } #expand_closed_background { top: 0px; - left: calc(var(--children_padding_left) - 18px); + left: -30px; } #expand_open_background { - top: 0px; left: -12px; + top: 0px; + left: -30px; } @@ -608,7 +602,7 @@ ul:not(.menu) li { left: 20px; top: calc(var(--scrollbar_height) + var(--pin_height) + 33px); width: 19px; - height: 800px; + height: 850px; background-color: var(--group_list_background); border-right: 1px solid var(--group_list_borders); overflow: visible; @@ -670,3 +664,6 @@ ul:not(.menu) li { } +#fopf_folder3 { + background-color: var(--folder_icon_hover); +} diff --git a/options/options.js b/options/options.js index d2267bc..eb9d431 100644 --- a/options/options.js +++ b/options/options.js @@ -7,38 +7,102 @@ var current_theme = ""; var themes = []; var SelectedTheme = Object.assign({}, DefaultTheme); + + var dragged_button; active_group = "tab_list"; // options for all drop down menus -let DropDownList = ["dbclick_folder", "midclick_folder", "midclick_tab", "dbclick_group", "midclick_group", "dbclick_tab", "append_child_tab", "append_child_tab_after_limit", "append_orphan_tab", "after_closing_active_tab"]; +let DropDownList = ["dbclick_folder", "midclick_folder", "midclick_tab", "dbclick_group", "midclick_group", "dbclick_tab", "append_child_tab", "append_child_tab_after_limit", "append_orphan_tab", "after_closing_active_tab", "move_tabs_on_url_change"]; document.addEventListener("DOMContentLoaded", function() { document.title = "Tree Tabs"; - chrome.runtime.sendMessage({command: "get_preferences"}, function(response) { - opt = Object.assign({}, response); - chrome.storage.local.get(null, function(items) { - if (items["themes"]) { - for (var themeName in items["themes"]) { - themes.push(themeName); - } + chrome.storage.local.get(null, function(storage) { + + GetCurrentPreferences(storage); + + if (storage["themes"]) { + for (var themeName in storage["themes"]) { + themes.push(themeName); } - if (items["current_theme"]) { - current_theme = items["current_theme"]; - LoadTheme(items["current_theme"]); - } - GetOptions(); - RefreshFields(); - SetEvents(); - AppendGroupToList("tab_list", caption_ungrouped_group, "", false); - AppendGroupToList("tab_list2", caption_noname_group, "", false); - AppendSampleTabs(); - }); + } + if (storage["current_theme"]) { + current_theme = storage["current_theme"]; + LoadTheme(storage["current_theme"]); + } + + + if (storage["unused_buttons"]) { + RecreateToolbarUnusedButtons(storage["unused_buttons"]); + } + + RecreateToolbar(GetCurrentToolbar(storage)); + SetToolbarEvents(false, false, true, "click"); + AddEditToolbarEditEvents(); + + + GetOptions(storage); + RefreshFields(); + SetEvents(); + + AppendGroupToList("tab_list", caption_ungrouped_group, "", false); + AppendGroupToList("tab_list2", caption_noname_group, "", false); + AppendSampleTabs(); + + setTimeout(function() { + document.querySelectorAll(".on").forEach(function(s){ + s.classList.remove("on"); + }); + RefreshGUI(); + }, 100); }); }); +function SetRegexes() { + let regexes = document.getElementById('tab_group_regexes'); + opt.tab_group_regexes = []; + for (let child of regexes.children) { + var regex = child.children[0].value.trim(); + var groupName = child.children[1].value.trim(); + if (regex !== "" && groupName !== "") { + opt.tab_group_regexes.push([regex, groupName]); + } + } + SavePreferences(); +} + +function AddRegexPair() { + let regexes = document.getElementById('tab_group_regexes'); + let outer = document.createElement("div"); + + let input = document.createElement("input"); + input.type = "text"; + input.style.width = '200px'; + input.onchange = SetRegexes; + input.onkeyup = SetRegexes; + outer.appendChild(input); + + input = document.createElement("input"); + input.type = "text"; + input.style.width = '200px'; + input.onchange = SetRegexes; + input.onkeyup = SetRegexes; + outer.appendChild(input); + + let deleteButton = document.createElement("input"); + deleteButton.type = "button"; + deleteButton.style.width = '75px'; + deleteButton.className = "set_button theme_buttons"; + deleteButton.value = "Remove"; + deleteButton.onclick = function() { regexes.removeChild(outer); } + outer.appendChild(deleteButton); + + regexes.appendChild(outer); + return outer; +} + // document events -function GetOptions() { +function GetOptions(storage) { // get language labels document.querySelectorAll(".label, .set_button, .bg_opt_drop_down_menu").forEach(function(s){ s.textContent = chrome.i18n.getMessage(s.id); @@ -69,9 +133,6 @@ function GetOptions() { }); - - - // get options for all drop down menus (loop through all drop down items that are in DropDownList array) for (let i = 0; i < DropDownList.length; i++) { let DropDownOption = document.getElementById(DropDownList[i]); @@ -82,6 +143,13 @@ function GetOptions() { } } } + + for (let i = 0; i < opt.tab_group_regexes.length; i++) { + let regexPair = opt.tab_group_regexes[i]; + let outer = AddRegexPair(); + outer.children[0].value = regexPair[0]; + outer.children[1].value = regexPair[1] + } // get options for tabs tree depth option document.getElementById("max_tree_depth").value = opt.max_tree_depth; @@ -92,7 +160,7 @@ function GetOptions() { for (var i = 0; i < themes.length; i++) { let theme_name = document.createElement("option"); theme_name.value = themes[i]; - theme_name.text = themes[i]; + theme_name.text = storage.themes[themes[i]].theme_name; ThemeList.add(theme_name); } // select current theme in dropdown list @@ -105,11 +173,38 @@ function GetOptions() { } function RemovePreview() { - if (document.styleSheets[document.styleSheets.length-1].cssRules.length) { - document.styleSheets[document.styleSheets.length-1].deleteRule(document.styleSheets[document.styleSheets.length-1].cssRules.length-1); - } document.querySelectorAll(".hover_blinking").forEach(function(s){s.classList.remove("hover_blinking");}); document.querySelectorAll(".hover_border_blinking").forEach(function(s){s.classList.remove("hover_border_blinking");}); + document.querySelectorAll(".red_preview").forEach(function(s){ + s.style.backgroundColor = ""; + s.style.border = ""; + s.style.borderBottom = ""; + s.style.borderRight = ""; + s.style.color = ""; + s.style.animation = ""; + s.style.fontWeight = ""; + s.style.fontStyle = ""; + // s.style.zIndex = ""; + s.classList.remove("red_preview"); + }); +} + + + +function AddRedStylePreview(Id, style, value, removePreview) { + if (removePreview) RemovePreview(); + let d = document.getElementById(Id); + d.classList.add("red_preview"); + d.style[style] = value; +} + +function AddBlueBackgroundPreview(Id, removePreview) { + if (removePreview) RemovePreview(); + document.getElementById(Id).classList.add("hover_blinking"); +} +function AddBlueBorderPreview(Id, removePreview) { + if (removePreview) RemovePreview(); + document.getElementById(Id).classList.add("hover_border_blinking"); } @@ -146,118 +241,307 @@ function SetEvents() { // console.log(event.target); // } // } - document.querySelectorAll(".pick_col, #filter_box_font").forEach(function(s){s.onmouseenter = function(event) { - document.styleSheets[document.styleSheets.length-1].insertRule("body { --"+this.id+": red; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - }}); - document.querySelectorAll(".font_weight_normal").forEach(function(s){s.onmouseenter = function(event) { - document.styleSheets[document.styleSheets.length-1].insertRule("body { --"+this.id+": normal; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - }}); - document.querySelectorAll(".font_weight_bold").forEach(function(s){s.onmouseenter = function(event) { - document.styleSheets[document.styleSheets.length-1].insertRule("body { --"+this.id+": bold; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - }}); - document.querySelectorAll(".font_style_normal").forEach(function(s){s.onmouseenter = function(event) { - document.styleSheets[document.styleSheets.length-1].insertRule("body { --"+this.id+": normal; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - }}); - document.querySelectorAll(".font_style_italic").forEach(function(s){s.onmouseenter = function(event) { - document.styleSheets[document.styleSheets.length-1].insertRule("body { --"+this.id+": italic; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - }}); - document.querySelectorAll(".pick_col, .font_weight_normal, .font_weight_bold, .font_style_normal, .font_style_italic, #filter_box_font").forEach(function(s){s.onmouseleave = function(event) { - RemovePreview(); - }}); - - document.getElementById("group_list_default_font_color").onmouseenter = function(event) { - document.getElementById("_gtetab_list").style.color = "red"; - document.getElementById("_gtetab_list2").style.color = "red"; - - } - document.getElementById("group_list_default_font_color").onmouseleave = function(event) { - document.getElementById("_gtetab_list").style.color = ""; - document.getElementById("_gtetab_list2").style.color = ""; - } - - document.getElementById("scrollbar_thumb_hover").onmouseenter = function(event) { + document.querySelectorAll("#scrollbar_thumb_hover, #options_tab_list_scrollbar_height_up, #options_tab_list_scrollbar_height_down, #options_tab_list_scrollbar_width_up, #options_tab_list_scrollbar_width_down, .pick_col, .font_weight_normal, .font_weight_bold, .font_style_normal, .font_style_italic, #filter_box_font").forEach(function(s){s.onmouseleave = function(event) { RemovePreview(); - document.getElementById("group_scrollbar_thumb").classList.add("hover_blinking"); - document.getElementById("pin_list_scrollbar_thumb").classList.add("hover_blinking"); - } - document.getElementById("scrollbar_thumb_hover").onmouseleave = function(event) { - RemovePreview(); - } - + }}); - document.getElementById("group_list_button_hover_background").onmouseenter = function(event) { - RemovePreview(); - document.getElementById("_tab_list2").classList.add("hover_blinking"); + // toolbar buttons + document.getElementById("button_background").onmouseenter = function(event) { + AddRedStylePreview("button_theme_plus", "backgroundColor", "red", true); } - document.getElementById("group_list_button_hover_background").onmouseleave = function(event) { - RemovePreview(); - } - document.getElementById("button_hover_background").onmouseenter = function(event) { - RemovePreview(); - document.querySelectorAll(".button").forEach(function(s){s.classList.add("hover_blinking");}); + AddBlueBackgroundPreview("button_theme_plus", true); } - document.getElementById("button_hover_background").onmouseleave = function(event) { - RemovePreview(); + + document.getElementById("button_on_background").onmouseenter = function(event) { + AddRedStylePreview("button_theme_search", "backgroundColor", "red", true); } - - + document.getElementById("button_icons").onmouseenter = function(event) { + AddRedStylePreview("button_theme_plus_img", "backgroundColor", "red", true); + } document.getElementById("button_icons_hover").onmouseenter = function(event) { - RemovePreview(); - document.querySelectorAll(".button_img").forEach(function(s){s.classList.remove("hover_blinking");}); + AddBlueBackgroundPreview("button_theme_plus_img", true); } - document.getElementById("button_icons_hover").onmouseleave = function(event) { - RemovePreview(); + document.getElementById("button_on_icons").onmouseenter = function(event) { + AddRedStylePreview("button_theme_search_img", "backgroundColor", "red", true); } + document.getElementById("button_border").onmouseenter = function(event) { + AddRedStylePreview("button_theme_plus", "border", "1px solid red", true); + } document.getElementById("button_hover_border").onmouseenter = function(event) { - RemovePreview(); - document.querySelectorAll(".button").forEach(function(s){s.classList.add("hover_border_blinking");}); + AddBlueBorderPreview("button_theme_plus", true); } - document.getElementById("button_hover_border").onmouseleave = function(event) { - RemovePreview(); + + + // search box + document.getElementById("filter_box_font").onmouseenter = function(event) { + AddRedStylePreview("filter_box_theme", "color", "red", true); + } + document.getElementById("filter_box_background").onmouseenter = function(event) { + AddRedStylePreview("filter_box_theme", "backgroundColor", "red", true); + } + document.getElementById("filter_box_border").onmouseenter = function(event) { + AddRedStylePreview("filter_box_theme", "border", "1px solid red", true); + } + document.getElementById("filter_clear_icon").onmouseenter = function(event) { + AddRedStylePreview("button_filter_clear_theme", "backgroundColor", "red", true); } - document.getElementById("options_tab_list_scrollbar_width_up").onmouseenter = function(event) { - document.getElementById("group_scrollbar").style.backgroundColor = "red"; - document.getElementById("group_scrollbar_thumb").style.backgroundColor = "red"; + // toolbar background + document.getElementById("toolbar_background").onmouseenter = function(event) { + AddRedStylePreview("toolbar_main_theme", "backgroundColor", "red", true); } - document.getElementById("options_tab_list_scrollbar_width_down").onmouseenter = function(event) { - document.getElementById("group_scrollbar").style.backgroundColor = "red"; - document.getElementById("group_scrollbar_thumb").style.backgroundColor = "red"; + + // shelf toolbar background + document.getElementById("toolbar_shelf_background").onmouseenter = function(event) { + AddRedStylePreview("toolbar_search_input_box_theme", "backgroundColor", "red", true); + } + + // toolbar's border + document.getElementById("toolbar_border_bottom").onmouseenter = function(event) { + AddRedStylePreview("button_theme_search", "border", "1px solid red", true); + AddRedStylePreview("toolbar_main_theme", "borderBottom", "1px solid red"); + AddRedStylePreview("toolbar_theme", "borderBottom", "1px solid red"); } - document.getElementById("options_tab_list_scrollbar_width_up").onmouseleave = function(event) { - document.getElementById("group_scrollbar").style.backgroundColor = ""; - document.getElementById("group_scrollbar_thumb").style.backgroundColor = ""; + // shelf toolbar buttons + document.getElementById("button_shelf_background").onmouseenter = function(event) { + AddRedStylePreview("button_theme_pen", "backgroundColor", "red", true); } - document.getElementById("options_tab_list_scrollbar_width_down").onmouseleave = function(event) { - document.getElementById("group_scrollbar").style.backgroundColor = ""; - document.getElementById("group_scrollbar_thumb").style.backgroundColor = ""; + document.getElementById("button_shelf_hover_background").onmouseenter = function(event) { + AddBlueBackgroundPreview("button_theme_pen", true); + } + document.getElementById("button_shelf_icons").onmouseenter = function(event) { + AddRedStylePreview("button_theme_pen_img", "backgroundColor", "red", true); + } + document.getElementById("button_shelf_icons_hover").onmouseenter = function(event) { + AddBlueBackgroundPreview("button_theme_pen_img", true); + } + document.getElementById("button_shelf_border").onmouseenter = function(event) { + AddRedStylePreview("button_theme_pen", "border", "1px solid red", true); + } + document.getElementById("button_shelf_hover_border").onmouseenter = function(event) { + AddBlueBorderPreview("button_theme_pen", true); + } + + // pinned tab attention_background + document.getElementById("attention_background").onmouseenter = function(event) { + AddRedStylePreview("tab_header10", "backgroundColor", "red", true); + document.getElementById("tab_header10").style.animation = "none"; + } + + // pinned tab attention_border + document.getElementById("attention_border").onmouseenter = function(event) { + AddRedStylePreview("tab_header10", "border", "1px solid red", true); + document.getElementById("tab_header10").style.animation = "none"; + } + + // pin_list border bottom + document.getElementById("pin_list_border_bottom").onmouseenter = function(event) { + AddRedStylePreview("pin_list", "borderBottom", "1px solid red", true); + } + + // pin_list background + document.getElementById("pin_list_background").onmouseenter = function(event) { + AddRedStylePreview("pin_list", "backgroundColor", "red", true); + } + + + // tab row font_color + document.querySelectorAll(".tab_col.font_color").forEach(function(s){s.onmouseenter = function(event) { + AddRedStylePreview("tab_title" + this.parentNode.id.substr(1), "color", "red", true); + }}); + + // tab row font not bold + document.querySelectorAll(".tab_col.font_weight_normal").forEach(function(s){s.onmouseenter = function(event) { + AddRedStylePreview("tab_title" + this.parentNode.id.substr(1), "color", "red", true); + AddRedStylePreview("tab_title" + this.parentNode.id.substr(1), "fontWeight", "normal", false); + }}); + + // tab row font bold + document.querySelectorAll(".tab_col.font_weight_bold").forEach(function(s){s.onmouseenter = function(event) { + AddRedStylePreview("tab_title" + this.parentNode.id.substr(1), "color", "red", true); + AddRedStylePreview("tab_title" + this.parentNode.id.substr(1), "fontWeight", "bold", false); + }}); + + // tab row font style normal + document.querySelectorAll(".tab_col.font_style_normal").forEach(function(s){s.onmouseenter = function(event) { + AddRedStylePreview("tab_title" + this.parentNode.id.substr(1), "color", "red", true); + AddRedStylePreview("tab_title" + this.parentNode.id.substr(1), "fontStyle", "normal", false); + }}); + // tab row font style italic + document.querySelectorAll(".tab_col.font_style_italic").forEach(function(s){s.onmouseenter = function(event) { + AddRedStylePreview("tab_title" + this.parentNode.id.substr(1), "color", "red", true); + AddRedStylePreview("tab_title" + this.parentNode.id.substr(1), "fontStyle", "italic", false); + }}); + + + // tab border + document.querySelectorAll(".tab_col.color_border").forEach(function(s){s.onmouseenter = function(event) { + AddRedStylePreview("tab_header" + this.parentNode.id.substr(1), "border", "1px solid red", true); + }}); + + // tab background + document.querySelectorAll(".tab_col.color_bucket").forEach(function(s){s.onmouseenter = function(event) { + AddRedStylePreview("tab_header" + this.parentNode.id.substr(1), "backgroundColor", "red", true); + }}); + + // scrollbars hover + document.getElementById("scrollbar_thumb_hover").onmouseenter = function(event) { + AddBlueBackgroundPreview("group_scrollbar_thumb", true); + AddBlueBackgroundPreview("pin_list_scrollbar_thumb"); + } + + // scrollbars thumb + document.getElementById("scrollbar_thumb").onmouseenter = function(event) { + AddRedStylePreview("group_scrollbar_thumb", "backgroundColor", "red", true); + AddRedStylePreview("pin_list_scrollbar_thumb", "backgroundColor", "red"); + } + + + // scrollbars track + document.getElementById("scrollbar_track").onmouseenter = function(event) { + AddRedStylePreview("group_scrollbar", "backgroundColor", "red", true); + AddRedStylePreview("pin_list_scrollbar", "backgroundColor", "red"); } + // tab_list scrollbars + document.querySelectorAll("#options_tab_list_scrollbar_width_up, #options_tab_list_scrollbar_width_down").forEach(function(s){s.onmouseenter = function(event) { + AddRedStylePreview("group_scrollbar", "backgroundColor", "red", true); + AddRedStylePreview("group_scrollbar_thumb", "backgroundColor", "red"); + }}); - document.getElementById("options_tab_list_scrollbar_height_up").onmouseenter = function(event) { - document.getElementById("pin_list_scrollbar").style.backgroundColor = "red"; - document.getElementById("pin_list_scrollbar_thumb").style.backgroundColor = "red"; + // pin_list scrollbars + document.querySelectorAll("#options_tab_list_scrollbar_height_up, #options_tab_list_scrollbar_height_down").forEach(function(s){s.onmouseenter = function(event) { + AddRedStylePreview("pin_list_scrollbar", "backgroundColor", "red", true); + AddRedStylePreview("pin_list_scrollbar_thumb", "backgroundColor", "red"); + }}); + + + + // folder icon open + document.getElementById("folder_icon_open").onmouseenter = function(event) { + AddRedStylePreview("fopf_folder1", "backgroundColor", "red", true); } - document.getElementById("options_tab_list_scrollbar_height_down").onmouseenter = function(event) { - document.getElementById("pin_list_scrollbar").style.backgroundColor = "red"; - document.getElementById("pin_list_scrollbar_thumb").style.backgroundColor = "red"; + // folder icon closed + document.getElementById("folder_icon_closed").onmouseenter = function(event) { + AddRedStylePreview("fopf_folder2", "backgroundColor", "red", true); } + // folder icon hover + document.getElementById("folder_icon_hover").onmouseenter = function(event) { + AddBlueBackgroundPreview("fopf_folder3", true); + } + + + // tab expand closed + document.getElementById("expand_closed_background").onmouseenter = function(event) { + AddRedStylePreview("exp14", "backgroundColor", "red", true); + } + // tab expand hover + document.getElementById("expand_hover_background").onmouseenter = function(event) { + AddBlueBackgroundPreview("exp16", true); + } + // tab expand open + document.getElementById("expand_open_background").onmouseenter = function(event) { + AddRedStylePreview("exp5", "backgroundColor", "red", true); + } + + - document.getElementById("options_tab_list_scrollbar_height_up").onmouseleave = function(event) { - document.getElementById("pin_list_scrollbar").style.backgroundColor = ""; - document.getElementById("pin_list_scrollbar_thumb").style.backgroundColor = ""; + + + // drag indicator + document.getElementById("drag_indicator").onmouseenter = function(event) { + AddRedStylePreview("di19", "borderBottom", "1px solid red", true); } - document.getElementById("options_tab_list_scrollbar_height_down").onmouseleave = function(event) { - document.getElementById("pin_list_scrollbar").style.backgroundColor = ""; - document.getElementById("pin_list_scrollbar_thumb").style.backgroundColor = ""; + + + // close x + document.getElementById("close_x").onmouseenter = function(event) { + AddRedStylePreview("close_img11", "backgroundColor", "red", true); } + // close x hover + document.getElementById("close_hover_x").onmouseenter = function(event) { + AddBlueBackgroundPreview("close_img13", true); + } + // close border hover + document.getElementById("close_hover_border").onmouseenter = function(event) { + AddBlueBorderPreview("close13", true); + } + // close border hover + document.getElementById("close_hover_background").onmouseenter = function(event) { + AddBlueBackgroundPreview("close13", true); + } + + + + + // group button hover + document.getElementById("group_list_button_hover_background").onmouseenter = function(event) { + AddBlueBackgroundPreview("_tab_list2", true); + } + // group buttons borders + document.getElementById("group_list_borders").onmouseenter = function(event) { + AddRedStylePreview("toolbar_groups_block", "borderRight", "1px solid red", true); + AddRedStylePreview("_tab_list", "border", "1px solid red"); + } + // group buttons font + document.getElementById("group_list_default_font_color").onmouseenter = function(event) { + AddRedStylePreview("_gtetab_list", "color", "red", true); + AddRedStylePreview("_gtetab_list2", "color", "red"); + } + // group list background + document.getElementById("group_list_background").onmouseenter = function(event) { + AddRedStylePreview("toolbar_groups_block", "backgroundColor", "red", true); + } + // tab_list background + document.getElementById("tab_list_background").onmouseenter = function(event) { + AddRedStylePreview("tab_list", "backgroundColor", "red", true); + AddRedStylePreview("_tab_list", "backgroundColor", "red"); + } + + + + + + // menu hover border + document.getElementById("tabs_menu_hover_border").onmouseenter = function(event) { + AddRedStylePreview("menu_hover_sample", "border", "1px solid red", true); + } + // menu hover background + document.getElementById("tabs_menu_hover_background").onmouseenter = function(event) { + AddRedStylePreview("menu_hover_sample", "backgroundColor", "red", true); + } + + // menu separator + document.getElementById("tabs_menu_separator").onmouseenter = function(event) { + AddRedStylePreview("menu_separator1", "backgroundColor", "red", true); + AddRedStylePreview("menu_separator2", "backgroundColor", "red"); + } + + // menu font + document.getElementById("tabs_menu_font").onmouseenter = function(event) { + AddRedStylePreview("menu_hover_sample", "color", "red", true); + AddRedStylePreview("menu_sample1", "color", "red"); + AddRedStylePreview("menu_sample2", "color", "red"); + } + + + // menu border + document.getElementById("tabs_menu_border").onmouseenter = function(event) { + AddRedStylePreview("tabs_menu", "border", "1px solid red", true); + } + + // menu background + document.getElementById("tabs_menu_background").onmouseenter = function(event) { + AddRedStylePreview("tabs_menu", "backgroundColor", "red", true); + } + // --------------------------------------COLOR PICKER--------------------------------------------------------------------- @@ -322,14 +606,25 @@ function SetEvents() { } } SavePreferences(); + if (this.id == "show_toolbar") { + SaveToolbar(); + RefreshFields(); + + + // setTimeout(function() { + // chrome.runtime.sendMessage({command: "reload_toolbar", toolbar: toolbar, opt: opt}); + // }, 300); + } }}}); // options that need reload document.onclick = function(event) {if (event.which == 1) { - if (event.target.id == "show_toolbar" || event.target.id == "syncro_tabbar_tabs_order" || event.target.id == "allow_pin_close" || event.target.id == "switch_with_scroll" || event.target.id == "always_show_close" || event.target.id == "never_show_close" || + if (event.target.id == "syncro_tabbar_tabs_order" || event.target.id == "allow_pin_close" || event.target.id == "switch_with_scroll" || event.target.id == "always_show_close" || event.target.id == "never_show_close" || event.target.id == "hide_other_groups_tabs_firefox" || event.target.id == "collapse_other_trees" || event.target.id == "show_counter_tabs" || event.target.id == "show_counter_tabs_hints" || event.target.id == "syncro_tabbar_tabs_order" || event.target.id == "syncro_tabbar_groups_tabs_order" || event.target.id == "groups_toolbar_default") { - chrome.runtime.sendMessage({command: "reload_sidebar"}); + setTimeout(function() { + chrome.runtime.sendMessage({command: "reload_sidebar"}); + }, 50); } if (event.target.id == "groups_toolbar_default") { chrome.runtime.sendMessage({command: "reload"}); @@ -342,11 +637,11 @@ function SetEvents() { // set dropdown menu options for (let i = 0; i < DropDownList.length; i++) { document.getElementById(DropDownList[i]).onchange = function(event) { -console.log(opt[this.id]); -console.log(this.value); opt[this.id] = this.value; SavePreferences(); - chrome.runtime.sendMessage({command: "reload_sidebar"}); + setTimeout(function() { + chrome.runtime.sendMessage({command: "reload_sidebar"}); + }, 50); } } @@ -354,18 +649,20 @@ console.log(this.value); document.getElementById("max_tree_depth").oninput = function(event) { opt.max_tree_depth = parseInt(this.value); SavePreferences(); - chrome.runtime.sendMessage({command: "reload_sidebar"}); + setTimeout(function() { + chrome.runtime.sendMessage({command: "reload_sidebar"}); + }, 50); } // set toolbar on/off and show/hide all toolbar options - document.getElementById("show_toolbar").onclick = function(event) {if (event.which == 1) { - SelectedTheme.ToolbarShow = this.checked ? true : false; - RefreshFields(); - SaveTheme(document.getElementById("theme_list").value); - }} + // document.getElementById("show_toolbar").onclick = function(event) {if (event.which == 1) { + // SelectedTheme.ToolbarShow = this.checked ? true : false; + // RefreshFields(); + // SaveTheme(document.getElementById("theme_list").value); + // }} -// ------------------------------OTHER------------------------------------------------------------------------------------ +// ------------------------------OTHER----------------------------------------------------------------------------------- // block system dragging document.ondrop = function(event) { @@ -374,21 +671,32 @@ console.log(this.value); document.ondragover = function(event) { event.preventDefault(); } + +// ------------------------------ADD REGEX FILTER------------------------------------------------------------------------- + document.getElementById("add_tab_group_regex").onclick = AddRegexPair; + // ----------------------------RESET TOOLBAR BUTTON----------------------------------------------------------------------- document.getElementById("options_reset_toolbar_button").onclick = function(event) {if (event.which == 1) { + SetToolbarEvents(true, false, false, ""); RemoveToolbarEditEvents(); - SelectedTheme["toolbar"] = DefaultToolbar; - SelectedTheme["unused_buttons"] = ""; - document.getElementById("toolbar").innerHTML = DefaultToolbar; - document.getElementById("toolbar_unused_buttons").innerHTML = ""; - SaveTheme(document.getElementById("theme_list").value); - document.querySelectorAll(".on").forEach(function(s){s.classList.remove("on");}); - RefreshGUI(); + + + let unused_buttons = document.getElementById("toolbar_unused_buttons"); + while(unused_buttons.hasChildNodes()) { + unused_buttons.removeChild(unused_buttons.firstChild); + } + + RemoveToolbar(); + RecreateToolbar(DefaultToolbar); SetToolbarEvents(false, false, true, "click"); AddEditToolbarEditEvents(); + + SaveToolbar(); + + }} @@ -413,7 +721,7 @@ console.log(this.value); // import theme preset button document.getElementById("options_import_theme_button").onclick = function(event) {if (event.which == 1) { - let inputFile = ShowOpenFileDialog("import_theme", ".tt_theme"); + let inputFile = ShowOpenFileDialog(".tt_theme"); inputFile.onchange = function(event) { ImportTheme(); } @@ -421,10 +729,11 @@ console.log(this.value); // export theme preset button document.getElementById("options_export_theme_button").onclick = function(event) {if (event.which == 1) { - if (document.getElementById("theme_list").options.length == 0) { + let ThemeList = document.getElementById("theme_list"); + if (ThemeList.options.length == 0) { alert(chrome.i18n.getMessage("options_no_theme_to_export")); } else { - SaveFile(document.getElementById("theme_list").value + ".tt_theme", SelectedTheme); + SaveFile(ThemeList.options[ThemeList.selectedIndex].text, "tt_theme", SelectedTheme); } }} @@ -580,16 +889,46 @@ console.log(this.value); +// ----------------------EXPORT DEBUG LOG--------------------------------------------------------------------------------- + document.getElementById("options_export_debug").onclick = function(event) {if (event.which == 1) { + chrome.storage.local.get(null, function(storage) { + SaveFile("TreeTabs", "log", storage); + }); + }} + +// ----------------------IMPORT DEBUG LOG---------------------------------------------------------------------------- + document.getElementById("options_print_debug").onclick = function(event) {if (event.which == 1) { + let inputFile = ShowOpenFileDialog(".log"); + inputFile.onchange = function(event) { + let file = document.getElementById("file_import"); + let fr = new FileReader(); + if (file.files[0] == undefined) return; + fr.readAsText(file.files[file.files.length - 1]); + fr.onload = function() { + let data = fr.result; + file.parentNode.removeChild(file); + let LoadedData = JSON.parse(data); + // LoadedData.forEach(function(d){ + // console.log(d); + // }); + // LoadedData.forEach(function(d){ + console.log(LoadedData); + // }); + } + } + + }} + // ----------------------CLEAR DATA BUTTON-------------------------------------------------------------------------------- // clear data document.getElementById("options_clear_data").onclick = function(event) {if (event.which == 1) { chrome.storage.local.clear(); - chrome.runtime.sendMessage({command: "reload"}); - chrome.runtime.sendMessage({command: "reload_sidebar"}); setTimeout(function() { + chrome.runtime.sendMessage({command: "reload"}); + chrome.runtime.sendMessage({command: "reload_sidebar"}); location.reload(); - }, 300); + }, 100); }} } @@ -602,51 +941,43 @@ function RemoveToolbarEditEvents() { }); } +// ----------------------EDIT TOOLBAR------------------------------------------------------------------------------------- function AddEditToolbarEditEvents() { document.querySelectorAll("#button_filter_clear").forEach(function(s){ s.style.opacity = "1"; }); - document.querySelectorAll(".button_img").forEach(function(s){ - if (s.parentNode.id != "button_filter_type" || s.parentNode.id != "filter_search_go_prev" || s.parentNode.id != "filter_search_go_next") { - s.setAttribute("draggable", true); - s.onmousedown = function(event) { - if (event.which == 1) { - dragged_button = document.getElementById(this.parentNode.id); - } - } - s.ondragstart = function(event) { - event.dataTransfer.setData(" "," "); - event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); - } - // move (flip) buttons - s.ondragenter = function(event) { - if ((dragged_button.id == "button_tools" || dragged_button.id == "button_search" || dragged_button.id == "button_groups" || dragged_button.id == "button_backup" || dragged_button.id == "button_folders") && this.parentNode.parentNode.classList.contains("toolbar_shelf")) { - return; - } - let dragged_buttonIndex = Array.from(dragged_button.parentNode.children).indexOf(dragged_button); - let Index = Array.from(this.parentNode.parentNode.children).indexOf(this.parentNode); - - if (Index <= dragged_buttonIndex) { - this.parentNode.parentNode.insertBefore(dragged_button, this.parentNode); - } else { - if (this.parentNode.nextSibling != null) { - this.parentNode.parentNode.insertBefore(dragged_button, this.parentNode.nextSibling); - } else { - this.parentNode.parentNode.appendChild(dragged_button); - } - } - } - // save toolbar - s.ondragend = function(event) { - RemoveToolbarEditEvents(); - SelectedTheme.toolbar = document.getElementById("toolbar").innerHTML; - SelectedTheme.unused_buttons = document.getElementById("toolbar_unused_buttons").innerHTML; - SaveTheme(document.getElementById("theme_list").value); - - AddEditToolbarEditEvents(); + document.querySelectorAll("#toolbar_main .button_img, #toolbar_shelf_tools .button_img, #toolbar_shelf_groups .button_img, #toolbar_shelf_backup .button_img, #toolbar_shelf_folders .button_img").forEach(function(s){ + s.setAttribute("draggable", true); + s.onmousedown = function(event) { + if (event.which == 1) { + dragged_button = document.getElementById(this.parentNode.id); } } + s.ondragstart = function(event) { + event.dataTransfer.setData(" "," "); + event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); + } + // move (flip) buttons + s.ondragenter = function(event) { + if ((dragged_button.id == "button_tools" || dragged_button.id == "button_search" || dragged_button.id == "button_groups" || dragged_button.id == "button_backup" || dragged_button.id == "button_folders") && this.parentNode.parentNode.classList.contains("toolbar_shelf")) { + return; + } + let dragged_buttonIndex = Array.from(dragged_button.parentNode.children).indexOf(dragged_button); + let Index = Array.from(this.parentNode.parentNode.children).indexOf(this.parentNode); + + if (Index <= dragged_buttonIndex) { + InsterBeforeNode(dragged_button, this.parentNode); + } else { + InsterAfterNode(dragged_button, this.parentNode); + } + } + // save toolbar + s.ondragend = function(event) { + RemoveToolbarEditEvents(); + SaveToolbar(); + AddEditToolbarEditEvents(); + } }); @@ -675,4 +1006,8 @@ function copyStringToClipboard(string) { // dummy functions function BindTabsSwitchingToMouseWheel() {} function GetFaviconAndTitle() {} -function RefreshMediaIcon() {} \ No newline at end of file +function RefreshMediaIcon() {} +function SetActiveTab() {} +function RefreshCounters() {} +function RefreshExpandStates() {} +function Loadi18n() {} \ No newline at end of file diff --git a/options/refresh.js b/options/refresh.js index 23e76a8..d0cbb92 100644 --- a/options/refresh.js +++ b/options/refresh.js @@ -13,6 +13,8 @@ function RefreshFields() { document.querySelectorAll("#scrollbar_size_indicator, #scrollbar_thumb, #scrollbar_thumb_hover, #scrollbar_track").forEach(function(s){ s.style.display = "none"; }); + } else { + document.getElementById("firefox_option_hide_other_groups_tabs_firefox").style.display = "none"; } if (browserId == "V") { let WebPanelUrlBox = document.getElementById("url_for_web_panel"); @@ -25,11 +27,13 @@ function RefreshFields() { document.querySelectorAll("#options_available_buttons, #sample_toolbar_block, #options_reset_toolbar_button").forEach(function(s){ s.style.display = ""; }); + document.getElementById("options_toolbar_look").style.display = ""; document.getElementById("field_show_toolbar").style.height = ""; } else{ document.querySelectorAll("#options_available_buttons, #sample_toolbar_block, #options_reset_toolbar_button").forEach(function(s){ s.style.display = "none"; }); + document.getElementById("options_toolbar_look").style.display = "none"; document.getElementById("field_show_toolbar").style.height = "6"; } } diff --git a/options/sample_tabs.js b/options/sample_tabs.js index b4593a6..e7b802d 100644 --- a/options/sample_tabs.js +++ b/options/sample_tabs.js @@ -52,7 +52,7 @@ function AppendSampleTabs() { document.getElementById("tab_title17").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_discarded_hover"); document.getElementById("tab_header17").classList.add("tab_header_hover"); - AppendTab({id: 19, pinned: false, discarded: true}, "5", false, false, true, false, false, "selected_tab", false, false, false); + AppendTab({id: 19, pinned: false, discarded: true}, "5", false, false, true, false, false, "selected_tab highlighted_drop_target after", false, false, false); document.getElementById("tab_title19").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_discarded_selected"); AppendTab({id: 20, pinned: false, discarded: true}, "5", false, false, true, false, false, "selected_tab", false, false, false); @@ -121,6 +121,11 @@ function AppendSampleTabs() { document.getElementById("tab_title37").textContent = chrome.i18n.getMessage("options_theme_tabs_sample_text_search_result_highlighted_selected_active_hover"); document.getElementById("tab_header37").classList.add("tab_header_hover"); + AddNewFolder("f_folder1", "cftab_list", caption_noname_group, 0, "o", "o", false); + AddNewFolder("f_folder2", "f_folder1", caption_noname_group, 0, "c", "c", false); + AddNewFolder("f_folder3", "f_folder1", caption_noname_group, 0, "c", "c", false); + + document.getElementById("_tab_list").classList.add("active_group"); } \ No newline at end of file diff --git a/options/theme.js b/options/theme.js deleted file mode 100644 index e31faed..0000000 --- a/options/theme.js +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright (c) 2017 kroppy. All rights reserved. -// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license -// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ - -function LoadTheme(themeName, reloadSidebar) { - - document.querySelectorAll(".theme_buttons").forEach(function(s){ - s.disabled = true; - }); - - chrome.storage.local.get(null, function(items) { - if (items.themes[themeName]) { - SelectedTheme = Object.assign({}, items.themes[themeName]); - current_theme = themeName; - } else { - SelectedTheme = Object.assign({}, DefaultTheme); - current_theme = ""; - } - setTimeout(function() { - document.getElementById("new_theme_name").value = themeName; - setTimeout(function() { - - SetToolbarEvents(true, false, false, ""); - RemoveToolbarEditEvents(); - - ApplySizeSet(SelectedTheme["TabsSizeSetNumber"]); - ApplyColorsSet(SelectedTheme["ColorsSet"]); - - document.getElementById("_gtetab_list").style.color = ""; - document.getElementById("_gtetab_list2").style.color = ""; - - document.getElementById("toolbar").innerHTML = SelectedTheme.toolbar; - document.getElementById("toolbar_unused_buttons").innerHTML = SelectedTheme.unused_buttons; - - if (browserId == "F") { - document.querySelectorAll("#button_load_bak1, #button_load_bak2, #button_load_bak3").forEach(function(s){ - s.parentNode.removeChild(s); - }); - } - - document.getElementById("show_toolbar").checked = SelectedTheme.ToolbarShow; - - if (SelectedTheme["TabsMargins"]) { - document.getElementById("tabs_margin_spacing")[SelectedTheme["TabsMargins"]].checked = true; - ApplyTabsMargins(SelectedTheme["TabsMargins"]); - } else { - document.getElementById("tabs_margin_spacing")["2"].checked = true; - } - - document.querySelectorAll(".on").forEach(function(s){ - s.classList.remove("on"); - }); - - SetToolbarEvents(false, false, true, "click"); - AddEditToolbarEditEvents(); - RefreshFields(); - RefreshGUI(); - if (reloadSidebar) { - chrome.runtime.sendMessage({command: "reload_theme", themeName: "theme"+themeName}); - } - - document.querySelectorAll(".theme_buttons").forEach(function(s){ - s.disabled = false; - }); - - }, 200); - }, 200); - }); -} -function SaveTheme(themeName) { - chrome.storage.local.get(null, function(items) { - let LSthemes = items.themes ? Object.assign({}, items.themes) : {}; - LSthemes[themeName] = Object.assign({}, SelectedTheme); - chrome.storage.local.set({themes: LSthemes}); - chrome.runtime.sendMessage({command: "reload_theme", themeName: "theme"+themeName}); - return SelectedTheme; - }); -} -function AddNewTheme() { - - let ThemeList = document.getElementById("theme_list"); - let ThemeNameBox = document.getElementById("new_theme_name"); - let NewName = ThemeNameBox.value; - - if (ThemeNameBox.value == "") { - alert(chrome.i18n.getMessage("options_theme_name_cannot_be_empty")); - return; - } - - document.getElementById("toolbar").innerHTML = DefaultToolbar; - - SelectedTheme = Object.assign({}, DefaultTheme); - SelectedTheme["ColorsSet"] = {}; - DefaultTheme["ColorsSet"] = {}; - - if (themes.indexOf(NewName) != -1) { - while (themes.indexOf(NewName) != -1) { - let matched = NewName.match(/\(\d+\)+/); - if (matched != null && matched.length > 0) { - NewName = NewName.replace(matched[0], ("(" + (parseInt(matched[0].match(/\d+/)[0]) + 1 ) + ")") ); - } else { - NewName = NewName + "(1)"; - } - } - } - - - ThemeNameBox.value = NewName; - SelectedTheme["theme_name"] = NewName; - - themes.push(NewName); - - let ThemeNameOption = document.createElement("option"); - - ThemeNameOption.value = NewName; - ThemeNameOption.text = NewName; - - ThemeList.add(ThemeNameOption); - ThemeList.selectedIndex = ThemeList.options.length-1; - - SaveTheme(NewName); - setTimeout(function() { - LoadTheme(NewName, true); - }, 50); - - chrome.storage.local.set({current_theme: NewName}); - RefreshFields(); -} -function DeleteSelectedTheme() { - chrome.storage.local.get(null, function(items) { - let LSthemes = items.themes ? Object.assign({}, items.themes) : {}; - - let ThemeList = document.getElementById("theme_list"); - - themes.splice(ThemeList.selectedIndex, 1); - if (LSthemes[current_theme]) { - delete LSthemes[current_theme]; - } - chrome.storage.local.set({themes: LSthemes}); - - ThemeList.remove(ThemeList.selectedIndex); - - current_theme = (ThemeList.options.length > 0) ? ThemeList.value : "Default"; - chrome.storage.local.set({current_theme: current_theme}); - if (ThemeList.options.length == 0) { - SelectedTheme = Object.assign({}, DefaultTheme); - SelectedTheme["ColorsSet"] = {}; - chrome.storage.local.set({themes: {}}); - setTimeout(function() { - chrome.runtime.sendMessage({command: "reload_theme", themeName: ""}); - }, 500); - } - LoadTheme(current_theme, true); - RefreshFields(); - }); -} -function RenameSelectedTheme() { - - let ThemeNameBox = document.getElementById("new_theme_name"); - - if (themes.indexOf(ThemeNameBox.value) != -1) { - alert(chrome.i18n.getMessage("options_there_is_a_theme_with_this_name")); - return; - } - if (ThemeNameBox.value == "") { - alert(chrome.i18n.getMessage("options_theme_name_cannot_be_empty")); - return; - } - chrome.storage.local.get(null, function(items) { - let LSthemes = items.themes ? Object.assign({}, items.themes) : {}; - SelectedTheme["theme_name"] = ThemeNameBox.value; - let ThemeList = document.getElementById("theme_list"); - ThemeList.options[ThemeList.selectedIndex].value = ThemeNameBox.value; - ThemeList.options[ThemeList.selectedIndex].text = ThemeNameBox.value; - LSthemes[ThemeNameBox.value] = SelectedTheme; - if (LSthemes[current_theme]) { - delete LSthemes[current_theme]; - } - current_theme = ThemeNameBox.value; - themes[ThemeList.selectedIndex] = ThemeNameBox.value; - chrome.storage.local.set({themes: LSthemes}); - chrome.storage.local.set({current_theme: current_theme}); - }); -} -function ImportTheme() { - var file = document.getElementById("import_theme"); - var fr = new FileReader(); - if (file.files[0] == undefined) return; - fr.readAsText(file.files[0]); - fr.onload = function() { - var data = fr.result; - file.parentNode.removeChild(file); - var themeObj = JSON.parse(data); - if (themeObj.theme_version > DefaultTheme["theme_version"]) { - alert(chrome.i18n.getMessage("options_loaded_theme_newer_version")); - } - if (themeObj.theme_version < DefaultTheme["theme_version"]) { - alert(chrome.i18n.getMessage("options_loaded_theme_older_version")); - } - if (themeObj.theme_version <= DefaultTheme["theme_version"]) { - SelectedTheme = Object.assign({}, DefaultTheme); - SelectedTheme["ColorsSet"] = {}; - for (var val in themeObj.ColorsSet) { - SelectedTheme["ColorsSet"][val] = themeObj.ColorsSet[val]; - } - SelectedTheme["ToolbarShow"] = themeObj.ToolbarShow; - SelectedTheme["TabsSizeSetNumber"] = themeObj.TabsSizeSetNumber; - SelectedTheme["theme_version"] = DefaultTheme["theme_version"]; - if (themeObj.theme_version == 1) { - SelectedTheme["ColorsSet"]["scrollbar_height"] = themeObj.ScrollbarPinList + "px"; - SelectedTheme["ColorsSet"]["scrollbar_width"] = themeObj.ScrollbarTabList + "px"; - } - if (themeObj.theme_version == 2) { - SelectedTheme["unused_buttons"] = themeObj["unused_buttons"]; - } - if (themeObj.theme_version == 3) { - SelectedTheme["TabsMargins"] = themeObj["TabsMargins"]; - } - if (themes.indexOf(themeObj.theme_name) == -1) { - SelectedTheme["theme_name"] = themeObj.theme_name; - } else { - let NewName = themeObj.theme_name; - while (themes.indexOf(NewName) != -1) { - let matched = NewName.match(/\(\d+\)+/); - if (matched != null && matched.length > 0) { - NewName = NewName.replace(matched[0], ("(" + (parseInt(matched[0].match(/\d+/)[0]) + 1 ) + ")") ); - } else { - NewName = NewName + "(1)"; - } - } - SelectedTheme["theme_name"] = NewName; - } - themes.push(SelectedTheme["theme_name"]); - SaveTheme(SelectedTheme["theme_name"]); - var ThemeList = document.getElementById("theme_list"); - var theme_name = document.createElement("option"); - theme_name.value = SelectedTheme["theme_name"]; - theme_name.text = theme_name.value; - ThemeList.add(theme_name); - ThemeList.selectedIndex = ThemeList.options.length-1; - current_theme = SelectedTheme["theme_name"]; - document.createElement("new_theme_name").value = current_theme; - setTimeout(function() { - LoadTheme(current_theme, true); - }, 500); - RefreshFields(); - DefaultTheme["ColorsSet"] = {}; - chrome.storage.local.set({current_theme: current_theme}); - } - } -} \ No newline at end of file diff --git a/scripts/backup.js b/scripts/backup.js index f60b42b..eb2d3f0 100644 --- a/scripts/backup.js +++ b/scripts/backup.js @@ -2,148 +2,304 @@ // Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ -function ExportGroup(filename) { - if (opt.debug) { - console.log("function: ExportGroup, filename "+filename); - } - let GroupToSave = { group: bggroups[active_group], folders: {}, tabs: [] }; - document.querySelectorAll("#"+active_group+" .folder").forEach(function(s){ +function ExportGroup(groupId, filename, save_to_manager) { + let GroupToSave = { group: bggroups[groupId], folders: {}, tabs: [] }; + document.querySelectorAll("#" + groupId + " .folder").forEach(function(s) { if (bgfolders[s.id]) { GroupToSave.folders[s.id] = bgfolders[s.id]; } }); - let Tabs = document.querySelectorAll("#"+active_group+" .tab"); + let Tabs = document.querySelectorAll("#" + groupId + " .tab"); if (Tabs.length > 0) { - let lastId = parseInt(Tabs[Tabs.length-1].id); - Tabs.forEach(function(s){ + let lastId = parseInt(Tabs[Tabs.length - 1].id); + Tabs.forEach(function(s) { chrome.tabs.get(parseInt(s.id), function(tab) { if ((tab.url).startsWith("www") || (tab.url).startsWith("http") || (tab.url).startsWith("ftp")) { - (GroupToSave.tabs).push( - { - id: tab.id, - parent: s.parentNode.parentNode.id, - index: Array.from(s.parentNode.children).indexOf(s), - expand: (s.classList.contains("c") ? "c" : (s.classList.contains("o") ? "o" : "")), - url: tab.url - } - ); + (GroupToSave.tabs).push({ + id: tab.id, + parent: s.parentNode.parentNode.id, + index: Array.from(s.parentNode.children).indexOf(s), + expand: (s.classList.contains("c") ? "c" : (s.classList.contains("o") ? "o" : "")), + url: tab.url + }); } - if (tab.id == lastId) { - // if (opt.debug) { - // console.log(GroupToSave); - // } - SaveFile(filename, GroupToSave); + if (filename) { + SaveFile(filename, "tt_group", GroupToSave); + } + if (save_to_manager) { + AddGroupToStorage(GroupToSave, true); + } + + if (opt.debug) { + log("f: ExportGroup, filename: "+filename+", groupId: "+groupId+", save_to_manager: "+save_to_manager); + } } }); }); + } else { + if (filename) { + SaveFile(filename, "tt_group", GroupToSave); + } + if (save_to_manager) { + AddGroupToStorage(GroupToSave, true); + } + + if (opt.debug) { + log("f: ExportGroup, filename: "+filename+", groupId: "+groupId+", save_to_manager: "+save_to_manager); + } + } + } -function ImportGroup() { - let file = document.getElementById("file_import_group"); + +function ImportGroup(recreate_group, save_to_manager) { + let file = document.getElementById("file_import"); let fr = new FileReader(); if (file.files[0] == undefined) return; fr.readAsText(file.files[0]); fr.onload = function() { let data = fr.result; + let group = JSON.parse(data); file.parentNode.removeChild(file); - let LoadedGroup = JSON.parse(data); - let NewFolders = {}; - let RefsTabs = {}; - let NewTabs = []; - let NewGroupId = AddNewGroup(LoadedGroup.group.name, LoadedGroup.group.font); - SetActiveGroup(NewGroupId, false, false); - for (var folder in LoadedGroup.folders) { - let newId = GenerateNewFolderID(); - NewFolders[folder] = { id: newId, parent: NewGroupId, index: (LoadedGroup.folders[folder].index), name: (LoadedGroup.folders[folder].name), expand: (LoadedGroup.folders[folder].expand) }; + if (recreate_group) { + RecreateGroup(group); } - for (var folder in NewFolders) { - if (NewFolders[LoadedGroup.folders[folder].parent]) { - NewFolders[folder].parent = NewFolders[LoadedGroup.folders[folder].parent].id; + if (save_to_manager) { + AddGroupToStorage(group, true); + } + + if (opt.debug) { + log("f: ImportGroup, recreate_group: "+recreate_group+", save_to_manager: "+save_to_manager); + } + } +} + +function AddGroupToStorage(group, add_to_manager) { + chrome.storage.local.get(null, function(storage) { + if (storage["hibernated_groups"] == undefined) { + let hibernated_groups = []; + hibernated_groups.push(group); + chrome.storage.local.set({ hibernated_groups: hibernated_groups }); + if (add_to_manager) { + AddGroupToManagerList(group); + } + } else { + let hibernated_groups = storage["hibernated_groups"]; + hibernated_groups.push(group); + chrome.storage.local.set({ hibernated_groups: hibernated_groups }); + if (add_to_manager) { + AddGroupToManagerList(group); } } - (LoadedGroup.tabs).forEach(function(Tab){ - chrome.tabs.create({url: Tab.url, active: false}, function(new_tab) { - if (new_tab) { - RefsTabs[Tab.id] = new_tab.id; - Tab.id = new_tab.id; - NewTabs.push(Tab); - setTimeout(function() { - let nt = document.getElementById(new_tab.id); - let NewGroupTabs = document.getElementById("ct"+NewGroupId); - if (nt != null && NewGroupTabs != null) { - NewGroupTabs.appendChild(nt); + if (opt.debug) { + // log("f: AddGroupToStorage, group: "+JSON.stringify(group)+", add_to_manager: "+add_to_manager); + log("f: AddGroupToStorage, add_to_manager: "+add_to_manager); + } + }); +} + + +function RecreateGroup(LoadedGroup) { + let NewFolders = {}; + let RefsTabs = {}; + let NewTabs = []; + let NewGroupId = AddNewGroup(LoadedGroup.group.name, LoadedGroup.group.font); + SetActiveGroup(NewGroupId, false, false); + for (var folder in LoadedGroup.folders) { + let newId = GenerateNewFolderID(); + NewFolders[folder] = { id: newId, parent: NewGroupId, index: (LoadedGroup.folders[folder].index), name: (LoadedGroup.folders[folder].name), expand: (LoadedGroup.folders[folder].expand) }; + } + for (var folder in NewFolders) { + if (NewFolders[LoadedGroup.folders[folder].parent]) { + NewFolders[folder].parent = NewFolders[LoadedGroup.folders[folder].parent].id; + } + } + (LoadedGroup.tabs).forEach(function(Tab) { + chrome.tabs.create({ url: Tab.url, active: false }, function(new_tab) { + if (new_tab) { + RefsTabs[Tab.id] = new_tab.id; + Tab.id = new_tab.id; + NewTabs.push(Tab); + setTimeout(function() { + let nt = document.getElementById(new_tab.id); + let NewGroupTabs = document.getElementById("ct" + NewGroupId); + if (nt != null && NewGroupTabs != null) { + NewGroupTabs.appendChild(nt); + } + }, 1000); + } + if (NewTabs.length == LoadedGroup.tabs.length - 1) { + setTimeout(function() { + NewTabs.forEach(function(LTab) { + if (LTab.parent == LoadedGroup.group.id) { + LTab.parent = NewGroupId; } - }, 1000); - } - if (NewTabs.length == LoadedGroup.tabs.length-1) { + if (NewFolders[LTab.parent]) { + LTab.parent = NewFolders[LTab.parent].id; + } + if (RefsTabs[LTab.parent]) { + LTab.parent = RefsTabs[LTab.parent]; + } + }); + setTimeout(function() { + RearrangeTreeStructure({}, NewFolders, NewTabs); + }, 1000); setTimeout(function() { - NewTabs.forEach(function(LTab) { - if (LTab.parent == LoadedGroup.group.id) { - LTab.parent = NewGroupId; - } - if (NewFolders[LTab.parent]) { - LTab.parent = NewFolders[LTab.parent].id; - } - if (RefsTabs[LTab.parent]) { - LTab.parent = RefsTabs[LTab.parent]; - } - }); RearrangeTreeStructure({}, NewFolders, NewTabs); }, 2000); - } - }); + setTimeout(function() { + RearrangeTreeStructure({}, NewFolders, NewTabs); + }, 5000); + }, 2000); + } }); - } + }); + + if (opt.debug) { + // log("f: RecreateGroup, LoadedGroup: "+JSON.stringify(LoadedGroup)+", NewFolders: "+JSON.stringify(NewFolders)+", NewTabs: "+JSON.stringify(NewTabs)); + log("f: RecreateGroup"); + } + } -function ExportSession(filename) { - chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(w) { - chrome.runtime.sendMessage({command: "get_browser_tabs"}, function(response) { - let tabs = Object.assign({}, response); - chrome.runtime.sendMessage({command: "get_windows"}, function(response) { - let windows = Object.assign({}, response); - let warn = true; - let ExportWindows = []; - w.forEach(function(CWin) { - if (CWin.tabs.length > 0) { - // if (CWin.tabs.length > 100 && warn) { - // alert(chrome.i18n.getMessage("warning_exporting_big_amount_of_tabs")); - // warn = false; - // } - windows[CWin.id]["id"] = CWin.id; - windows[CWin.id]["tabs"] = []; - CWin.tabs.forEach(function(CTab) { - if ((CTab.url).startsWith("www") || (CTab.url).startsWith("http") || (CTab.url).startsWith("ftp")) { - windows[CWin.id]["tabs"].push({id: CTab.id, url: CTab.url, parent: tabs[CTab.id].parent, index: tabs[CTab.id].index, expand: tabs[CTab.id].expand}); - } - }); - ExportWindows.push(windows[CWin.id]); + + +function ExportSession(name, save_to_file, save_to_manager, save_to_autosave_manager) { + chrome.windows.getAll({ windowTypes: ['normal'], populate: true }, function(w) { + chrome.runtime.sendMessage({ command: "get_browser_tabs" }, function(response) { + let tabs = Object.assign({}, response); + chrome.runtime.sendMessage({ command: "get_windows" }, function(response) { + let windows = Object.assign({}, response); + let warn = true; + let ExportWindows = []; + w.forEach(function(CWin) { + if (CWin.tabs.length > 0) { + windows[CWin.id]["id"] = CWin.id; + windows[CWin.id]["tabs"] = []; + CWin.tabs.forEach(function(CTab) { + if ((CTab.url).startsWith("www") || (CTab.url).startsWith("http") || (CTab.url).startsWith("ftp")) { + windows[CWin.id]["tabs"].push({ id: CTab.id, url: CTab.url, parent: tabs[CTab.id].parent, index: tabs[CTab.id].index, expand: tabs[CTab.id].expand }); + } + }); + ExportWindows.push(windows[CWin.id]); + } + }); + if (save_to_file) { + SaveFile(name, "tt_session", ExportWindows); } + if (save_to_manager) { + AddSessionToStorage(ExportWindows, name, true); + } + if (save_to_autosave_manager) { + AddAutosaveSessionToStorage(ExportWindows, name) + } + + if (opt.debug) { + // log("f: ExportSession, name: "+name+", session: "+JSON.stringify(ExportWindows)+", save_to_file: "+save_to_file+", save_to_manager: "+save_to_manager+", save_to_autosave_manager: "+save_to_autosave_manager); + log("f: ExportSession, name: "+name+", save_to_file: "+save_to_file+", save_to_manager: "+save_to_manager+", save_to_autosave_manager: "+save_to_autosave_manager); + } + }); - SaveFile(filename, ExportWindows); - }); }); }); } -function ImportSession() { - let file = document.getElementById("file_import_backup"); + +function ImportSession(recreate_session, save_to_manager, merge_session) { + let file = document.getElementById("file_import"); let fr = new FileReader(); if (file.files[0] == undefined) return; - fr.readAsText(file.files[file.files.length-1]); + fr.readAsText(file.files[file.files.length - 1]); + fr.onload = function() { let data = fr.result; file.parentNode.removeChild(file); - let LoadedWindows = JSON.parse(data); - let RefsTabs = {}; - if (opt.debug) console.log(LoadedWindows); - LoadedWindows.forEach(function(LWin) { - let NewTabs = []; - let urls = []; - (LWin.tabs).forEach(function(Tab) { + + let LoadedSession = JSON.parse(data); + + if (opt.debug) { + // log("f: ImportSession, session: "+data+", recreate_session: "+recreate_session+", merge_session: "+merge_session); + log("f: ImportSession, recreate_session: "+recreate_session+", merge_session: "+merge_session); + } + + if (recreate_session) { + RecreateSession(LoadedSession); + } + if (merge_session) { + ImportMergeTabs(LoadedSession); + } + if (save_to_manager) { + AddSessionToStorage(LoadedSession, (file.files[file.files.length - 1].name).replace(".tt_session", ""), true); + } + } +} + +function AddSessionToStorage(session, name, add_to_manager) { + chrome.storage.local.get(null, function(storage) { + if (storage.saved_sessions == undefined) { + let saved_sessions = []; + saved_sessions.push({ name: name, session: session }); + chrome.storage.local.set({ saved_sessions: saved_sessions }); + if (add_to_manager) { + AddSessionToManagerList(saved_sessions[saved_sessions.length - 1]); + } + } else { + let saved_sessions = storage.saved_sessions; + saved_sessions.push({ name: name, session: session }); + + chrome.storage.local.set({ saved_sessions: saved_sessions }); + if (add_to_manager) { + AddSessionToManagerList(saved_sessions[saved_sessions.length - 1]); + } + } + + if (opt.debug) { + // log("f: AddSessionToStorage, name: "+name+", add_to_manager: "+add_to_manager+", session: "+JSON.stringify(session)); + log("f: AddSessionToStorage, name: "+name+", add_to_manager: "+add_to_manager); + } + }); + +} + +function AddAutosaveSessionToStorage(session, name) { + chrome.storage.local.get(null, function(storage) { + if (storage.saved_sessions_automatic == undefined) { + let s = []; + s.push({ name: name, session: session }); + chrome.storage.local.set({ saved_sessions_automatic: s }); + } else { + let s = storage.saved_sessions_automatic; + s.unshift({ name: name, session: session }); + if (s[opt.autosave_max_to_keep]) { + s.splice(opt.autosave_max_to_keep, (s.length - opt.autosave_max_to_keep)); + } + chrome.storage.local.set({ saved_sessions_automatic: s }); + } + + if (opt.debug) { + // log("f: AddAutosaveSessionToStorage, name: "+name+", session: "+JSON.stringify(session)); + log("f: AddAutosaveSessionToStorage, name: "+name); + } + }); +} + + + +function RecreateSession(LoadedSession) { + let RefsTabs = {}; + + if (opt.debug) { + // log("f: RecreateSession, session: "+JSON.stringify(LoadedSession)); + log("f: RecreateSession"); + } + + LoadedSession.forEach(function(LWin) { + let NewTabs = []; + let urls = []; + (LWin.tabs).forEach(function(Tab) { urls.push(Tab.url); NewTabs.push(Tab); - }); - chrome.windows.create({url: urls}, function(new_window) { + }); + chrome.windows.create({ url: urls }, function(new_window) { for (let tInd = 0; tInd < new_window.tabs.length; tInd++) { RefsTabs[NewTabs[tInd].id] = new_window.tabs[tInd].id; NewTabs[tInd].id = new_window.tabs[tInd].id; @@ -151,12 +307,12 @@ function ImportSession() { for (let tInd = 0; tInd < new_window.tabs.length; tInd++) { if (RefsTabs[NewTabs[tInd].parent] != undefined) { NewTabs[tInd].parent = RefsTabs[NewTabs[tInd].parent]; - } + } } let HaveResponse; let GiveUp = 0; var Append = setInterval(function() { - chrome.runtime.sendMessage({command: "remote_update", groups: LWin.groups, folders: LWin.folders, tabs: NewTabs, windowId: new_window.id}, function(response) { + chrome.runtime.sendMessage({ command: "remote_update", groups: LWin.groups, folders: LWin.folders, tabs: NewTabs, windowId: new_window.id }, function(response) { HaveResponse = response; }); if (HaveResponse || GiveUp > 900) { @@ -164,13 +320,17 @@ function ImportSession() { } GiveUp++; }, 2000); - }); }); - } + }); } + + function RearrangeTreeStructure(groups, folders, tabs) { // groups and folders are in object, just like bggroups and bgfolders, but tabs are in array of bgtreetabs objects - if (opt.debug) console.log("function: RearrangeTreeStructure"); - chrome.tabs.query({currentWindow: true}, function(ChromeTabs) { + if (opt.debug) { + log("f: RearrangeTreeStructure"); + } + + chrome.tabs.query({ currentWindow: true }, function(ChromeTabs) { if (groups && Object.keys(groups).length > 0) { for (var group in groups) { bggroups[groups[group].id] = Object.assign({}, groups[group]); @@ -186,17 +346,17 @@ function RearrangeTreeStructure(groups, folders, tabs) { // groups and folders a let bgtabs = {}; tabs.forEach(function(Tab) { if (Tab.parent == "pin_list") { - chrome.tabs.update(Tab.id, {pinned: true}); + chrome.tabs.update(Tab.id, { pinned: true }); } let tb = document.getElementById(Tab.id); - let tbp = document.getElementById("ct"+Tab.parent); + let tbp = document.getElementById("ct" + Tab.parent); if (tb != null && tbp != null) { tbp.appendChild(tb); if (Tab.expand != "") { tb.classList.add(Tab.expand); } } - bgtabs[Tab.id] = {index: Tab.index, parent: Tab.parent, expand: Tab.expand}; + bgtabs[Tab.id] = { index: Tab.index, parent: Tab.parent, expand: Tab.expand }; }); RearrangeTreeTabs(ChromeTabs, bgtabs, true); RearrangeFolders(true); @@ -209,68 +369,108 @@ function RearrangeTreeStructure(groups, folders, tabs) { // groups and folders a }, 1000); }); } -function ImportMergeTabs() { - if (opt.debug) console.log("function: ImportMergeTabs"); - let file = document.getElementById("file_import_merge_backup"); - let fr = new FileReader(); - if (file.files[0] == undefined) return; - fr.readAsText(file.files[0]); - fr.onload = function() { - let data = fr.result; - file.parentNode.removeChild(file); - let lw = JSON.parse(data); - let RefsWins = {}; - let RefsTabs = {}; - for (let LWI = 0; LWI < lw.length; LWI++) { // clear previous window ids - lw[LWI].id = ""; - } - if (opt.debug) console.log(lw); - chrome.windows.getAll({windowTypes: ['normal'], populate: true}, function(cw) { - for (let CWI = 0; CWI < cw.length; CWI++) { // loop Windows - for (let LWI = 0; LWI < lw.length; LWI++) { // loop Loaded Windows - let tabsMatch = 0; - for (let CTI = 0; CTI < cw[CWI].tabs.length; CTI++) { // loop Tabs of each Current Window - for (let LTI = 0; LTI < lw[LWI].tabs.length; LTI++) { // loop Tabs of each Loaded Window - if (cw[CWI].tabs[CTI].url == lw[LWI].tabs[LTI].url) { - RefsTabs[lw[LWI].tabs[LTI].id] = cw[CWI].tabs[CTI].id; - lw[LWI].tabs[LTI].id = cw[CWI].tabs[CTI].id; - lw[LWI].tabs[LTI].url = ""; - tabsMatch++; - break; - } + +function ImportMergeTabs(LoadedSession) { + if (opt.debug) { + // log("f: ImportMergeTabs, session: "+JSON.stringify(LoadedSession)); + log("f: ImportMergeTabs"); + } + let RefsWins = {}; + let RefsTabs = {}; + for (let LWI = 0; LWI < LoadedSession.length; LWI++) { // clear previous window ids + LoadedSession[LWI].id = ""; + } + chrome.windows.getAll({ windowTypes: ['normal'], populate: true }, function(cw) { + for (let CWI = 0; CWI < cw.length; CWI++) { // loop Windows + for (let LWI = 0; LWI < LoadedSession.length; LWI++) { // loop Loaded Windows + let tabsMatch = 0; + for (let CTI = 0; CTI < cw[CWI].tabs.length; CTI++) { // loop Tabs of each Current Window + for (let LTI = 0; LTI < LoadedSession[LWI].tabs.length; LTI++) { // loop Tabs of each Loaded Window + if (cw[CWI].tabs[CTI].url == LoadedSession[LWI].tabs[LTI].url) { + RefsTabs[LoadedSession[LWI].tabs[LTI].id] = cw[CWI].tabs[CTI].id; + LoadedSession[LWI].tabs[LTI].id = cw[CWI].tabs[CTI].id; + LoadedSession[LWI].tabs[LTI].url = ""; + tabsMatch++; + break; } } - if (opt.debug) console.log(tabsMatch); - if (tabsMatch > lw[LWI].tabs.length*0.8) { - lw[LWI].id = cw[CWI].id; - break; - } + } + if (opt.debug) { + log("f: ImportMergeTabs, tabsMatch: "+tabsMatch); + } + if (tabsMatch > LoadedSession[LWI].tabs.length * 0.6) { + LoadedSession[LWI].id = cw[CWI].id; + break; } } - if (opt.debug) console.log(lw); - lw.forEach(function(w) { - if (w.id == "") { // missing window, lets make one - if (opt.debug) console.log("missing window"); - let NewTabs = []; - let urls = []; - (w.tabs).forEach(function(Tab) { - urls.push(Tab.url); + } + + LoadedSession.forEach(function(w) { + if (w.id == "") { // missing window, lets make one + if (opt.debug) { + log("f: ImportMergeTabs, missing window"); + } + + let NewTabs = []; + let urls = []; + (w.tabs).forEach(function(Tab) { + urls.push(Tab.url); + NewTabs.push(Tab); + }); + chrome.windows.create({ url: urls }, function(new_window) { + for (let tInd = 0; tInd < new_window.tabs.length; tInd++) { + RefsTabs[NewTabs[tInd].id] = new_window.tabs[tInd].id; + NewTabs[tInd].id = new_window.tabs[tInd].id; + } + for (let tInd = 0; tInd < new_window.tabs.length; tInd++) { + if (RefsTabs[NewTabs[tInd].parent] != undefined) { + NewTabs[tInd].parent = RefsTabs[NewTabs[tInd].parent]; + } + } + let HaveResponse; + let GiveUp = 0; + var Append = setInterval(function() { + chrome.runtime.sendMessage({ command: "remote_update", groups: w.groups, folders: w.folders, tabs: NewTabs, windowId: new_window.id }, function(response) { + HaveResponse = response; + }); + if (HaveResponse || GiveUp > 900) { + clearInterval(Append); + } + GiveUp++; + }, 2000); + }); + } else { // window exists, lets add missing tabs + if (opt.debug) { + log("f: ImportMergeTabs, window exists"); + } + + let NewTabs = []; + (w.tabs).forEach(function(Tab) { + if (Tab.url != "") { // missing tab, lets make one + chrome.tabs.create({ url: Tab.url, windowId: w.id }, function(tab) { + Tab.id = tab.id; + RefsTabs[tab.id] = tab.id; + NewTabs.push(Tab); + }); + } else { NewTabs.push(Tab); - }); - chrome.windows.create({url: urls}, function(new_window) { - for (let tInd = 0; tInd < new_window.tabs.length; tInd++) { - RefsTabs[NewTabs[tInd].id] = new_window.tabs[tInd].id; - NewTabs[tInd].id = new_window.tabs[tInd].id; - } - for (let tInd = 0; tInd < new_window.tabs.length; tInd++) { - if (RefsTabs[NewTabs[tInd].parent] != undefined) { - NewTabs[tInd].parent = RefsTabs[NewTabs[tInd].parent]; - } + } + }); + setTimeout(function() { + for (let tInd = 0; tInd < NewTabs.length; tInd++) { + if (RefsTabs[NewTabs[tInd].parent] != undefined) { + NewTabs[tInd].parent = RefsTabs[NewTabs[tInd].parent]; } + } + }, 4000); + setTimeout(function() { + if (w.id == CurrentWindowId) { + RearrangeTreeStructure(w.groups, w.folders, NewTabs); + } else { let HaveResponse; let GiveUp = 0; var Append = setInterval(function() { - chrome.runtime.sendMessage({command: "remote_update", groups: w.groups, folders: w.folders, tabs: NewTabs, windowId: new_window.id}, function(response) { + chrome.runtime.sendMessage({ command: "remote_update", groups: w.groups, folders: w.folders, tabs: NewTabs, windowId: w.id }, function(response) { HaveResponse = response; }); if (HaveResponse || GiveUp > 900) { @@ -278,49 +478,30 @@ function ImportMergeTabs() { } GiveUp++; }, 2000); - }); - } - else - { // window exists, lets add missing tabs - if (opt.debug) console.log("window exists"); - let NewTabs = []; - (w.tabs).forEach(function(Tab) { - if (Tab.url != "") { // missing tab, lets make one - chrome.tabs.create({url: Tab.url, windowId: w.id}, function(tab) { - Tab.id = tab.id; - RefsTabs[tab.id] = tab.id; - NewTabs.push(Tab); - }); - } else { - NewTabs.push(Tab); - } - }); - setTimeout(function() { - for (let tInd = 0; tInd < NewTabs.length; tInd++) { - if (RefsTabs[NewTabs[tInd].parent] != undefined) { - NewTabs[tInd].parent = RefsTabs[NewTabs[tInd].parent]; - } - } - }, 4000); - setTimeout(function() { - if (w.id == CurrentWindowId) { - RearrangeTreeStructure(w.groups, w.folders, NewTabs); - } else { - let HaveResponse; - let GiveUp = 0; - var Append = setInterval(function() { - chrome.runtime.sendMessage({command: "remote_update", groups: w.groups, folders: w.folders, tabs: NewTabs, windowId: w.id}, function(response) { - HaveResponse = response; - }); - if (HaveResponse || GiveUp > 900) { - clearInterval(Append); - } - GiveUp++; - }, 2000); - } - }, 6000); - } - }); + } + }, 6000); + } }); - } + }); +} + + +function StartAutoSaveSession() { + if (opt.autosave_interval > 0 && opt.autosave_max_to_keep > 0) { + AutoSaveSession = setInterval(function() { + if (opt.debug) { + log("f: AutoSaveSession, loop time is: "+opt.autosave_interval); + } + + let d = new Date(); + ExportSession((d.toLocaleString().replace("/", ".").replace("/", ".").replace(":", "꞉").replace(":", "꞉")), false, false, true); + + if (document.getElementById("manager_window").style.top != "-500px") { + chrome.storage.local.get(null, function(storage) { + ReAddSessionAutomaticToManagerList(storage); + }); + } + + }, opt.autosave_interval * 60000); + } } \ No newline at end of file diff --git a/scripts/chrome.js b/scripts/chrome.js index 3aa49ad..2112ad0 100644 --- a/scripts/chrome.js +++ b/scripts/chrome.js @@ -5,6 +5,7 @@ // ********** CHROME EVENTS *************** function StartChromeListeners() { + if (browserId == "F") { browser.browserAction.onClicked.addListener(function(tab) { if (tab.windowId == CurrentWindowId) { @@ -12,168 +13,265 @@ function StartChromeListeners() { } }); } + chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { + if (message.command == "backup_available") { - if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); - document.getElementById("button_load_bak"+message.bak).classList.remove("disabled"); - } - if (message.command == "drag_drop") { - if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); - if (opt.debug) console.log(message); - DragAndDrop.ComesFromWindowId = message.ComesFromWindowId; - DragAndDrop.DragNodeClass = message.DragNodeClass; - DragAndDrop.Depth = message.Depth; - DragAndDrop.Folders = Object.assign({}, message.Folders); - DragAndDrop.FoldersSelected = message.FoldersSelected; - DragAndDrop.TabsIds = message.TabsIds; - DragAndDrop.TabsIdsParents = message.TabsIdsParents; - DragAndDrop.TabsIdsSelected = message.TabsIdsSelected; - DropTargetsFront(undefined, true, false); - } - if (message.command == "dropped") { - if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); - if (opt.debug) console.log(message); - DragAndDrop.DroppedToWindowId = message.DroppedToWindowId; - if (Object.keys(DragAndDrop.Folders).length > 0 && message.DroppedToWindowId != CurrentWindowId) { - for (var folder in DragAndDrop.Folders) - { - RemoveFolder(DragAndDrop.Folders[folder].id); - } + if (opt.debug) { + log("message to sidebar "+CurrentWindowId+": message: "+message.command); + } + let BAKbutton = document.getElementById("button_load_bak"+message.bak); + if (BAKbutton != null) { + BAKbutton.classList.remove("disabled"); } } - if (message.command == "dragend") { + + if (message.command == "drag_drop") { + if (opt.debug) { + log("message to sidebar "+CurrentWindowId+": message: "+message.command); + } CleanUpDragClasses(); + DragNodeClass = message.DragNodeClass; + DragTreeDepth = Object.assign(0, message.DragTreeDepth); } + + if (message.command == "dragend") { + if (opt.debug) { + log("message to sidebar "+CurrentWindowId+": message: "+message.command); + } + CleanUpDragClasses(); + EmptyDragAndDrop(); + } + + if (message.command == "remove_folder") { + if (opt.debug) { + log("message to sidebar "+CurrentWindowId+": message: "+message.command+" folderId: "+message.folderId); + } + RemoveFolder(message.folderId); + } + if (message.command == "reload_sidebar") { - if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); - if (opt.debug) console.log(message); + if (opt.debug) { + log("message to sidebar "+CurrentWindowId+": message: "+message.command); + } window.location.reload(); } + if (message.command == "reload_options") { - if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); - chrome.runtime.sendMessage({command: "get_preferences"}, function(response) { - opt = Object.assign({}, response); - setTimeout(function() { - RestorePinListRowSettings(); - }, 200); - }); - } - if (message.command == "reload_theme") { - if (opt.debug) console.log("message to sidebar "+CurrentWindowId+": message: "+message.command); + if (opt.debug) { + log("message to sidebar "+CurrentWindowId+": message: "+message.command); + } + opt = Object.assign({}, message.opt); setTimeout(function() { - chrome.runtime.sendMessage({command: "get_theme", windowId: CurrentWindowId}, function(response) { - RestorePinListRowSettings(); - let theme = response; - ApplyTheme(theme); - }); - }, 300); + RestorePinListRowSettings(); + }, 100); } + + if (message.command == "reload_toolbar") { + if (opt.debug) { + log("message to sidebar "+CurrentWindowId+": message: "+message.command); + } + opt = Object.assign({}, message.opt); + + if (opt.show_toolbar) { + RemoveToolbar(); + RecreateToolbar(message.toolbar); + SetToolbarEvents(false, true, true, "mousedown"); + RestoreToolbarShelf(); + RestoreToolbarSearchFilter(); + } else { + RemoveToolbar(); + } + RefreshGUI(); + } + + if (message.command == "reload_theme") { + if (opt.debug) { + log("message to sidebar "+CurrentWindowId+": message: "+message.command); + } + RestorePinListRowSettings(); + ApplyTheme(message.theme); + } + if (message.windowId == CurrentWindowId) { // I WANT TO MOVE THIS LOGIC TO THE BACKGROUND SCRIPT! - if (message.command == "tab_created") { // if set to treat unparented tabs as active tab's child - - if (opt.debug) console.log("tab_created: "+message.tabId); - if (opt.debug) console.log("tab is pinned: "+message.tab.pinned); + if (message.command == "tab_created") { - if (message.parentTabId != undefined) { - AppendTab(message.tab, message.parentTabId, false, false, true, message.index, true, false, false, true, false); - } else { - if (opt.append_orphan_tab == "as_child" && message.tab.openerTabId == undefined && document.querySelector("#"+active_group+" .active_tab")) { - if (opt.debug) console.log("ignore orphan case, append tab as child"); - message.tab.openerTabId = document.querySelector("#"+active_group+" .active_tab").id; + chrome.tabs.get(message.tabId, function(NewTab) { // get tab again as reported tab's url is empty! Also for some reason firefox sends tab with "active == false" even if tab is active (THIS IS POSSIBLY A NEW BUG IN FF 60.01!) + if (opt.debug) { + log("chrome event: tab_created: "+message.tabId); } - if (message.tab.openerTabId) { // child case - if (opt.append_child_tab == "after_active") { - if (opt.debug) console.log("child case, tab will append after active"); - AppendTab(message.tab, false, false, document.querySelector("#"+active_group+" .active_tab") != null ? document.querySelector("#"+active_group+" .active_tab").id : false, false, false, true, false, false, true, false); + + if (opt.move_tabs_on_url_change == "from_empty_b" && NewTab.url == newTabUrl) { + EmptyTabs.push(message.tabId); + } + + if (document.getElementById(message.tabId) == null) { + + if (opt.move_tabs_on_url_change == "from_empty" && NewTab.url == newTabUrl) { + EmptyTabs.push(message.tabId); + } + + if (message.parentTabId != undefined) { + AppendTab(NewTab, message.parentTabId, false, false, true, message.index, true, false, false, true, false); } else { - let Parents = GetParentsByClass(document.getElementById(message.tab.openerTabId), "tab"); - if (opt.max_tree_depth < 0 || (opt.max_tree_depth > 0 && Parents.length < opt.max_tree_depth)) { // append to tree - if (opt.append_child_tab == "top") { - if (opt.debug) console.log("child case, in tree limit, tab will append on top"); - AppendTab(message.tab, message.tab.openerTabId, false, false, (message.tab.pinned ? true : false), false, true, false, false, true, false); - } - if (opt.append_child_tab == "bottom") { - if (opt.debug) console.log("child case, in tree limit, tab will append on bottom"); - AppendTab(message.tab, message.tab.openerTabId, false, false, true, false, true, false, false, true, false); + if (opt.append_orphan_tab == "as_child" && NewTab.openerTabId == undefined && document.querySelector("#"+active_group+" .active_tab")) { + if (opt.debug) { + log("tab_created: as_child, ignores orphan case, appending tab as child"); } + NewTab.openerTabId = document.querySelector("#"+active_group+" .active_tab").id; } - if (opt.max_tree_depth > 0 && Parents.length >= opt.max_tree_depth) { // if reached depth limit of the tree - if (opt.debug) console.log("child case, surpassed tree limit"); - if (opt.append_child_tab_after_limit == "after") { - if (opt.debug) console.log("tab will append after active"); - AppendTab(message.tab, false, false, message.tab.openerTabId, true, false, true, false, false, true, false); + if (NewTab.openerTabId) { // child case + if (opt.append_child_tab == "after_active") { + if (opt.debug) { + log("tab_created: child case, tab will append after active, openerTabId: "+NewTab.openerTabId); + } + AppendTab(NewTab, false, false, document.querySelector("#"+active_group+" .active_tab") != null ? document.querySelector("#"+active_group+" .active_tab").id : false, false, false, true, false, false, true, false); + } else { + let Parents = GetParentsByClass(document.getElementById(NewTab.openerTabId), "tab"); + if (opt.max_tree_depth < 0 || (opt.max_tree_depth > 0 && Parents.length < opt.max_tree_depth)) { // append to tree + if (opt.append_child_tab == "top") { + if (opt.debug) { + log("tab_created: child case, in tree limit, tab will append on top, openerTabId: "+NewTab.openerTabId); + } + AppendTab(NewTab, NewTab.openerTabId, false, false, (NewTab.pinned ? true : false), false, true, false, false, true, false); + } + if (opt.append_child_tab == "bottom") { + if (opt.debug) { + log("tab_created: child case, in tree limit, tab will append on bottom, openerTabId: "+NewTab.openerTabId); + } + AppendTab(NewTab, NewTab.openerTabId, false, false, true, false, true, false, false, true, false); + } + } + if (opt.max_tree_depth > 0 && Parents.length >= opt.max_tree_depth) { // if reached depth limit of the tree + if (opt.debug) { + log("tab_created: child case, surpassed tree limit, openerTabId: "+NewTab.openerTabId); + } + if (opt.append_child_tab_after_limit == "after") { + if (opt.debug) { + log("tab_created: tab will append after active, openerTabId: "+NewTab.openerTabId); + } + AppendTab(NewTab, false, false, NewTab.openerTabId, true, false, true, false, false, true, false); + } + if (opt.append_child_tab_after_limit == "top") { + if (opt.debug) { + log("tab_created: tab will append on top, openerTabId: "+NewTab.openerTabId); + } + AppendTab(NewTab, document.getElementById(NewTab.openerTabId).parentNode.parentNode.id, false, false, (NewTab.pinned ? true : false), false, true, false, false, true, false); + } + if (opt.append_child_tab_after_limit == "bottom") { + if (opt.debug) { + log("tab_created: tab will append on bottom, openerTabId: "+NewTab.openerTabId); + } + AppendTab(NewTab, document.getElementById(NewTab.openerTabId).parentNode.parentNode.id, false, false, true, false, true, false, false, true, false); + } + } } - if (opt.append_child_tab_after_limit == "top") { - if (opt.debug) console.log("tab will append on top"); - AppendTab(message.tab, document.getElementById(message.tab.openerTabId).parentNode.parentNode.id, false, false, (message.tab.pinned ? true : false), false, true, false, false, true, false); + if (opt.max_tree_depth == 0) { // place tabs flat + if (opt.debug) { + log("tab_created: max_tree_depth is 0, tabs are placed on the same level"); + } + if (opt.append_child_tab_after_limit == "after") { + if (opt.debug) { + log("tab_created: tab will append after active"); + } + AppendTab(NewTab, false, false, NewTab.openerTabId, false, false, true, false, false, true, false); + } + if (opt.append_child_tab_after_limit == "top") { + if (opt.debug) { + log("tab_created: tab will append on top"); + } + AppendTab(NewTab, false, false, false, false, false, true, false, false, true, false); + } + if (opt.append_child_tab_after_limit == "bottom") { + if (opt.debug) { + log("tab_created: tab will append on bottom"); + } + AppendTab(NewTab, false, false, false, true, false, true, false, false, true, false); + } } - if (opt.append_child_tab_after_limit == "bottom") { - if (opt.debug) console.log("tab will append on bottom"); - AppendTab(message.tab, document.getElementById(message.tab.openerTabId).parentNode.parentNode.id, false, false, true, false, true, false, false, true, false); + } else { // orphan case + + // if set to append orphan tabs to ungrouped group + // if tab is still not present, basically, not opened by OpenNewTab(), it will switch to ungrouped group + // if (opt.orphaned_tabs_to_ungrouped === true && document.getElementById(message.tabId) == null && !NewTab.pinned) { + if (opt.orphaned_tabs_to_ungrouped === true && !NewTab.pinned) { + if (opt.debug) { + log("tab_created: orphan case, orphaned tab goes to ungrouped"); + } + if (active_group != "tab_list") { + SetActiveGroup("tab_list", false, false); + } + } + + if (opt.append_orphan_tab == "after_active") { + if (opt.debug) { + log("tab_created: orphan case, appending tab after active"); + } + AppendTab(NewTab, false, false, (document.querySelector("#"+active_group+" .active_tab") != null ? document.querySelector("#"+active_group+" .active_tab").id : undefined), (NewTab.pinned ? true : false), false, true, false, false, true, false); + } + if (opt.append_orphan_tab == "top") { + if (opt.debug) { + log("tab_created: orphan case, appending tab on top"); + } + AppendTab(NewTab, false, false, false, false, false, true, false, false, true, false); + } + if (opt.append_orphan_tab == "bottom" || opt.append_orphan_tab == "as_child") { + if (opt.debug) { + log("tab_created: orphan case, appending tab on bottom"); + } + AppendTab(NewTab, false, false, false, true, false, true, false, false, true, false); } } } - if (opt.max_tree_depth == 0) { // place tabs flat - if (opt.debug) console.log("max_tree_depth is 0, tabs are placed on the same level"); - if (opt.append_child_tab_after_limit == "after") { - if (opt.debug) console.log("tab will append after active"); - AppendTab(message.tab, false, false, message.tab.openerTabId, false, false, true, false, false, true, false); - } - if (opt.append_child_tab_after_limit == "top") { - if (opt.debug) console.log("tab will append on top"); - AppendTab(message.tab, false, false, false, false, false, true, false, false, true, false); - } - if (opt.append_child_tab_after_limit == "bottom") { - if (opt.debug) console.log("tab will append on bottom"); - AppendTab(message.tab, false, false, false, true, false, true, false, false, true, false); + if (opt.move_tabs_on_url_change === "all_new") { + AppendTabToGroupOnRegexMatch(message.tabId, NewTab.url); + } + + if (NewTab.openerTabId) { // check if openerTabId is defined, if it's in DOM and if it's closed, then change it to open + let openerTab = document.querySelector(".c[id='"+NewTab.openerTabId+"']"); + if (openerTab != null) { + openerTab.classList.remove("c"); + openerTab.classList.add("o"); } } - } else { // orphan case - if (opt.append_orphan_tab == "after_active") { - AppendTab(message.tab, false, false, (document.querySelector("#"+active_group+" .active_tab") != null ? document.querySelector("#"+active_group+" .active_tab").id : undefined), (message.tab.pinned ? true : false), false, true, false, false, true, false); - } - if (opt.append_orphan_tab == "top") { - AppendTab(message.tab, false, false, false, false, false, true, false, false, true, false); - } - if (opt.append_orphan_tab == "bottom" || opt.append_orphan_tab == "as_child") { - AppendTab(message.tab, false, false, false, true, false, true, false, false, true, false); + if (opt.syncro_tabbar_tabs_order) { + let tabIds = Array.prototype.map.call(document.querySelectorAll(".pin, .tab"), function(s){ + return parseInt(s.id); + }); + chrome.tabs.move(message.tabId, {index: tabIds.indexOf(message.tabId)}); } + + RefreshExpandStates(); + setTimeout(function() { + schedule_update_data++; + }, 500); + setTimeout(function() { + RefreshCounters(); + RefreshGUI(); + },50); } - } - - if (message.tab.openerTabId) { // check if openerTabId is defined, if it's in DOM and if it's closed, then change it to open - let openerTab = document.querySelector(".c[id='"+message.tab.openerTabId+"']"); - if (openerTab != null) { - openerTab.classList.remove("c"); - openerTab.classList.add("o"); - } - } - if (opt.syncro_tabbar_tabs_order) { - let tabIds = Array.prototype.map.call(document.querySelectorAll(".pin, .tab"), function(s){ - return parseInt(s.id); - }); - chrome.tabs.move(message.tab.id, {index: tabIds.indexOf(message.tab.id)}); - } - RefreshExpandStates(); - schedule_update_data++; - RefreshGUI(); - RefreshCounters(); + }); return; } if (message.command == "tab_attached") { - if (opt.debug) console.log(message); + if (opt.debug) { + log("chrome event: "+message.command+", tabId: "+message.tabId+", tab is pinned: "+message.tab.pinned+", ParentId: "+message.ParentId); + } AppendTab(message.tab, message.ParentId, false, false, true, false, true, false, false, true, false); RefreshGUI(); return; } if (message.command == "tab_detached") { - let ctDetachedParent = document.getElementById(message.tabId).childNodes[4]; + if (opt.debug) { + log("chrome event: "+message.command+ ", tabId: " + message.tabId); + } + let ctDetachedParent = document.getElementById(message.tabId).childNodes[1]; if (ctDetachedParent != null) { if (opt.promote_children_in_first_child == true && ctDetachedParent.childNodes.length > 1) { - let ctNewParent = document.getElementById(ctDetachedParent.firstChild.id).childNodes[4]; + let ctNewParent = document.getElementById(ctDetachedParent.firstChild.id).childNodes[1]; ctDetachedParent.parentNode.parentNode.insertBefore(ctDetachedParent.firstChild, ctDetachedParent.parentNode); while (ctDetachedParent.firstChild) { ctNewParent.appendChild(ctDetachedParent.firstChild); @@ -192,14 +290,23 @@ function StartChromeListeners() { return; } if (message.command == "tab_removed") { - if (opt.debug) console.log("tab_removed: "+message.tabId); + if (opt.debug) { + log("chrome event: "+message.command+ ", tabId: " + message.tabId); + } + + if (EmptyTabs.indexOf(message.tabId) != -1) { + EmptyTabs.splice(EmptyTabs.indexOf(message.tabId), 1); + } + let mTab = document.getElementById(message.tabId); if (mTab != null) { - let ctParent = mTab.childNodes[4]; - if (opt.debug) console.log("tab_removed, promote children: " +opt.promote_children); + let ctParent = mTab.childNodes[1]; + if (opt.debug) { + log("tab_removed, promote children: " +opt.promote_children); + } if (opt.promote_children == true) { if (opt.promote_children_in_first_child == true && ctParent.childNodes.length > 1) { - let ctNewParent = document.getElementById(ctParent.firstChild.id).childNodes[4]; + let ctNewParent = document.getElementById(ctParent.firstChild.id).childNodes[1]; ctParent.parentNode.parentNode.insertBefore(ctParent.firstChild, ctParent.parentNode); while (ctParent.firstChild) { ctNewParent.appendChild(ctParent.firstChild); @@ -225,14 +332,25 @@ function StartChromeListeners() { return; } if (message.command == "tab_activated") { - SetActiveTab(message.tabId); + if (opt.debug) { + log("chrome event: "+message.command+ ", tabId: " + message.tabId); + } + SetActiveTab(message.tabId, true); return; } if (message.command == "tab_attention") { + if (opt.debug) { + log("chrome event: "+message.command+ ", tabId: " + message.tabId); + } SetAttentionIcon(message.tabId); return; } if (message.command == "tab_updated") { + if (opt.debug) { + log("chrome event: "+message.command+ ", tabId: " + message.tabId+ ", changeInfo: "+JSON.stringify(message.changeInfo)); + // log(message.changeInfo); + } + if (message.changeInfo.favIconUrl != undefined || message.changeInfo.url != undefined) { setTimeout(function() { GetFaviconAndTitle(message.tabId, true); @@ -251,15 +369,38 @@ function StartChromeListeners() { } if (message.changeInfo.pinned != undefined) { let updateTab = document.getElementById(message.tabId); - if (updateTab != null && ( (message.tab.pinned && updateTab.classList.contains("tab")) || (!message.tab.pinned && updateTab.classList.contains("pin")) ) ) { - SetTabClass(message.tabId, message.tab.pinned); - schedule_update_data++; + if (updateTab != null) { + if (message.tab.pinned && updateTab.classList.contains("pin") == false) { + SetTabClass(message.tabId, true); + schedule_update_data++; + } + if (!message.tab.pinned && updateTab.classList.contains("tab") == false) { + SetTabClass(message.tabId, false); + schedule_update_data++; + } } RefreshExpandStates(); } + + + // if set to append when url changes and matches pre-set group + if (message.changeInfo.url != undefined && message.changeInfo.url != newTabUrl) { + // if (((opt.move_tabs_on_url_change == "from_empty" || opt.move_tabs_on_url_change == "from_empty_b") && EmptyTabs.indexOf(message.tabId) != -1) || opt.move_tabs_on_url_change == "always") { + if (EmptyTabs.indexOf(message.tabId) != -1 || opt.move_tabs_on_url_change == "always") { + AppendTabToGroupOnRegexMatch(message.tabId, message.changeInfo.url); + } + if (EmptyTabs.indexOf(message.tabId) != -1) { + EmptyTabs.splice(EmptyTabs.indexOf(message.tabId), 1); + } + } + return; } if (message.command == "remote_update") { + if (opt.debug) { + log("chrome event: "+message.command+ ", tabId: " + message.tabId); + log(message); + } RearrangeTreeStructure(message.groups, message.folders, message.tabs); sendResponse(true); return; diff --git a/scripts/events.js b/scripts/events.js index e3d898d..eb538bf 100644 --- a/scripts/events.js +++ b/scripts/events.js @@ -3,6 +3,10 @@ // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ function SetEvents() { + if (opt.debug) { + log("f: SetEvents, adding global events."); + } + let PinList = document.getElementById("pin_list"); if (!opt.switch_with_scroll) { @@ -23,7 +27,7 @@ function SetEvents() { } } document.oncontextmenu = function(event){ - if (!event.ctrlKey) { + if (!event.ctrlKey && event.target.classList.contains("text_input") == false) { event.preventDefault(); } } @@ -46,23 +50,6 @@ function SetEvents() { RemoveHeadersHoverClass(); } - } - // MOUSE DOWN EVENTS - document.body.onmousedown = function(event) { - - if (event.which == 2) { - event.preventDefault(); - } - - if (event.which == 1 && event.target.classList.contains("menu_item") == false) { - HideMenus(); - } - event.stopImmediatePropagation(); - - if (event.which == 1) { - RemoveHeadersHoverClass(); - } - } // CONFIRM EDIT FOLDER @@ -107,18 +94,17 @@ function SetEvents() { HideRenameDialogs(); } } - - PinList.onmousedown = function(event) { - if (opt.pin_list_multi_row) { - if (event.which == 1 && event.target == this) { + PinList.onclick = function(event) { + if (event.which == 1 && event.target == this) { + if (opt.pin_list_multi_row || (opt.pin_list_multi_row == false && event.clientY < (this.childNodes[0].getBoundingClientRect().height + this.getBoundingClientRect().top))) { DeselectFolders(); DeselectTabs(); - HideMenus(); } - } else { - if (event.which == 1 && event.target == this && event.clientY < (this.childNodes[0].getBoundingClientRect().height + this.getBoundingClientRect().top)) { - DeselectFolders(); - DeselectTabs(); + } + } + PinList.onmousedown = function(event) { + if (event.which == 1 && event.target == this) { + if (opt.pin_list_multi_row || (opt.pin_list_multi_row == false && event.clientY < (this.childNodes[0].getBoundingClientRect().height + this.getBoundingClientRect().top))) { HideMenus(); } } @@ -130,10 +116,11 @@ function SetEvents() { ShowFGlobalMenu(event); } } - PinList.ondragenter = function(event) { + PinList.ondragover = function(event) { // PIN,TAB==>PINLIST - if (event.target.id == "pin_list" && DragAndDrop.DragNodeClass == "tab") { - HighlightNode(this); + if (event.target.id == "pin_list" && DragNodeClass == "tab" && this.classList.contains("highlighted_drop_target") == false) { + RemoveHighlight(); + this.classList.add("highlighted_drop_target"); } } @@ -206,118 +193,112 @@ function SetEvents() { document.body.ondragover = function(event) { + if (opt.debug) { + log("drag over: "+event.target.id); + } event.preventDefault(); if (event.target.parentNode.classList.contains("c") && event.target.parentNode.classList.contains("dragged_tree") == false) { - if (DragAndDrop.timeout && opt.open_tree_on_hover) { + if (DragOverTimer && opt.open_tree_on_hover) { event.target.parentNode.classList.add("o"); event.target.parentNode.classList.remove("c"); - DragAndDrop.timeout = false; + DragOverTimer = false; } } } document.ondrop = function(event) { if (opt.debug) { - console.log("drop"); + log("dropped on window: "+CurrentWindowId); } - DragAndDrop.DroppedToWindowId = CurrentWindowId; + + let TabsIds = event.dataTransfer.getData("TabsIds") ? JSON.parse(event.dataTransfer.getData("TabsIds")) : []; + let TabsIdsParents = event.dataTransfer.getData("TabsIdsParents") ? JSON.parse(event.dataTransfer.getData("TabsIdsParents")) : []; + let TabsIdsSelected = event.dataTransfer.getData("TabsIdsSelected") ? JSON.parse(event.dataTransfer.getData("TabsIdsSelected")) : []; + let Folders = event.dataTransfer.getData("Folders") ? JSON.parse(event.dataTransfer.getData("Folders")) : {}; + let FoldersSelected = event.dataTransfer.getData("FoldersSelected") ? JSON.parse(event.dataTransfer.getData("FoldersSelected")) : []; + let SourceWindowId = event.dataTransfer.getData("SourceWindowId") ? JSON.parse(event.dataTransfer.getData("SourceWindowId")) : 0; let target = document.querySelector(".highlighted_drop_target"); + event.preventDefault(); - if (DragAndDrop.ComesFromWindowId == CurrentWindowId) { - let selected = (document.querySelectorAll(".selected_tab").length > 0 ? document.querySelectorAll(".selected_tab") : (document.querySelectorAll(".selected_folder").length > 0 ? document.querySelectorAll(".selected_folder") : document.querySelectorAll(".dragged_group_button"))); - DropToTarget(target, selected); + + if (SourceWindowId == CurrentWindowId) { + DropToTarget(target, TabsIdsSelected, TabsIds, TabsIdsParents, Folders, FoldersSelected); } else { - if (Object.keys(DragAndDrop.Folders).length > 0) { - for (var folder in DragAndDrop.Folders) { - bgfolders[DragAndDrop.Folders[folder].id] = Object.assign({}, DragAndDrop.Folders[folder]); + FreezeSelected(); + + if (Object.keys(Folders).length > 0) { + + let SelectedFolders = Object.assign([], FoldersSelected); + + for (var folder in Folders) { + AddNewFolder(folder, Folders[folder].parent, Folders[folder].name, Folders[folder].index, Folders[folder].expand, (FoldersSelected.indexOf(folder) != -1 ? "selected_folder" : undefined), true); + chrome.runtime.sendMessage({ command: "remove_folder", folderId: Folders[folder].id }); } - AppendFolders(bgfolders); } - let currentlySelected = document.querySelectorAll(".selected_tab"); - currentlySelected.forEach(function(s){ - s.classList.add("selected_frozen"); - s.classList.remove("selected_tab"); - s.classList.remove("selected_last"); - }); + let counter = 0; - (DragAndDrop.TabsIds).forEach(function(TabId) { - if (opt.debug) console.log("DragAndDrop: will now move tab: "+TabId); - chrome.tabs.move(TabId, { windowId: CurrentWindowId, index: -1 }, function(MovedTab) { - if (browserId == "F") { // MOZILLA BUG 1398272 - let MovedTabId = MovedTab[0] != undefined ? MovedTab[0].id : (MovedTab.id != undefined ? MovedTab.id : TabId); - if ((DragAndDrop.TabsIdsParents).indexOf("ct"+DragAndDrop.TabsIds[counter]) != -1) { // MOZILLA BUG 1398272 - DragAndDrop.TabsIdsParents[(DragAndDrop.TabsIdsParents).indexOf("ct"+DragAndDrop.TabsIds[counter])] = "ct"+MovedTabId; // MOZILLA BUG 1398272 - } // MOZILLA BUG 1398272 - if ((DragAndDrop.TabsIdsSelected).indexOf(DragAndDrop.TabsIds[counter]) != -1) { // MOZILLA BUG 1398272 - DragAndDrop.TabsIdsSelected[(DragAndDrop.TabsIdsSelected).indexOf(DragAndDrop.TabsIds[counter])] = MovedTabId; // MOZILLA BUG 1398272 - } // MOZILLA BUG 1398272 - DragAndDrop.TabsIds[counter] = MovedTabId; // MOZILLA BUG 1398272 - } // MOZILLA BUG 1398272 - counter++; - if (counter == DragAndDrop.TabsIds.length) { - console.log(DragAndDrop); - setTimeout(function() { - (DragAndDrop.TabsIdsSelected).forEach(function(selectedTabId) { - let selectedTab = document.getElementById(selectedTabId); - if (selectedTab != null) { - selectedTab.classList.add("selected_temporarly"); - selectedTab.classList.add("selected_tab"); - } - }); - for (var tabsIdsIndex = 1; tabsIdsIndex < (DragAndDrop.TabsIds).length; tabsIdsIndex++) { - let DTab = document.getElementById(DragAndDrop.TabsIds[tabsIdsIndex]); - let DTabParent = document.getElementById(DragAndDrop.TabsIdsParents[tabsIdsIndex]); - if (DTab != null && DTabParent != null) { - DTabParent.appendChild(DTab); - } - } - for (var FolderSelectedIndex = 0; FolderSelectedIndex < (DragAndDrop.FoldersSelected).length; FolderSelectedIndex++) { - let Folder = document.getElementById(DragAndDrop.FoldersSelected[FolderSelectedIndex]); - if (Folder != null) { - Folder.classList.add("selected_folder_temporarly"); - Folder.classList.add("selected_folder"); - } - } - let selected = (document.querySelectorAll(".selected_tab").length > 0 ? document.querySelectorAll(".selected_tab") : (document.querySelectorAll(".selected_folder").length > 0 ? document.querySelectorAll(".selected_folder") : document.querySelectorAll(".dragged_group_button"))); - DropToTarget(target, selected); - }, 300); + if (TabsIds.length == 0) { + DropToTarget(target, TabsIdsSelected, TabsIds, TabsIdsParents, Folders, FoldersSelected); + } else { + (TabsIds).forEach(function(TabId) { + if (opt.debug) { + log("DragAndDrop: will now move tab: "+TabId); } + + chrome.tabs.move(TabId, { windowId: CurrentWindowId, index: -1 }, function(MovedTab) { + if (browserId == "F") { // MOZILLA BUG 1398272 + let MovedTabId = MovedTab[0] != undefined ? MovedTab[0].id : (MovedTab.id != undefined ? MovedTab.id : TabId); // MOZILLA BUG 1398272 + if ((TabsIdsParents).indexOf("ct"+TabsIds[counter]) != -1) { // MOZILLA BUG 1398272 + TabsIdsParents[(TabsIdsParents).indexOf("ct"+TabsIds[counter])] = "ct"+MovedTabId; // MOZILLA BUG 1398272 + } // MOZILLA BUG 1398272 + if ((TabsIdsSelected).indexOf(TabsIds[counter]) != -1) { // MOZILLA BUG 1398272 + TabsIdsSelected[(TabsIdsSelected).indexOf(TabsIds[counter])] = MovedTabId; // MOZILLA BUG 1398272 + } // MOZILLA BUG 1398272 + TabsIds[counter] = MovedTabId; // MOZILLA BUG 1398272 + } // MOZILLA BUG 1398272 + counter++; + if (counter == TabsIds.length) { + setTimeout(function() { + (TabsIdsSelected).forEach(function(selectedTabId) { + let selectedTab = document.getElementById(selectedTabId); + if (selectedTab != null) { + selectedTab.classList.add("selected_temporarly"); + selectedTab.classList.add("selected_tab"); + } + }); + DropToTarget(target, TabsIdsSelected, TabsIds, TabsIdsParents, Folders, FoldersSelected); + }, 200); + } + }); }); - }); - } - // event.dataTransfer.setData("folders", test_data); - // let folders = event.dataTransfer.getData("folders"); - } - document.ondragleave = function(event) { - if (opt.debug) { - console.log("global dragleave"); - } - if (event.target.classList) { - if (event.target.classList.contains("highlighted_drop_target") || event.target.classList.contains("drop_target")) { - event.target.classList.remove("highlighted_drop_target"); - } - if (event.target.classList.contains("drag_enter_center")) { - DragAndDrop.timeout = false; } } } - document.ondragend = function(event) { + + document.ondragleave = function(event) { if (opt.debug) { - console.log("document dragend"); - console.log(event); + log("global dragleave"); } - - + + if (event.target.classList) { + if (event.target.classList.contains("drag_enter_center")) { + DragOverTimer = false; + } + } + RemoveHighlight(); + } + + document.ondragend = function(event) { + // log("document dragend"); // DETACHING TEMPORARILY DISABLED PLEASE USE MENU OR TOOLBAR! - // if (DragAndDrop.ComesFromWindowId == CurrentWindowId && DragAndDrop.DroppedToWindowId == 0) { // if ((browserId == "F" && ( event.screenX < event.view.mozInnerScreenX || event.screenX > (event.view.mozInnerScreenX + window.innerWidth) || event.screenY < event.view.mozInnerScreenY || event.screenY > (event.view.mozInnerScreenY + window.innerHeight)))|| (browserId != "F" && (event.pageX < 0 || event.pageX > window.outerWidth || event.pageY < 0 || event.pageY > window.outerHeight))) { - // if (opt.debug) console.log("dragged outside sidebar"); - // if (DragAndDrop.DragNodeClass == "tab") { + // log("dragged outside sidebar"); + // if (DragNodeClass == "tab") { // Detach(DragAndDrop.TabsIds, {}); // } - // if (DragAndDrop.DragNodeClass == "folder") { + // if (DragNodeClass == "folder") { // Detach(DragAndDrop.TabsIds, DragAndDrop.Folders); // setTimeout(function() { // SaveFolders(); @@ -325,16 +306,22 @@ function SetEvents() { // } // } // } - CleanUpDragClasses(); - chrome.runtime.sendMessage({command: "dragend"}); + setTimeout(function() { + CleanUpDragClasses(); + chrome.runtime.sendMessage({command: "dragend"}); + }, 500); } } function BindTabsSwitchingToMouseWheel(Id) { - document.getElementById(Id).onmousewheel = function(event) { + if (opt.debug) { + log("f: BindTabsSwitchingToMouseWheel, binding tabs switch to group: "+Id); + } + + document.getElementById(Id).onwheel = function(event) { event.preventDefault(); - let prev = event.wheelDelta > 0 || event.detail < 0; + let prev = event.deltaY < 0; if (prev) { ActivatePrevTab(); } else { @@ -343,221 +330,238 @@ function BindTabsSwitchingToMouseWheel(Id) { } } +function RemoveHighlight() { + document.querySelectorAll(".highlighted_drop_target").forEach(function(s){ + if (opt.debug) { + log("removing highlight of: " + s.id); + } + s.classList.remove("before"); + s.classList.remove("after"); + s.classList.remove("inside"); + s.classList.remove("highlighted_drop_target"); + }); +} + function RemoveHeadersHoverClass() { document.querySelectorAll(".folder_header_hover, .tab_header_hover").forEach(function(s){ + if (opt.debug) { + log("removing hover of: " + s.id); + } s.classList.remove("folder_header_hover"); s.classList.remove("tab_header_hover"); }); } -function DropToTarget(TargetNode, selected) { - if (opt.debug) console.log("function: DropToTarget"); - if (TargetNode != null && selected.length > 0) { - if (DragAndDrop.DragNodeClass == "tab") { - if (TargetNode.parentNode.classList.contains("pin")) { // dropped on pin - if (TargetNode.classList.contains("drag_entered_top")) { - selected.forEach(function(s){ - SetTabClass(s.id, true); - TargetNode.parentNode.parentNode.insertBefore(s, TargetNode.parentNode); - }); - } else { - if (TargetNode.parentNode.nextSibling != null) { - for (let i = selected.length-1; i >= 0; i--) { - SetTabClass(selected[i].id, true); - TargetNode.parentNode.parentNode.insertBefore(selected[i], TargetNode.parentNode.nextSibling); - } - } else { - selected.forEach(function(s){ - SetTabClass(s.id, true); - TargetNode.parentNode.parentNode.appendChild(s); - }); - } - } - } - if (TargetNode.id == "pin_list") { // dropped on pin_list - document.querySelectorAll(".selected_tab").forEach(function(s){ - SetTabClass(s.id, true); - TargetNode.appendChild(s); - }); - } - if (TargetNode.parentNode.classList.contains("tab") || TargetNode.parentNode.classList.contains("folder")) { // dropped on tab or folder - selected.forEach(function(s){ - SetTabClass(s.id, false); - }); - if (TargetNode.classList.contains("drag_entered_top")) { - selected.forEach(function(s){ - TargetNode.parentNode.parentNode.insertBefore(s, TargetNode.parentNode); - }); - } - if (TargetNode.classList.contains("drag_entered_bottom")) { - if (TargetNode.parentNode.nextSibling != null) { - for (let i = selected.length-1; i >= 0; i--) { - TargetNode.parentNode.parentNode.insertBefore(selected[i], TargetNode.parentNode.nextSibling); - } - } else { - selected.forEach(function(s){ - TargetNode.parentNode.parentNode.appendChild(s); - }); - } - } - if (TargetNode.classList.contains("drag_enter_center")) { - let newParent = document.getElementById("ct" + TargetNode.id.substr(2)); - if (opt.append_child_tab == "bottom") { - selected.forEach(function(s){ - newParent.appendChild(s); - }); - } else { - for (let i = selected.length-1; i >= 0; i--) { - newParent.prepend(selected[i]); - } - } - } - } - if (TargetNode.classList.contains("group")) { // dropped on group (tab list) - selected.forEach(function(s){ - SetTabClass(s.id, false); - }); - let newParent = document.getElementById("ct" + TargetNode.id); - selected.forEach(function(s){ - newParent.appendChild(s); - }); - } - if (TargetNode.classList.contains("group_drag_box")) { // dropped on group button (group list) - selected.forEach(function(s){ - SetTabClass(s.id, false); - }); - let newParent = document.getElementById("ct" + TargetNode.id.substr(1)); - selected.forEach(function(s){ - newParent.appendChild(s); - }); - } + + + + +function DropToTarget(TargetNode, TabsIdsSelected, TabsIds, TabsIdsParents, Folders, FoldersSelected) { + if (TargetNode != null) { + + if (opt.debug) { + log("f: DropToTarget, TargetNode: "+TargetNode.id+", TabsIdsSelected: "+JSON.stringify(TabsIdsSelected)+", TabsIds: "+JSON.stringify(TabsIds)+", TabsIdsParents: "+JSON.stringify(TabsIdsParents)+", Folders: "+JSON.stringify(Folders)+", FoldersSelected: "+JSON.stringify(FoldersSelected) ); } - if (DragAndDrop.DragNodeClass == "folder") { // dropped on group button (group list) - if (opt.debug) console.log("DragNodeClass is folder"); - if (TargetNode.classList.contains("group")) { // dropped on group (tab list) - let newParent = document.getElementById("cf" + TargetNode.id); - selected.forEach(function(s){ - newParent.appendChild(s); - }); - } - if (TargetNode.classList.contains("group_drag_box")) { // dropped on group button (group list) - let newParent = document.getElementById("cf" + TargetNode.id.substr(1)); - selected.forEach(function(s){ - newParent.appendChild(s); - }); - } - if (TargetNode.parentNode.classList.contains("folder")) { // dropped on folder - if (TargetNode.classList.contains("drag_entered_top")) { - selected.forEach(function(s){ - TargetNode.parentNode.parentNode.insertBefore(s, TargetNode.parentNode); + + // let Append; + let pinTabs = false; + + if (DragNodeClass == "tab") { + if (TargetNode.classList.contains("pin")) { + pinTabs = true; + if (TargetNode.classList.contains("before")) { + TabsIds.forEach(function(tabId){ + InsterBeforeNode(document.getElementById(tabId), TargetNode); }); } - if (TargetNode.classList.contains("drag_entered_bottom")) { - if (TargetNode.parentNode.nextSibling != null) { - for(let i = selected.length-1; i >= 0; i--) { - TargetNode.parentNode.parentNode.insertBefore(selected[i], TargetNode.parentNode.nextSibling); - } - } else { - selected.forEach(function(s){ - TargetNode.parentNode.parentNode.appendChild(s); - }); - } - } - if (TargetNode.classList.contains("drag_enter_center")) { - let newParent = document.getElementById("cf" + TargetNode.id.substr(2)); - if (opt.append_child_tab == "bottom") { - selected.forEach(function(s){ - newParent.appendChild(s); - }); - } else { - for (let i = selected.length-1; i >= 0; i--) { - newParent.prepend(selected[i]); - } + if (TargetNode.classList.contains("after")) { + for (let i = TabsIds.length-1; i >= 0; i--) { + InsterAfterNode(document.getElementById(TabsIds[i]), TargetNode); } } } + + if (TargetNode.classList.contains("tab")) { + if (TargetNode.classList.contains("before")) { + TabsIdsSelected.forEach(function(tabId){ + InsterBeforeNode(document.getElementById(tabId), TargetNode); + }); + } + if (TargetNode.classList.contains("after")) { + for (let i = TabsIdsSelected.length-1; i >= 0; i--) { + InsterAfterNode(document.getElementById(TabsIdsSelected[i]), TargetNode); + } + } + if (TargetNode.classList.contains("inside")) { + TabsIdsSelected.forEach(function(tabId){ + AppendToNode(document.getElementById(tabId), TargetNode.childNodes[1]); + }); + } + } + + if (TargetNode.id == "pin_list") { + pinTabs = true; + TabsIds.forEach(function(tabId){ + AppendToNode(document.getElementById(tabId), TargetNode); + }); + } + + if (TargetNode.classList.contains("group")) { + TabsIdsSelected.forEach(function(tabId){ + AppendToNode(document.getElementById(tabId), TargetNode.childNodes[1]); + }); + } + + if (TargetNode.classList.contains("folder")) { + TabsIdsSelected.forEach(function(tabId){ + AppendToNode(document.getElementById(tabId), TargetNode.childNodes[2]); + }); + } + + if (TargetNode.classList.contains("group_button")) { // dropped on group button (group list) + TabsIdsSelected.forEach(function(tabId){ + AppendToNode(document.getElementById(tabId), document.getElementById("ct" + (TargetNode.id.substr(1)))); + }); + } + } + + + if (DragNodeClass == "folder") { + if (TargetNode.classList.contains("folder")) { // dropped on folder + if (TargetNode.classList.contains("before")) { + FoldersSelected.forEach(function(folderId){ + InsterBeforeNode(document.getElementById(folderId), TargetNode); + }); + } + if (TargetNode.classList.contains("after")) { + for(let i = FoldersSelected.length-1; i >= 0; i--) { + InsterAfterNode(document.getElementById(FoldersSelected[i]), TargetNode); + } + } + if (TargetNode.classList.contains("inside")) { + FoldersSelected.forEach(function(folderId){ + AppendToNode(document.getElementById(folderId), TargetNode.childNodes[1]); + }); + } + } + + if (TargetNode.classList.contains("group")) { + FoldersSelected.forEach(function(folderId){ + AppendToNode(document.getElementById(folderId), TargetNode.childNodes[0]); + }); + } + + if (TargetNode.classList.contains("group_button")) { // dropped on group button (group list) + FoldersSelected.forEach(function(folderId){ + AppendToNode(document.getElementById(folderId), document.getElementById("cf" + TargetNode.id.substr(1))); + }); + } + setTimeout(function() { SaveFolders(); - }, 300); + }, 600); } - if (TargetNode.parentNode.classList.contains("group_button") && DragAndDrop.DragNodeClass == "group") { - if (TargetNode.classList.contains("group_button_drag_entered_top")) { - TargetNode.parentNode.parentNode.insertBefore(selected[0], TargetNode.parentNode); - } else { - if (TargetNode.parentNode.nextSibling != null) { - TargetNode.parentNode.parentNode.insertBefore(selected[0], TargetNode.parentNode.nextSibling); - } else { - TargetNode.parentNode.parentNode.appendChild(selected[0]); + if (TargetNode.classList.contains("group_button") && (DragNodeClass == "tab" || DragNodeClass == "folder")) { + chrome.tabs.query({currentWindow: true, active: true}, function(activeTab) { + let Tab = document.getElementById(activeTab[0].id); + if (Tab != null && TabsIds.indexOf(activeTab[0].id) != -1) { + SetActiveGroup(TargetNode.id.substr(1), false, false); + SetActiveTab(activeTab[0].id, true); } + }); + } + + if (DragNodeClass == "group") { + if (TargetNode.classList.contains("before")) { + InsterBeforeNode(document.querySelector(".dragged_group_button"), TargetNode); + } + if (TargetNode.classList.contains("after")) { + InsterAfterNode(document.querySelector(".dragged_group_button"), TargetNode); } UpdateBgGroupsOrder(); RearrangeGroupsLists(); if (opt.syncro_tabbar_groups_tabs_order) { schedule_rearrange_tabs++; } - } + } - if (opt.syncro_tabbar_tabs_order && DragAndDrop.TabsIds[0] != undefined) { + SetMultiTabsClass(TabsIds, pinTabs); + // SetMultiTabsClass(TabsIdsSelected, pinTabs); + + // recheck new structure + if (TabsIds.length) { + for (var ind = 0; ind < TabsIds.length; ind++) { + if (TabsIdsSelected.indexOf(TabsIds[ind]) == -1) { + let Tab = document.getElementById(TabsIds[ind]); + let TabParent = document.getElementById(TabsIdsParents[ind]); + if (TabParent != null && TabParent.id != Tab.parentNode.id) { + TabParent.appendChild(Tab); + } + } + } + } + + if (opt.syncro_tabbar_tabs_order && TabsIds[0] != undefined) { let tabIds = Array.prototype.map.call(document.querySelectorAll(".pin, .tab"), function(s){ return parseInt(s.id); }); - if (opt.debug) console.log("After DropToTarget, will Syncro tabbar tabs order, TabsIds array is:"); - if (opt.debug) console.log(DragAndDrop.TabsIds); - chrome.tabs.move(DragAndDrop.TabsIds, {index: tabIds.indexOf(DragAndDrop.TabsIds[0])}); + + if (opt.debug) { + log( "f: DropToTarget, will Syncro tabbar tabs order, TabsIds array is:"+JSON.stringify(TabsIds) ); + } + + chrome.tabs.move(TabsIds, {index: tabIds.indexOf(TabsIds[0])}); setTimeout(function() { schedule_rearrange_tabs++; }, 500); } } - DragAndDrop.timeout = false; + + DragOverTimer = false; setTimeout(function() { - EmptyDragAndDrop(); RefreshExpandStates(); RefreshCounters(); - RefreshGUI(); schedule_update_data++; + RefreshGUI(); + EmptyDragAndDrop(); + + if (opt.debug) { + log("DropToTarget END"); + } + }, 300); + + setTimeout(function() { + CleanUpDragClasses(); + RemoveHighlight(); }, 100); - - CleanUpDragClasses(); - } -function DropTargetsFront(ExcludeNode, tabs, groups) { - if (ExcludeNode == undefined) { - ExcludeNode = {parentNode: {childNodes: [{id: "x"}, {id: "x"}, {id: "x"}], id: "x"}}; - } - if (tabs) { - document.querySelectorAll("#"+active_group+" .drag_enter_center:not(#"+ExcludeNode.parentNode.childNodes[0].id+")").forEach(function(s){ - s.style.zIndex = 9911; - }); - document.querySelectorAll("#"+active_group+" .drag_enter_center:not(#"+ExcludeNode.parentNode.childNodes[0].id+")").forEach(function(s){ - s.style.zIndex = 9911; - }); - document.querySelectorAll(".drag_entered_top:not(#"+ExcludeNode.parentNode.childNodes[1].id+")").forEach(function(s){ - s.style.zIndex = 9915; - }); - document.querySelectorAll(".drag_entered_bottom:not(#"+ExcludeNode.parentNode.childNodes[2].id+")").forEach(function(s){ - s.style.zIndex = 9920; - }); - } - if (groups) { - document.querySelectorAll(".group_button:not(#"+ExcludeNode.parentNode.id+") .group_drag_box").forEach(function(s){ - s.style.zIndex = -1; - }); - } + +function FreezeSelected() { + document.querySelectorAll(".selected_tab").forEach(function(s){ + if (opt.debug) { + log("freezing selected tab: " + s.id); + } + s.classList.add("selected_frozen"); + s.classList.remove("selected_tab"); + s.classList.remove("selected_last"); + }); + document.querySelectorAll(".selected_folder").forEach(function(s){ + if (opt.debug) { + log("freezing selected folder: " + s.id); + } + s.classList.add("selected_folder_frozen"); + s.classList.remove("selected_folder"); + }); } function CleanUpDragClasses() { - document.querySelectorAll(".highlighted_drop_target").forEach(function(s){ - s.classList.remove("highlighted_drop_target"); - }); - document.querySelectorAll(".highlighted_selected").forEach(function(s){ - s.classList.add("selected_tab"); - s.classList.remove("highlighted_selected"); - }); + if (opt.debug) { + log("f: CleanUpDragClasses, unfreezing and removing temporary classes..."); + } document.querySelectorAll(".selected_frozen").forEach(function(s){ s.classList.add("selected_tab"); s.classList.remove("selected_frozen"); @@ -566,10 +570,6 @@ function CleanUpDragClasses() { s.classList.remove("selected_tab"); s.classList.remove("selected_temporarly"); }); - document.querySelectorAll(".highlighted_selected").forEach(function(s){ - s.classList.add("selected_folder"); - s.classList.remove("highlighted_selected"); - }); document.querySelectorAll(".selected_folder_frozen").forEach(function(s){ s.classList.add("selected_folder"); s.classList.remove("selected_folder_frozen"); @@ -584,16 +584,19 @@ function CleanUpDragClasses() { document.querySelectorAll(".folder_header").forEach(function(s){ s.classList.remove("folder_header_hover"); }); - document.querySelectorAll(".dragged_group_button").forEach(function(s){ // dragged group button + document.querySelectorAll(".dragged_group_button").forEach(function(s){ s.classList.remove("dragged_group_button"); }); document.querySelectorAll(".dragged_tree").forEach(function(s){ s.classList.remove("dragged_tree"); }); - document.querySelectorAll(".dragged_selected").forEach(function(s){ - s.classList.remove("dragged_selected"); - }); - document.querySelectorAll(".drop_target").forEach(function(s){ - s.style.zIndex = ""; - }); } + +function EmptyDragAndDrop() { + if (opt.debug) { + log("f: EmptyDragAndDrop, reset DragOverTimer and removing DragNodeClass..."); + } + DragOverTimer = false; + DragNodeClass = ""; + DragTreeDepth = 0; +} \ No newline at end of file diff --git a/scripts/folders.js b/scripts/folders.js index d7d8f33..c61de8d 100644 --- a/scripts/folders.js +++ b/scripts/folders.js @@ -2,27 +2,35 @@ // Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ -function AddNewFolder(ParentId, Name, Index, ExpandState) { - var newId = GenerateNewFolderID(); +function AddNewFolder(folderId, ParentId, Name, Index, ExpandState, AdditionalClass, SetEvents) { + var newId = folderId ? folderId : GenerateNewFolderID(); bgfolders[newId] = { id: newId, parent: (ParentId ? ParentId : ""), index: (Index ? Index : 0), name: (Name ? Name : caption_noname_group), expand: (ExpandState ? ExpandState : "") }; - AppendFolder(newId, caption_noname_group, (ParentId ? ParentId : ""), undefined, true); + if (opt.debug) { + log("f: AddNewFolder, folder: "+JSON.stringify(bgfolders[newId])); + } + AppendFolder(newId, caption_noname_group, (ParentId ? ParentId : ""), undefined, SetEvents, AdditionalClass); SaveFolders(); RefreshCounters(); RefreshExpandStates(); return newId; } -function AppendFolder(folderId, Name, ParentId, Expand, SetEvents) { +function AppendFolder(folderId, Name, ParentId, Expand, SetEvents, AdditionalClass) { + if (opt.debug) { + log("f: AppendFolder, folder: "+JSON.stringify(bgfolders[folderId])); + } + let ClassList = "folder "; + if (AdditionalClass != undefined) { + ClassList = ClassList + AdditionalClass; + } if (document.getElementById(folderId) == null) { - var fd = document.createElement("div"); fd.className = "folder "; if (Expand) { fd.className += Expand } fd.id = folderId;// FOLDER - var dc = document.createElement("div"); dc.className = "drop_target drag_enter_center"; dc.id = "dc"+folderId; fd.appendChild(dc); // DROP TARGET CENTER - var du = document.createElement("div"); du.className = "drop_target drag_entered_top"; du.id = "du"+folderId; fd.appendChild(du); // DROP TARGET TOP - var dd = document.createElement("div"); dd.className = "drop_target drag_entered_bottom"; dd.id = "dd"+folderId; fd.appendChild(dd); // DROP TARGET BOTTOM + var fd = document.createElement("div"); fd.className = ClassList; if (Expand) { fd.className += Expand } fd.id = folderId; // FOLDER var fh = document.createElement("div"); fh.className = (opt.always_show_close && !opt.never_show_close) ? "folder_header close_show" : "folder_header"; fh.id = "folder_header"+folderId; if (SetEvents) {fh.draggable = true;} fd.appendChild(fh); // HEADER var ex = document.createElement("div"); ex.className = "folder_icon"; ex.id = "fop"+folderId; fh.appendChild(ex); var ft = document.createElement("div"); ft.className = "folder_title"; ft.id = "folder_title"+folderId; ft.textContent = Name; fh.appendChild(ft); // TITLE var cf = document.createElement("div"); cf.className = "children_folders"; cf.id = "cf"+folderId; fd.appendChild(cf); var ct = document.createElement("div"); ct.className = "children_tabs"; ct.id = "ct"+folderId; fd.appendChild(ct); + var di = document.createElement("div"); di.className = "drag_indicator"; di.id = "di"+folderId; fd.appendChild(di); // DROP TARGET INDICATOR if (!opt.never_show_close) { var cl = document.createElement("div"); cl.className = "close"; cl.id = "close"+folderId; fh.appendChild(cl); // CLOSE BUTTON var ci = document.createElement("div"); ci.className = "close_img"; ci.id = "close_img"+folderId; cl.appendChild(ci); @@ -40,12 +48,20 @@ function AppendFolder(folderId, Name, ParentId, Expand, SetEvents) { } } + cf.onclick = function(event) { + if (event.target == this && event.which == 1) { + DeselectFolders(); + DeselectTabs(); + } + } + ct.onclick = function(event) { + if (event.target == this && event.which == 1) { + DeselectFolders(); + DeselectTabs(); + } + } cf.onmousedown = function(event) { if (event.target == this) { - if (event.which == 1) { - DeselectFolders(); - DeselectTabs(); - } if (event.which == 2 && event.target == this) { event.stopImmediatePropagation(); ActionClickGroup(this.parentNode, opt.midclick_group); @@ -57,10 +73,6 @@ function AppendFolder(folderId, Name, ParentId, Expand, SetEvents) { } ct.onmousedown = function(event) { if (event.target == this) { - if (event.which == 1) { - DeselectFolders(); - DeselectTabs(); - } if (event.which == 2 && event.target == this) { event.stopImmediatePropagation(); ActionClickGroup(this.parentNode, opt.midclick_group); @@ -85,17 +97,21 @@ function AppendFolder(folderId, Name, ParentId, Expand, SetEvents) { this.classList.remove("close_hover"); } } - fh.onmousedown = function(event) { - if (document.getElementById("main_menu").style.top != "-1000px") { - HideMenus(); - } + fh.onclick = function(event) { // SELECT FOLDER if (event.which == 1 && !event.shiftKey) { DeselectTabs(); - if (!event.ctrlKey) { + if (!event.ctrlKey && this.parentNode.classList.contains("selected_folder") == false) { DeselectFolders(); } - event.target.parentNode.parentNode.classList.toggle("selected_folder"); + if (event.ctrlKey) { + this.parentNode.classList.toggle("selected_folder"); + } + } + } + fh.onmousedown = function(event) { + if (document.getElementById("main_menu").style.top != "-1000px") { + HideMenus(); } if (event.which == 2) { event.preventDefault(); @@ -108,86 +124,12 @@ function AppendFolder(folderId, Name, ParentId, Expand, SetEvents) { } // edit folder fh.ondblclick = function(event) { - if (event.which == 1 && !event.shiftKey && !event.ctrlKey && (event.target.classList.contains("folder_title") || event.target.classList.contains("folder_header"))) { - // if (event.which == 1) { - // ShowRenameFolderDialog(this.parentNode.id); + if (event.which == 1 && !event.shiftKey && !event.ctrlKey && event.target.classList.contains("folder_header")) { ActionClickFolder(this.parentNode, opt.dbclick_folder); } } fh.ondragstart = function(event) { // DRAG START - event.stopPropagation(); - event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); - event.dataTransfer.setData("text", ""); - // event.dataTransfer.setData("TTSourceWindowId", CurrentWindowId); - CleanUpDragClasses(); - EmptyDragAndDrop(); - - if (opt.debug) console.log("started dragging folder"); - if (opt.debug) console.log(DragAndDrop.DragNodeClass); - - DropTargetsFront(this, true, false); - - if (this.parentNode.classList.contains("selected_folder") == false) { - if (opt.debug) console.log(this.parentNode.classList); - document.querySelectorAll(".selected_folder").forEach(function(s){ - s.classList.add("selected_folder_frozen"); - s.classList.remove("selected_folder"); - }); - this.parentNode.classList.add("selected_folder_temporarly"); - this.parentNode.classList.add("selected_folder"); - } else { - document.querySelectorAll(".group:not(#"+active_group+") .selected_folder").forEach(function(s){ - s.classList.add("selected_folder_frozen"); - s.classList.remove("selected_folder"); - }); - } - RemoveHeadersHoverClass(); - // let test_data = []; - document.querySelectorAll("[id='"+this.parentNode.id+"'], [id='"+this.parentNode.id+"'] .folder, [id='"+this.parentNode.id+"'] .tab").forEach(function(s){ - s.classList.add("dragged_tree"); - }); - document.querySelectorAll(".selected_tab, .selected_tab .tab, .selected_folder, .selected_folder .folder").forEach(function(s){ - s.classList.add("dragged_selected"); - // test_data.push(s.id); - }); - let Folders = GetSelectedFolders(); - - document.querySelectorAll("[id='"+this.parentNode.id+"'], [id='"+this.parentNode.id+"'] .folder, [id='"+this.parentNode.id+"'] .tab").forEach(function(s){ - s.classList.add("dragged_tree"); - }); - document.querySelectorAll(".selected_tab, .selected_tab .tab, .selected_folder, .selected_folder .folder").forEach(function(s){ - s.classList.add("dragged_selected"); - }); - - if (opt.max_tree_drag_drop_folders) { - document.querySelectorAll(".dragged_tree .folder").forEach(function(s){ - let parents = GetParentsByClass(s.parentNode, "dragged_tree"); - if (parents.length > DragAndDrop.Depth) { - DragAndDrop.Depth = parents.length; - } - }); - } else { - DragAndDrop.Depth = -1; - } - - DragAndDrop.DragNodeClass = "folder"; - DragAndDrop.TabsIds = Object.assign([], Folders.TabsIds); - DragAndDrop.TabsIdsParents = Object.assign([], Folders.TabsIdsParents); - DragAndDrop.Folders = Object.assign({}, Folders.Folders); - DragAndDrop.FoldersSelected = Object.assign([], Folders.FoldersSelected); - DragAndDrop.ComesFromWindowId = CurrentWindowId; - - chrome.runtime.sendMessage({ - command: "drag_drop", - DragNodeClass: DragAndDrop.DragNodeClass, - TabsIds: DragAndDrop.TabsIds, - TabsIdsParents: DragAndDrop.TabsIdsParents, - TabsIdsSelected: DragAndDrop.TabsIdsSelected, - ComesFromWindowId: CurrentWindowId, - Depth: DragAndDrop.Depth, - Folders: DragAndDrop.Folders, - FoldersSelected: DragAndDrop.FoldersSelected - }); + FolderStartDrag(this, event); } fh.ondragenter = function(event) { this.classList.remove("folder_header_hover"); @@ -204,34 +146,27 @@ function AppendFolder(folderId, Name, ParentId, Expand, SetEvents) { this.classList.remove("close_show"); } } - dc.ondragenter = function(event) { - // DRAGENTER PIN,TAB,FOLDER==>DROP ZONES - DragAndDrop.timeout = false; + fh.ondragleave = function(event) { + RemoveHighlight(); + } + fh.ondragover = function(event) { + FolderDragOver(this, event); + } + + fh.ondragenter = function(event) { + DragOverTimer = false; setTimeout(function() { - DragAndDrop.timeout = true; + DragOverTimer = true; }, 1000); - if (DragAndDrop.DragNodeClass == "tab" || DragAndDrop.DragNodeClass == "folder") { - HighlightDragEnter(this, 0, "folder"); - } - } - du.ondragenter = function(event) { - // FOLDER==>FOLDER - if (DragAndDrop.DragNodeClass == "tab" || DragAndDrop.DragNodeClass == "folder") { - HighlightDragEnter(this, 1, "folder"); - } - } - dd.ondragenter = function(event) { - // FOLDER==>FOLDER - if (DragAndDrop.DragNodeClass == "tab" || DragAndDrop.DragNodeClass == "folder") { - HighlightDragEnter(this, 1, "folder"); - } } + ex.onmousedown = function(event) { + event.stopPropagation(); if (document.getElementById("main_menu").style.top != "-1000px") { HideMenus(); } // EXPAND/COLLAPSE FOLDER - if (event.which == 1 && !event.shiftKey && !event.ctrlKey) { + if (event.which == 1 && !event.shiftKey && !event.ctrlKey && event.target == this) { event.stopPropagation(); EventExpandBox(this.parentNode.parentNode); RefreshExpandStates(); @@ -257,8 +192,11 @@ function GenerateNewFolderID() { } function AppendFolders(Folders) { + if (opt.debug) { + log("f: AppendFolders, Folders: "+JSON.stringify(Folders)); + } for (var folderId in Folders) { - AppendFolder(folderId, Folders[folderId].name, Folders[folderId].parent, Folders[folderId].expand, true); + AppendFolder(folderId, Folders[folderId].name, Folders[folderId].parent, Folders[folderId].expand, true, undefined); } for (var folderId in Folders) { let f = document.getElementById(folderId); @@ -279,17 +217,16 @@ function SaveFolders() { } function RearrangeFolders(first_loop) { + if (opt.debug) { + log("f: RearrangeFolders"); + } document.querySelectorAll(".folder").forEach(function(s){ if (bgfolders[s.id] && s.parentNode.childNodes[bgfolders[s.id].index]) { let Ind = Array.from(s.parentNode.children).indexOf(s); if (Ind > bgfolders[s.id].index) { - s.parentNode.childNodes[bgfolders[s.id].index].parentNode.insertBefore(s, s.parentNode.childNodes[bgfolders[s.id].index]); + InsterBeforeNode(s, s.parentNode.childNodes[bgfolders[s.id].index]); } else { - if (s.parentNode.childNodes[bgfolders[s.id].index].nextSibling != null) { - s.parentNode.childNodes[bgfolders[s.id].index].parentNode.insertBefore(s, s.parentNode.childNodes[bgfolders[s.id].index].nextSibling); - } else { - s.parentNode.childNodes[bgfolders[s.id].index].parentNode.appendChild(s); - } + InsterAfterNode(s, s.parentNode.childNodes[bgfolders[s.id].index]); } } let newInd = Array.from(s.parentNode.children).indexOf(s); @@ -300,27 +237,30 @@ function RearrangeFolders(first_loop) { } function RemoveFolder(FolderId) { + if (opt.debug) { + log("f: RemoveFolder, folderId "+FolderId); + } let folder = document.getElementById(FolderId); if (folder != null) { - let CF = folder.childNodes[4]; // CF stands for DIV with children folders - let CT = folder.childNodes[5]; // CT stands for DIV with children tabs + let CF = folder.childNodes[1]; // CF stands for DIV with children folders + let CT = folder.childNodes[2]; // CT stands for DIV with children tabs if (opt.promote_children == true) { if (opt.promote_children_in_first_child == true && CF.children.length > 0) { let FirstFolderChild = CF.firstChild; folder.parentNode.insertBefore(FirstFolderChild, folder); - let NewCF = FirstFolderChild.childNodes[4]; + let NewCF = FirstFolderChild.childNodes[1]; while (CF.firstChild) { NewCF.appendChild(CF.firstChild); } if (CT.childNodes.length > 0) { - let NewCT = FirstFolderChild.childNodes[5]; + let NewCT = FirstFolderChild.childNodes[2]; while (CT.firstChild) { NewCT.appendChild(CT.firstChild); } } } else { let NewCT = document.getElementById("ct"+folder.parentNode.parentNode.id); - // let NewCT = folder.parentNode.parentNode.childNodes[5]; + // let NewCT = folder.parentNode.parentNode.childNodes[2]; while (CT.firstChild) { NewCT.appendChild(CT.firstChild); } @@ -344,17 +284,20 @@ function RemoveFolder(FolderId) { } } -function SetActiveFolder(FolderId) { - let folder = document.getElementById(FolderId); - if (folder != null) { - document.querySelectorAll(".selected_folder").forEach(function(s){ - s.classList.remove("selected_folder"); - }); - folder.classList.add("selected_folder"); - } -} +// function SetActiveFolder(FolderId) { + // let folder = document.getElementById(FolderId); + // if (folder != null) { + // document.querySelectorAll(".selected_folder").forEach(function(s){ + // s.classList.remove("selected_folder"); + // }); + // folder.classList.add("selected_folder"); + // } +// } function ShowRenameFolderDialog(FolderId) { // Rename folder popup + if (opt.debug) { + log("f: ShowRenameFolderDialog, folderId "+FolderId); + } HideRenameDialogs(); if (bgfolders[FolderId]) { let name = document.getElementById("folder_edit_name"); @@ -363,7 +306,8 @@ function ShowRenameFolderDialog(FolderId) { // Rename folder popup folderEditDialog.setAttribute("FolderId", FolderId); folderEditDialog.style.display = "block"; folderEditDialog.style.top = document.getElementById("toolbar").getBoundingClientRect().height + document.getElementById("pin_list").getBoundingClientRect().height + 8 + "px"; - folderEditDialog.style.left = "22px"; + // folderEditDialog.style.left = "22px"; + folderEditDialog.style.left = ""; setTimeout(function(){ document.getElementById("folder_edit_name").select(); },5); @@ -373,26 +317,35 @@ function ShowRenameFolderDialog(FolderId) { // Rename folder popup function FolderRenameConfirm() { // when pressed OK in folder popup let name = document.getElementById("folder_edit_name"); let FolderId = document.getElementById("folder_edit").getAttribute("FolderId"); - name.value = name.value.replace(/[\f\n\r\v\t\<\>\+\-\(\)\.\,\;\:\~\/\|\?\@\!\"\'\£\$\%\&\^\#\=\*\[\]]?/gi, ""); + // name.value = name.value.replace(/[\f\n\r\v\t\<\>\+\-\(\)\.\,\;\:\~\/\|\?\@\!\"\'\£\$\%\&\^\#\=\*\[\]]?/gi, ""); bgfolders[FolderId].name = name.value; document.getElementById("folder_title" + FolderId).textContent = name.value; HideRenameDialogs(); + if (opt.debug) { + log("f: FolderRenameConfirm, folderId "+FolderId+", name: "+name.value); + } chrome.runtime.sendMessage({command: "save_folders", folders: bgfolders, windowId: CurrentWindowId}); RefreshCounters(); } function DeselectFolders() { + if (opt.debug) { + log("f: DeselectFolders"); + } document.querySelectorAll("#"+active_group+" .selected_folder").forEach(function(s){ s.classList.remove("selected_folder"); }); } function ActionClickFolder(FolderNode, bgOption) { + if (opt.debug) { + log("f: ActionClickFolder, folderId "+FolderNode.id+", bgOption: "+bgOption); + } if (bgOption == "rename_folder") { ShowRenameFolderDialog(FolderNode.id); } if (bgOption == "new_folder") { - AddNewFolder(FolderNode.id, undefined, undefined, undefined); + AddNewFolder(undefined, FolderNode.id, undefined, undefined, undefined, undefined, true); } if (bgOption == "new_tab") { OpenNewTab(false, FolderNode.id); @@ -412,3 +365,125 @@ function ActionClickFolder(FolderNode, bgOption) { } } +function FolderStartDrag(Node, event) { + if (opt.debug) { + log("f: FolderStartDrag, folderId "+Node.id); + } + event.stopPropagation(); + event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); + event.dataTransfer.setData("text", ""); + event.dataTransfer.setData("SourceWindowId", CurrentWindowId); + CleanUpDragClasses(); + EmptyDragAndDrop(); + + DragNodeClass = "folder"; + + let TabsIds = []; + let TabsIdsParents = []; + + let Folders = {}; + let FoldersSelected = []; + + + if (Node.parentNode.classList.contains("selected_folder")) { + document.querySelectorAll(".group:not(#"+active_group+") .selected_folder").forEach(function(s){ + s.classList.add("selected_folder_frozen"); + s.classList.remove("selected_folder"); + }); + } else { + FreezeSelected(); + Node.parentNode.classList.add("selected_folder_temporarly"); + Node.parentNode.classList.add("selected_folder"); + } + + RemoveHeadersHoverClass(); + + document.querySelectorAll("[id='"+Node.parentNode.id+"'], [id='"+Node.parentNode.id+"'] .folder, [id='"+Node.parentNode.id+"'] .tab").forEach(function(s){ + s.classList.add("dragged_tree"); + }); + + if (opt.max_tree_drag_drop_folders) { + document.querySelectorAll(".dragged_tree .folder").forEach(function(s){ + let parents = GetParentsByClass(s.parentNode, "dragged_tree"); + if (parents.length > DragTreeDepth) { + DragTreeDepth = parents.length; + } + }); + } else { + DragTreeDepth = -1; + } + + // REST OF SELECTED FOLDERS+TABS THAT WILL BE DRAGGED + document.querySelectorAll(".selected_folder, .selected_folder .tab, .selected_folder .folder").forEach(function(s){ + s.classList.add("dragged_tree"); + }); + + document.querySelectorAll("#"+active_group+" .selected_folder").forEach(function(s){ + FoldersSelected.push(s.id); + Folders[s.id] = Object.assign({}, bgfolders[s.id]); + let Fchildren = document.querySelectorAll("#cf"+s.id+" .folder"); + Fchildren.forEach(function(fc){ + Folders[fc.id] = Folders[fc.id] = Object.assign({}, bgfolders[fc.id]); + }); + let Tchildren = document.querySelectorAll("#ct"+s.id+" .tab"); + Tchildren.forEach(function(tc){ + TabsIds.push(parseInt(tc.id)); + TabsIdsParents.push(tc.parentNode.id); + }); + }); + + event.dataTransfer.setData("TabsIds", JSON.stringify(TabsIds)); + event.dataTransfer.setData("TabsIdsParents", JSON.stringify(TabsIdsParents)); + + event.dataTransfer.setData("Folders", JSON.stringify(TabsIds)); + event.dataTransfer.setData("FoldersSelected", JSON.stringify(FoldersSelected)); + + chrome.runtime.sendMessage({ + command: "drag_drop", + DragNodeClass: "folder", + DragTreeDepth: DragTreeDepth + }); +} + +function FolderDragOver(Node, event) { + if (opt.debug) { + log("f: debug, folderId "+Node.id); + } + if (Node.parentNode.classList.contains("dragged_tree") == false) { + + let P = (GetParentsByClass(Node, "folder")).length + DragTreeDepth; + let PGroup = Node.parentNode.parentNode.parentNode.classList.contains("group"); + + if (DragNodeClass == "folder" && Node.parentNode.classList.contains("before") == false && event.layerY < Node.clientHeight/3 && (P <= opt.max_tree_depth+1 || opt.max_tree_depth<0 || PGroup || opt.max_tree_drag_drop_folders == false)) { + RemoveHighlight(); + Node.parentNode.classList.remove("inside"); + Node.parentNode.classList.remove("after"); + Node.parentNode.classList.add("before"); + Node.parentNode.classList.add("highlighted_drop_target"); + } + + if (DragNodeClass == "folder" && Node.parentNode.classList.contains("inside") == false && event.layerY > Node.clientHeight/3 && event.layerY <= 2*(Node.clientHeight/3) && (P <= opt.max_tree_depth || opt.max_tree_depth<0 || opt.max_tree_drag_drop_folders == false)) { + RemoveHighlight(); + Node.parentNode.classList.remove("before"); + Node.parentNode.classList.remove("after"); + Node.parentNode.classList.add("inside"); + Node.parentNode.classList.add("highlighted_drop_target"); + } + + if (DragNodeClass == "folder" && Node.parentNode.classList.contains("after") == false && Node.parentNode.classList.contains("o") == false && event.layerY > 2*(Node.clientHeight/3) && (P <= opt.max_tree_depth+1 || opt.max_tree_depth<0 || PGroup || opt.max_tree_drag_drop_folders == false)) { + RemoveHighlight(); + Node.parentNode.classList.remove("inside"); + Node.parentNode.classList.remove("before"); + Node.parentNode.classList.add("after"); + Node.parentNode.classList.add("highlighted_drop_target"); + } + + if (DragNodeClass == "tab" && Node.parentNode.classList.contains("inside") == false && (P <= opt.max_tree_depth || opt.max_tree_depth<0 || opt.max_tree_drag_drop_folders == false)) { + RemoveHighlight(); + Node.parentNode.classList.remove("before"); + Node.parentNode.classList.remove("after"); + Node.parentNode.classList.add("inside"); + Node.parentNode.classList.add("highlighted_drop_target"); + } + } +} \ No newline at end of file diff --git a/scripts/global.js b/scripts/global.js index 4876e51..d2aadfa 100644 --- a/scripts/global.js +++ b/scripts/global.js @@ -4,34 +4,34 @@ // ********** GLOBAL VARIABLES FOR BACKGROUND, OPTIONS AND SIDEBAR *************** +// BACKGROUND VARIABLES +let debug = []; var running = false; var schedule_save = -999; -var schedule_update_data = 0; -var schedule_rearrange_tabs = 0; -var schedule_rearrange_reverse = false; var windows = {}; var tabs = {}; var tt_ids = {}; -var DragAndDrop = { - timeout: false, - Depth: 0, - // DragNode: undefined, - DragNodeClass: "", - TabsIds: [], - TabsIdsParents: [], - TabsIdsSelected: [], - Folders: {}, - FoldersSelected: [], - ComesFromWindowId: undefined, - DroppedToWindowId: 0 -}; + + +// SIDEBAR VARIABLES +var AutoSaveSession; +var schedule_update_data = 0; +var schedule_rearrange_tabs = 0; + +var DragNodeClass = ""; +var DragOverTimer = true; +var DragTreeDepth = 0; + var menuItemNode; var CurrentWindowId = 0; var SearchIndex = 0; var active_group = "tab_list"; var opt = {}; -var browserId = navigator.userAgent.match("Opera") !== null ? "O" : ( navigator.userAgent.match("Vivaldi") !== null ? "V" : (navigator.userAgent.match("Firefox") !== null ? "F" : "C" ) ); -var bgtabs = {}; +var browserId = navigator.userAgent.match("Opera|OPR") !== null ? "O" : ( navigator.userAgent.match("Vivaldi") !== null ? "V" : (navigator.userAgent.match("Firefox") !== null ? "F" : "C" ) ); + +var newTabUrl = browserId == "F" ? "about:newtab" : "chrome://startpage/"; +var EmptyTabs = []; + var bggroups = {}; var bgfolders = {}; var caption_clear_filter = chrome.i18n.getMessage("caption_clear_filter"); @@ -39,74 +39,30 @@ var caption_loading = chrome.i18n.getMessage("caption_loading"); var caption_searchbox = chrome.i18n.getMessage("caption_searchbox"); var caption_ungrouped_group = chrome.i18n.getMessage("caption_ungrouped_group"); var caption_noname_group = chrome.i18n.getMessage("caption_noname_group"); -const DefaultToolbar = - '
'+ - '
'+ - '
'+ - '
'+ - ''+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - ''+ - '
'+ - '
'+ - (browserId != "F" ? - '
'+ - '
'+ - '
'+ - '
'+ - '
' - : '')+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - (browserId != "F" ? - '
'+ - '
'+ - '
' - : '')+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'; -var DefaultTheme = { + + +// DEFAULTS NEEDED FOR START AND FOR OPTIONS PAGE +const DefaultToolbar = { + "toolbar_main": ["button_new", "button_pin", "button_undo", "button_search", "button_tools", "button_groups", "button_backup", "button_folders"], + "toolbar_search": ["button_filter_type", "filter_search_go_prev", "filter_search_go_next"], + "toolbar_shelf_tools": (browserId == "F" ? ["button_manager_window", "button_options", "button_unload", "button_detach", "button_reboot"] : ["button_manager_window", "button_options", "button_bookmarks", "button_downloads", "button_history", "button_settings", "button_extensions", "button_unload", "button_detach", "button_reboot"]), + "toolbar_shelf_groups": ["button_groups_toolbar_hide", "button_new_group", "button_remove_group", "button_edit_group", "button_import_group", "button_export_group"], + "toolbar_shelf_backup": (browserId == "F" ? ["button_import_bak", "button_import_merge_bak", "button_export_bak"] : ["button_import_bak", "button_import_merge_bak", "button_export_bak", "button_load_bak1", "button_load_bak2", "button_load_bak3"]), + "toolbar_shelf_folders": ["button_new_folder", "button_remove_folder", "button_edit_folder"] +}; + +const DefaultTheme = { "ToolbarShow": true, "ColorsSet": {}, "TabsSizeSetNumber": 2, "TabsMargins": "2", "theme_name": "untitled", - "theme_version": 3, - "toolbar": DefaultToolbar, - "unused_buttons": "" + "theme_version": 4, }; -var DefaultPreferences = { + +const DefaultPreferences = { + "hide_other_groups_tabs_firefox": false, + "show_toolbar": true, "skip_load": false, "pin_list_multi_row": true, "always_show_close": false, @@ -137,13 +93,12 @@ var DefaultPreferences = { "midclick_group": "nothing", "midclick_folder": "nothing", "dbclick_folder": "rename_folder", - "debug": false -}; -var theme = { - "TabsSizeSetNumber": 2, - "TabsMargins": "2", - "ToolbarShow": true, - "toolbar": DefaultToolbar + "debug": false, + "orphaned_tabs_to_ungrouped": false, + "tab_group_regexes": [], + "move_tabs_on_url_change": "never", + "autosave_max_to_keep": 5, + "autosave_interval": 15 }; // ******************* GLOBAL FUNCTIONS ************************ @@ -154,122 +109,13 @@ function GenerateRandomID(){ var random = ""; for (var letter = 0; letter < 6; letter++ ) {random += letters[Math.floor(Math.random() * letters.length)];} return random; } -// color in format "rgb(r,g,b)" or simply "r,g,b" (can have spaces, but must contain "," between values) -function RGBtoHex(color){ - color = color.replace(/[rgb(]|\)|\s/g, ""); color = color.split(","); return color.map(function(v){ return ("0"+Math.min(Math.max(parseInt(v), 0), 255).toString(16)).slice(-2); }).join(""); -} -function HexToRGB(hex, alpha){ - hex = hex.replace('#', ''); - let r = parseInt(hex.length == 3 ? hex.slice(0, 1).repeat(2) : hex.slice(0, 2), 16); - let g = parseInt(hex.length == 3 ? hex.slice(1, 2).repeat(2) : hex.slice(2, 4), 16); - let b = parseInt(hex.length == 3 ? hex.slice(2, 3).repeat(2) : hex.slice(4, 6), 16); - if (alpha) { return 'rgba('+r+', '+g+', '+b+', '+alpha+')'; } else { return 'rgb('+r+', '+g+', '+b+')'; } -} - -function GetCurrentTheme() { - chrome.storage.local.get(null, function(items) { - if (items["current_theme"] && items["themes"] && items["themes"][items["current_theme"]]) { - theme = items["themes"][items["current_theme"]]; - if (theme.theme_version == 1) { - theme["ColorsSet"]["scrollbar_height"] = theme.ScrollbarPinList + "px"; - theme["ColorsSet"]["scrollbar_width"] = theme.ScrollbarTabList + "px"; - theme["toolbar"] = DefaultToolbar; - theme["unused_buttons"] = ""; - } - if (theme.theme_version == 2) { - SelectedTheme["TabsMargins"] = "2"; - } - } else { - theme = Object.assign({}, DefaultTheme); - } - }); -} - -function ApplyTheme(theme) { - if (theme.theme_version == 1) { - theme["ColorsSet"]["scrollbar_height"] = theme.ScrollbarPinList + "px"; - theme["ColorsSet"]["scrollbar_width"] = theme.ScrollbarTabList + "px"; - theme["toolbar"] = DefaultToolbar; - theme["unused_buttons"] = ""; - } - if (theme.theme_version == 2) { - theme["TabsMargins"] = "2"; - } - RestoreStateOfGroupsToolbar(); - ApplySizeSet(theme["TabsSizeSetNumber"]); - ApplyColorsSet(theme["ColorsSet"]); - ApplyTabsMargins(theme["TabsMargins"]); - if (theme.ToolbarShow == true) { - SetToolbarEvents(true, false, false, ""); - if (theme.theme_version == DefaultTheme.theme_version) { - document.getElementById("toolbar").innerHTML = theme.toolbar; - if (browserId == "F") { - document.querySelectorAll(".button#button_load_bak1, .button#button_load_bak2, .button#button_load_bak3").forEach(function(s){ - s.parentNode.removeChild(s); - }); - } - } else { - document.getElementById("toolbar").innerHTML = DefaultToolbar; - } - SetToolbarEvents(false, true, true, "mousedown"); - RestoreToolbarShelf(); - RestoreToolbarSearchFilter(); - } else { - document.getElementById("toolbar").innerHTML = ""; - RefreshGUI(); - } - - for (var groupId in bggroups) { - let groupTitle = document.getElementById("_gte"+groupId); - if (groupTitle != null && bggroups[groupId].font == "") { - groupTitle.style.color = ""; - } - } - Loadi18n(); -} - -// theme colors is an object with css variables (but without --), for example; {"button_background": "#f2f2f2", "filter_box_border": "#cccccc"} -function ApplyColorsSet(ThemeColors){ - let css_variables = ""; - for (let css_variable in ThemeColors) { - css_variables = css_variables + "--" + css_variable + ":" + ThemeColors[css_variable] + ";"; - } - for (let si = 0; si < document.styleSheets.length; si++) { - if (document.styleSheets[si].ownerNode.id == "theme_colors") { - document.styleSheets[si].deleteRule(document.styleSheets[si].cssRules.length-1); - document.styleSheets[si].insertRule("body { "+css_variables+" }", document.styleSheets[si].cssRules.length); - } - } -} - -function ApplySizeSet(size){ - for (let si = 0; si < document.styleSheets.length; si++) { - if ((document.styleSheets[si].ownerNode.id).match("sizes_preset") != null) { - if (document.styleSheets[si].ownerNode.id == "sizes_preset_"+size) { - document.styleSheets.item(si).disabled = false; - } else { - document.styleSheets.item(si).disabled = true; - } - } - } - if (browserId == "F") { - // for some reason top position for various things is different in firefox????? - if (size > 1) { - document.styleSheets[document.styleSheets.length-1].insertRule(".tab_header>.tab_title { margin-top: -1px; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - } else { - document.styleSheets[document.styleSheets.length-1].insertRule(".tab_header>.tab_title { margin-top: 0px; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); - } - } -} - -function ApplyTabsMargins(size){ - for (let si = 0; si < document.styleSheets.length; si++) { - if ((document.styleSheets[si].ownerNode.id).match("tabs_margin") != null) { - if (document.styleSheets[si].ownerNode.id == "tabs_margin_"+size) { - document.styleSheets.item(si).disabled = false; - } else { - document.styleSheets.item(si).disabled = true; +function GetCurrentPreferences(storage) { + opt = Object.assign({}, DefaultPreferences); + if (storage["preferences"]) { + for (var parameter in storage["preferences"]) { + if (opt[parameter] != undefined) { + opt[parameter] = storage["preferences"][parameter]; } } } @@ -279,59 +125,77 @@ function LoadDefaultPreferences() { opt = Object.assign({}, DefaultPreferences); } -function SavePreferences() { - chrome.runtime.sendMessage({command: "save_preferences", opt: opt}, function(response) { - setTimeout(function() { - chrome.runtime.sendMessage({command: "reload_options"}); - }, 300); - }); +function GetCurrentTheme(storage) { + if (storage["current_theme"] && storage["themes"] && storage["themes"][storage["current_theme"]]) { + let theme = storage["themes"][storage["current_theme"]]; + let correctedTheme = CheckTheme(theme); + if (correctedTheme.theme_version < 4 && storage["preferences"].show_toolbar == undefined) { + opt.show_toolbar = correctedTheme.ToolbarShow; + SavePreferences(); + } + return correctedTheme; + } else { + return DefaultTheme; + } } -function ShowOpenFileDialog(id, extension) { +function GetCurrentToolbar(storage) { + if (storage["toolbar"]) { + return storage["toolbar"]; + } else { + return DefaultToolbar; + } +} + +function SavePreferences() { + chrome.storage.local.set({preferences: opt}); + chrome.runtime.sendMessage({command: "reload_options", opt: opt}); +} + +function ShowOpenFileDialog(extension) { let body = document.getElementById("body"); let inp = document.createElement("input"); - inp.id = id; + inp.id = "file_import"; inp.type = "file"; inp.accept = extension; inp.style.display = "none"; body.appendChild(inp); - inp.click(); + setTimeout(function() { + inp.click(); + }, 10); return inp; } -function SaveFile(filename, data) { - chrome.tabs.query({currentWindow: true, active: true}, function(activeTab) { - chrome.tabs.create({url: "download.html"}, function(tab) { - setTimeout(function() { - chrome.runtime.sendMessage({command: "show_save_file_dialog", currentTabId: activeTab[0].id, selfTabId: tab.id, data: data, filename: filename}); - }, 100); - }); - }); +function SaveFile(filename, extension, data) { + let file = new File([JSON.stringify(data)], filename+"."+extension, {type: "text/"+extension+";charset=utf-8"} ); + let body = document.getElementById("body"); + let savelink = document.createElement("a"); + savelink.href = URL.createObjectURL(file); + savelink.fileSize = file.size; + savelink.target = "_blank"; + savelink.style.display = "none"; + savelink.type = "file"; + savelink.download = filename+"."+extension; + body.appendChild(savelink); + setTimeout(function() { + savelink.click(); + setTimeout(function() { + savelink.parentNode.removeChild(savelink); + }, 60000); + }, 10); } -// function SaveFile(filename, data) { - // let file = new File([JSON.stringify(data)], filename, {type: "text/csv;charset=utf-8"} ); - // let body = document.getElementById("body"); - // let savelink = document.createElement("a"); - // savelink.target = "_blank"; - // savelink.style.display = "none"; - // savelink.type = "file"; - // savelink.download = filename; - // savelink.href = URL.createObjectURL(file); - // body.appendChild(savelink); - // savelink.click(); - // savelink.parentNode.removeChild(savelink); -// } +function log(log) { + if (opt.debug) { + chrome.runtime.sendMessage({command: "debug", log: log}); + } +} -function EmptyDragAndDrop() { - DragAndDrop.timeout = false; - DragAndDrop.DragNodeClass = ""; - DragAndDrop.DroppedToWindowId = 0; - DragAndDrop.ComesFromWindowId = undefined; - DragAndDrop.Depth = 0; - DragAndDrop.TabsIds = []; - DragAndDrop.TabsIdsParents = []; - DragAndDrop.TabsIdsSelected = []; - DragAndDrop.Folders = {}; - DragAndDrop.FoldersSelected = []; +function pushlog(log) { + debug.push(log); + if (debug.length > 100) { + debug.splice(0, 1); + } + console.log(log); + schedule_save++; } \ No newline at end of file diff --git a/scripts/groups.js b/scripts/groups.js index e1484d9..4f01c50 100644 --- a/scripts/groups.js +++ b/scripts/groups.js @@ -9,6 +9,9 @@ function SaveGroups() { } function AppendGroups(Groups) { + if (opt.debug) { + log("f: AppendGroups, Groups: "+JSON.stringify(Groups)); + } // let GroupList = document.getElementById("group_list"); // let scroll = GroupList.scrollTop; @@ -26,19 +29,18 @@ function AppendGroups(Groups) { } function RearrangeGroupsButtons(first_loop) { + if (opt.debug) { + log("f: RearrangeGroupsButtons"); + } document.querySelectorAll(".group_button").forEach(function(s){ let groupId = (s.id).substr(1); if (bggroups[groupId]) { if (s.parentNode.childNodes[bggroups[groupId].index] != undefined) { let Ind = Array.from(s.parentNode.children).indexOf(s); if (Ind > bggroups[groupId].index) { - s.parentNode.childNodes[bggroups[groupId].index].parentNode.insertBefore(s, s.parentNode.childNodes[bggroups[groupId].index]); + InsterBeforeNode(s, s.parentNode.childNodes[bggroups[groupId].index]); } else { - if (s.parentNode.childNodes[bggroups[groupId].index].nextSibling != null) { - s.parentNode.childNodes[bggroups[groupId].index].parentNode.insertBefore(s, s.parentNode.childNodes[bggroups[groupId].index].nextSibling); - } else { - s.parentNode.childNodes[bggroups[groupId].index].parentNode.appendChild(s); - } + InsterAfterNode(s, s.parentNode.childNodes[bggroups[groupId].index]); } let newInd = Array.from(s.parentNode.children).indexOf(s); if (newInd != bggroups[groupId].index && first_loop) { @@ -50,6 +52,9 @@ function RearrangeGroupsButtons(first_loop) { } function RearrangeGroupsLists() { + if (opt.debug) { + log("f: RearrangeGroupsLists"); + } let activegroup = document.getElementById(active_group); let scroll = activegroup.scrollTop; let groups = document.getElementById("groups"); @@ -63,17 +68,25 @@ function RearrangeGroupsLists() { } function AppendGroupToList(groupId, group_name, font_color, SetEvents) { + if (opt.debug) { + log("f: AppendGroupToList, groupId: "+groupId+", group_name: "+group_name+", font_color: "+font_color+", SetEvents: "+SetEvents); + } if (document.getElementById(groupId) == null) { let grp = document.createElement("div"); grp.className = "group"; grp.id = groupId; grp.style.display = "none"; document.getElementById("groups").appendChild(grp); let gcf = document.createElement("div"); gcf.className = "children_folders"; gcf.id = "cf"+groupId; grp.appendChild(gcf); let gct = document.createElement("div"); gct.className = "children_tabs"; gct.id = "ct"+groupId; grp.appendChild(gct); if (SetEvents) { - grp.onmousedown = function(event) { - event.stopImmediatePropagation(); + grp.onclick = function(event) { if (event.which == 1 && event.target == this && event.clientX < (this.childNodes[0].getBoundingClientRect().width + this.getBoundingClientRect().left)) { DeselectFolders(); DeselectTabs(); + } + } + grp.onmousedown = function(event) { + event.stopImmediatePropagation(); + if (event.which == 1 && event.target == this && event.clientX < (this.childNodes[0].getBoundingClientRect().width + this.getBoundingClientRect().left)) { HideMenus(); + return false; } if (event.which == 2) { event.preventDefault(); @@ -83,11 +96,19 @@ function AppendGroupToList(groupId, group_name, font_color, SetEvents) { // SHOW MENU ShowFGlobalMenu(event); } + if (browserId == "V") { + chrome.windows.getCurrent({populate: false}, function(window) { + if (CurrentWindowId != window.id) { + location.reload(); + } + }); + } } - grp.ondragenter = function(event) { + grp.ondragover = function(event) { // PIN,TAB==>GROUP - if (event.target.id == this.id && (DragAndDrop.DragNodeClass == "tab" || DragAndDrop.DragNodeClass == "folder")) { - HighlightNode(this); + if (event.target.id == this.id && (DragNodeClass == "tab" || DragNodeClass == "folder")) { + RemoveHighlight(); + this.classList.add("highlighted_drop_target"); } } // DOUBLE CLICK ACTION @@ -106,7 +127,7 @@ function AppendGroupToList(groupId, group_name, font_color, SetEvents) { } if (document.getElementById("_"+groupId) == null) { - let gbn = document.createElement("div"); gbn.className = "group_button"; gbn.id = "_"+groupId; document.getElementById("group_list").appendChild(gbn); + let gbn = document.createElement("div"); gbn.className = "group_button"; if (SetEvents) {gbn.draggable = true;} gbn.id = "_"+groupId; document.getElementById("group_list").appendChild(gbn); let gte = document.createElement("span"); gte.className = "group_title"; gte.id = "_gte"+groupId; gte.textContent = group_name; if (font_color != "") { gte.style.color = "#"+font_color; @@ -114,14 +135,12 @@ function AppendGroupToList(groupId, group_name, font_color, SetEvents) { gte.style.color = window.getComputedStyle(document.getElementById("body"), null).getPropertyValue("--group_list_default_font_color"); } gbn.appendChild(gte); - let gtd = document.createElement("div"); gtd.className = "drop_target group_drag_box"; if (SetEvents) {gtd.draggable = true;} gtd.id = "-"+groupId; gbn.appendChild(gtd); - let gdd = document.createElement("div"); gdd.className = "drop_target group_button_drag_entered_bottom"; gdd.id = "dd"+groupId; gbn.appendChild(gdd); - let gdu = document.createElement("div"); gdu.className = "drop_target group_button_drag_entered_top"; gdu.id = "du"+groupId; gbn.appendChild(gdu); + var di = document.createElement("div"); di.className = "drag_indicator"; di.id = "di"+groupId; gbn.appendChild(di); // DROP TARGET INDICATOR if (SetEvents) { // ACTIVATE GROUP - gtd.onclick = function(event) { + gbn.onclick = function(event) { SetActiveGroup(this.id.substr(1), true, true); } @@ -134,49 +153,31 @@ function AppendGroupToList(groupId, group_name, font_color, SetEvents) { } // EDIT GROUP - gtd.ondblclick = function(event) { - if (event.which == 1 && this.id != "-tab_list") { + gbn.ondblclick = function(event) { + if (event.which == 1 && this.id != "_tab_list") { ShowGroupEditWindow((this.id).substr(1)); } } // DRAGGING GROUPS - gtd.ondragstart = function(event) { // DRAG START + gbn.ondragstart = function(event) { // DRAG START event.stopPropagation(); event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); event.dataTransfer.setData("text", ""); - // event.dataTransfer.setData("text/plain", ""); - // event.dataTransfer.setData("TTSourceWindowId", CurrentWindowId); + event.dataTransfer.setData("SourceWindowId", CurrentWindowId); CleanUpDragClasses(); EmptyDragAndDrop(); - DragAndDrop.ComesFromWindowId = CurrentWindowId; - DragAndDrop.DragNodeClass = "group"; - // DragAndDrop.DragNode = event.target.parentNode; + DragNodeClass = "group"; - this.parentNode.classList.add("dragged_group_button"); - // event.dataTransfer.setData("null", "null"); - DropTargetsFront(this, false, true); + this.classList.add("dragged_group_button"); } - gtd.ondragenter = function(event) { // DRAG START - if (DragAndDrop.DragNodeClass == "tab" || DragAndDrop.DragNodeClass == "folder") { - HighlightNode(this); - } - } - - gdu.ondragenter = function(event) { // DRAG START - if (DragAndDrop.DragNodeClass == "group") { - HighlightNode(this); - } - } - - gdd.ondragenter = function(event) { // DRAG START - // GROUP BUTTON==>GROUP BUTTON - if (DragAndDrop.DragNodeClass == "group") { - HighlightNode(this); - } + + gbn.ondragover = function(event) { + GroupButtonDragOver(this, event); } + // scroll groups // $(document).on("mousedown", "#scroll_group_up, #scroll_group_down", function(event) { // IOKeys.LMB = true; @@ -202,11 +203,59 @@ function GenerateNewGroupID(){ function AddNewGroup(Name, FontColor) { let newId = GenerateNewGroupID(); bggroups[newId] = { id: newId, index: 0, active_tab: 0, prev_active_tab: 0, active_tab_ttid: "", name: (Name ? Name : caption_noname_group), font: (FontColor ? FontColor : "") }; + if (opt.debug) { + log("f: AddNewGroup, groupId: "+newId+", Name: "+Name+", FontColor: "+FontColor); + } AppendGroupToList(newId, bggroups[newId].name, bggroups[newId].font, true); UpdateBgGroupsOrder(); return newId; } +function FindGroupIdByName(name) { + if (opt.debug) { + log("f: FindGroupIdByName: "+name); + } + for (let key in bggroups) { + if (!bggroups.hasOwnProperty(key)) { + continue; + } + if (bggroups[key].name === name) { + return key; + } + } + return null; +} + +function AppendTabToGroupOnRegexMatch(tabId, url) { + if (opt.debug) { + log("f: AppendTabToGroupOnRegexMatch, tabId: "+tabId+", url: "+url); + } + let Tab = document.getElementById(tabId); + + if (Tab != null && Tab.classList.contains("tab")) { + let TabGroup = GetParentsByClass(Tab, "group"); + + for (let i = 0; i < opt.tab_group_regexes.length; i++) { + let regexPair = opt.tab_group_regexes[i]; + if (url.match(regexPair[0])) { + let groupId = FindGroupIdByName(regexPair[1]); + if (groupId === null) { + groupId = AddNewGroup(regexPair[1]); + } + if (TabGroup.length > 0 && TabGroup[0].id !== groupId) { + let newParent = document.getElementById("ct" + groupId); + newParent.appendChild(Tab); + SetActiveGroup(groupId, true, true); + SetActiveTabInGroup(groupId, Tab.id); + chrome.tabs.update(tabId, { active: true }); + } + break; + } + } + } + +} + // remove group, delete tabs if close_tabs is true function GroupRemove(groupId, close_tabs) { if (close_tabs) { @@ -231,23 +280,25 @@ function GroupRemove(groupId, close_tabs) { RefreshExpandStates(); RefreshCounters(); } - delete bggroups[groupId]; - if (groupId == active_group) { - if (document.getElementById("_"+groupId).previousSibling) { - SetActiveGroup((document.getElementById("_"+groupId).previousSibling.id).substr(1), true, true); - } else { - if (document.getElementById("_"+groupId).nextSibling) { - SetActiveGroup((document.getElementById("_"+groupId).nextSibling.id).substr(1), true, true); + if (groupId != "tab_list") { + delete bggroups[groupId]; + if (groupId == active_group) { + if (document.getElementById("_"+groupId).previousSibling) { + SetActiveGroup((document.getElementById("_"+groupId).previousSibling.id).substr(1), true, true); } else { - SetActiveGroup("tab_list", true, true); + if (document.getElementById("_"+groupId).nextSibling) { + SetActiveGroup((document.getElementById("_"+groupId).nextSibling.id).substr(1), true, true); + } else { + SetActiveGroup("tab_list", true, true); + } } } + let group = document.getElementById(groupId); + group.parentNode.removeChild(group); + let groupButton = document.getElementById("_"+groupId); + groupButton.parentNode.removeChild(groupButton); } SaveGroups(); - let group = document.getElementById(groupId); - group.parentNode.removeChild(group); - let groupButton = document.getElementById("_"+groupId); - groupButton.parentNode.removeChild(groupButton); schedule_update_data++; } @@ -261,7 +312,9 @@ function UpdateBgGroupsOrder() { } function SetActiveGroup(groupId, switch_to_active_in_group, scroll_to_active) { - if (opt.debug) console.log("function: SetActiveGroup"); + if (opt.debug) { + log("f: SetActiveGroup, groupId: "+groupId+", switch_to_active_in_group: "+switch_to_active_in_group+", scroll_to_active: "+scroll_to_active); + } let group = document.getElementById(groupId); if (group != null) { active_group = groupId; @@ -296,6 +349,20 @@ function SetActiveGroup(groupId, switch_to_active_in_group, scroll_to_active) { chrome.runtime.sendMessage({command: "set_active_group", active_group: groupId, windowId: CurrentWindowId}); RefreshExpandStates(); RefreshCounters(); + + if (browserId == "F" && opt.hide_other_groups_tabs_firefox) { + let HideTabIds = Array.prototype.map.call(document.querySelectorAll(".group:not([id='"+groupId+"']) .tab"), function(s){ + return parseInt(s.id); + }); + let ShowTabIds = Array.prototype.map.call(document.querySelectorAll("#"+groupId+" .tab"), function(s){ + return parseInt(s.id); + }); + + browser.tabs.hide(HideTabIds); + browser.tabs.show(ShowTabIds); + } + + } } @@ -322,7 +389,8 @@ function ShowGroupEditWindow(groupId) { groupEditDialog.setAttribute("groupId", groupId); groupEditDialog.style.display = "block"; groupEditDialog.style.top = document.getElementById("toolbar").getBoundingClientRect().height + document.getElementById("pin_list").getBoundingClientRect().height + 8 + "px"; - groupEditDialog.style.left = "22px"; + // groupEditDialog.style.left = "22px"; + groupEditDialog.style.left = ""; let DefaultGroupButtonFontColor = window.getComputedStyle(document.getElementById("body"), null).getPropertyValue("--group_list_default_font_color"); let GroupEditFont = document.getElementById("group_edit_font"); GroupEditFont.style.backgroundColor = (bggroups[groupId].font == "" ? DefaultGroupButtonFontColor : "#"+bggroups[groupId].font); @@ -337,7 +405,7 @@ function GroupEditConfirm() { let groupId = document.getElementById("group_edit").getAttribute("groupId"); if (bggroups[groupId]) { let GroupEditName = document.getElementById("group_edit_name"); - GroupEditName.value = GroupEditName.value.replace(/[\f\n\r\v\t\<\>\+\-\(\)\.\,\;\:\~\/\|\?\@\!\"\'\£\$\%\&\^\#\=\*\[\]]?/gi, ""); + // GroupEditName.value = GroupEditName.value.replace(/[\f\n\r\v\t\<\>\+\-\(\)\.\,\;\:\~\/\|\?\@\!\"\'\£\$\%\&\^\#\=\*\[\]]?/gi, ""); bggroups[groupId].name = GroupEditName.value; let GroupEditFont = document.getElementById("group_edit_font"); let DefaultGroupButtonFontColor = window.getComputedStyle(document.getElementById("body"), null).getPropertyValue("--group_list_default_font_color"); @@ -387,7 +455,6 @@ function GroupsToolbarToggle() { } function ActionClickGroup(Node, bgOption) { - console.log(Node.id) if (bgOption == "new_tab") { if (Node.id == "pin_list") { OpenNewTab(true, undefined); @@ -399,7 +466,74 @@ function ActionClickGroup(Node, bgOption) { if (bgOption == "activate_previous_active") { chrome.tabs.update(parseInt(bggroups[active_group].prev_active_tab), {active: true}); } + if (bgOption == "undo_close_tab") { + chrome.sessions.getRecentlyClosed( null, function(sessions) { + if (sessions.length > 0) { + chrome.sessions.restore(null, function(restored) {}); + } + }); + } } + + + + +// SET ACTIVE TAB FOR EACH GROUP +function SetActiveTabInEachGroup() { + chrome.tabs.query({currentWindow: true, active: true}, function(tabs) { + SetActiveTab(tabs[0].id); + chrome.runtime.sendMessage({command: "get_active_group", windowId: CurrentWindowId}, function(response) { + if (response) { + SetActiveGroup(response, false, true); + for (var group in bggroups) { + let ActiveInGroup = document.querySelector("#"+group+" [id='"+bggroups[group].active_tab+"']"); + if (ActiveInGroup != null) { + ActiveInGroup.classList.add("active_tab"); + } + } + if (tabs[0].pinned) { + let ActiveTabinActiveGroup = document.querySelectorAll("#"+active_group+" .active_tab"); + if (ActiveTabinActiveGroup != null) { + ActiveTabinActiveGroup.forEach(function(s){ + s.classList.remove("active_tab"); + }); + } + } + } else { + SetActiveGroup("tab_list", false, true); + } + }); + }); +} + +function GroupButtonDragOver(Node, event) { + if (Node.classList.contains("inside") == false && (DragNodeClass == "tab" || DragNodeClass == "folder")) { + RemoveHighlight(); + Node.classList.remove("before"); + Node.classList.remove("after"); + Node.classList.add("inside"); + Node.classList.add("highlighted_drop_target"); + } + + if (Node.classList.contains("before") == false && event.layerY < Node.clientHeight/2 && DragNodeClass == "group") { + RemoveHighlight(); + Node.classList.add("before"); + Node.classList.remove("after"); + Node.classList.remove("inside"); + Node.classList.add("highlighted_drop_target"); + } + + if (Node.classList.contains("after") == false && event.layerY > Node.clientHeight/2 && DragNodeClass == "group") { + RemoveHighlight(); + Node.classList.remove("before"); + Node.classList.add("after"); + Node.classList.remove("inside"); + Node.classList.add("highlighted_drop_target"); + } +} + + + // function AppendTabsToGroup(p) { // } diff --git a/scripts/manager.js b/scripts/manager.js new file mode 100644 index 0000000..6f3b2f0 --- /dev/null +++ b/scripts/manager.js @@ -0,0 +1,373 @@ +// Copyright (c) 2017 kroppy. All rights reserved. +// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license +// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + + +function OpenManagerWindow() { + HideRenameDialogs(); + + if (opt.debug) { + log("f: OpenManagerWindow"); + } + + chrome.storage.local.get(null, function(storage) { + let ManagerWindow = document.getElementById("manager_window"); + ManagerWindow.style.display = "block"; + + // ManagerWindow.style.top = document.getElementById("toolbar").getBoundingClientRect().height - 13 + "px"; + ManagerWindow.style.top = ""; + ManagerWindow.style.left = ""; + + let GroupList = document.getElementById("manager_window_groups_list"); + while (GroupList.hasChildNodes()) { + GroupList.removeChild(GroupList.firstChild); + } + + let SessionsList = document.getElementById("manager_window_sessions_list"); + while (SessionsList.hasChildNodes()) { + SessionsList.removeChild(SessionsList.firstChild); + } + + + if (storage.hibernated_groups != undefined) { + storage.hibernated_groups.forEach(function(hibernated_group){ + AddGroupToManagerList(hibernated_group); + }); + } + if (storage.saved_sessions != undefined) { + (storage.saved_sessions).forEach(function(saved_session){ + AddSessionToManagerList(saved_session); + }); + } + + ReAddSessionAutomaticToManagerList(storage); + }); +} + + + +function AddGroupToManagerList(hibernated_group) { + + let GroupList = document.getElementById("manager_window_groups_list"); + + let HibernatedGroupRow = document.createElement("li"); + HibernatedGroupRow.classList = "hibernated_group_row" + GroupList.appendChild(HibernatedGroupRow); + + let DeleteGroupIcon = document.createElement("div"); + DeleteGroupIcon.classList = "manager_window_list_button delete_hibernated_group"; + DeleteGroupIcon.title = chrome.i18n.getMessage("manager_window_delete_icon"); + + DeleteGroupIcon.onmousedown = function(event) { + if (event.which == 1) { + let hib_group = this.parentNode; + let HibernategGroupIndex = Array.from(hib_group.parentNode.children).indexOf(hib_group); + + chrome.storage.local.get(null, function(storage) { + let hibernated_groups = storage.hibernated_groups; + hibernated_groups.splice(HibernategGroupIndex, 1); + + chrome.storage.local.set({hibernated_groups: hibernated_groups}); + hib_group.parentNode.removeChild(hib_group); + RefreshGUI(); + }); + } + } + HibernatedGroupRow.appendChild(DeleteGroupIcon); + + + let ExportGroupIcon = document.createElement("div"); + ExportGroupIcon.classList = "manager_window_list_button export_hibernated_group"; + ExportGroupIcon.title = chrome.i18n.getMessage("manager_window_savetofile_icon"); + ExportGroupIcon.onmousedown = function(event) { + if (event.which == 1) { + let HibernategGroupIndex = Array.from(this.parentNode.parentNode.children).indexOf(this.parentNode); + chrome.storage.local.get(null, function(storage) { + let filename = storage.hibernated_groups[HibernategGroupIndex].group.name == "" ? caption_noname_group : storage.hibernated_groups[HibernategGroupIndex].group.name; + SaveFile(filename, "tt_group", storage.hibernated_groups[HibernategGroupIndex]); + }); + } + } + HibernatedGroupRow.appendChild(ExportGroupIcon); + + let LoadGroupIcon = document.createElement("div"); + LoadGroupIcon.classList = "manager_window_list_button load_hibernated_group"; + LoadGroupIcon.title = chrome.i18n.getMessage("manager_window_load_icon"); + LoadGroupIcon.onmousedown = function(event) { + if (event.which == 1) { + let HibernategGroupIndex = Array.from(this.parentNode.parentNode.children).indexOf(this.parentNode); + chrome.storage.local.get(null, function(storage) { + RecreateGroup(storage.hibernated_groups[HibernategGroupIndex]); + }); + } + } + HibernatedGroupRow.appendChild(LoadGroupIcon); + + + let name = document.createElement("div"); + name.contentEditable = true; + name.textContent = hibernated_group.group.name; + name.classList = "manager_window_group_name text_input"; + name.onkeydown = function(event) { return event.which != 13; } + name.oninput = function(event) { + // this.textContent = (this.textContent).replace(/\n/g,' '); + let hib_group_name = this.textContent; + let hib_group = this.parentNode; + let HibernategGroupIndex = Array.from(hib_group.parentNode.children).indexOf(hib_group); + chrome.storage.local.get(null, function(storage) { + let hibernated_groups = storage.hibernated_groups; + hibernated_groups[HibernategGroupIndex].group.name = hib_group_name; + chrome.storage.local.set({hibernated_groups: hibernated_groups}); + }); + } + HibernatedGroupRow.appendChild(name); + let tabsCounter = document.createElement("div"); + tabsCounter.textContent = " - ("+ hibernated_group.tabs.length + ")"; + tabsCounter.classList = "manager_window_group_name"; + HibernatedGroupRow.appendChild(tabsCounter); + RefreshGUI(); +} + + + +function AddSessionToManagerList(saved_session) { + let SessionsList = document.getElementById("manager_window_sessions_list"); + + let SavedSessionRow = document.createElement("li"); + SavedSessionRow.classList = "saved_session_row" + SessionsList.appendChild(SavedSessionRow); + + + let DeleteSessionIcon = document.createElement("div"); + DeleteSessionIcon.classList = "manager_window_list_button delete_saved_session"; + DeleteSessionIcon.title = chrome.i18n.getMessage("manager_window_delete_icon"); + DeleteSessionIcon.onmousedown = function(event) { + if (event.which == 1) { + let saved_session = this.parentNode; + let SessionIndex = Array.from(saved_session.parentNode.children).indexOf(saved_session); + chrome.storage.local.get(null, function(storage) { + let S_Sessions = storage.saved_sessions; + S_Sessions.splice(SessionIndex, 1); + chrome.storage.local.set({saved_sessions: S_Sessions}); + saved_session.parentNode.removeChild(saved_session); + RefreshGUI(); + + }); + } + } + SavedSessionRow.appendChild(DeleteSessionIcon); + + + let ExportSessionIcon = document.createElement("div"); + ExportSessionIcon.classList = "manager_window_list_button export_saved_session"; + ExportSessionIcon.title = chrome.i18n.getMessage("manager_window_savetofile_icon"); + ExportSessionIcon.onmousedown = function(event) { + if (event.which == 1) { + let saved_session = this.parentNode; + let SessionIndex = Array.from(saved_session.parentNode.children).indexOf(saved_session); + chrome.storage.local.get(null, function(storage) { + let filename = storage.saved_sessions[SessionIndex].name == "" ? caption_noname_group : storage.saved_sessions[SessionIndex].name; + SaveFile(filename, "tt_session", storage.saved_sessions[SessionIndex].session); + }); + } + } + SavedSessionRow.appendChild(ExportSessionIcon); + + + let LoadSessionIcon = document.createElement("div"); + LoadSessionIcon.classList = "manager_window_list_button load_saved_session"; + LoadSessionIcon.title = chrome.i18n.getMessage("manager_window_load_icon"); + LoadSessionIcon.onmousedown = function(event) { + if (event.which == 1) { + let saved_session = this.parentNode; + let SessionIndex = Array.from(saved_session.parentNode.children).indexOf(saved_session); + chrome.storage.local.get(null, function(storage) { + let S_Sessions = storage.saved_sessions; + RecreateSession(S_Sessions[SessionIndex].session); + }); + } + } + SavedSessionRow.appendChild(LoadSessionIcon); + + let MergeSessionIcon = document.createElement("div"); + MergeSessionIcon.classList = "manager_window_list_button merge_saved_session"; + MergeSessionIcon.title = chrome.i18n.getMessage("manager_window_merge_icon"); + MergeSessionIcon.onmousedown = function(event) { + if (event.which == 1) { + let saved_session = this.parentNode; + let SessionIndex = Array.from(saved_session.parentNode.children).indexOf(saved_session); + chrome.storage.local.get(null, function(storage) { + let S_Sessions = storage.saved_sessions; + ImportMergeTabs(S_Sessions[SessionIndex].session); + }); + } + } + SavedSessionRow.appendChild(MergeSessionIcon); + + let name = document.createElement("div"); + name.contentEditable = true; + name.textContent = saved_session.name; + name.classList = "manager_window_session_name"; + name.onkeydown = function(event) { return event.which != 13; } + name.oninput = function(event) { + // this.textContent = (this.textContent).replace(/\n/g,' '); + let session_name = this.textContent; + let s = this.parentNode; + let SessionIndex = Array.from(s.parentNode.children).indexOf(s); + chrome.storage.local.get(null, function(storage) { + let S_Sessions = storage.saved_sessions; + S_Sessions[SessionIndex].name = session_name; + chrome.storage.local.set({saved_sessions: S_Sessions}); + }); + } + SavedSessionRow.appendChild(name); + + RefreshGUI(); +} + + +function ReAddSessionAutomaticToManagerList(storage) { + let SessionsAutomaticList = document.getElementById("manager_window_autosessions_list"); + while (SessionsAutomaticList.hasChildNodes()) { + SessionsAutomaticList.removeChild(SessionsAutomaticList.firstChild); + } + if (storage.saved_sessions_automatic != undefined) { + (storage.saved_sessions_automatic).forEach(function(saved_sessions_automatic){ + AddSessionAutomaticToManagerList(saved_sessions_automatic); + }); + } + RefreshGUI(); +} + + +function AddSessionAutomaticToManagerList(saved_session) { + let SessionsList = document.getElementById("manager_window_autosessions_list"); + + let SavedSessionRow = document.createElement("li"); + SavedSessionRow.classList = "saved_session_row" + SessionsList.appendChild(SavedSessionRow); + + + let LoadSessionIcon = document.createElement("div"); + LoadSessionIcon.classList = "manager_window_list_button load_saved_session"; + LoadSessionIcon.title = chrome.i18n.getMessage("manager_window_load_icon"); + LoadSessionIcon.onmousedown = function(event) { + if (event.which == 1) { + let saved_session = this.parentNode; + let SessionIndex = Array.from(saved_session.parentNode.children).indexOf(saved_session); + chrome.storage.local.get(null, function(storage) { + let S_Sessions = storage.saved_sessions_automatic; + RecreateSession(S_Sessions[SessionIndex].session); + }); + } + } + SavedSessionRow.appendChild(LoadSessionIcon); + + + let MergeSessionIcon = document.createElement("div"); + MergeSessionIcon.classList = "manager_window_list_button merge_saved_session"; + MergeSessionIcon.title = chrome.i18n.getMessage("manager_window_merge_icon"); + MergeSessionIcon.onmousedown = function(event) { + if (event.which == 1) { + let saved_session = this.parentNode; + let SessionIndex = Array.from(saved_session.parentNode.children).indexOf(saved_session); + chrome.storage.local.get(null, function(storage) { + let S_Sessions = storage.saved_sessions_automatic; + // RecreateSession(S_Sessions[SessionIndex].session); + ImportMergeTabs(S_Sessions[SessionIndex].session); + }); + } + } + SavedSessionRow.appendChild(MergeSessionIcon); + + + + let name = document.createElement("div"); + name.textContent = saved_session.name; + name.classList = "manager_window_session_name"; + SavedSessionRow.appendChild(name); + + RefreshGUI(); +} + + +function SetManagerEvents() { + document.getElementById("manager_window_close").onmousedown = function(event) { + if (event.which == 1) { + HideRenameDialogs(); + } + } + + document.querySelectorAll(".manager_window_toolbar_button").forEach(function(s){ + s.onmousedown = function(event) { + if (event.which == 1) { + document.querySelectorAll(".manager_window_panel").forEach(function(s){ + s.classList.remove("mw_pan_on"); + }); + document.getElementById((this.id).replace("button", "panel")).classList.add("mw_pan_on"); + + document.querySelectorAll(".mw_on").forEach(function(s){ + s.classList.remove("mw_on"); + }); + this.classList.add("mw_on"); + RefreshGUI(); + } + } + }); + + + document.getElementById("manager_window_button_import_group").onmousedown = function(event) { + if (event.which == 1) { + let inputFile = ShowOpenFileDialog(".tt_group"); + inputFile.onchange = function(event) { + ImportGroup(false, true); + } + } + } + document.getElementById("manager_window_button_hibernate_group").onmousedown = function(event) { + if (event.which == 1) { + ExportGroup(active_group, false, true); + setTimeout(function() { + GroupRemove(active_group, true); + }, 100); + setTimeout(function() { + OpenManagerWindow(); + }, 150); + } + } + + + document.getElementById("manager_window_button_save_current_session").onmousedown = function(event) { + if (event.which == 1) { + let d = new Date(); + ExportSession((d.toLocaleString().replace("/", ".").replace("/", ".").replace(":", "꞉").replace(":", "꞉")), false, true, false); + } + } + document.getElementById("manager_window_button_import_session").onmousedown = function(event) { + if (event.which == 1) { + let inputFile = ShowOpenFileDialog(".tt_session"); + inputFile.onchange = function(event) { + ImportSession(false, true, false); + } + } + } + + + let autosessions_save_max_to_keep = document.getElementById("manager_window_autosessions_maximum_saves"); + autosessions_save_max_to_keep.value = opt.autosave_max_to_keep; + autosessions_save_max_to_keep.oninput = function(event) { + opt.autosave_max_to_keep = parseInt(this.value); + SavePreferences(); + } + + + let autosessions_save_timer = document.getElementById("manager_window_autosessions_save_timer"); + autosessions_save_timer.value = opt.autosave_interval; + autosessions_save_timer.oninput = function(event) { + opt.autosave_interval = parseInt(this.value); + SavePreferences(); + clearInterval(AutoSaveSession); + StartAutoSaveSession(); + } + +} diff --git a/scripts/menu.js b/scripts/menu.js index bee47ce..1b5e120 100644 --- a/scripts/menu.js +++ b/scripts/menu.js @@ -9,6 +9,7 @@ function HideMenus() { document.querySelectorAll(".menu").forEach(function(s){ s.style.top = "-1000px"; s.style.left = "-1000px"; + s.style.display = "none"; }); } @@ -43,14 +44,14 @@ function ShowTabMenu(TabNode, event) { document.getElementById("menu_close").style.display = ""; } - document.querySelectorAll("#menu_new_pin, #separator_unpt, #menu_unpin_tab, #separator_dupt, #menu_duplicate_tab, #separator_undclo, #menu_undo_close_tab, #separator_deta, #menu_detach_tab, #menu_reload_tab, #separator_clo, #menu_close_other, #separator_mutot, #menu_mute_other, #menu_unmute_other, #separator_tts, #menu_treetabs_settings").forEach(function(s){ + document.querySelectorAll("#menu_new_pin, #separator_unpt, #menu_unpin_tab, #separator_dupt, #menu_duplicate_tab, #separator_undclo, #menu_undo_close_tab, #separator_deta, #menu_detach_tab, #menu_reload_tab, #separator_clo, #menu_close_other, #separator_mutot, #menu_mute_other, #menu_unmute_other, #separator_tts, #menu_manager_window, #menu_treetabs_settings").forEach(function(s){ s.style.display = ""; }); } if (TabNode.classList.contains("tab")) { - document.querySelectorAll("#menu_new_tab, #separator_pit, #menu_pin_tab, #separator_newf, #menu_new_folder, #separator_dupt, #menu_duplicate_tab, #separator_undclo, #menu_undo_close_tab, #separator_expaa, #menu_expand_all, #menu_collapse_all, #separator_deta, #menu_detach_tab, #menu_reload_tab, #separator_clo, #menu_close, #menu_close_other, #separator_mut, #separator_mutot, #menu_mute_other, #menu_unmute_other, #separator_tts, #menu_treetabs_settings").forEach(function(s){ + document.querySelectorAll("#menu_bookmark_tree, #menu_new_tab, #separator_pit, #menu_pin_tab, #separator_newf, #menu_new_folder, #separator_dupt, #menu_duplicate_tab, #separator_undclo, #menu_undo_close_tab, #separator_expaa, #menu_expand_all, #menu_collapse_all, #separator_deta, #menu_detach_tab, #menu_reload_tab, #separator_clo, #menu_close, #menu_close_other, #separator_mut, #separator_mutot, #menu_mute_other, #menu_unmute_other, #separator_tts, #menu_manager_window, #menu_treetabs_settings").forEach(function(s){ s.style.display = ""; }); @@ -65,7 +66,7 @@ function ShowTabMenu(TabNode, event) { if (TabNode.classList.contains("c") || TabNode.classList.contains("o")) { document.querySelector("#menu_close_tree").style.display = ""; document.querySelector("#separator_bkt").style.display = ""; - document.querySelector("#menu_bookmark_tree").style.display = ""; + // document.querySelector("#menu_bookmark_tree").style.display = ""; document.querySelector("#separator_mutt").style.display = ""; document.querySelector("#menu_mute_tree").style.display = ""; document.querySelector("#menu_unmute_tree").style.display = ""; @@ -78,7 +79,7 @@ function ShowFolderMenu(FolderNode, event) { HideMenus(); menuItemNode = FolderNode; - document.querySelectorAll("#menu_mute_tab, #menu_unmute_tab, #menu_unload, #menu_new_tab, #menu_new_folder, #separator_renf, #menu_rename_folder, #menu_delete_folder, #separator_bkt, #menu_bookmark_tree, #separator_expaa, #menu_expand_all, #separator_colla, #menu_collapse_all, #menu_new_group, #separator_tts, #menu_treetabs_settings").forEach(function(s){ + document.querySelectorAll("#menu_mute_tab, #menu_unmute_tab, #separator_unlo, #menu_unload, #menu_new_tab, #menu_new_folder, #separator_renf, #menu_rename_folder, #menu_delete_folder, #separator_bkt, #menu_bookmark_tree, #separator_expaa, #menu_expand_all, #menu_collapse_all, #menu_new_group, #separator_tts, #menu_manager_window, #menu_treetabs_settings").forEach(function(s){ s.style.display = ""; }); @@ -97,7 +98,7 @@ function ShowFGlobalMenu(event) { HideMenus(); - document.querySelectorAll("#menu_new_pin, #menu_new_tab, #menu_new_folder, #separator_undclo, #menu_undo_close_tab, #separator_expaa, #menu_expand_all, #menu_collapse_all, #separator_newg, #menu_new_group, #separator_gbk, #menu_bookmark_group, #separator_tts, #menu_treetabs_settings").forEach(function(s){ + document.querySelectorAll("#menu_new_pin, #menu_new_tab, #menu_new_folder, #separator_undclo, #menu_undo_close_tab, #separator_expaa, #menu_expand_all, #menu_collapse_all, #separator_newg, #menu_new_group, #separator_gbk, #menu_bookmark_group, #separator_tts, #menu_manager_window, #menu_treetabs_settings").forEach(function(s){ s.style.display = ""; }); ShowMenu(document.getElementById("main_menu"), event); @@ -107,11 +108,11 @@ function ShowFGroupMenu(GroupNode, event) { HideMenus(); menuItemNode = GroupNode; - document.querySelectorAll("#menu_new_group, #menu_rename_group, #menu_delete_group, #menu_delete_group_tabs_close, #separator_gunlo, #groups_menu_unload, #separator_gbk, #separator_tts, #menu_bookmark_group, #separator_tts, #menu_treetabs_settings").forEach(function(s){ + document.querySelectorAll("#menu_new_group, #menu_rename_group, #menu_delete_group, #menu_delete_group_tabs_close, #separator_gunlo, #menu_groups_unload, #separator_gbk, #separator_tts, #menu_bookmark_group, #separator_tts, #menu_groups_hibernate, #menu_manager_window, #menu_treetabs_settings").forEach(function(s){ s.style.display = ""; }); if (menuItemNode.id == "tab_list") { - document.querySelectorAll("#menu_rename_group, #menu_delete_group, #menu_delete_group_tabs_close").forEach(function(s){ + document.querySelectorAll("#menu_groups_hibernate, #menu_rename_group, #menu_delete_group, #menu_delete_group_tabs_close").forEach(function(s){ s.style.display = "none"; }); } @@ -146,7 +147,7 @@ function SetMenu() { if (menuItemNode.classList.contains("tab")) { OpenNewTab(false, menuItemNode.id); } else { - OpenNewTab(); + OpenNewTab(false, active_group); } } } @@ -177,24 +178,10 @@ function SetMenu() { if (event.which == 1) { if (menuItemNode.classList.contains("selected_tab")) { document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ - chrome.tabs.duplicate(parseInt(s.id), function(tab) { - setTimeout(function() { - let tb = document.getElementById(tab.id); - if (s != null && tb != null) { - s.parentNode.insertBefore(tb, s); - } - }, 10); - }); + DuplicateTab(s); }); } else { - chrome.tabs.duplicate(parseInt(menuItemNode.id), function(tab) { - setTimeout(function() { - let tb = document.getElementById(tab.id); - if (menuItemNode != null && tb != null) { - menuItemNode.parentNode.insertBefore(tb, menuItemNode); - } - }, 10); - }); + DuplicateTab(menuItemNode); } HideMenus(); } @@ -210,8 +197,8 @@ function SetMenu() { let tabsArr = []; document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ tabsArr.push(parseInt(s.id)); - if (s.childNodes[4].childNodes.length > 0) { - document.querySelectorAll("#"+s.childNodes[4].id+" .tab").forEach(function(t){ + if (s.childNodes[1].childNodes.length > 0) { + document.querySelectorAll("#"+s.childNodes[1].id+" .tab").forEach(function(t){ tabsArr.push(parseInt(t.id)); }); } @@ -250,8 +237,8 @@ function SetMenu() { let tabsArr = []; document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ tabsArr.push(parseInt(s.id)); - if (s.childNodes[4].childNodes.length > 0) { - document.querySelectorAll("#"+s.childNodes[4].id+" .tab").forEach(function(t){ + if (s.childNodes[1].childNodes.length > 0) { + document.querySelectorAll("#"+s.childNodes[1].id+" .tab").forEach(function(t){ tabsArr.push(parseInt(t.id)); }); } @@ -281,8 +268,8 @@ function SetMenu() { let tabsArr = []; document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ tabsArr.push(parseInt(s.id)); - if (s.childNodes[4].childNodes.length > 0) { - document.querySelectorAll("#"+s.childNodes[4].id+" .tab").forEach(function(t){ + if (s.childNodes[1].childNodes.length > 0) { + document.querySelectorAll("#"+s.childNodes[1].id+" .tab").forEach(function(t){ tabsArr.push(parseInt(t.id)); }); } @@ -428,17 +415,17 @@ function SetMenu() { if (event.which == 1) { event.stopPropagation(); if (menuItemNode.classList.contains("folder")) { - AddNewFolder(menuItemNode.id, undefined, undefined, undefined); + AddNewFolder(undefined, menuItemNode.id, undefined, undefined, undefined, undefined, true); } else { if (menuItemNode.classList.contains("tab")) { let folders = GetParentsByClass(menuItemNode, "folder"); if (folders.length > 0) { - AddNewFolder(folders[0].id, undefined, undefined, undefined); + AddNewFolder(undefined, folders[0].id, undefined, undefined, undefined, undefined, true); } else { - AddNewFolder(); + AddNewFolder(undefined, undefined, undefined, undefined, undefined, undefined, true); } } else { - AddNewFolder(); + AddNewFolder(undefined, undefined, undefined, undefined, undefined, undefined, true); } } HideMenus(); @@ -514,8 +501,8 @@ function SetMenu() { let tabsArr = []; document.querySelectorAll("[id='"+menuItemNode.id+"'] .tab, [id='"+menuItemNode.id+"']").forEach(function(s){ tabsArr.push(parseInt(s.id)); - if (s.childNodes[4].childNodes.length > 0) { - document.querySelectorAll("#"+s.childNodes[4].id+" .tab").forEach(function(t){ + if (s.childNodes[1].childNodes.length > 0) { + document.querySelectorAll("#"+s.childNodes[1].id+" .tab").forEach(function(t){ tabsArr.push(parseInt(t.id)); }); } @@ -624,7 +611,7 @@ function SetMenu() { } - if (m.id == "groups_menu_unload") { + if (m.id == "menu_groups_unload") { m.onmousedown = function(event) { if (event.which == 1) { event.stopPropagation(); @@ -638,6 +625,29 @@ function SetMenu() { } } + if (m.id == "menu_manager_window") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + OpenManagerWindow(); + HideMenus(); + } + } + } + + if (m.id == "menu_groups_hibernate") { + m.onmousedown = function(event) { + if (event.which == 1) { + event.stopPropagation(); + ExportGroup(menuItemNode.id, false, true); + HideMenus(); + setTimeout(function() { + GroupRemove(menuItemNode.id, true); + }, 100); + } + } + } + if (m.id == "menu_bookmark_group") { m.onmousedown = function(event) { diff --git a/scripts/refresh.js b/scripts/refresh.js index 4553196..e4f9dfb 100644 --- a/scripts/refresh.js +++ b/scripts/refresh.js @@ -4,8 +4,9 @@ // ********** REFRESH GUI *************** -function RefreshGUI() { +async function RefreshGUI() { let toolbar = document.getElementById("toolbar"); + let toolbarHeight = 27; if (toolbar.children.length > 0) { toolbar.style.height = ""; toolbar.style.width = ""; @@ -14,21 +15,27 @@ function RefreshGUI() { toolbar.style.padding = ""; if (document.querySelector(".on.button") != null) { toolbar.style.height = "53px"; + toolbarHeight = 54; } else { toolbar.style.height = "26px"; } } else { toolbar.style.height = "0px"; + toolbarHeight = 0; toolbar.style.width = "0px"; toolbar.style.display = "none"; toolbar.style.border = "none"; toolbar.style.padding = "0"; } + + let group_list = document.getElementById("group_list"); + group_list.style.width = document.body.clientWidth + 50 + "px"; + let pin_list = document.getElementById("pin_list"); if (pin_list.children.length > 0) { - pin_list.style.top = toolbar.getBoundingClientRect().height + "px"; + pin_list.style.top = toolbarHeight + "px"; pin_list.style.height = ""; - pin_list.style.width = document.body.clientWidth + "px";; + pin_list.style.width = ""; pin_list.style.display = ""; pin_list.style.border = ""; pin_list.style.padding = ""; @@ -40,9 +47,13 @@ function RefreshGUI() { pin_list.style.border = "none"; pin_list.style.padding = "0"; } + let pin_listHeight = pin_list.getBoundingClientRect().height; + let toolbar_groups = document.getElementById("toolbar_groups"); - toolbar_groups.style.top = toolbar.getBoundingClientRect().height + pin_list.getBoundingClientRect().height + "px"; - toolbar_groups.style.height = document.body.clientHeight - toolbar.getBoundingClientRect().height - pin_list.getBoundingClientRect().height + "px"; + toolbar_groups.style.top = toolbarHeight + pin_listHeight + "px"; + toolbar_groups.style.height = document.body.clientHeight - toolbarHeight - pin_listHeight + "px"; + let toolbar_groupsWidth = toolbar_groups.getBoundingClientRect().width; + if (opt.show_counter_groups) { document.querySelectorAll(".group").forEach(function(s){ let groupLabel = document.getElementById("_gte"+s.id); @@ -62,10 +73,64 @@ function RefreshGUI() { s.style.height = s.firstChild.getBoundingClientRect().height + "px"; }); let groups = document.getElementById("groups"); - groups.style.top = toolbar.getBoundingClientRect().height + pin_list.getBoundingClientRect().height + "px"; - groups.style.left = toolbar_groups.getBoundingClientRect().width + "px"; - groups.style.height = document.body.clientHeight - pin_list.getBoundingClientRect().height - toolbar.getBoundingClientRect().height + "px"; - groups.style.width = document.body.clientWidth - toolbar_groups.getBoundingClientRect().width + 1 + "px"; + let groupsHeight = document.body.clientHeight - toolbarHeight - pin_listHeight; + + groups.style.top = toolbarHeight + pin_listHeight + "px"; + groups.style.left = toolbar_groupsWidth + "px"; + groups.style.height = groupsHeight + "px"; + groups.style.width = (document.body.clientWidth - toolbar_groupsWidth - 1) + "px"; + + + // let total = ManagerWindowGroupsListHeight + ManagerWindowSessionsListHeight; + // if (total > document.body.clientHeight - 200) { + // let cut = (total - (document.body.clientHeight - 200))/2; + // ManagerWindowGroupsList.style.height = ManagerWindowGroupsListHeight - cut + "px"; + // ManagerWindowSessionsList.style.height = ManagerWindowSessionsListHeight - cut + "px"; + // } else { + // ManagerWindowGroupsList.style.height = ManagerWindowGroupsListHeight + "px"; + // ManagerWindowSessionsList.style.height = ManagerWindowSessionsListHeight + "px"; + // } + // ManagerWindow.style.height = ManagerWindowGroupsList.clientHeight + ManagerWindowSessionsList.clientHeight + 300 + "px"; + + + + + let PanelList = document.querySelector(".mw_pan_on>.manager_window_list"); + let PanelListHeight = 3 + PanelList.children.length * 18; + + let ManagerWindowPanelButtons = document.querySelector(".mw_pan_on>.manager_window_panel_buttons"); + let ManagerWindowPanelButtonsHeight = ManagerWindowPanelButtons.clientHeight; + + let MaxAllowedHeight = document.body.clientHeight - 140; + + + if (PanelListHeight + ManagerWindowPanelButtonsHeight < MaxAllowedHeight) { + PanelList.style.height = PanelListHeight + "px"; + } else { + PanelList.style.height = MaxAllowedHeight - ManagerWindowPanelButtonsHeight + "px"; + } + + // if (ManagerWindowSessionsListHeight > document.body.clientHeight - 300) { + // ManagerWindowSessionsList.style.height = document.body.clientHeight - 300 + "px"; + // } else { + // ManagerWindowSessionsList.style.height = ManagerWindowSessionsListHeight + "px"; + // } + + + + let ManagerWindow = document.getElementById("manager_window"); + // ManagerWindow.style.height = PanelListHeight.clientHeight + 700 + "px"; + ManagerWindow.style.height = PanelList.clientHeight + ManagerWindowPanelButtonsHeight + 56 + "px"; + + + + + + + + + + } // set discarded class @@ -119,7 +184,7 @@ function RefreshMediaIcon(tabId) { // Vivaldi does not have changeInfo.audible listener, this is my own implementation, hopefully this will not affect performance too much function VivaldiRefreshMediaIcons() { setInterval(function() { - chrome.tabs.query({currentWindow: true}, function(tabs) { + chrome.tabs.query({currentWindow: true, audible: true}, function(tabs) { document.querySelectorAll(".audible, .muted").forEach(function(s){ s.classList.remove("audible"); s.classList.remove("muted"); @@ -134,17 +199,16 @@ function VivaldiRefreshMediaIcons() { } } }); - // }, 1400); - }, 1000); + }, 2000); } -function GetFaviconAndTitle(tabId, addCounter) { +async function GetFaviconAndTitle(tabId, addCounter) { let t = document.getElementById(tabId); if (t != null) { chrome.tabs.get(parseInt(tabId), function(tab) { if (tab){ let title = tab.title ? tab.title : tab.url; - let tHeader = t.childNodes[3]; + let tHeader = t.childNodes[0]; let tTitle = tHeader.childNodes[1]; if (tab.status == "complete") { t.classList.remove("loading"); @@ -193,9 +257,9 @@ function GetFaviconAndTitle(tabId, addCounter) { } // refresh open closed trees states -function RefreshExpandStates() { +async function RefreshExpandStates() { document.querySelectorAll("#"+active_group+" .folder").forEach(function(s){ - if (s.childNodes[4].children.length == 0 && s.childNodes[5].children.length == 0) { + if (s.childNodes[1].children.length == 0 && s.childNodes[2].children.length == 0) { s.classList.remove("o"); s.classList.remove("c"); } else { @@ -205,7 +269,7 @@ function RefreshExpandStates() { } }); document.querySelectorAll("#"+active_group+" .tab").forEach(function(s){ - if (s.childNodes[4].children.length == 0) { + if (s.childNodes[1].children.length == 0) { s.classList.remove("o"); s.classList.remove("c"); } else { @@ -216,52 +280,53 @@ function RefreshExpandStates() { }); } -function RefreshCounters() { +async function RefreshCounters() { if (opt.show_counter_tabs || opt.show_counter_tabs_hints) { document.querySelectorAll("#"+active_group+" .tab").forEach(function(s){ - let title = s.childNodes[3].getAttribute("tabTitle"); + let title = s.childNodes[0].getAttribute("tabTitle"); if (title != null) { - s.childNodes[3].title = title; - s.childNodes[3].childNodes[1].textContent =title; + s.childNodes[0].title = title; + s.childNodes[0].childNodes[1].textContent =title; } }); document.querySelectorAll("#"+active_group+" .o.tab, #"+active_group+" .c.tab").forEach(function(s){ - let title = s.childNodes[3].getAttribute("tabTitle"); - + let title = s.childNodes[0].getAttribute("tabTitle"); if (opt.show_counter_tabs && title != null) { - s.childNodes[3].childNodes[1].textContent = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + title; + s.childNodes[0].childNodes[1].textContent = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + title; } if (opt.show_counter_tabs_hints) { - s.childNodes[3].title = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + title; + s.childNodes[0].title = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + title; } }); document.querySelectorAll("#"+active_group+" .folder").forEach(function(s){ if (opt.show_counter_tabs && bgfolders[s.id]) { - s.childNodes[3].childNodes[1].textContent = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + bgfolders[s.id].name; + s.childNodes[0].childNodes[1].textContent = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + bgfolders[s.id].name; } if (opt.show_counter_tabs_hints && bgfolders[s.id]) { - s.childNodes[3].title = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + bgfolders[s.id].name; + s.childNodes[0].title = ("("+ document.querySelectorAll("[id='" + s.id + "'] .tab").length +") ") + bgfolders[s.id].name; } }); } } -function RefreshTabCounter(tabId) { +async function RefreshTabCounter(tabId) { let t = document.getElementById(tabId); - let title = t.childNodes[3].getAttribute("tabTitle"); - if (t != null && title != null) { - if (t.classList.contains("o") || t.classList.contains("c")) { - if (opt.show_counter_tabs) { - t.childNodes[3].childNodes[1].textContent = ("("+ document.querySelectorAll("[id='" + t.id + "'] .tab").length +") ") + title; + if (t.childNodes[0]) { + let title = t.childNodes[0].getAttribute("tabTitle"); + if (t != null && title != null) { + if (t.classList.contains("o") || t.classList.contains("c")) { + if (opt.show_counter_tabs) { + t.childNodes[0].childNodes[1].textContent = ("("+ document.querySelectorAll("[id='" + t.id + "'] .tab").length +") ") + title; + } + if (opt.show_counter_tabs_hints) { + t.childNodes[0].title = ("("+ document.querySelectorAll("[id='" + t.id + "'] .tab").length +") ") + title; + } + } else { + t.childNodes[0].title = title; + t.childNodes[0].childNodes[1].textContent = title; } - if (opt.show_counter_tabs_hints) { - t.childNodes[3].title = ("("+ document.querySelectorAll("[id='" + t.id + "'] .tab").length +") ") + title; - } - } else { - t.childNodes[3].title = title; - t.childNodes[3].childNodes[1].textContent = title; } } } diff --git a/scripts/tabs.js b/scripts/tabs.js index b80df43..870d097 100644 --- a/scripts/tabs.js +++ b/scripts/tabs.js @@ -4,17 +4,24 @@ // ********** TABS FUNCTIONS *************** + async function UpdateData() { + if (opt.debug) { + log("f: UpdateData"); + } + setInterval(function() { if (schedule_update_data > 1) { schedule_update_data = 1; } if (schedule_update_data > 0) { - if (opt.debug) console.log("function: update tabs"); + let PinInd = 0; let pins_data = []; document.querySelectorAll(".pin").forEach(function(pin){ - pins_data.push({id: pin.id, index: Array.from(pin.parentNode.children).indexOf(pin)}); + pins_data.push({id: pin.id, index: PinInd}); + PinInd++; }); + let tabs_data = []; document.querySelectorAll(".tab").forEach(function(tab){ tabs_data.push({id: tab.id, parent: tab.parentNode.parentNode.id, index: Array.from(tab.parentNode.children).indexOf(tab), expand: (tab.classList.contains("c") ? "c" : (tab.classList.contains("o") ? "o" : ""))}); @@ -22,10 +29,13 @@ async function UpdateData() { chrome.runtime.sendMessage({command: "update_all_tabs", pins: pins_data, tabs: tabs_data}); schedule_update_data--; } - }, 1000); + }, 2000); } function RearrangeBrowserTabs() { + if (opt.debug) { + log("f: RearrangeBrowserTabs"); + } setInterval(function() { if (schedule_rearrange_tabs > 0) { schedule_rearrange_tabs--; @@ -38,6 +48,9 @@ function RearrangeBrowserTabs() { } async function RearrangeBrowserTabsLoop(tabIds, tabIndex) { + if (opt.debug) { + log("f: RearrangeBrowserTabsLoop"); + } if (tabIndex >= 0 && schedule_rearrange_tabs == 0){ chrome.tabs.get(tabIds[tabIndex], function(tab) { if (tab && tabIndex != tab.index) { @@ -54,13 +67,9 @@ function RearrangeTreeTabs(tabs, bgtabs, first_loop) { if (bgtabs[Tab.id] && t != null && t.parentNode.childNodes[bgtabs[Tab.id].index]) { let tInd = Array.from(t.parentNode.children).indexOf(t); if (tInd > bgtabs[Tab.id].index) { - t.parentNode.childNodes[bgtabs[Tab.id].index].parentNode.insertBefore(t, t.parentNode.childNodes[bgtabs[Tab.id].index]); + InsterBeforeNode(t, t.parentNode.childNodes[bgtabs[Tab.id].index]); } else { - if (t.parentNode.childNodes[bgtabs[Tab.id].index].nextSibling != null) { - t.parentNode.childNodes[bgtabs[Tab.id].index].parentNode.insertBefore(t, t.parentNode.childNodes[bgtabs[Tab.id].index].nextSibling); - } else { - t.parentNode.childNodes[bgtabs[Tab.id].index].parentNode.appendChild(t); - } + InsterAfterNode(t, t.parentNode.childNodes[bgtabs[Tab.id].index]); } let newtInd = Array.from(t.parentNode.children).indexOf(t); if (bgtabs[Tab.id] && newtInd != bgtabs[Tab.id].index && first_loop) { @@ -83,9 +92,6 @@ function AppendTab(tab, ParentId, InsertBeforeId, InsertAfterId, Append, Index, ClassList = ClassList +" "+ AdditionalClass; } var tb = document.createElement("div"); tb.className = ClassList; tb.id = tab.id; // TAB - var dc = document.createElement("div"); dc.className = "drop_target drag_enter_center"; dc.id = "dc"+tab.id; tb.appendChild(dc); // DROP TARGET CENTER - var du = document.createElement("div"); du.className = "drop_target drag_entered_top"; du.id = "du"+tab.id; tb.appendChild(du); // DROP TARGET TOP - var dd = document.createElement("div"); dd.className = "drop_target drag_entered_bottom"; dd.id = "dd"+tab.id; tb.appendChild(dd); // DROP TARGET BOTTOM var th = document.createElement("div"); th.className = (opt.always_show_close && !opt.never_show_close) ? "tab_header close_show" : "tab_header"; th.id = "tab_header"+tab.id; if (SetEvents) {th.draggable = true;} tb.appendChild(th); // HEADER var ex = document.createElement("div"); ex.className = "expand"; ex.id = "exp"+tab.id; th.appendChild(ex); // EXPAND ARROW var tt = document.createElement("div"); tt.className = "tab_title"; tt.id = "tab_title"+tab.id; th.appendChild(tt); // TITLE @@ -95,14 +101,17 @@ function AppendTab(tab, ParentId, InsertBeforeId, InsertAfterId, Append, Index, } var mi = document.createElement("div"); mi.className = "tab_mediaicon"; mi.id = "tab_mediaicon"+tab.id; th.appendChild(mi); var ct = document.createElement("div"); ct.className = "children_tabs"; ct.id = "ct"+tab.id; tb.appendChild(ct); + var di = document.createElement("div"); di.className = "drag_indicator"; di.id = "di"+tab.id; tb.appendChild(di); // DROP TARGET INDICATOR if (SetEvents) { + ct.onclick = function(event) { + if (event.target == this && event.which == 1) { + DeselectFolders(); + DeselectTabs(); + } + } ct.onmousedown = function(event) { if (event.target == this) { - if (event.which == 1) { - DeselectFolders(); - DeselectTabs(); - } if (event.which == 2 && event.target == this) { event.stopImmediatePropagation(); ActionClickGroup(this.parentNode, opt.midclick_group); @@ -146,33 +155,34 @@ function AppendTab(tab, ParentId, InsertBeforeId, InsertAfterId, Append, Index, this.classList.remove("close_hover"); } } - tb.ondragenter = function(event) { - this.childNodes[1].style.zIndex = 99999; - } - th.onclick = function(event) { event.stopImmediatePropagation(); if (document.getElementById("main_menu").style.top != "-1000px") { HideMenus(); } else { - if (event.which == 1 && !event.shiftKey && !event.ctrlKey && (event.target.classList.contains("tab_title") || event.target.classList.contains("tab_header"))) { + if (event.which == 1 && !event.shiftKey && !event.ctrlKey && event.target.classList.contains("tab_header")) { DeselectTabs(); - // SetActiveTab(this.parentNode.id); chrome.tabs.update(parseInt(this.parentNode.id), { active: true }); } } } th.ondblclick = function(event) { - if (event.target.classList && (event.target.classList.contains("tab_title") || event.target.classList.contains("tab_header"))) { + if (event.target.classList && event.target.classList.contains("tab_header")) { ActionClickTab(this.parentNode, opt.dbclick_tab); } } th.onmousedown = function(event) { + if (browserId == "V") { + chrome.windows.getCurrent({populate: false}, function(window) { + if (CurrentWindowId != window.id) { + location.reload(); + } + }); + } event.stopImmediatePropagation(); if (event.which == 1) { - // SELECT TAB/PIN EventSelectTab(event, this.parentNode); } if (event.which == 2) { @@ -196,96 +206,29 @@ function AppendTab(tab, ParentId, InsertBeforeId, InsertAfterId, Append, Index, this.classList.remove("close_show"); } } - th.ondragstart = function(event) { // DRAG START - event.stopPropagation(); - event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); - event.dataTransfer.setData("text", ""); - // event.dataTransfer.setData("text/plain", ""); - // event.dataTransfer.setData("TTSourceWindowId", CurrentWindowId); + + - CleanUpDragClasses(); - EmptyDragAndDrop(); - - DropTargetsFront(this, true, false); - - if (this.parentNode.classList.contains("selected_tab") == false) { - document.querySelectorAll(".selected_tab").forEach(function(s){ - s.classList.add("selected_frozen"); - s.classList.remove("selected_tab"); - s.classList.remove("selected_last"); - }); - this.parentNode.classList.add("selected_temporarly"); - this.parentNode.classList.add("selected_tab"); - } else { - document.querySelectorAll(".group:not(#"+active_group+") .selected_tab").forEach(function(s){ - s.classList.add("selected_frozen"); - s.classList.remove("selected_tab"); - s.classList.remove("selected_last"); - }); - } - let Tabs = GetSelectedTabs(); - - document.querySelectorAll("[id='"+this.parentNode.id+"'], [id='"+this.parentNode.id+"'] .folder, [id='"+this.parentNode.id+"'] .tab").forEach(function(s){ - s.classList.add("dragged_tree"); - }); - document.querySelectorAll(".selected_tab, .selected_tab .tab, .selected_folder, .selected_folder .folder").forEach(function(s){ - s.classList.add("dragged_selected"); - }); - - if (opt.max_tree_drag_drop) { - document.querySelectorAll(".dragged_tree .tab").forEach(function(s){ - let parents = GetParentsByClass(s.parentNode, "dragged_tree"); - if (parents.length > DragAndDrop.Depth) { - DragAndDrop.Depth = parents.length; - } - }); - } else { - DragAndDrop.Depth = -1; - } - - DragAndDrop.TabsIds = Object.assign([], Tabs.TabsIds); - DragAndDrop.TabsIdsParents = Object.assign([], Tabs.TabsIdsParents); - DragAndDrop.TabsIdsSelected = Object.assign([], Tabs.TabsIdsSelected); - DragAndDrop.DragNodeClass = "tab"; - DragAndDrop.ComesFromWindowId = CurrentWindowId; - - chrome.runtime.sendMessage({ - command: "drag_drop", - DragNodeClass: DragAndDrop.DragNodeClass, - TabsIds: DragAndDrop.TabsIds, - TabsIdsParents: DragAndDrop.TabsIdsParents, - TabsIdsSelected: DragAndDrop.TabsIdsSelected, - ComesFromWindowId: CurrentWindowId, - Depth: DragAndDrop.Depth, - Folders: DragAndDrop.Folders, - FoldersSelected: DragAndDrop.FoldersSelected - }); + th.ondragstart = function(event) { // DRAG START + TabStartDrag(this.parentNode, event); } + + th.ondragenter = function(event) { this.classList.remove("tab_header_hover"); - } - - dc.ondragenter = function(event) { - DragAndDrop.timeout = false; + DragOverTimer = false; setTimeout(function() { - DragAndDrop.timeout = true; + DragOverTimer = true; }, 1000); - if (DragAndDrop.DragNodeClass == "tab") { - HighlightDragEnter(this, 0, "tab"); - } } - du.ondragenter = function(event) { - if (DragAndDrop.DragNodeClass == "tab") { - HighlightDragEnter(this, 1, "tab"); - } + th.ondragleave = function(event) { + RemoveHighlight(); } - dd.ondragenter = function(event) { - if (DragAndDrop.DragNodeClass == "tab") { - HighlightDragEnter(this, 1, "tab"); - } + th.ondragover = function(event) { + TabDragOver(this, event); } mi.onmousedown = function(event) { @@ -333,11 +276,7 @@ function AppendTab(tab, ParentId, InsertBeforeId, InsertAfterId, Append, Index, let After = document.getElementById(InsertAfterId); if (After != null) { if ((tab.pinned && After.classList.contains("pin")) || (tab.pinned == false && After.classList.contains("tab"))) { - if (After.nextSibling != null) { - After.parentNode.insertBefore(tb, After.nextSibling); - } else { - After.parentNode.appendChild(tb); - } + InsterAfterNode(tb, After); } } } @@ -359,6 +298,9 @@ function AppendTab(tab, ParentId, InsertBeforeId, InsertAfterId, Append, Index, } function RemoveTabFromList(tabId) { + if (opt.debug) { + log("f: RemoveTabFromList, tabId: "+tabId); + } let tab = document.getElementById(tabId); if (tab != null) { tab.parentNode.removeChild(tab); @@ -385,37 +327,53 @@ function SetTabClass(tabId, pin) { tabs[i].remove("o"); tabs[i].remove("c"); tabs[i].classList.add("pin"); - if(Tab.nextSibling != null) { - PinList.insertBefore(tabs[i], Tab.nextSibling); - } else { - PinList.appendChild(tabs[i]); - } + InsterAfterNode(tabs[i], Tab); chrome.tabs.update(parseInt(tabs[i].id), {pinned: true}); } } - + chrome.tabs.update(parseInt(tabId), {pinned: true}); } else { - if (GroupList.childNodes.length > 0) { // flatten out children - GroupList.insertBefore(Tab, GroupList.childNodes[0]); - } else { - GroupList.appendChild(Tab); + if (Tab.parentNode.id == "pin_list") { // if coming from pin_list + if (GroupList.childNodes.length > 0) { + GroupList.insertBefore(Tab, GroupList.childNodes[0]); + } else { + GroupList.appendChild(Tab); + } } Tab.classList.remove("pin"); Tab.classList.remove("attention"); Tab.classList.add("tab"); RefreshExpandStates(); + chrome.tabs.update(parseInt(tabId), {pinned: false}); } - chrome.tabs.update(parseInt(tabId), {pinned: pin}); RefreshGUI(); } } +function SetMultiTabsClass(TabsIds, pin) { + TabsIds.forEach(function(tabId){ + SetTabClass(tabId, pin); + }); +} -function SetActiveTab(tabId) { +function SetActiveTab(tabId, switchToGroup) { + if (opt.debug) { + log("f: SetActiveTab, tabId: "+tabId); + } let Tab = document.getElementById(tabId); if (Tab != null) { + let TabGroup = GetParentsByClass(Tab, "group"); + if (TabGroup.length) { + if (Tab.classList.contains("tab")) { + SetActiveTabInGroup(TabGroup[0].id, tabId); + } + if (switchToGroup) { + SetActiveGroup(TabGroup[0].id, false, false); // not going to scroll, because mostly it's going to change to a new active in group AFTER switch, so we are not going to scroll to previous active tab + } + } document.querySelectorAll(".selected_folder").forEach(function(s){ s.classList.remove("selected_folder"); }); + // document.querySelectorAll(".pin, #"+active_group+" .tab"+(TabGroup.length ? ", #"+TabGroup[0].id+" .tab" : "")).forEach(function(s){ document.querySelectorAll(".pin, #"+active_group+" .tab").forEach(function(s){ s.classList.remove("active_tab"); s.classList.remove("selected_tab"); @@ -424,15 +382,10 @@ function SetActiveTab(tabId) { s.classList.remove("selected_temporarly"); s.classList.remove("tab_header_hover"); }); - document.querySelectorAll(".highlighted_drop_target").forEach(function(s){ - s.classList.remove("highlighted_drop_target"); - }); + RemoveHighlight(); Tab.classList.remove("attention"); Tab.classList.add("active_tab"); ScrollToTab(tabId); - if (Tab.classList.contains("tab")) { - SetActiveTabInGroup(active_group, tabId); - } } } @@ -468,28 +421,36 @@ function ScrollToTab(tabId) { } function Detach(tabsIds, Folders) { + if (opt.debug) { + log("f: Detach"); + } chrome.windows.get(CurrentWindowId, {populate : true}, function(window) { if (window.tabs.length == 1 || tabsIds.length == 0) { return; } if (tabsIds.length == window.tabs.length) { - if (opt.debug) console.log("You are trying to detach all tabs! Skipping!"); + if (opt.debug) { + log("You are trying to detach all tabs! Skipping!"); + } return; } + + let Indexes = []; + let Parents = []; + let Expands = []; + let NewIds = []; // MOZILLA BUG 1398272 + let NewTabs = []; + let Ind = 0; + + tabsIds.forEach(function(tabId) { + let tab = document.getElementById(tabId); + NewIds.push(tabId); // MOZILLA BUG 1398272 + Indexes.push(Array.from(tab.parentNode.children).indexOf(tab)); + Parents.push(tab.parentNode.parentNode.id); + Expands.push( (tab.classList.contains("c") ? "c" : (tab.classList.contains("o") ? "o" : "")) ); + }); + chrome.windows.create({tabId: tabsIds[0], state:window.state}, function(new_window) { - let Indexes = []; - let Parents = []; - let Expands = []; - let NewIds = []; // MOZILLA BUG 1398272 - let NewTabs = []; - let Ind = 0; - tabsIds.forEach(function(tabId) { - let tab = document.getElementById(tabId); - NewIds.push(tabId); // MOZILLA BUG 1398272 - Indexes.push(Array.from(tab.parentNode.children).indexOf(tab)); - Parents.push(tab.parentNode.parentNode.id); - Expands.push( (tab.classList.contains("c") ? "c" : (tab.classList.contains("o") ? "o" : "")) ); - }); tabsIds.forEach(function(tabId) { chrome.tabs.move(tabId, {windowId: new_window.id, index:-1}, function(MovedTab) { if (browserId == "F") { // MOZILLA BUG 1398272 @@ -507,7 +468,9 @@ function Detach(tabsIds, Folders) { // chrome.tabs.remove(new_window.tabs[0].id, null); let Confirmations = 0; let GiveUpLimit = 600; - if (opt.debug) console.log("Detach - Remote Append and Update Loop, waiting for confirmations after attach tabs"); + if (opt.debug) { + log("Detach - Remote Append and Update Loop, waiting for confirmations after attach tabs"); + } var Append = setInterval(function() { chrome.windows.get(new_window.id, function(confirm_new_window) { chrome.runtime.sendMessage({command: "remote_update", groups: {}, folders: Folders, tabs: NewTabs, windowId: new_window.id}, function(response) { @@ -516,7 +479,9 @@ function Detach(tabsIds, Folders) { } }); GiveUpLimit--; - if (opt.debug) console.log("Detach -> Attach in new window confirmed: "+Confirmations+" times. If sidebar is not open in new window this loop will give up in: "+GiveUpLimit+" seconds"); + if (opt.debug) { + log("Detach -> Attach in new window confirmed: "+Confirmations+" times. If sidebar is not open in new window this loop will give up in: "+GiveUpLimit+" seconds"); + } if (Confirmations > 2 || GiveUpLimit < 0 || confirm_new_window == undefined) { clearInterval(Append); } @@ -535,6 +500,15 @@ function Detach(tabsIds, Folders) { } function CloseTabs(tabsIds) { + if (opt.debug) { + log("f: CloseTabs, tabsIds are: "+JSON.stringify(tabsIds)); + } + tabsIds.forEach(function(tabId) { + let Tab = document.getElementById(tabId); + if (Tab != null) { + Tab.classList.add("will_be_closed"); + } + }); let activeTab = document.querySelector(".pin.active_tab, #"+active_group+" .tab.active_tab"); if (activeTab != null && tabsIds.indexOf(parseInt(activeTab.id)) != -1) { SwitchActiveTabBeforeClose(active_group); @@ -544,6 +518,7 @@ function CloseTabs(tabsIds) { if (tab.classList.contains("pin") && opt.allow_pin_close) { tab.parentNode.removeChild(tab); chrome.tabs.update(tabId, {pinned: false}); + RefreshGUI(); } if (tabId == tabsIds[tabsIds.length-1]) { setTimeout(function() { @@ -570,33 +545,53 @@ function DiscardTabs(tabsIds) { } function SwitchActiveTabBeforeClose(ActiveGroupId) { - if (opt.debug) console.log("function: SwitchActiveTabBeforeClose"); + if (opt.debug) { + log("f: SwitchActiveTabBeforeClose"); + } let activeGroup = document.getElementById(ActiveGroupId); - if (document.querySelectorAll("#"+ActiveGroupId+" .tab").length <= 1 && document.querySelector(".pin.active_tab") == null) { - if (opt.after_closing_active_tab == "above" || opt.after_closing_active_tab == "above_seek_in_parent") { - if (activeGroup.previousSibling != null) { - if (document.querySelectorAll("#"+activeGroup.previousSibling.id+" .tab").length > 0) { - SetActiveGroup(activeGroup.previousSibling.id, true, true); - } else { - SwitchActiveTabBeforeClose(activeGroup.previousSibling.id); - return; - } - } else { - SetActiveGroup("tab_list", true, true); + + if (document.querySelectorAll("#"+ActiveGroupId+" .tab").length <= 1 && document.querySelector(".pin.active_tab") == null) { // CHECK IF CLOSING LAST TAB IN ACTIVE GROUP + + let pins = document.querySelectorAll(".pin"); + + if (pins.length > 0) { // IF THERE ARE ANY PINNED TABS, ACTIVATE IT + if (opt.debug) { + log("available pin, switching to: "+pins[pins.length-1].id); } - } else { - if (activeGroup.nextSibling != null) { - if (document.querySelectorAll("#"+activeGroup.nextSibling.id+" .tab").length > 0) { - SetActiveGroup(activeGroup.nextSibling.id, true, true); + chrome.tabs.update(parseInt(pins[pins.length-1].id), {active: true}); + return; + } else { // NO OTHER CHOICE BUT TO SEEK IN ANOTHER GROUP + + if (opt.after_closing_active_tab == "above" || opt.after_closing_active_tab == "above_seek_in_parent") { + if (activeGroup.previousSibling != null) { + if (document.querySelectorAll("#"+activeGroup.previousSibling.id+" .tab").length > 0) { + SetActiveGroup(activeGroup.previousSibling.id, true, true); + } else { + SwitchActiveTabBeforeClose(activeGroup.previousSibling.id); + return; + } } else { - SwitchActiveTabBeforeClose(activeGroup.nextSibling.id); - return; + SetActiveGroup("tab_list", true, true); } } else { - SetActiveGroup("tab_list", true, true); + if (activeGroup.nextSibling != null) { + if (document.querySelectorAll("#"+activeGroup.nextSibling.id+" .tab").length > 0) { + SetActiveGroup(activeGroup.nextSibling.id, true, true); + } else { + SwitchActiveTabBeforeClose(activeGroup.nextSibling.id); + return; + } + } else { + SetActiveGroup("tab_list", true, true); + } } } } else { + + if (opt.debug) { + log("available tabs in current group, switching option is: "+opt.after_closing_active_tab); + } + if (opt.after_closing_active_tab == "above") { ActivatePrevTab(true); } @@ -623,10 +618,13 @@ function ActivateNextTabBeforeClose() { } } } - let activeTab = document.querySelector("#"+active_group+" .tab.active_tab"); - if (activeTab != null && document.querySelectorAll("#"+active_group+" .tab").length > 1) { - if (opt.promote_children && activeTab.lastChild.firstChild != null) { - chrome.tabs.update(parseInt(activeTab.lastChild.firstChild.id), { active: true }); + + let will_be_closed = document.querySelectorAll("#"+active_group+" .will_be_closed"); + let activeTab = will_be_closed.length > 0 ? will_be_closed[will_be_closed.length-1] : document.querySelector("#"+active_group+" .tab.active_tab"); + + if (activeTab != null && document.querySelectorAll("#"+active_group+" .tab:not(.will_be_closed)").length > 1) { + if (opt.promote_children && activeTab.childNodes[1].firstChild != null) { + chrome.tabs.update(parseInt(activeTab.childNodes[1].firstChild.id), { active: true }); } else { if (activeTab.nextSibling != null) { chrome.tabs.update(parseInt(activeTab.nextSibling.id), { active: true }); @@ -656,10 +654,13 @@ function ActivatePrevTabBeforeClose() { } } } - let activeTab = document.querySelector("#"+active_group+" .tab.active_tab"); - if (activeTab != null && document.querySelectorAll("#"+active_group+" .tab").length > 1) { - if (opt.promote_children && activeTab.lastChild.firstChild != null) { - chrome.tabs.update(parseInt(activeTab.lastChild.firstChild.id), { active: true }); + + let will_be_closed = document.querySelectorAll("#"+active_group+" .will_be_closed"); + let activeTab = will_be_closed.length > 0 ? will_be_closed[0] : document.querySelector("#"+active_group+" .tab.active_tab"); + + if (activeTab != null && document.querySelectorAll("#"+active_group+" .tab:not(.will_be_closed)").length > 1) { + if (opt.promote_children && activeTab.childNodes[1].firstChild != null) { + chrome.tabs.update(parseInt(activeTab.childNodes[1].firstChild.id), { active: true }); } else { if (activeTab.previousSibling != null) { chrome.tabs.update(parseInt(activeTab.previousSibling.id), { active: true }); @@ -689,9 +690,12 @@ function ActivateNextTab(allow_reverse) { } } } - let activeTab = document.querySelector("#"+active_group+" .tab.active_tab"); + + let will_be_closed = document.querySelectorAll("#"+active_group+" .will_be_closed"); + let activeTab = will_be_closed.length > 0 ? will_be_closed[will_be_closed.length-1] : document.querySelector("#"+active_group+" .tab.active_tab"); + if (activeTab != null && document.querySelectorAll("#"+active_group+" .tab").length > 1) { - let FirstChild = activeTab.lastChild.firstChild; + let FirstChild = activeTab.childNodes[1].firstChild; if (FirstChild != null) { chrome.tabs.update(parseInt(FirstChild.id), { active: true }); } else { @@ -728,7 +732,10 @@ function ActivatePrevTab(allow_reverse) { } } } - let activeTab = document.querySelector("#"+active_group+" .tab.active_tab"); + + let will_be_closed = document.querySelectorAll("#"+active_group+" .will_be_closed"); + let activeTab = will_be_closed.length > 0 ? will_be_closed[0] : document.querySelector("#"+active_group+" .tab.active_tab"); + if (activeTab != null && document.querySelectorAll("#"+active_group+" .tab").length > 1) { let pSchildren = activeTab.previousSibling != null ? document.querySelectorAll("#ct"+activeTab.previousSibling.id+" .tab") : null; if (activeTab.previousSibling != null && pSchildren.length > 0) { @@ -749,6 +756,52 @@ function ActivatePrevTab(allow_reverse) { } } + +function OpenNewTab(pin, parentId) { + if (pin) { + chrome.tabs.create({pinned: true}, function(tab) { + if (parentId) { + AppendTab(tab, "pin_list", false, parentId, true, false, true, false, false, true, false); + schedule_update_data++; + } + newTabUrl = tab.url; + }); + } else { + chrome.tabs.create({}, function(tab) { + if (parentId) { + AppendTab(tab, parentId, false, false, (opt.append_orphan_tab == "top" ? false : true), false, true, false, false, true, false); + schedule_update_data++; + } + newTabUrl = tab.url; + }); + } +} + +function DuplicateTab(SourceTabNode) { + chrome.tabs.duplicate(parseInt(SourceTabNode.id), function(tab) { + let DupRetry = setInterval(function() { + let DupTab = document.getElementById(tab.id); + if (DupTab != null) { + if (browserId == "F" && tab.pinned) { + DupTab.classList.remove("tab"); + DupTab.classList.add("pin"); + } + InsterAfterNode(DupTab, SourceTabNode); + RefreshExpandStates(); + schedule_update_data++; + RefreshCounters(); + clearInterval(DupRetry); + } + }, 10); + setTimeout(function() { + if (DupRetry) { + clearInterval(DupRetry); + } + }, 500); + }); + +} + function DeselectTabs() { document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ s.classList.remove("selected_tab"); @@ -756,27 +809,8 @@ function DeselectTabs() { }); } -function HighlightNode(Node) { - document.querySelectorAll(".highlighted_drop_target").forEach(function(s){ - s.classList.remove("highlighted_drop_target"); - }); - Node.classList.add("highlighted_drop_target"); -} -function HighlightDragEnter(Node, addDepth, Class) { // Class == "tab" or "folder" - // PIN,TAB==>TAB OR PIN,TAB==>FOLDER - // AND AVOID ENTERING INSIDE OWN CHILDREN - if (Node.classList.contains("highlighted_drop_target") == false && Node.parentNode.classList.contains("dragged_tree") == false && Node.parentNode.classList.contains("dragged_selected") == false) { - if (opt.max_tree_depth >= 0 && DragAndDrop.Depth >= 0 && DragAndDrop.DragNodeClass == Class) { - let Parents = GetParentsByClass(Node, Class); - if ((Parents.length + DragAndDrop.Depth <= opt.max_tree_depth + addDepth) || (Node.parentNode.parentNode.parentNode.classList.contains("group") && Node.classList.contains("drag_enter_center") == false)) { - HighlightNode(Node); - } - } else { - HighlightNode(Node); - } - } -} +// TAB EVENTS function EventExpandBox(Node) { if (Node.classList.contains("o")) { @@ -836,26 +870,6 @@ function EventExpandBox(Node) { } } - -function OpenNewTab(pin, parentId) { - if (pin) { - chrome.tabs.create({pinned: true}, function(tab) { - if (parentId) { - AppendTab(tab, "pin_list", false, parentId, true, false, true, false, false, true, false); - schedule_update_data++; - } - }); - } else { - chrome.tabs.create({}, function(tab) { - if (parentId) { - AppendTab(tab, parentId, false, false, (opt.append_orphan_tab == "top" ? false : true), false, true, false, false, true, false); - schedule_update_data++; - } - }); - } -} - - function EventSelectTab(event, TabNode) { DeselectFolders(); if (event.shiftKey) { // SET SELECTION WITH SHIFT @@ -911,6 +925,13 @@ function ActionClickTab(TabNode, bgOption) { CloseTabs([parseInt(TabNode.id)]); } } + if (bgOption == "undo_close_tab") { + chrome.sessions.getRecentlyClosed( null, function(sessions) { + if (sessions.length > 0) { + chrome.sessions.restore(null, function(restored) {}); + } + }); + } if (bgOption == "reload_tab") { chrome.tabs.reload(parseInt(TabNode.id)); } @@ -922,3 +943,124 @@ function ActionClickTab(TabNode, bgOption) { chrome.tabs.update(parseInt(bggroups[active_group].prev_active_tab), {active: true}); } } + + + + + +function TabStartDrag(Node, event) { + event.stopPropagation(); + event.dataTransfer.setDragImage(document.getElementById("DragImage"), 0, 0); + event.dataTransfer.setData("text", ""); + event.dataTransfer.setData("SourceWindowId", CurrentWindowId); + + CleanUpDragClasses(); + EmptyDragAndDrop(); + + DragNodeClass = "tab"; + + let TabsIds = []; + let TabsIdsParents = []; + let TabsIdsSelected = []; + + if (Node.classList.contains("selected_tab")) { + document.querySelectorAll(".group:not(#"+active_group+") .selected_tab").forEach(function(s){ + s.classList.add("selected_frozen"); + s.classList.remove("selected_tab"); + s.classList.remove("selected_last"); + }); + document.querySelectorAll("#pin_list .selected_tab, .group#"+active_group+" .selected_tab").forEach(function(s){ + TabsIdsSelected.push(parseInt(s.id)); + }); + } else { + FreezeSelected(); + Node.classList.add("selected_temporarly"); + Node.classList.add("selected_tab"); + TabsIdsSelected.push(parseInt(Node.id)); + } + + document.querySelectorAll("[id='"+Node.id+"'], [id='"+Node.id+"'] .tab").forEach(function(s){ + s.classList.add("dragged_tree"); + }); + + if (opt.max_tree_drag_drop) { + document.querySelectorAll(".dragged_tree .tab").forEach(function(s){ + let parents = GetParentsByClass(s.parentNode, "dragged_tree"); + if (parents.length > DragTreeDepth) { + DragTreeDepth = parents.length; + } + }); + } else { + DragTreeDepth = -1; + } + + // REST OF SELECTED TABS THAT WILL BE DRAGGED + document.querySelectorAll(".selected_tab, .selected_tab .tab").forEach(function(s){ + s.classList.add("dragged_tree"); + TabsIds.push(parseInt(s.id)); + TabsIdsParents.push(s.parentNode.id); + }); + + DragAndDropData = {TabsIds: TabsIds, TabsIdsParents: TabsIdsParents, TabsIdsSelected: TabsIdsSelected}; + + event.dataTransfer.setData("TabsIds", JSON.stringify(TabsIds)); + event.dataTransfer.setData("TabsIdsParents", JSON.stringify(TabsIdsParents)); + event.dataTransfer.setData("TabsIdsSelected", JSON.stringify(TabsIdsSelected)); + + chrome.runtime.sendMessage({ + command: "drag_drop", + DragNodeClass: "tab", + DragTreeDepth: DragTreeDepth + }); +} + +function TabDragOver(Node, event) { + if (DragNodeClass == "tab" && Node.parentNode.classList.contains("dragged_tree") == false) { + + if (Node.parentNode.classList.contains("pin")) { + if (Node.parentNode.classList.contains("before") == false && event.layerX < Node.clientWidth/2) { + RemoveHighlight(); + Node.parentNode.classList.remove("after"); + Node.parentNode.classList.add("before"); + Node.parentNode.classList.add("highlighted_drop_target"); + } + if (Node.parentNode.classList.contains("after") == false && event.layerX >= Node.clientWidth/2) { + RemoveHighlight(); + Node.parentNode.classList.remove("before"); + Node.parentNode.classList.add("after"); + Node.parentNode.classList.add("highlighted_drop_target"); + } + } + + if (Node.parentNode.classList.contains("tab")) { + let P = (GetParentsByClass(Node, "tab")).length + DragTreeDepth; + let PGroup = Node.parentNode.parentNode.parentNode.classList.contains("group"); + + if (Node.parentNode.classList.contains("before") == false && event.layerY < Node.clientHeight/3 && (P <= opt.max_tree_depth+1 || opt.max_tree_depth<0 || PGroup || opt.max_tree_drag_drop == false)) { + RemoveHighlight(); + Node.parentNode.classList.remove("inside"); + Node.parentNode.classList.remove("after"); + Node.parentNode.classList.add("before"); + Node.parentNode.classList.add("highlighted_drop_target"); + } + + + if (Node.parentNode.classList.contains("inside") == false && event.layerY > Node.clientHeight/3 && event.layerY <= 2*(Node.clientHeight/3) && (P <= opt.max_tree_depth || opt.max_tree_depth<0 || opt.max_tree_drag_drop == false)) { + RemoveHighlight(); + Node.parentNode.classList.remove("before"); + Node.parentNode.classList.remove("after"); + Node.parentNode.classList.add("inside"); + Node.parentNode.classList.add("highlighted_drop_target"); + } + + + if (Node.parentNode.classList.contains("after") == false && Node.parentNode.classList.contains("o") == false && event.layerY > 2*(Node.clientHeight/3) && (P <= opt.max_tree_depth+1 || opt.max_tree_depth<0 || PGroup || opt.max_tree_drag_drop == false)) { + RemoveHighlight(); + Node.parentNode.classList.remove("inside"); + Node.parentNode.classList.remove("before"); + Node.parentNode.classList.add("after"); + Node.parentNode.classList.add("highlighted_drop_target"); + } + } + } +} \ No newline at end of file diff --git a/scripts/theme.js b/scripts/theme.js new file mode 100644 index 0000000..39b324a --- /dev/null +++ b/scripts/theme.js @@ -0,0 +1,393 @@ +// Copyright (c) 2017 kroppy. All rights reserved. +// Use of this source code is governed by a Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0) license +// that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ + + +function Loadi18n() { + // toolbar labels + document.querySelectorAll(".button, .manager_window_toolbar_button").forEach(function(s){ + s.title = chrome.i18n.getMessage(s.id); + }); + // menu labels and edit group dialog labels + document.querySelectorAll(".menu_item, .edit_dialog_button, #manager_window_header_title, .manager_window_label").forEach(function(s){ + s.textContent = chrome.i18n.getMessage(s.id); + }); +} + +function RestorePinListRowSettings() { + plist = document.getElementById("pin_list"); + if (opt.pin_list_multi_row) { + plist.style.whiteSpace = "normal"; + plist.style.overflowX = "hidden"; + } else { + plist.style.whiteSpace = ""; + plist.style.overflowX = ""; + } + RefreshGUI(); +} + +function ApplyTheme(theme) { + RestoreStateOfGroupsToolbar(); + ApplySizeSet(theme["TabsSizeSetNumber"]); + ApplyColorsSet(theme["ColorsSet"]); + ApplyTabsMargins(theme["TabsMargins"]); + RefreshGUI(); + + for (var groupId in bggroups) { + let groupTitle = document.getElementById("_gte"+groupId); + if (groupTitle != null && bggroups[groupId].font == "") { + groupTitle.style.color = ""; + } + } + Loadi18n(); +} + +// theme colors is an object with css variables (but without --), for example; {"button_background": "#f2f2f2", "filter_box_border": "#cccccc"} +function ApplyColorsSet(ThemeColors){ + let css_variables = ""; + for (let css_variable in ThemeColors) { + css_variables = css_variables + "--" + css_variable + ":" + ThemeColors[css_variable] + ";"; + } + for (let si = 0; si < document.styleSheets.length; si++) { + if (document.styleSheets[si].ownerNode.id == "theme_colors") { + document.styleSheets[si].deleteRule(document.styleSheets[si].cssRules.length-1); + document.styleSheets[si].insertRule("body { "+css_variables+" }", document.styleSheets[si].cssRules.length); + } + } +} + +function ApplySizeSet(size){ + for (let si = 0; si < document.styleSheets.length; si++) { + if ((document.styleSheets[si].ownerNode.id).match("sizes_preset") != null) { + if (document.styleSheets[si].ownerNode.id == "sizes_preset_"+size) { + document.styleSheets.item(si).disabled = false; + } else { + document.styleSheets.item(si).disabled = true; + } + } + } + if (browserId == "F") { + // for some reason top position for various things is different in firefox????? + if (size > 1) { + document.styleSheets[document.styleSheets.length-1].insertRule(".tab_header>.tab_title { margin-top: -1px; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); + } else { + document.styleSheets[document.styleSheets.length-1].insertRule(".tab_header>.tab_title { margin-top: 0px; }", document.styleSheets[document.styleSheets.length-1].cssRules.length); + } + } +} + +function ApplyTabsMargins(size){ + for (let si = 0; si < document.styleSheets.length; si++) { + if ((document.styleSheets[si].ownerNode.id).match("tabs_margin") != null) { + if (document.styleSheets[si].ownerNode.id == "tabs_margin_"+size) { + document.styleSheets.item(si).disabled = false; + } else { + document.styleSheets.item(si).disabled = true; + } + } + } +} + + +// OPTIONS PAGE +function LoadTheme(ThemeId, reloadInSidebar) { + + document.querySelectorAll(".theme_buttons").forEach(function(s){ + s.disabled = true; + }); + + chrome.storage.local.set({current_theme: ThemeId}, function() { + chrome.storage.local.get(null, function(storage) { + SelectedTheme = Object.assign({}, GetCurrentTheme(storage)); + setTimeout(function() { + document.getElementById("new_theme_name").value = SelectedTheme.theme_name; + setTimeout(function() { + // SetToolbarEvents(true, false, false, ""); + RemoveToolbarEditEvents(); + + ApplySizeSet(SelectedTheme["TabsSizeSetNumber"]); + ApplyColorsSet(SelectedTheme["ColorsSet"]); + document.getElementById("_gtetab_list").style.color = ""; + document.getElementById("_gtetab_list2").style.color = ""; + + if (SelectedTheme["TabsMargins"]) { + document.getElementById("tabs_margin_spacing")[SelectedTheme["TabsMargins"]].checked = true; + ApplyTabsMargins(SelectedTheme["TabsMargins"]); + } else { + document.getElementById("tabs_margin_spacing")["2"].checked = true; + } + + if (reloadInSidebar) { + chrome.runtime.sendMessage({command: "reload_theme", ThemeId: ThemeId, theme: SelectedTheme}); + } + + document.querySelectorAll(".theme_buttons").forEach(function(s){ + s.disabled = false; + }); + + }, 200); + }, 200); + }); + }); +} + +function SaveTheme(ThemeId) { + chrome.storage.local.get(null, function(storage) { + + SelectedTheme.theme_version = DefaultTheme.theme_version; + + let LSthemes = storage.themes ? Object.assign({}, storage.themes) : {}; + + LSthemes[ThemeId] = Object.assign({}, SelectedTheme); + + chrome.storage.local.set({themes: LSthemes}); + + chrome.runtime.sendMessage({command: "reload_theme", ThemeId: ThemeId, theme: SelectedTheme}); + return SelectedTheme; + }); +} + +function AddNewTheme() { + + let ThemeId = GenerateRandomID() + GenerateRandomID(); + let ThemeList = document.getElementById("theme_list"); + let ThemeNameBox = document.getElementById("new_theme_name"); + let NewName = ThemeNameBox.value; + + if (ThemeNameBox.value == "") { + alert(chrome.i18n.getMessage("options_theme_name_cannot_be_empty")); + return; + } + + SelectedTheme = Object.assign({}, DefaultTheme); + SelectedTheme["ColorsSet"] = {}; + + // let Names = []; + + // for (let i = 0; i < ThemeList.options.length; i++) { + // Names.push(ThemeList.options[i].text); + // } + + // while (Names.indexOf(NewName) != -1) { + // let matched = NewName.match(/\(\d+\)+/); + // if (matched != null && matched.length > 0) { + // NewName = NewName.replace(matched[0], ("(" + (parseInt(matched[0].match(/\d+/)[0]) + 1 ) + ")") ); + // } else { + // NewName = NewName + "(1)"; + // } + // } + + ThemeNameBox.value = NewName; + SelectedTheme["theme_name"] = NewName; + + themes.push(ThemeId); + + let ThemeNameOption = document.createElement("option"); + + ThemeNameOption.value = ThemeId; + ThemeNameOption.text = NewName; + + ThemeList.add(ThemeNameOption); + ThemeList.selectedIndex = ThemeList.options.length-1; + + SaveTheme(ThemeId); + setTimeout(function() { + LoadTheme(ThemeId, true); + }, 50); + + chrome.storage.local.set({current_theme: ThemeId}); + RefreshFields(); +} + +function DeleteSelectedTheme() { + chrome.storage.local.get(null, function(storage) { + let LSthemes = storage.themes ? Object.assign({}, storage.themes) : {}; + + let ThemeList = document.getElementById("theme_list"); + + themes.splice(ThemeList.selectedIndex, 1); + if (LSthemes[current_theme]) { + delete LSthemes[current_theme]; + } + chrome.storage.local.set({themes: LSthemes}); + + ThemeList.remove(ThemeList.selectedIndex); + + current_theme = (ThemeList.options.length > 0) ? ThemeList.value : "default"; + + + chrome.storage.local.set({current_theme: current_theme}); + + if (ThemeList.options.length == 0) { + current_theme = ""; + SelectedTheme = Object.assign({}, DefaultTheme); + SelectedTheme["ColorsSet"] = {}; + chrome.storage.local.set({themes: {}}); + setTimeout(function() { + chrome.runtime.sendMessage({command: "reload_theme", themeName: "", theme: SelectedTheme}); + }, 500); + } + LoadTheme(current_theme, true); + RefreshFields(); + }); +} + +function RenameSelectedTheme() { + let ThemeList = document.getElementById("theme_list"); + let ThemeNameBox = document.getElementById("new_theme_name"); + + // for (let i = 0; i < ThemeList.options.length; i++) { + // if (ThemeNameBox.value == ThemeList.options[i].text){ + // alert(chrome.i18n.getMessage("options_there_is_a_theme_with_this_name")); + // return; + // } + // } + + if (ThemeNameBox.value == "") { + alert(chrome.i18n.getMessage("options_theme_name_cannot_be_empty")); + return; + } + + + chrome.storage.local.get(null, function(storage) { + let LSthemes = storage.themes ? Object.assign({}, storage.themes) : {}; + ThemeList.options[ThemeList.selectedIndex].text = ThemeNameBox.value; + SelectedTheme["theme_name"] = ThemeNameBox.value; + LSthemes[current_theme]["theme_name"] = ThemeNameBox.value; + chrome.storage.local.set({themes: LSthemes}); + chrome.storage.local.set({current_theme: current_theme}); + }); +} + + + +function CheckTheme(theme) { + if (theme.theme_version < 2) { + theme["ColorsSet"]["scrollbar_height"] = theme.ScrollbarPinList + "px"; + theme["ColorsSet"]["scrollbar_width"] = theme.ScrollbarTabList + "px"; + } + if (theme["TabsMargins"] == undefined) { + theme["TabsMargins"] = "2"; + } + if (theme.theme_version < 4) { + delete theme["ColorsSet"]["active_font_weight"]; + delete theme["ColorsSet"]["expand_lines"]; + delete theme["ColorsSet"]["expand_open_border"]; + delete theme["ColorsSet"]["expand_closed_border"]; + + if (theme["ColorsSet"]["toolbar_background"]) { + theme["ColorsSet"]["toolbar_shelf_background"] = theme["ColorsSet"]["toolbar_background"]; + theme["ColorsSet"]["button_on_background"] = theme["ColorsSet"]["toolbar_background"]; + } + if (theme["ColorsSet"]["button_icons"]) { + theme["ColorsSet"]["button_on_icons"] = theme["ColorsSet"]["button_icons"]; + theme["ColorsSet"]["button_shelf_icons"] = theme["ColorsSet"]["button_icons"]; + } + if (theme["ColorsSet"]["button_background"]) { + theme["ColorsSet"]["button_shelf_background"] = theme["ColorsSet"]["button_background"]; + } + if (theme["ColorsSet"]["button_hover_background"]) { + theme["ColorsSet"]["button_shelf_hover_background"] = theme["ColorsSet"]["button_hover_background"]; + } + if (theme["ColorsSet"]["button_border"]) { + theme["ColorsSet"]["button_shelf_border"] = theme["ColorsSet"]["button_border"]; + } + if (theme["ColorsSet"]["button_hover_border"]) { + theme["ColorsSet"]["button_shelf_hover_border"] = theme["ColorsSet"]["button_hover_border"]; + } + if (theme["ColorsSet"]["button_icons_hover"]) { + theme["ColorsSet"]["button_shelf_icons_hover"] = theme["ColorsSet"]["button_icons_hover"]; + } + + if (theme["ColorsSet"]["expand_hover_background"]) { + theme["ColorsSet"]["folder_icon_hover"] = theme["ColorsSet"]["expand_hover_background"]; + } + if (theme["ColorsSet"]["expand_closed_background"]) { + theme["ColorsSet"]["folder_icon_closed"] = theme["ColorsSet"]["expand_closed_background"]; + } + if (theme["ColorsSet"]["expand_open_background"]) { + theme["ColorsSet"]["folder_icon_open"] = theme["ColorsSet"]["expand_open_background"]; + } + } + + return theme; +} + + + +function ImportTheme() { + var file = document.getElementById("file_import"); + var fr = new FileReader(); + if (file.files[0] == undefined) return; + fr.readAsText(file.files[0]); + fr.onload = function() { + var data = fr.result; + file.parentNode.removeChild(file); + + var themeObj = JSON.parse(data); + + if (themeObj.theme_version > DefaultTheme["theme_version"]) { + alert(chrome.i18n.getMessage("options_loaded_theme_newer_version")); + } + if (themeObj.theme_version < DefaultTheme["theme_version"]) { + alert(chrome.i18n.getMessage("options_loaded_theme_older_version")); + } + + if (themeObj.theme_version <= DefaultTheme["theme_version"]) { + let ThemeList = document.getElementById("theme_list"); + let ThemeId = GenerateRandomID() + GenerateRandomID(); + let correctedTheme = CheckTheme(themeObj); + + SelectedTheme = Object.assign({}, DefaultTheme); + + for (var val in correctedTheme.ColorsSet) { + SelectedTheme["ColorsSet"][val] = correctedTheme.ColorsSet[val]; + } + + SelectedTheme["TabsSizeSetNumber"] = correctedTheme.TabsSizeSetNumber; + SelectedTheme["TabsMargins"] = correctedTheme["TabsMargins"]; + SelectedTheme["theme_version"] = DefaultTheme["theme_version"]; + + // let Names = []; + // for (let i = 0; i < ThemeList.options.length; i++) { + // Names.push(ThemeList.options[i].text); + // } + + // if (Names.indexOf(correctedTheme.theme_name) == -1) { + SelectedTheme["theme_name"] = correctedTheme.theme_name; + // } else { + // let NewName = correctedTheme.theme_name; + // while (Names.indexOf(NewName) != -1) { + // let matched = NewName.match(/\(\d+\)+/); + // if (matched != null && matched.length > 0) { + // NewName = NewName.replace(matched[0], ("(" + (parseInt(matched[0].match(/\d+/)[0]) + 1 ) + ")") ); + // } else { + // NewName = NewName + "(1)"; + // } + // } + // SelectedTheme["theme_name"] = NewName; + // } + + themes.push(ThemeId); + SaveTheme(ThemeId); + + var theme_name = document.createElement("option"); + + theme_name.value = ThemeId; + theme_name.text = SelectedTheme["theme_name"]; + + ThemeList.add(theme_name); + ThemeList.selectedIndex = ThemeList.options.length-1; + + current_theme = ThemeId; + document.createElement("new_theme_name").value = ThemeId; + + setTimeout(function() { + LoadTheme(ThemeId, true); + }, 500); + RefreshFields(); + DefaultTheme["ColorsSet"] = {}; + chrome.storage.local.set({current_theme: ThemeId}); + } + } +} \ No newline at end of file diff --git a/scripts/toolbar.js b/scripts/toolbar.js index 0581af2..f69b1fa 100644 --- a/scripts/toolbar.js +++ b/scripts/toolbar.js @@ -113,7 +113,122 @@ function ShelfToggle(mousebutton, button, toolbarId, SendMessage) { } } -// ASSIGN MOUSE EVENTS FOR TOOLBAR BUTTONS, Buttons AND ToolbarShelfToggle, PARAMETERS DECIDE IF BUTTONS ARE CLICKABLE +function RemoveToolbar() { + let toolbar = document.getElementById("toolbar"); + while(toolbar.hasChildNodes()) { + toolbar.removeChild(toolbar.firstChild); + } +} + +function RecreateToolbar(NewToolbar) { + let toolbar = document.getElementById("toolbar"); + + for (var shelf in NewToolbar) { + let NewShelf = document.createElement("div"); + NewShelf.id = shelf; + NewShelf.classList = "toolbar_shelf"; + toolbar.appendChild(NewShelf); + + NewToolbar[shelf].forEach(function(button){ + let Newbutton = document.createElement("div"); + Newbutton.id = button; + Newbutton.classList = "button"; + + NewShelf.appendChild(Newbutton); + + let NewbuttonIMG = document.createElement("div"); + NewbuttonIMG.classList = "button_img"; + Newbutton.appendChild(NewbuttonIMG); + + }); + + } + + let toolbar_main = document.getElementById("toolbar_main"); + let SearchShelf = document.getElementById("toolbar_search"); + + if (toolbar_main != null && SearchShelf != null) { + toolbar_main.classList.remove("toolbar_shelf"); + + let SearchBox = document.createElement("div"); + SearchBox.id = "toolbar_search_input_box"; + SearchShelf.appendChild(SearchBox); + + let SearchInput = document.createElement("input"); + SearchInput.classList = "text_input"; + SearchInput.id = "filter_box"; + SearchInput.type = "text"; + SearchInput.placeholder = caption_searchbox; + SearchBox.appendChild(SearchInput); + + let ClearX = document.createElement("div"); + ClearX.id = "button_filter_clear"; + ClearX.type = "reset"; + ClearX.style.opacity = "0"; + ClearX.style.position = "absolute"; + SearchBox.appendChild(ClearX); + + let SearchButtons = document.createElement("div"); + SearchButtons.id = "toolbar_search_buttons"; + SearchShelf.appendChild(SearchButtons); + + let FilterType = document.getElementById("button_filter_type"); + SearchButtons.appendChild(FilterType); + + let GoPrev = document.getElementById("filter_search_go_prev"); + SearchButtons.appendChild(GoPrev); + + let GoNext = document.getElementById("filter_search_go_next"); + SearchButtons.appendChild(GoNext); + + Loadi18n(); + } + +} + +function RecreateToolbarUnusedButtons(buttonsIds) { + let unused_buttons = document.getElementById("toolbar_unused_buttons"); + + buttonsIds.forEach(function(button){ + let Newbutton = document.createElement("div"); + Newbutton.id = button; + Newbutton.classList = "button"; + unused_buttons.appendChild(Newbutton); + let NewbuttonIMG = document.createElement("div"); + NewbuttonIMG.classList = "button_img"; + Newbutton.appendChild(NewbuttonIMG); + + }); +} + + + +function SaveToolbar() { + let unused_buttons = []; + let toolbar = {}; + + let u = document.querySelectorAll("#toolbar_unused_buttons .button"); + u.forEach(function(b){ + unused_buttons.push(b.id); + }); + + let t = document.getElementById("toolbar"); + t.childNodes.forEach(function(s){ + toolbar[s.id] = []; + let t = document.querySelectorAll("#"+s.id+" .button").forEach(function(b){ + toolbar[s.id].push(b.id); + }); + }); + + chrome.storage.local.set({toolbar: toolbar}); + chrome.storage.local.set({unused_buttons: unused_buttons}); + setTimeout(function() { + chrome.runtime.sendMessage({command: "reload_toolbar", toolbar: toolbar, opt: opt}); + }, 50); +} + + +// ASSIGN MOUSE EVENTS FOR TOOLBAR BUTTONS, (Buttons AND ToolbarShelfToggle), PARAMETERS DECIDE IF BUTTONS ARE CLICKABLE // IN OPTIONS PAGE - TOOLBAR BUTTONS SAMPLES, MUST NOT CALL FUNCTIONS ON CLICKS, BUT STILL SHELFS BUTTONS MUST TOGGLE AND MOREOVER ON CLICK AND NOT ON MOUSEDOWN THIS IS WHERE ToolbarShelfToggleClickType="Click" IS NECESSARY function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, ToolbarShelfToggleClickType) { @@ -193,7 +308,7 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To if (s.id == "button_new") { s.onclick = function(event) { if (event.which == 1) { - OpenNewTab(); + OpenNewTab(false, active_group); } } s.onmousedown = function(event) { @@ -202,26 +317,21 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To event.preventDefault(); let activeTab = document.querySelector("#"+active_group+" .active_tab") != null ? document.querySelector("#"+active_group+" .active_tab") : document.querySelector(".pin.active_tab") != null ? document.querySelector(".pin.active_tab") : null; if (activeTab != null) { - chrome.tabs.duplicate(parseInt(activeTab.id), function(tab) { - setTimeout(function() { - if (activeTab.nextSibling != null) { - activeTab.parentNode.insertBefore(document.getElementById(tab.id), activeTab.nextSibling); - } else { - activeTab.parentNode.appendChild(document.getElementById(tab.id)); - } - RefreshExpandStates(); - schedule_update_data++; - RefreshCounters(); - }, 300); - }); - } + DuplicateTab(activeTab); + } } // SCROLL TO TAB if (event.which == 3) { - let activeTab = document.querySelector("#"+active_group+" .active_tab") != null ? document.querySelector("#"+active_group+" .active_tab") : document.querySelector(".pin.active_tab") != null ? document.querySelector(".pin.active_tab") : null; - if (activeTab != null) { - ScrollToTab(activeTab.id); - } + chrome.tabs.query({currentWindow: true, active: true}, function(activeTab) { + if (activeTab[0].pinned && opt.pin_list_multi_row == false) { + ScrollToTab(activeTab[0].id); + } + if (activeTab[0].pinned == false) { + let Tab = document.getElementById(activeTab[0].id); + let groupId = GetParentsByClass(Tab, "group")[0].id; + SetActiveGroup(groupId, true, true); + } + }); } } } @@ -269,8 +379,8 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To let tabsArr = []; document.querySelectorAll(".pin.selected_tab, .pin.active_tab, #"+active_group+" .selected_tab, #"+active_group+" .active_tab").forEach(function(s){ tabsArr.push(parseInt(s.id)); - if (s.childNodes[4].childNodes.length > 0) { - document.querySelectorAll("#"+s.childNodes[4].id+" .tab").forEach(function(t){ + if (s.childNodes[1].childNodes.length > 0) { + document.querySelectorAll("#"+s.childNodes[1].id+" .tab").forEach(function(t){ tabsArr.push(parseInt(t.id)); }); } @@ -281,15 +391,6 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To } } - // SHOW/HIDE GROUPS TOOLBAR - if (s.id == "button_groups_toolbar_hide") { - s.onmousedown = function(event) { - if (event.which == 1) { - GroupsToolbarToggle(); - } - } - } - // GO TO PREVIOUS SEARCH RESULT if (s.id == "filter_search_go_prev") { s.onmousedown = function(event) { @@ -331,7 +432,26 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To } } } - + + // SHOW/HIDE GROUPS TOOLBAR + if (s.id == "button_groups_toolbar_hide") { + s.onmousedown = function(event) { + if (event.which == 1) { + GroupsToolbarToggle(); + } + } + } + + // SHOW GROUP MANAGER + if (s.id == "button_manager_window") { + s.onmousedown = function(event) { + if (event.which == 1 && document.getElementById("manager_window").style.top == "-500px") { + OpenManagerWindow(); + } else { + HideRenameDialogs(); + } + } + } // NEW GROUP if (s.id == "button_new_group") { s.onmousedown = function(event) { @@ -369,7 +489,7 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To if (s.id == "button_export_group") { s.onmousedown = function(event) { if (event.which == 1) { - ExportGroup(bggroups[active_group].name+".tt_group"); + ExportGroup(active_group, bggroups[active_group].name+".tt_group", false); } } } @@ -378,10 +498,9 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To if (s.id == "button_import_group") { s.onmousedown = function(event) { if (event.which == 1) { - let inputFile = ShowOpenFileDialog("file_import_group", ".tt_group"); + let inputFile = ShowOpenFileDialog(".tt_group"); inputFile.onchange = function(event) { - ImportGroup(); - // this.parentNode.removeChild(this); + ImportGroup(true, false); } } } @@ -391,7 +510,7 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To if (s.id == "button_new_folder") { s.onmousedown = function(event) { if (event.which == 1) { - AddNewFolder(); + AddNewFolder(undefined, undefined, undefined, undefined, undefined, undefined, true); } } } @@ -440,10 +559,9 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To if (s.id == "button_import_bak") { s.onmousedown = function(event) { if (event.which == 1) { - let inputFile = ShowOpenFileDialog("file_import_backup", ".tt_session"); + let inputFile = ShowOpenFileDialog(".tt_session"); inputFile.onchange = function(event) { - ImportSession(); - // this.remove(); + ImportSession(true, false, false); } } } @@ -452,7 +570,8 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To if (s.id == "button_export_bak") { s.onmousedown = function(event) { if (event.which == 1) { - ExportSession("Session.tt_session"); + let d = new Date(); + ExportSession((d.toLocaleString().replace("/", ".").replace("/", ".").replace(":", "꞉").replace(":", "꞉"))+".tt_session", true, false, false); } } } @@ -460,10 +579,10 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To if (s.id == "button_import_merge_bak") { s.onmousedown = function(event) { if (event.which == 1) { - let inputFile = ShowOpenFileDialog("file_import_merge_backup", ".tt_session"); + let inputFile = ShowOpenFileDialog(".tt_session"); inputFile.onchange = function(event) { - ImportMergeTabs(); - // this.remove(); + ImportSession(false, false, true); + // ImportMergeTabs(); } } } @@ -486,6 +605,17 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To } } } + + // EMERGENCY RELOAD + if (s.id == "button_reboot") { + s.onmousedown = function(event) { + if (event.which == 1) { + chrome.runtime.sendMessage({command: "reload"}); + chrome.runtime.sendMessage({command: "reload_sidebar"}); + location.reload(); + } + } + } // SORT TABS // if (s.id == "button_sort") { @@ -556,18 +686,15 @@ function SetToolbarEvents(CleanPreviousBindings, Buttons, ToolbarShelfToggle, To s.onmousedown = function(event) { if (event.which == 1 && this.classList.contains("disabled") == false) { let BakN = (this.id).substr(15); - chrome.storage.local.get(null, function(items) { - if (Object.keys(items["windows_BAK"+BakN]).length > 0) { chrome.storage.local.set({"windows": items["windows_BAK"+BakN]}); } - if (Object.keys(items["tabs_BAK"+BakN]).length > 0) { chrome.storage.local.set({"tabs": items["tabs_BAK"+BakN]}); alert("Loaded backup"); } + chrome.storage.local.get(null, function(storage) { + if (Object.keys(storage["windows_BAK"+BakN]).length > 0) { chrome.storage.local.set({"windows": storage["windows_BAK"+BakN]}); } + if (Object.keys(storage["tabs_BAK"+BakN]).length > 0) { chrome.storage.local.set({"tabs": storage["tabs_BAK"+BakN]}); alert("Loaded backup"); } chrome.runtime.sendMessage({command: "reload"}); chrome.runtime.sendMessage({command: "reload_sidebar"}); location.reload(); }); } } } - - } - } }); diff --git a/scripts/utils.js b/scripts/utils.js index 7a1b2e8..8f6a8b8 100644 --- a/scripts/utils.js +++ b/scripts/utils.js @@ -3,6 +3,82 @@ // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ +function RecheckFirefox() { + chrome.tabs.query({pinned: false, currentWindow: true}, function(tabs) { + let last_tabId = tabs[tabs.length-1].id; + let p = []; + let p_tt = []; + let t_ref = {}; + let t_ind = 0; + let ok = 0; + let ti = 0; + let tc = tabs.length; + for (ti = 0; ti < tc; ti++) { + let tabId = tabs[ti].id; + p.push(""); + p_tt.push(""); + let t = Promise.resolve(browser.sessions.getTabValue(tabId, "TTdata")).then(function(TabData) { + if (TabData != undefined) { + t_ref[TabData.ttid] = tabs[t_ind].id; + p_tt[t_ind] = TabData.parent_ttid; + p[t_ind] = TabData.parent; + } + t_ind++; + if (tabId == last_tabId) { + let i = 0; + for (i = 0; i < p.length; i++) { + if (t_ref[p_tt[i]]) { + p[i] = t_ref[p_tt[i]]; + } + } + for (i = 0; i < p.length; i++) { + let Tab = document.getElementById(tabs[i].id); + if (Tab && p[i] == Tab.parentNode.parentNode.id) { + ok++; + } + } + if (ok < tabs.length*0.5) { + if (opt.debug) { + log("emergency reload"); + } + chrome.storage.local.set({emergency_reload: true}); + chrome.runtime.sendMessage({command: "reload"}); + chrome.runtime.sendMessage({command: "reload_sidebar"}); + location.reload(); + } else { + if (opt.debug) { + log("f: RecheckFirefox, ok"); + } + } + } + }); + } + }); +} + + +function AppendToNode(Node, AppendNode) { + if (Node != null && AppendNode != null) { + AppendNode.appendChild(Node); + } +} + +function InsterBeforeNode(Node, BeforeNode) { + if (Node != null && BeforeNode != null) { + BeforeNode.parentNode.insertBefore(Node, BeforeNode); + } +} + +function InsterAfterNode(Node, AfterNode) { + if (Node != null && AfterNode != null) { + if (AfterNode.nextSibling != null) { + AfterNode.parentNode.insertBefore(Node, AfterNode.nextSibling); + } else { + AfterNode.parentNode.appendChild(Node); + } + } +} + function HideRenameDialogs() { document.querySelectorAll(".edit_dialog").forEach(function(s){ s.style.display = "none"; @@ -33,9 +109,25 @@ function GetParentsBy2Classes(Node, ClassA, ClassB) { return Parents; } +// color in format "rgb(r,g,b)" or simply "r,g,b" (can have spaces, but must contain "," between values) +function RGBtoHex(color){ + color = color.replace(/[rgb(]|\)|\s/g, ""); color = color.split(","); return color.map(function(v){ return ("0"+Math.min(Math.max(parseInt(v), 0), 255).toString(16)).slice(-2); }).join(""); +} + +function HexToRGB(hex, alpha){ + hex = hex.replace('#', ''); + let r = parseInt(hex.length == 3 ? hex.slice(0, 1).repeat(2) : hex.slice(0, 2), 16); + let g = parseInt(hex.length == 3 ? hex.slice(1, 2).repeat(2) : hex.slice(2, 4), 16); + let b = parseInt(hex.length == 3 ? hex.slice(2, 3).repeat(2) : hex.slice(4, 6), 16); + if (alpha) { return 'rgba('+r+', '+g+', '+b+', '+alpha+')'; } else { return 'rgb('+r+', '+g+', '+b+')'; } +} function GetSelectedFolders() { - if (opt.debug) console.log("function: GetSelectedFolders"); + + if (opt.debug) { + log("f: GetSelectedFolders"); + } + let res = {Folders: {}, FoldersSelected: [], TabsIds: [], TabsIdsParents: []}; document.querySelectorAll("#"+active_group+" .selected_folder").forEach(function(s){ res.FoldersSelected.push(s.id); @@ -50,12 +142,10 @@ function GetSelectedFolders() { res.TabsIdsParents.push(tc.parentNode.id); }); }); - if (opt.debug) console.log(res); return res; } function GetSelectedTabs() { - if (opt.debug) console.log("function: GetSelectedTabs"); // let res = {urls: [], TabsIds: [], TabsIdsParents: [], TabsIdsSelected: []}; let res = {TabsIds: [], TabsIdsParents: [], TabsIdsSelected: []}; document.querySelectorAll(".pin.selected_tab, #"+active_group+" .selected_tab").forEach(function(s){ @@ -77,7 +167,6 @@ function GetSelectedTabs() { res.TabsIdsParents.push(tc.parentNode.id); }); }); - if (opt.debug) console.log(res); return res; } diff --git a/sidebar.html b/sidebar.html index 35b8311..440d0fd 100644 --- a/sidebar.html +++ b/sidebar.html @@ -30,6 +30,7 @@ + @@ -50,7 +51,7 @@
    - +

    @@ -58,12 +59,59 @@
    - +
+
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    + +
    + +
    + +
    +
    +
    + +
+ @@ -158,6 +209,7 @@ + @@ -168,6 +220,7 @@ + diff --git a/sidebar.js b/sidebar.js index e0c0352..76f6127 100644 --- a/sidebar.js +++ b/sidebar.js @@ -3,135 +3,117 @@ // that can be found at https://creativecommons.org/licenses/by-nc-nd/4.0/ document.addEventListener("DOMContentLoaded", Run(), false); -function Loadi18n() { - // toolbar labels - document.querySelectorAll(".button").forEach(function(s){ - s.title = chrome.i18n.getMessage(s.id); - }); - // menu labels and edit group dialog labels - document.querySelectorAll(".menu_item, .edit_dialog_button").forEach(function(s){ - s.textContent = chrome.i18n.getMessage(s.id); - }); -} -function RestorePinListRowSettings() { - plist = document.getElementById("pin_list"); - if (opt.pin_list_multi_row) { - plist.style.whiteSpace = "normal"; - plist.style.overflowX = "hidden"; - } else { - plist.style.whiteSpace = ""; - plist.style.overflowX = ""; - } - RefreshGUI(); -} + + function Run() { chrome.runtime.sendMessage({command: "is_bg_ready"}, function(response) { - setTimeout(function() { - if (response == true) { - Load(); - } else { + if (response == true) { + Initialize(); + } else { + setTimeout(function() { Run(); - } - },200); + },100); + } }); } -function Load() { - chrome.windows.getCurrent({populate: false}, function(window) { - CurrentWindowId = window.id; - chrome.runtime.sendMessage({command: "get_preferences"}, function(response) { - opt = Object.assign({}, response); + +function Initialize() { + + chrome.tabs.query({currentWindow: true}, function(tabs) { + CurrentWindowId = tabs[0].windowId; + + chrome.storage.local.get(null, function(storage) { + GetCurrentPreferences(storage); + + ApplyTheme(GetCurrentTheme(storage)); + + if (opt.show_toolbar) { + RecreateToolbar(GetCurrentToolbar(storage)); + SetToolbarEvents(false, true, true, "mousedown"); + RestoreToolbarShelf(); + RestoreToolbarSearchFilter(); + } + chrome.runtime.sendMessage({command: "get_browser_tabs"}, function(response) { - bgtabs = Object.assign({}, response); + let bgtabs = Object.assign({}, response); chrome.runtime.sendMessage({command: "get_folders", windowId: CurrentWindowId}, function(response) { bgfolders = Object.assign({}, response); chrome.runtime.sendMessage({command: "get_groups", windowId: CurrentWindowId}, function(response) { bggroups = Object.assign({}, response); - chrome.runtime.sendMessage({command: "get_theme", windowId: CurrentWindowId}, function(response) { - ApplyTheme(response); - Initialize(); - }); + // APPEND GROUPS + AppendGroups(bggroups); + // APPEND FOLDERS + AppendFolders(bgfolders); + // APPEND TABS + let ti = 0; + let tc = tabs.length; + for (ti = 0; ti < tc; ti++) { + AppendTab(tabs[ti], false, false, false, true, false, true, false, true, false, false); + } + for (ti = 0; ti < tc; ti++) { + if (bgtabs[tabs[ti].id] && !tabs[ti].pinned) { + let TabParent = document.getElementById("ct"+bgtabs[tabs[ti].id].parent) ; + if (TabParent != null && document.querySelector("[id='"+tabs[ti].id+"'] #ct"+bgtabs[tabs[ti].id].parent) == null) { + TabParent.appendChild(document.getElementById(tabs[ti].id)); + } + } + } + for (ti = 0; ti < tc; ti++) { + if (bgtabs[tabs[ti].id] && !tabs[ti].pinned && bgtabs[tabs[ti].id].expand != "") { + document.getElementById(tabs[ti].id).classList.add(bgtabs[tabs[ti].id].expand); + } + } + // SET ACTIVE TAB FOR EACH GROUP + SetActiveTabInEachGroup(); + RearrangeTreeTabs(tabs, bgtabs, true); + RearrangeFolders(true); + StartChromeListeners(); + SetMenu(); + SetEvents(); + SetManagerEvents(); + HideMenus(); + if (opt.switch_with_scroll) { + BindTabsSwitchingToMouseWheel("pin_list"); + } + if (opt.syncro_tabbar_tabs_order || opt.syncro_tabbar_groups_tabs_order) { + RearrangeBrowserTabs(); + } + RestorePinListRowSettings(); + StartAutoSaveSession(); + if (browserId == "V") { + VivaldiRefreshMediaIcons(); + } + setTimeout(function() { + RefreshExpandStates(); + RefreshCounters(); + SetActiveTabInEachGroup(); + if (browserId == "F" && opt.skip_load == false && storage.emergency_reload == undefined) { + RecheckFirefox(); + } + }, 1000); + setTimeout(function() { + UpdateData(); + delete debug; + delete running; + delete schedule_save; + delete windows; + delete tabs; + delete tt_ids; + delete DefaultToolbar; + delete DefaultTheme; + delete DefaultPreferences; + if (storage.emergency_reload != undefined) { + chrome.storage.local.remove("emergency_reload"); + } + }, 5000); + if (browserId != "F") { + if (Object.keys(storage["windows_BAK1"]).length > 0 && document.getElementById("button_load_bak1") != null) { document.getElementById("button_load_bak1").classList.remove("disabled"); } + if (Object.keys(storage["windows_BAK2"]).length > 0 && document.getElementById("button_load_bak2") != null) { document.getElementById("button_load_bak2").classList.remove("disabled"); } + if (Object.keys(storage["windows_BAK3"]).length > 0 && document.getElementById("button_load_bak3") != null) { document.getElementById("button_load_bak3").classList.remove("disabled"); } + } }); }); }); }); }); } -function Initialize() { - // APPEND GROUPS - AppendGroups(bggroups); - chrome.tabs.query({currentWindow: true}, function(tabs) { - // APPEND FOLDERS - AppendFolders(bgfolders); - // APPEND TABS - let tc = tabs.length; - for (var ti = 0; ti < tc; ti++) { - AppendTab(tabs[ti], false, false, false, true, false, true, false, true, false, false); - } - for (var ti = 0; ti < tc; ti++) { - if (bgtabs[tabs[ti].id] && !tabs[ti].pinned) { - let TabParent = document.getElementById("ct"+bgtabs[tabs[ti].id].parent) ; - - if (TabParent != null && document.querySelector("[id='"+tabs[ti].id+"'] #ct"+bgtabs[tabs[ti].id].parent) == null) { - TabParent.appendChild(document.getElementById(tabs[ti].id)); - } - } - } - for (var ti = 0; ti < tc; ti++) { - if (bgtabs[tabs[ti].id] && !tabs[ti].pinned && bgtabs[tabs[ti].id].expand != "") { - document.getElementById(tabs[ti].id).classList.add(bgtabs[tabs[ti].id].expand); - } - } - // SET ACTIVE TAB FOR EACH GROUP - chrome.tabs.query({currentWindow: true, active: true}, function(tabs) { - chrome.runtime.sendMessage({command: "get_active_group", windowId: CurrentWindowId}, function(response) { - for (var group in bggroups) { - if (response && tabs[0].pinned && response == group) { - SetActiveTab(tabs[0].id); - continue; - } - let activeInGroup = document.querySelector("#"+group+" [id='"+bggroups[group].active_tab+"']"); - if (activeInGroup != null) { - activeInGroup.classList.add("active_tab"); - } - } - if (response) { - SetActiveGroup(response, true, true); - } else { - SetActiveGroup("tab_list", true, true); - } - }); - }); - RearrangeTreeTabs(tabs, bgtabs, true); - RearrangeFolders(true); - StartChromeListeners(); - SetMenu(); - SetEvents(); - HideMenus(); - if (opt.switch_with_scroll) { - BindTabsSwitchingToMouseWheel("pin_list"); - } - if (opt.syncro_tabbar_tabs_order || opt.syncro_tabbar_groups_tabs_order) { - RearrangeBrowserTabs(); - } - RestorePinListRowSettings(); - if (browserId == "V") { - VivaldiRefreshMediaIcons(); - } - setTimeout(function() { - RefreshExpandStates(); - RefreshCounters(); - }, 3000); - setTimeout(function() { - UpdateData(); - delete bgtabs; - delete theme; - }, 5000); - if (browserId != "F") { - chrome.storage.local.get(null, function(items) { - if (Object.keys(items["windows_BAK1"]).length > 0 && document.getElementById("button_load_bak1") != null) { document.getElementById("button_load_bak1").classList.remove("disabled"); } - if (Object.keys(items["windows_BAK2"]).length > 0 && document.getElementById("button_load_bak2") != null) { document.getElementById("button_load_bak2").classList.remove("disabled"); } - if (Object.keys(items["windows_BAK3"]).length > 0 && document.getElementById("button_load_bak3") != null) { document.getElementById("button_load_bak3").classList.remove("disabled"); } - }); - } - }); -} \ No newline at end of file diff --git a/theme/close.svg b/theme/close.svg index b190883..4975b7f 100644 --- a/theme/close.svg +++ b/theme/close.svg @@ -26,15 +26,15 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="44.8" - inkscape:cx="4.1559123" - inkscape:cy="4.8313983" + inkscape:cx="9.4572516" + inkscape:cy="5.545684" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" units="px" inkscape:window-width="1920" - inkscape:window-height="1028" - inkscape:window-x="-8" + inkscape:window-height="1058" + inkscape:window-x="1912" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:object-paths="true" @@ -60,7 +60,7 @@ transform="translate(0,-1040.3622)"> diff --git a/theme/theme.css b/theme/theme.css index b6431bf..658a2f4 100644 --- a/theme/theme.css +++ b/theme/theme.css @@ -1,22 +1,29 @@ /* SCROLLBARS */ +::-webkit-scrollbar-corner { + background-color: transparent; +} +.manager_window_list::-webkit-scrollbar, .group::-webkit-scrollbar, #pin_list::-webkit-scrollbar { height: var(--scrollbar_height); width: var(--scrollbar_width); } +.manager_window_list::-webkit-scrollbar-thumb, .group::-webkit-scrollbar-thumb, #pin_list::-webkit-scrollbar-thumb { background-color: var(--scrollbar_thumb); } +.manager_window_list::-webkit-scrollbar-thumb:hover, .group::-webkit-scrollbar-thumb:hover, #pin_list::-webkit-scrollbar-thumb:hover { background-color: var(--scrollbar_thumb_hover); } +.manager_window_list::-webkit-scrollbar-track, .group::-webkit-scrollbar-track, #pin_list::-webkit-scrollbar-track { background-color: var(--scrollbar_track); @@ -32,78 +39,7 @@ div { background-color: var(--tab_list_background); } -/* MAIN TOOLBAR */ -#toolbar { - position: absolute; - top: 0px; - left: 0px; - width: 100%; - background-color: var(--toolbar_background); - border-bottom: 1px solid var(--toolbar_border_bottom); -} - - -#toolbar_main { - position: relative; - width: 100%; - height: 26px; - top: 0px; - border-bottom: 1px solid var(--toolbar_border_bottom); - background-color: var(--toolbar_background); -} - - -.toolbar_shelf { - position: relative; - width: 100%; - height: 26px; - border-bottom: 1px solid var(--toolbar_border_bottom); - background-color: var(--toolbar_background); - overflow: hidden; -} - -.button.disabled { - opacity: 0.2; -} -.button { - position: relative; - display: inline-block; - vertical-align: top; - width: var(--button_size); - height: var(--button_size); - top: 1px; - left: 1px; - margin-right: 1px; -} - -.button:not(.on) { - background-color: var(--button_background); - border: 1px solid var(--button_border); -} - -.button:hover:not(.on) { - background-color: var(--button_hover_background); - border: 1px solid var(--button_hover_border); -} -.button:hover:not(.on)>.button_img { - background-color: var(--button_icons_hover); -} - -.button.on { - width: var(--button_size); - height: 26px; - background-color: var(--toolbar_background); - border: 1px solid var(--toolbar_border_bottom); -} - -.button_img { - width: var(--button_size); - height: var(--button_size); - background-size: var(--button_size) var(--button_size); - background-position: 0px 0px; - background-color: var(--button_icons); -} /* MAIN TOOLBAR BUTTONS */ @@ -227,6 +163,11 @@ div { mask-image: url(../theme/toolbar_load_bak3.svg); } +#button_reboot>.button_img { + -webkit-mask-image: url(../theme/toolbar_alert.svg); + mask-image: url(../theme/toolbar_alert.svg); +} + #button_backup>.button_img { -webkit-mask-image: url(../theme/toolbar_save.svg); mask-image: url(../theme/toolbar_save.svg); @@ -270,6 +211,11 @@ div { mask-image: url(../theme/toolbar_trashcan.svg); } +#button_manager_window>.button_img { + -webkit-mask-image: url(../theme/toolbar_window.svg); + mask-image: url(../theme/toolbar_window.svg); +} + /* MAIN TOOLBAR SEARCHBOX */ @@ -293,7 +239,8 @@ div { -webkit-mask-image: url(../theme/toolbar_filter_search_go_prev.svg); mask-image: url(../theme/toolbar_filter_search_go_prev.svg); width: 16px; - background-size: 16px 22px; + -webkit-mask-size: 16px 22px; + mask-size: 16px 22px; } #filter_search_go_next>.button_img { @@ -301,6 +248,8 @@ div { mask-image: url(../theme/toolbar_filter_search_go_next.svg); width: 16px; background-size: 16px 22px; + -webkit-mask-size: 16px 22px; + mask-size: 16px 22px; } #toolbar_search_input_box { @@ -353,6 +302,117 @@ div { } +/* MAIN TOOLBAR */ + +#toolbar { + position: absolute; + top: 0px; + left: 0px; + width: 100%; + background-color: var(--toolbar_background); + border-bottom: 1px solid var(--toolbar_border_bottom); +} + + +#toolbar_main { + position: relative; + width: 100%; + height: 26px; + top: 0px; + border-bottom: 1px solid var(--toolbar_border_bottom); + background-color: var(--toolbar_background); +} + + +.toolbar_shelf { + position: relative; + width: 100%; + height: 26px; + border-bottom: 1px solid var(--toolbar_border_bottom); + background-color: var(--toolbar_shelf_background); + overflow: hidden; + z-index: 200; +} + +.button.disabled { + opacity: 0.2; +} + +.button { + position: relative; + display: inline-block; + vertical-align: top; + width: 24px; + height: 24px; +} + +.button_img { + position: absolute; + top: 1px; + left: 1px; + width: 22px; + height: 22px; + -webkit-mask-size: 22px 22px; + mask-size: 22px 22px; + background-color: var(--button_icons); +} + + + + +.button:not(.on) { + background-color: var(--button_background); + border: 1px solid var(--button_border); +} +.button:hover:not(.on) { + background-color: var(--button_hover_background); + border: 1px solid var(--button_hover_border); +} +.button:hover:not(.on)>.button_img { + background-color: var(--button_icons_hover); +} + + + +.button.on { + top: -1px; + height: 27px; + width: 26px; + background-color: var(--button_on_background); + border: 1px solid var(--toolbar_border_bottom); + margin-left: -1px; + margin-right: -1px; + z-index: 100; +} +.button.on .button_img { + top: 2px; + left: 2px; + background-color: var(--button_on_icons); +} + + + + + + +.toolbar_shelf .button { + background-color: var(--button_shelf_background); + border: 1px solid var(--button_shelf_border); +} +.toolbar_shelf .button_img { + background-color: var(--button_shelf_icons); +} + +.toolbar_shelf .button:hover { + background-color: var(--button_shelf_hover_background); + border: 1px solid var(--button_shelf_hover_border); +} +.toolbar_shelf .button:hover .button_img { + background-color: var(--button_shelf_icons_hover); +} + + + /* LISTS */ @@ -371,12 +431,14 @@ div { border-bottom: 1px solid var(--pin_list_border_bottom); } + + #groups { z-index: 10; position: absolute; display: inline-block; - width: 100%; - height: 100%; + width: 0px; + height: 0px; background-color: var(--tab_list_background); } @@ -384,13 +446,23 @@ div { .group { position: absolute; height: 100%; - width: calc(100% - 1px); + width: 100%; display: inline-block; overflow-x: hidden; overflow-y: auto; - background-color: var(--tab_list_background); } +.group>.children_folders { + position: relative; + top: var(--group_folders_top); +} +.group>.children_tabs { + position: relative; + top: var(--group_tabs_top); +} + + + /* GROUPS (SHELF LIKE BUTTONS) TOOLBAR */ @@ -400,7 +472,6 @@ div { vertical-align: top; top: 0px; left: 0px; - /* width and border are set in RestoreStateOfGroupsToolbar() */ width: 0px; height: 100%; background-color: var(--group_list_background); @@ -412,22 +483,19 @@ div { display: block; vertical-align: top; left: 0px; - top: 4px; - width: 50px; - height: calc(100% - 8px); + width: 1000px; + height: 100%; overflow-x: visible; overflow-y: scroll; } .group_title { - padding-right: 5px; padding-left: 6px; display: inline-block; position: absolute; - transform: rotateZ(-90deg) translateX(-100%) translateY(1.5px); + transform: rotateZ(-90deg) translateX(-100%) translateY(3px); transform-origin: top left; - font-family: Arial, Helvetica, "Nimbus Sans L", "Liberation Sans", FreeSans, Sans-serif; font-size: 11px; font-weight: bold; @@ -437,57 +505,15 @@ div { .group_button { position: relative; - margin-left: 1px; - width: 18px; + left: -1px; + width: 20px; height: 300px; border: 1px solid transparent; background-color: transparent; } -.drop_target.group_button_drag_entered_top { - z-index: 3; - position: absolute; - width: 110%; - height: 50%; - left: -1px; - top: -1px; - border-top: 1px solid transparent; - background-color: transparent; -} -.drop_target.group_button_drag_entered_top.highlighted_drop_target { - border-top: 1px solid var(--drag_indicator); -} - -.drop_target.group_button_drag_entered_bottom { - z-index: 4; - position: absolute; - width: 110%; - height: 50%; - left: -1px; - bottom: -2px; - border-bottom: 1px solid transparent; - background-color: transparent; -} -.drop_target.group_button_drag_entered_bottom.highlighted_drop_target { - border-bottom: 1px solid var(--drag_indicator); -} - - -.drop_target.group_drag_box { - z-index: 5; - position: absolute; - width: 100%; - height: 100%; - left: -1px; - top: -1px; - background-color: transparent; -} -.drop_target.group_drag_box.highlighted_drop_target { - border: 1px solid var(--drag_indicator); -} - .group_button:hover:not(.active_group) { - width: 16px; + width: 18px; background-color: var(--group_list_button_hover_background); } @@ -495,94 +521,10 @@ div { border: 1px solid var(--group_list_borders); background-color: var(--tab_list_background); } - - - -/* GROUP AND FOLDER EDIT DIALOG */ - -.edit_dialog { - z-index: 88888; - position: absolute; - overflow: hidden; - width: calc(100% - 28px); - height: 53px; - background-color: var(--tabs_menu_background); - display: none; - word-wrap: normal; - white-space: initial; - font-family: Arial, Helvetica, "Nimbus Sans L", "Liberation Sans", FreeSans, Sans-serif; font-size: 12px; - border: 1px solid var(--tabs_menu_border); - padding: 0px 0px 0px 0px; - color: var(--tabs_menu_font); +#group_list .group_button.active_group:first-child { + border-top: 1px solid var(--tab_list_background); } -.edit_dialog_confirm, -.edit_dialog_discard { - position: absolute; -} -.edit_dialog_confirm, -.edit_dialog_discard { - line-height: 17px; - font-family: Arial, Helvetica, "Nimbus Sans L", "Liberation Sans", FreeSans, Sans-serif; - font-size: 11px; - text-overflow: ellipsis; - background: transparent; - text-align: center; - vertical-align: middle; - overflow: hidden; - display: inline-block; - top: 30px; - width: calc(50% - 8px); height: 17px; - border: 1px solid var(--tabs_menu_border); - color: var(--tabs_menu_font); -} -.edit_dialog_confirm { - left: 5px; -} -.edit_dialog_discard { - left: calc(50% + 1px); -} -.edit_dialog_confirm:hover, -.edit_dialog_discard:hover { - border: 1px solid var(--tabs_menu_hover_border); - - background-color: var(--tabs_menu_hover_background); -} -.edit_dialog_edit_name { - position: absolute; - display: inline-block; - vertical-align: top; - top: 4px; left: 5px; - width: calc(100% - 38px); height: 19px; - background-color: var(--filter_box_background); - border: solid 1px var(--filter_box_border); - color: var(--filter_box_font); -} -.edit_dialog_edit_name:focus { - outline: none; -} - -#folder_edit_name { - width: calc(100% - 14px); -} - - -#group_edit_font { - position: absolute; - display: inline-block; - top: 5px; - right: 5px; - width: 19px; height: 19px; - border: 1px solid var(--tabs_menu_border); - background-color: #000000; - color: var(--tabs_menu_font); -} -#group_edit_font:hover { - opacity: 0.8; -} - - - /* PINS AND TABS COLORS, WATCH OUT AND DON'T MESS WITH IT */ /* normal */ @@ -884,6 +826,7 @@ div { padding-right: 3px; padding-left: var(--tab_title_text_padding_left); font-size: var(--title_font_size); + pointer-events: none; } .tab { @@ -892,8 +835,10 @@ div { left: 0px; height: auto; width: auto; - /* border-top: 1px solid transparent; */ - margin-top: var(--margin_top_tab); + margin-top: var(--margin_tab_top); + margin-bottom: var(--margin_tab_bottom); + margin-left: var(--margin_tab_left); + margin-right: var(--margin_tab_right); } .tab>.tab_header { @@ -901,64 +846,14 @@ div { z-index: 10; position: relative; top: 0px; - left: var(--tab_header_left); + left: 0px; height: var(--tab_height); line-height: var(--tab_height_line); - width: var(--tab_header_width); + width: calc(100% - 2px); background-image: url(../theme/icon_empty.svg); background-size: var(--favicon_width) var(--favicon_height); background-position: var(--favicon_left), center; -} - - -/* DRAG AND DROP TARGETS */ - -.drop_target { - position: absolute; - /* pointer-events: none; */ -} - -.tab>.drop_target.drag_enter_center { - border-radius: var(--tab_header_border_radius); - z-index: -1; - top: 0px; - left: var(--tab_drag_enter_center_left); - height: var(--tab_height); - width: var(--tab_drag_enter_center_width); - border: 1px solid transparent; -} - -.tab>.drop_target.drag_enter_center.highlighted_drop_target { - border: 1px solid var(--drag_indicator); -} - -.tab>.drop_target.drag_entered_top { - border-radius: var(--tab_header_border_radius); - z-index: -1; - top: var(--tab_drag_entered_top); - left: var(--tab_drag_entered_left); - width: var(--tab_drag_entered_tb_width); - height: var(--drag_area_top); - border-top: 1px solid transparent; -} -.tab>.drop_target.drag_entered_top.highlighted_drop_target { - border-top: 1px solid var(--drag_indicator); -} - -.tab>.drop_target.drag_entered_bottom { - border-radius: var(--tab_header_border_radius); - z-index: -1; - bottom: var(--tab_drag_entered_bottom); - left: var(--tab_drag_entered_left); - width: var(--tab_drag_entered_tb_width); - height: var(--drag_area_bottom); - border-bottom: 1px solid transparent; -} -.tab>.drop_target.drag_entered_bottom.highlighted_drop_target { - border-bottom: 1px solid var(--drag_indicator); -} -.group>:first-child { - margin-top: var(--margin_top_first_tab); + /* background-image: linear-gradient(to bottom, rgba(0,0,0,0.6) 0%,rgba(0,0,0,0.6) 100%), url(../theme/icon_empty.svg); */ } .group>.children_tabs>:last-child { @@ -968,7 +863,9 @@ div { /* TABS WITH CHILDREN, OPEN AND CLOSED */ .expand { + display: none; z-index: -1; + pointer-events: none; position: absolute; top: 0px; left: 0px; @@ -985,6 +882,9 @@ div { position: relative; padding-left: var(--children_padding_left); } +.tab>.children_tabs>.tab { + margin-right: 0px; +} .tab.o>.children_tabs { height: auto; @@ -1001,14 +901,18 @@ div { } .tab.c>.tab_header>.expand { + display: block; z-index: 200; + pointer-events: auto; background-color: var(--expand_closed_background); mask-image: url(../theme/expand_closed.svg); -webkit-mask-image: url(../theme/expand_c.svg); } .tab.o>.tab_header>.expand { + display: block; z-index: 200; + pointer-events: auto; background-color: var(--expand_open_background); mask-image: url(../theme/expand_open.svg); -webkit-mask-image: url(../theme/expand_o.svg); @@ -1034,6 +938,7 @@ div { color:var(--tab_title_font_color); font-style:var(--tab_title_font_style); font-weight:var(--tab_title_font_weight); + pointer-events: none; } .folder { @@ -1042,65 +947,36 @@ div { left: 0px; height: auto; width: auto; - margin-top: var(--margin_top_tab); + margin-top: var(--margin_tab_top); + margin-bottom: var(--margin_tab_bottom); + margin-left: var(--margin_tab_left); + margin-right: var(--margin_tab_right); } .folder>.folder_header { z-index: 10; position: relative; top: 0px; - left: var(--tab_header_left); + left: 0px; height: var(--tab_height); line-height: var(--tab_height_line); - width: var(--tab_header_width); + width: calc(100% - 2px); border-radius:var(--tab_header_border_radius); border:1px solid var(--tab_border); background-color:var(--tab_background); } -.folder>.drop_target.drag_enter_center { - border-radius: var(--tab_header_border_radius); - z-index: -1; - top: 0px; - left: var(--tab_drag_enter_center_left); - height: var(--tab_height); - width: var(--tab_drag_enter_center_width); - border: 1px solid transparent; -} - -.folder>.drop_target.drag_enter_center.highlighted_drop_target { - border: 1px solid var(--drag_indicator); -} - -.folder>.drop_target.drag_entered_top { - border-radius: var(--tab_header_border_radius); - z-index: -1; - top: var(--tab_drag_entered_top); - left: var(--tab_drag_entered_left); - width: var(--tab_drag_entered_tb_width); - height: var(--drag_area_top); - border-top: 1px solid transparent; -} -.folder>.drop_target.drag_entered_top.highlighted_drop_target { - border-top: 1px solid var(--drag_indicator); -} - -.folder>.drop_target.drag_entered_bottom { - border-radius: var(--tab_header_border_radius); - z-index: -1; - bottom: var(--tab_drag_entered_bottom); - left: var(--tab_drag_entered_left); - width: var(--tab_drag_entered_tb_width); - height: var(--drag_area_bottom); - border-bottom: 1px solid transparent; -} -.folder>.drop_target.drag_entered_bottom.highlighted_drop_target { - border-bottom: 1px solid var(--drag_indicator); -} .folder>.children_folders, .folder>.children_tabs { position: relative; padding-left: var(--children_padding_left); } + +.folder>.children_folders>.folder, +.folder>.children_tabs>.tab { + margin-right: 0px; +} + + .folder.o>.children_folders, .folder.o>.children_tabs { height: auto; @@ -1131,18 +1007,18 @@ div { .folder.c>.folder_header>.folder_icon:hover, .folder.o>.folder_header>.folder_icon:hover { - background-color: var(--expand_hover_background); + background-color: var(--folder_icon_hover); } .folder>.folder_header>.folder_icon, .folder.c>.folder_header>.folder_icon { - background-color: var(--expand_closed_background); + background-color: var(--folder_icon_closed); -webkit-mask-image: url(../theme/icon_folder_closed.svg); mask-image: url(../theme/icon_folder_closed.svg); } .folder.o>.folder_header>.folder_icon { - background-color: var(--expand_open_background); + background-color: var(--folder_icon_open); -webkit-mask-image: url(../theme/icon_folder_open.svg); mask-image: url(../theme/icon_folder_open.svg); } @@ -1176,11 +1052,6 @@ div { } - -/* .children_folders>:last-child { - margin-bottom: 1px; -} */ - .selected_folder>.folder_header .active_folder>.folder_header { z-index: 900; @@ -1210,16 +1081,8 @@ div { margin-bottom: var(--pin_margin_bottom); height: var(--pin_height); width: var(--pin_width); - /* border: 1px solid red; */ } -/* #pin_list>:first-child { - background-color: red; - -} -#pin_list>:first-child>.tab_header { - opacity: 0.1; -} */ .pin>.tab_header>.tab_title, .pin>.tab_header>.expand, @@ -1232,6 +1095,7 @@ div { width: 0px; } .pin>.tab_header { + animation: none; z-index: 10; position: relative; top: 0px; @@ -1243,42 +1107,6 @@ div { background-position: center, center; } -.pin>.drop_target.drag_entered_top { - z-index: -1; - position: absolute; - top: 0px; - left: var(--pin_drag_entered_top_left); - height: 100%; - width: 50%; - border-left: 1px solid transparent; -} - -.pin>.drop_target.drag_entered_top.highlighted_drop_target { - border-left: 1px solid var(--drag_indicator); -} - -.pin>.drop_target.drag_entered_bottom { - z-index: -1; - position: absolute; - top: 0px; - left: var(--pin_drag_entered_bottom_right); - height: 100%; - width: 50%; - border-left: 1px solid transparent; -} - -.pin>.drop_target.drag_entered_bottom.highlighted_drop_target { - border-right: 1px solid var(--drag_indicator); -} - -.pin>.drop_target.drag_enter_center { - z-index: -1; - display: none; - position: absolute; - top: 0px; - height: 0px; - width: 0px; -} .pin>.children_tabs { display: none; position: absolute; @@ -1296,6 +1124,124 @@ div { } + + + +/* DRAG AND DROP TARGETS */ + +.drag_indicator { + z-index: 99999; + display: none; + position: absolute; + pointer-events: none; +} + +.pin.highlighted_drop_target.before>.drag_indicator { + display: block; + top: 0px; + left: var(--pin_drag_entered_top_left); + height: 100%; + width: 100%; + border-left: 1px solid var(--drag_indicator); +} + +#pin_list.highlighted_drop_target>.pin:last-child>.drag_indicator, +.pin.highlighted_drop_target.after>.drag_indicator { + display: block; + top: 0px; + right: var(--pin_drag_entered_bottom_right); + height: 100%; + width: 100%; + border-right: 1px solid var(--drag_indicator); + +} + +.pin.highlighted_drop_target.inside>.drag_indicator { + display: none; + top: 0px; + left: 0px; + height: 0px; + width: 0px; +} + +.folder.highlighted_drop_target.inside>.drag_indicator, +.tab.highlighted_drop_target.inside>.drag_indicator { + display: block; + top: 0px; + left: 0px; + height: var(--tab_height); + width: calc(100% - 2px); + border-radius: var(--tab_header_border_radius); + border: 1px solid var(--drag_indicator); +} + + +.folder.highlighted_drop_target.before>.drag_indicator, +.tab.highlighted_drop_target.before>.drag_indicator { + display: block; + top: var(--tab_drag_entered_top); + left: 0px; + width: 100%; + height: var(--tab_height); + border-radius: var(--tab_header_border_radius); + border-top: 1px solid var(--drag_indicator); +} + + +.group.highlighted_drop_target>.children_tabs>.tab:last-child>.drag_indicator, +.folder.highlighted_drop_target.after>.drag_indicator, +.tab.highlighted_drop_target.after>.drag_indicator { + display: block; + bottom: var(--tab_drag_entered_bottom); + left: 0px; + width: 100%; + height: var(--tab_height); + border-radius: var(--tab_header_border_radius); + border-bottom: 1px solid var(--drag_indicator); +} + + +.group>.children_tabs>.tab:first-child>.drag_indicator, +.group>.children_folders>.folder:first-child>.drag_indicator { + top: 1px; +} + + + +.group_button.inside.highlighted_drop_target>.drag_indicator { + display: block; + top: -1px; + left: 0px; + width: calc(100% - 2px); + height: 100%; + border: 1px solid var(--drag_indicator); +} + +.group_button.before.highlighted_drop_target>.drag_indicator { + display: block; + top: -1px; + left: 0px; + width: 19px; + height: calc(100% + 2px); + border-top: 1px solid var(--drag_indicator); +} + + +.group_button.after.highlighted_drop_target>.drag_indicator { + display: block; + top: -1px; + left: 0px; + width: 19px; + height: calc(100% + 2px); + border-bottom: 1px solid var(--drag_indicator); +} + + + + + + + /* MEDIA */ @keyframes blinking2 { @@ -1305,21 +1251,21 @@ div { 100% {opacity: 0} } .tab_mediaicon { - animation: blinking2 1.5s infinite; + animation: none; position: absolute; - display: inline-block; + display: none; vertical-align: top; z-index: 999; bottom: 0px; left: 0px; -/* left: var(--tab_mediaicon_left); - bottom: var(--tab_mediaicon_bottom); */ height: 0px; width: 0px; background-size: 0px 0px; } .audible>.tab_header>.tab_mediaicon { + animation: blinking2 1.5s infinite; + display: inline-block; height: var(--tab_mediaicon_height); width: var(--tab_mediaicon_width); background-image: url(../theme/icon_audio.svg); @@ -1331,6 +1277,8 @@ div { } .muted>.tab_header>.tab_mediaicon { + animation: blinking2 1.5s infinite; + display: inline-block; height: var(--tab_mediaicon_height); width: var(--tab_mediaicon_width); background-image: url(../theme/icon_audio_muted.svg); @@ -1360,7 +1308,6 @@ div { right: var(--close_right); height: var(--close_height); width: var(--close_width); - background-size: var(--close_height) var(--close_width); } .close_img { @@ -1368,10 +1315,11 @@ div { position: absolute; top: 0px; left: 0px; - height: 100%; - width: 100%; + height: var(--close_height); + width: var(--close_width); background-color: var(--close_x); -webkit-mask-image: url(../theme/close.svg); + -webkit-mask-size: var(--close_height) var(--close_width); mask-image: url(../theme/close.svg); mask-size: 100%; mask-position: center, center; @@ -1387,7 +1335,6 @@ div { } .close_show>.close_hover>.close_img { - top: 0px; background-color: var(--close_hover_x); } @@ -1408,28 +1355,8 @@ div { z-index: 9999; } - - - - - - -/* - -@keyframes blinking { - 0% {background-color: var(--tab_background); border:1px solid var(--tab_border);} - 50% {background-color: var(--attention_background); border:1px solid var(--attention_border);} - 80% {background-color: var(--tab_background); border:1px solid var(--tab_border);} - 100% {background-color: var(--tab_background); border:1px solid var(--tab_border);} -} - - */ -.dragged_selected>.folder_header, -.dragged_selected>.tab_header, .dragged_tree>.folder_header, .dragged_tree>.tab_header { - /* animation: blinking 2.5s infinite; */ - border:1px solid var(--tab_selected_border); background-color:var(--tab_selected_background); @@ -1485,3 +1412,93 @@ div { padding: 0; overflow: hidden; } + + + + + +/* GROUP AND FOLDER EDIT DIALOG */ + +.edit_dialog { + z-index: 88888; + position: absolute; + overflow: hidden; + width: calc(100% - 24px); + left: 21px; + height: 53px; + background-color: var(--tabs_menu_background); + display: none; + word-wrap: normal; + white-space: initial; + font-family: Arial, Helvetica, "Nimbus Sans L", "Liberation Sans", FreeSans, Sans-serif; + font-size: 12px; + border: 1px solid var(--tabs_menu_border); + padding: 0px 0px 0px 0px; + color: var(--tabs_menu_font); +} + +.edit_dialog_confirm, +.edit_dialog_discard { + position: absolute; +} +.edit_dialog_confirm, +.edit_dialog_discard { + line-height: 17px; + font-family: Arial, Helvetica, "Nimbus Sans L", "Liberation Sans", FreeSans, Sans-serif; + font-size: 11px; + text-overflow: ellipsis; + background: transparent; + text-align: center; + vertical-align: middle; + overflow: hidden; + display: inline-block; + top: 30px; + width: calc(50% - 8px); height: 17px; + border: 1px solid var(--tabs_menu_border); + color: var(--tabs_menu_font); +} +.edit_dialog_confirm { + left: 5px; +} +.edit_dialog_discard { + left: calc(50% + 1px); +} +.edit_dialog_confirm:hover, +.edit_dialog_discard:hover { + border: 1px solid var(--tabs_menu_hover_border); + background-color: var(--tabs_menu_hover_background); +} +.edit_dialog_edit_name { + position: absolute; + display: inline-block; + vertical-align: top; + top: 4px; left: 5px; + width: calc(100% - 38px); height: 19px; + background-color: var(--filter_box_background); + border: solid 1px var(--filter_box_border); + color: var(--filter_box_font); +} +.edit_dialog_edit_name:focus { + outline: none; +} + +#folder_edit_name { + width: calc(100% - 14px); +} + + +#group_edit_font { + position: absolute; + display: inline-block; + top: 5px; + right: 5px; + width: 19px; height: 19px; + border: 1px solid var(--tabs_menu_border); + background-color: #000000; + color: var(--tabs_menu_font); +} +#group_edit_font:hover { + opacity: 0.8; +} + + diff --git a/theme/theme_colors.css b/theme/theme_colors.css index fc510f6..2bf65fd 100644 --- a/theme/theme_colors.css +++ b/theme/theme_colors.css @@ -9,11 +9,27 @@ body { --toolbar_background: #f2f2f2; --toolbar_border_bottom: #cccccc; + /* MAIN TOOLBAR "ON" BUTTONS COLORS */ + --button_on_background: #f2f2f2; + --button_on_icons: #808080; + + /* SHELF TOOLBAR */ + --toolbar_shelf_background: #f2f2f2; + + /* SHELF TOOLBAR BUTTONS COLORS */ + --button_shelf_background: #f2f2f2; + --button_shelf_border: #f2f2f2; + --button_shelf_hover_background: #dcdcdc; + --button_shelf_hover_border: #dcdcdc; + --button_shelf_icons: #808080; + --button_shelf_icons_hover: #808080; + + /* MAIN TOOLBAR BUTTONS COLORS */ --button_background: #f2f2f2; --button_border: #f2f2f2; --button_hover_background: #dcdcdc; - --button_hover_border: #bebebe; + --button_hover_border: #dcdcdc; --button_icons: #808080; --button_icons_hover: #808080; @@ -29,7 +45,7 @@ body { --group_list_default_font_color: #808080; --group_list_button_hover_background: #dcdcdc; - /* TOTO GROUP EDIT DIALOG */ + /* TODO GROUP EDIT DIALOG */ /* LISTS */ @@ -248,9 +264,12 @@ body { --tab_filtered_selected_active_highlighted_search_hover_title_font_weight: bold; /* folders */ - /* --folder_list_background: #fafafa; */ - - + --folder_icon_closed: #969696; + --folder_icon_open: #339bf3; + --folder_icon_hover: #ffa500; + + + /* TABS EXPAND INDICATOR */ --expand_hover_background: #ffa500; --expand_closed_background: #969696; --expand_open_background: #339bf3; diff --git a/theme/theme_manager.css b/theme/theme_manager.css new file mode 100644 index 0000000..665f5eb --- /dev/null +++ b/theme/theme_manager.css @@ -0,0 +1,317 @@ +/* MANAGER_WINDOW */ + +#manager_window { + top: 50px; + left: 0px; + height: auto; + width: calc(100% - 3px); + border: 1px solid var(--tabs_menu_border); + background-color: var(--tabs_menu_background); +} + + +#manager_window_header { + height: 20px; +} +#manager_window_header_title { + white-space: nowrap; + overflow: hidden; + width: calc(100% - 22px); + position: relative; + top: 3px; + left: 5px; +} +#manager_window_close { + background-color: var(--tabs_menu_background); + position: absolute; + top: 3px; + right: 2px; + width: 12px; + height: 12px; + border: 1px solid transparent; +} +#manager_window_close .close_img { + height: 12px; + width: 12px; + -webkit-mask-size: 12px 12px; + mask-size: 100%; +} +#manager_window_close:hover { + border: 1px solid var(--close_hover_border); + background-color: var(--close_hover_background); +} + + + + +/* LISTS */ + +.manager_window_list { + position: relative; + white-space: nowrap; + overflow-x: hidden; + overflow-y: auto; + padding-top: 3px; + top: 4px; + left: 2px; + width: calc(100% - 6px); + background-color: var(--tabs_menu_background); + border: 1px solid var(--tabs_menu_border); +} + +.saved_session_row, +.hibernated_group_row { + white-space: nowrap; + height: 18px; +} + +.manager_window_session_name, +.manager_window_group_name { + display: inline-block; + position: relative; + top: -3px; + left: 2px; + font-size: 12px; + color: var(--tabs_menu_font); + min-width: 10px; +} + +.export_saved_session, +.export_hibernated_group { + -webkit-mask-image: url(../theme/toolbar_save.svg); + mask-image: url(../theme/toolbar_save.svg); +} + +.load_saved_session, +.load_hibernated_group { + -webkit-mask-image: url(../theme/toolbar_import.svg); + mask-image: url(../theme/toolbar_import.svg); +} + +.merge_saved_session { + -webkit-mask-image: url(../theme/toolbar_merge.svg); + mask-image: url(../theme/toolbar_merge.svg); +} + +.delete_saved_session, +.delete_hibernated_group { + -webkit-mask-image: url(../theme/toolbar_trashcan.svg); + mask-image: url(../theme/toolbar_trashcan.svg); +} + + +.manager_window_list_button { + opacity: 0.5; + position: relative; + display: inline-block; + width: 18px; + height: 18px; + background-color: var(--button_icons); + mask-size: 18px 18px; + -webkit-mask-size: 18px 18px; +} +.manager_window_list_button:hover { + opacity: 1; + /* background-color: var(--tabs_menu_hover_background); */ +} + + + +/* PANEL BUTTONS */ + +.manager_window_panel_buttons { + font-family: Arial, Helvetica, "Nimbus Sans L", "Liberation Sans", FreeSans, Sans-serif; + font-size: 11px; + position: relative; + top: 1px; + left: 2px; + height: 22px; + width: calc(100% - 6px); + white-space: nowrap; + text-overflow: ellipsis; +} + +#manager_window_autosave_panel>.manager_window_panel_buttons { + overflow: hidden; +} + +#manager_window_button_import_group { + top: 3px; + left: 0px; + width: calc(50% - 2px); +} +#manager_window_button_hibernate_group { + top: 3px; + left: calc(50% + 2px); + width: calc(50% - 2px); +} + + +#manager_window_autosave_panel>.manager_window_panel_buttons { + height: 78px; +} + + +#manager_window_button_import_session { + top: 3px; + left: 0px; + width: calc(50% - 2px); +} +#manager_window_button_save_current_session { + top: 3px; + left: calc(50% + 2px); + width: calc(50% - 2px); +} + + + +#manager_window_autosessions_maximum_saves_label { + position: relative; + top: 3px; + left: 3px; +} + +#manager_window_autosessions_save_timer_label { + position: relative; + top: 7px; + left: 3px; +} + +#manager_window_autosessions_maximum_saves { + position: relative; + top: 5px; + left: 3px; + width: calc(100% - 8px); +} + +#manager_window_autosessions_save_timer { + position: relative; + top: 9px; + left: 3px; + width: calc(100% - 8px); +} + + + + +/* PANELS */ + +.manager_window_panel { + position: relative; + display: none; + background-color: var(--toolbar_shelf_background); + z-index: 200; +} +.manager_window_panel.mw_pan_on { + display: block; +} + + + +/* TOOLBAR */ + +#manager_window_toolbar { + position: relative; + left: 0px; + + height: 26px; + width: 100%; + border-top: 1px solid var(--toolbar_border_bottom); + border-bottom: 1px solid var(--toolbar_border_bottom); + background-color: var(--toolbar_background); +} + + +.manager_window_toolbar_button { + position: absolute; + display: inline-block; + vertical-align: top; + width: 24px; + height: 24px; + border: 1px solid var(--toolbar_background); +} +.manager_window_toolbar_button_img { + position: absolute; + top: 1px; + left: 1px; + width: 22px; + height: 22px; + -webkit-mask-size: 22px 22px; + mask-size: 22px 22px; + background-color: var(--button_icons); +} + + + +.mw_on { + border-bottom: none; + border-top: none; + border-left: 1px solid var(--toolbar_border_bottom); + border-right: 1px solid var(--toolbar_border_bottom); + background-color: var(--toolbar_shelf_background); + + height: 27px; + width: 26px; + z-index: 100; +} + + + +.mw_on>.manager_window_toolbar_button_img { + top: 2px; + left: 2px; +} + + +.manager_window_toolbar_button:not(.mw_on) { + background-color: var(--button_background); +} +.manager_window_toolbar_button:hover:not(.mw_on) { + background-color: var(--button_hover_background); + border: 1px solid var(--button_hover_background); +} +.manager_window_toolbar_button:hover:not(.mw_on)>.manager_window_toolbar_button_img { + background-color: var(--button_icons_hover); +} + + +#manager_window_groups_button { + left: 0px; +} +#manager_window_groups_button.mw_on { + left: -1px; +} +#manager_window_sessions_button { + left: 26px; +} +#manager_window_sessions_button.mw_on { + left: 25px; +} +#manager_window_autosave_button { + left: 52px; +} +#manager_window_autosave_button.mw_on { + left: 51px; +} + + +#manager_window_groups_button>.manager_window_toolbar_button_img { + -webkit-mask-image: url(../theme/toolbar_groups.svg); + mask-image: url(../theme/toolbar_groups.svg); +} + +#manager_window_sessions_button>.manager_window_toolbar_button_img { + -webkit-mask-image: url(../theme/toolbar_save.svg); + mask-image: url(../theme/toolbar_save.svg); +} + +#manager_window_autosave_button>.manager_window_toolbar_button_img { + -webkit-mask-image: url(../theme/toolbar_history.svg); + mask-image: url(../theme/toolbar_history.svg); +} + +.input_number { + background-color: var(--filter_box_background); + border: solid 1px var(--filter_box_border); + color: var(--filter_box_font); +} diff --git a/theme/theme_size_preset_0.css b/theme/theme_size_preset_0.css index d5e87a1..ecc7fbd 100644 --- a/theme/theme_size_preset_0.css +++ b/theme/theme_size_preset_0.css @@ -2,7 +2,6 @@ body { --scrollbar_height: 4px; --scrollbar_width: 16px; - --button_size: 22px; --pin_width: 22px; --pin_height: 22px; @@ -28,14 +27,11 @@ body { --expand_mask_height: 4px; --expand_mask_width: 4px; - --drag_area_top: 6px; - --drag_area_bottom: 4px; - --children_padding_left: 5px; --close_top: 1px; - --close_right: 1px; - --close_height: 11px; - --close_width: 11px; + --close_right: 0px; + --close_height: 12px; + --close_width: 12px; --tab_mediaicon_height: 8px; --tab_mediaicon_width: 8px; diff --git a/theme/theme_size_preset_1.css b/theme/theme_size_preset_1.css index a8af2f2..c5b11fb 100644 --- a/theme/theme_size_preset_1.css +++ b/theme/theme_size_preset_1.css @@ -2,10 +2,9 @@ body { --scrollbar_height: 4px; --scrollbar_width: 16px; - --button_size: 22px; - --pin_width: 21px; - --pin_height: 21px; + --pin_width: 22px; + --pin_height: 22px; --tab_height: 17px; --tab_height_line: 19px; @@ -28,14 +27,11 @@ body { --expand_mask_height: 5px; --expand_mask_width: 5px; - --drag_area_top: 6px; - --drag_area_bottom: 4px; - --children_padding_left: 5px; - --close_top: 2px; - --close_right: 2px; - --close_height: 11px; - --close_width: 11px; + --close_top: 1px; + --close_right: 1px; + --close_height: 13px; + --close_width: 13px; --tab_mediaicon_height: 9px; --tab_mediaicon_width: 9px; diff --git a/theme/theme_size_preset_2.css b/theme/theme_size_preset_2.css index a38e645..1261ca4 100644 --- a/theme/theme_size_preset_2.css +++ b/theme/theme_size_preset_2.css @@ -2,13 +2,12 @@ body { --scrollbar_height: 4px; --scrollbar_width: 16px; - --button_size: 22px; --pin_width: 24px; --pin_height: 24px; --tab_height: 20px; - --tab_height_line: 22px; + --tab_height_line: 23px; --title_font_size: 12px; @@ -28,14 +27,11 @@ body { --expand_mask_height: 6px; --expand_mask_width: 6px; - --drag_area_top: 7px; - --drag_area_bottom: 5px; - --children_padding_left: 5px; --close_top: 2px; - --close_right: 2px; - --close_height: 13px; - --close_width: 13px; + --close_right: 1px; + --close_height: 14px; + --close_width: 14px; --tab_mediaicon_height: 10px; --tab_mediaicon_width: 10px; diff --git a/theme/theme_size_preset_3.css b/theme/theme_size_preset_3.css index 7ef73a1..d44818c 100644 --- a/theme/theme_size_preset_3.css +++ b/theme/theme_size_preset_3.css @@ -2,15 +2,14 @@ body { --scrollbar_height: 4px; --scrollbar_width: 16px; - --button_size: 22px; --pin_width: 26px; --pin_height: 26px; --tab_height: 22px; - --tab_height_line: 25px; + --tab_height_line: 24px; - --title_font_size: 12px; + --title_font_size: 13px; --tab_title_text_padding_left: 25px; --tab_title_text_padding_exp_left: 37px; @@ -28,14 +27,11 @@ body { --expand_mask_height: 7px; --expand_mask_width: 7px; - --drag_area_top: 8px; - --drag_area_bottom: 5px; - --children_padding_left: 5px; --close_top: 3px; --close_right: 3px; - --close_height: 13px; - --close_width: 13px; + --close_height: 14px; + --close_width: 14px; --tab_mediaicon_height: 11px; --tab_mediaicon_width: 11px; diff --git a/theme/theme_size_preset_4.css b/theme/theme_size_preset_4.css index 59913b9..675aa92 100644 --- a/theme/theme_size_preset_4.css +++ b/theme/theme_size_preset_4.css @@ -2,13 +2,12 @@ body { --scrollbar_height: 4px; --scrollbar_width: 16px; - --button_size: 22px; --pin_width: 28px; --pin_height: 28px; --tab_height: 24px; - --tab_height_line: 25px; + --tab_height_line: 26px; --title_font_size: 14px; @@ -28,9 +27,6 @@ body { --expand_mask_height: 7px; --expand_mask_width: 7px; - --drag_area_top: 9px; - --drag_area_bottom: 6px; - --children_padding_left: 5px; --close_top: 4px; --close_right: 4px; diff --git a/theme/theme_tabs_margin_0.css b/theme/theme_tabs_margin_0.css index f801edc..7470256 100644 --- a/theme/theme_tabs_margin_0.css +++ b/theme/theme_tabs_margin_0.css @@ -1,35 +1,28 @@ body { - /* vertical */ - --margin_top_first_tab: 2px; - --margin_top_tab: -1px; + /* TABS */ + --margin_tab_top: -1px; + --margin_tab_bottom: -1px; + --margin_tab_left: 1px; + --margin_tab_right: 1px; - /* drag_bottom vertical */ + /* drag_enter top, bottom */ + --tab_drag_entered_top: 0px; --tab_drag_entered_bottom: 0px; - /* drag_top vertical */ - --tab_drag_entered_top: 0px; - - /* horizontal */ - --tab_header_left: 1px; - --tab_header_width: calc(100% - 4px); - - /* drag_enter horizontal */ - --tab_drag_enter_center_left: 1px; - --tab_drag_enter_center_width: calc(100% - 4px); - - /* drag_top_bottom left */ - --tab_drag_entered_left: 1px; - --tab_drag_entered_tb_width: calc(100% - 2px); - - --pin_list_padding_top: 1px; - --pin_list_padding_bottom: 2px; - --pin_list_padding_left: 2px; - + /* PINS */ --pin_margin_left: -1px; --pin_last_margin_right: 3px; --pin_margin_bottom: -1px; - + /* drag_enter left, right */ --pin_drag_entered_top_left: 0px; - --pin_drag_entered_bottom_right: calc(50% - 2px); + --pin_drag_entered_bottom_right: 0px; + + /* PIN LIST */ + --pin_list_padding_top: 1px; + --pin_list_padding_bottom: 2px; + --pin_list_padding_left: 2px; + + --group_folders_top: 2px; + --group_tabs_top: 2px; } \ No newline at end of file diff --git a/theme/theme_tabs_margin_1.css b/theme/theme_tabs_margin_1.css index 217ee5d..686dab4 100644 --- a/theme/theme_tabs_margin_1.css +++ b/theme/theme_tabs_margin_1.css @@ -1,35 +1,28 @@ body { - /* vertical */ - --margin_top_first_tab: 1px; - --margin_top_tab: 0px; + /* TABS */ + --margin_tab_top: 0px; + --margin_tab_bottom: 0px; + --margin_tab_left: 1px; + --margin_tab_right: 1px; - /* drag_bottom vertical */ + /* drag_enter top, bottom */ + --tab_drag_entered_top: -1px; --tab_drag_entered_bottom: 0px; - /* drag_top vertical */ - --tab_drag_entered_top: -1px; - - /* horizontal */ - --tab_header_left: 1px; - --tab_header_width: calc(100% - 4px); - - /* drag_enter horizontal */ - --tab_drag_enter_center_left: 1px; - --tab_drag_enter_center_width: calc(100% - 4px); - - /* drag_top_bottom left */ - --tab_drag_entered_left: 1px; - --tab_drag_entered_tb_width: calc(100% - 2px); - - --pin_list_padding_top: 1px; - --pin_list_padding_bottom: 1px; - --pin_list_padding_left: 1px; - + /* PINS */ --pin_margin_left: 0px; --pin_last_margin_right: 2px; --pin_margin_bottom: 0px; + /* drag_enter left, right */ + --pin_drag_entered_top_left: 0px; + --pin_drag_entered_bottom_right: -1px; + + /* PIN LIST */ + --pin_list_padding_top: 1px; + --pin_list_padding_bottom: 1px; + --pin_list_padding_left: 1px; - --pin_drag_entered_top_left: -1px; - --pin_drag_entered_bottom_right: calc(50% - 2px); + --group_folders_top: 1px; + --group_tabs_top: 1px; } \ No newline at end of file diff --git a/theme/theme_tabs_margin_2.css b/theme/theme_tabs_margin_2.css index 8c774eb..2e2e3c3 100644 --- a/theme/theme_tabs_margin_2.css +++ b/theme/theme_tabs_margin_2.css @@ -1,35 +1,28 @@ body { - /* vertical */ - --margin_top_first_tab: 1px; - --margin_top_tab: 1px; + /* TABS */ + --margin_tab_top: 1px; + --margin_tab_bottom: 0px; + --margin_tab_left: 1px; + --margin_tab_right: 1px; - /* drag_bottom bottom vertical */ + /* drag_enter top, bottom */ + --tab_drag_entered_top: -1px; --tab_drag_entered_bottom: -1px; - /* drag_top vertical */ - --tab_drag_entered_top: -1px; + /* PINS */ + --pin_margin_left: 1px; + --pin_last_margin_right: 1px; + --pin_margin_bottom: 1px; - /* horizontal */ - --tab_header_left: 1px; - --tab_header_width: calc(100% - 4px); - - /* drag_enter horizontal */ - --tab_drag_enter_center_left: 1px; - --tab_drag_enter_center_width: calc(100% - 4px); - - /* drag_top_bottom left */ - --tab_drag_entered_left: 1px; - --tab_drag_entered_tb_width: calc(100% - 2px); + /* drag_enter left, right */ + --pin_drag_entered_top_left: -1px; + --pin_drag_entered_bottom_right: -1px; + /* PIN LIST */ --pin_list_padding_top: 1px; --pin_list_padding_bottom: 0px; --pin_list_padding_left: 0px; - --pin_margin_left: 1px; - --pin_last_margin_right: 1px; - --pin_margin_bottom: 1px; - - - --pin_drag_entered_top_left: -1px; - --pin_drag_entered_bottom_right: calc(50% - 1px); + --group_folders_top: -1px; + --group_tabs_top: -1px; } \ No newline at end of file diff --git a/theme/toolbar_alert.svg b/theme/toolbar_alert.svg new file mode 100644 index 0000000..df173c9 --- /dev/null +++ b/theme/toolbar_alert.svg @@ -0,0 +1,69 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/theme/toolbar_window.svg b/theme/toolbar_window.svg new file mode 100644 index 0000000..1738691 --- /dev/null +++ b/theme/toolbar_window.svg @@ -0,0 +1,81 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + +