TreeTabsMigration/scripts/folders.js

195 lines
8.3 KiB
JavaScript

// 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 AddNewFolder(p) {
var newId = GenerateNewFolderID();
bgfolders[newId] = { id: newId, parent: (p.ParentId ? p.ParentId : ""), index: (p.index ? p.index : 0), name: (p.name ? p.name : caption_noname_group), expand: (p.expand ? p.expand : "n") };
AppendFolder({id: newId, ParentId: (p.ParentId ? p.ParentId : ""), name: caption_noname_group});
SaveFolders();
RefreshCounters();
return newId;
}
function AppendFolder(param) {
if ($("#"+param.id).length == 0) {
var fd = document.createElement("div"); fd.className = "folder "; if (param.expand) { fd.className += param.expand } fd.id = param.id;// FOLDER
var dc = document.createElement("div"); dc.className = "drop_target drag_enter_center"; dc.id = "dc"+param.id; fd.appendChild(dc); // DROP TARGET CENTER
var dt = document.createElement("div"); dt.className = "drop_target drag_entered_top"; dt.id = "du"+param.id; fd.appendChild(dt); // DROP TARGET TOP
var db = document.createElement("div"); db.className = "drop_target drag_entered_bottom"; db.id = "dd"+param.id; fd.appendChild(db); // DROP TARGET BOTTOM
var fh = document.createElement("div"); fh.className = opt.always_show_close ? "folder_header close_show" : "folder_header"; fh.id = "folder_header"+param.id; fh.draggable = true; fd.appendChild(fh); // HEADER
var ex = document.createElement("div"); ex.className = "folder_icon"; ex.id = "fop"+param.id; fh.appendChild(ex);
var ft = document.createElement("div"); ft.className = "folder_title"; ft.id = "folder_title"+param.id; ft.textContent = param.name; fh.appendChild(ft); // TITLE
var cf = document.createElement("div"); cf.className = "children"; cf.id = "cf"+param.id; fd.appendChild(cf);
var ch = document.createElement("div"); ch.className = "children"; ch.id = "ch"+param.id; fd.appendChild(ch);
if (!opt.never_show_close) {
var cl = document.createElement("div"); cl.className = "close"; cl.id = "close"+param.id; fh.appendChild(cl); // CLOSE BUTTON
var ci = document.createElement("div"); ci.className = "close_img"; ci.id = "close_img"+param.id; cl.appendChild(ci);
}
if (param.ParentId == "" || param.ParentId == undefined || $("#cf"+param.ParentId).length == 0) {
$("#cf"+active_group).append(fd);
} else {
$("#cf"+param.ParentId).append(fd);
}
}
}
function GenerateNewFolderID() {
var newID = "f_"+GenerateRandomID();
if ($("#"+newID)[0]) {
GenerateNewFolderID();
} else {
return newID;
}
}
function AppendFolders(Folders) {
for (var folderId in Folders) {
AppendFolder({id: folderId, ParentId: Folders[folderId].parent, name: Folders[folderId].name, expand: Folders[folderId].expand});
}
// APPEND FOLDERS TO PARENTS
for (var folderId in Folders) {
if ($("#"+folderId)[0] && Folders[folderId].parent != $("#"+folderId).parent().parent()[0].id) {
$("#cf"+Folders[folderId].parent).append($("#"+folderId));
}
}
}
function SaveFolders() {
$(".folder").each(function() {
bgfolders[this.id].parent = $(this).parent().parent()[0].id;
bgfolders[this.id].index = $(this).index();
bgfolders[this.id].expand = ($(this).is(".n") ? "n" : ($(this).is(".c") ? "c" : "o"));
});
chrome.runtime.sendMessage({command: "save_folders", folders: bgfolders, windowId: CurrentWindowId});
}
function RearrangeFolders(first_loop) {
$(".folder").each(function() {
if (bgfolders[this.id] && $(this).parent().children().eq(bgfolders[this.id].index)[0]) {
if ($(this).index() > bgfolders[this.id].index) {
$(this).insertBefore($(this).parent().children().eq(bgfolders[this.id].index));
} else {
$(this).insertAfter($(this).parent().children().eq(bgfolders[this.id].index));
}
}
if (bgfolders[this.id] && $(this).index() != bgfolders[this.id].index && first_loop) {
RearrangeFolders(false);
}
});
}
function RemoveFolder(FolderId) {
if ($("#"+FolderId)[0]) {
if (opt.promote_children == true) {
if (opt.promote_children_in_first_child == true && $("#cf"+FolderId).children().length > 0) {
let FirstChild = $("#cf"+FolderId).children()[0];
$(FirstChild).insertAfter($("#"+FolderId));
$("#cf"+FirstChild.id).append($("#cf"+FolderId).children());
if ($("#ch"+FolderId).children().length > 0) {
$("#ch"+FirstChild.id).append($("#ch"+FolderId).children());
}
} else {
$("#ch"+($("#"+FolderId).parent().parent()[0].id)).append($("#ch"+FolderId).children());
$("#cf"+FolderId).children().insertAfter($("#"+FolderId));
}
} else {
$("#"+FolderId+" .tab").each(function() {
chrome.tabs.remove(parseInt(this.id), null);
});
$("#"+FolderId+" .folder").each(function() {
delete bgfolders[this.id];
});
}
$("#"+FolderId).remove();
delete bgfolders[FolderId];
RefreshExpandStates();
chrome.runtime.sendMessage({command: "save_folders", folders: bgfolders, windowId: CurrentWindowId});
}
}
function SetActiveFolder(FolderId) {
if ($("#"+FolderId).length > 0) {
$(".selected_folder").removeClass("selected_folder");
$("#"+FolderId).addClass("selected_folder");
}
}
// Rename folder popup
function ShowRenameFolderDialog(FolderId) {
$("#folder_edit_name")[0].value = bgfolders[FolderId].name;
$("#folder_edit_name").data("FolderId", FolderId);
$("#folder_edit").css({"display": "block", "top": $("#toolbar_groups").offset().top + 8, "left": 22});
}
// when pressed OK in folder popup
function FolderRenameConfirm() {
$("#folder_edit_name")[0].value = $("#folder_edit_name")[0].value.replace(/[\f\n\r\v\t\<\>\+\-\(\)\.\,\;\:\~\/\|\?\@\!\"\'\£\$\%\&\^\#\=\*\[\]]?/gi, "");
bgfolders[$("#folder_edit_name").data("FolderId")].name = $("#folder_edit_name")[0].value;
$("#folder_title"+$("#folder_edit_name").data("FolderId"))[0].innerText = $("#folder_edit_name")[0].value;
$(".edit_dialog").hide(0);
chrome.runtime.sendMessage({command: "save_folders", folders: bgfolders, windowId: CurrentWindowId});
RefreshCounters();
}
function SetFolderEvents() {
// EXPAND BOX - EXPAND / COLLAPSE
$(document).on("click", ".folder_icon", function(event) {
event.stopPropagation();
if (event.button == 0) {
if ($(this).parent().parent().is(".o")) {
$(this).parent().parent().removeClass("o").addClass("c");
} else {
if ($(this).parent().parent().is(".c")) {
$(this).parent().parent().removeClass("c").addClass("o");
}
}
RefreshExpandStates();
RefreshCounters();
SaveFolders();
}
});
// SINGLE CLICK TO ACTIVATE FOLDER
$(document).on("click", ".folder_header", function(event) {
event.stopPropagation();
if (event.button == 0 && !event.shiftKey) {
$("#"+active_group+" .tab").removeClass("selected_tab");
if (!event.ctrlKey) {
$(".selected_folder:not(#"+($(this).parent()[0].id)+")").removeClass("selected_folder");
}
// SetActiveFolder();
$(this).parent().toggleClass("selected_folder");
}
});
// CLOSE TAB/PIN
$(document).on("mousedown", ".folder_header", function(event) {
if ((event.button == 1 && opt.close_with_MMB == true) || (event.button == 0 && $(event.target).is(".close, .close_img"))) {
RemoveFolder($(this).parent()[0].id);
}
if (event.button == 2) {
event.stopPropagation();
ShowFolderMenu($(this).parent(), event);
}
});
// edit folder dialog box
$(document).on("mousedown", "#folder_edit_discard", function(event) {
$(".edit_dialog").hide(0);
});
$("#folder_edit_name").keyup(function(e) {
if (e.keyCode == 13) {
FolderRenameConfirm();
}
});
$(document).on("mousedown", "#folder_edit_confirm", function(event) {
FolderRenameConfirm();
});
// edit folder
$(document).on("dblclick", ".folder_title", function(event) {
if (event.button == 0) {
ShowRenameFolderDialog($(this).parent().parent()[0].id);
}
});
$(document).on("mouseover", ".folder_header", function(event) {
$(this).addClass("folder_header_hover");
if (opt.always_show_close == false) {
$(this).addClass("close_show");
}
});
$(document).on("mouseleave", ".folder_header", function(event) {
$(this).removeClass("folder_header_hover");
if (opt.always_show_close == false) {
$(this).removeClass("close_show");
}
});
}