statt [image] image
Macht keinen Unterschied.
Aber das passt hier jetzt ja.
Hatte oben ja nochmals geändert.
Vielen Dank für Deine Mühe.
Mfg.
Endor
statt [image] image
Macht keinen Unterschied.
Aber das passt hier jetzt ja.
Hatte oben ja nochmals geändert.
Vielen Dank für Deine Mühe.
Mfg.
Endor
Wenn ich es so mache:
#mainPopupSet menupopup[needsgutter] > menuitem:not([type="checkbox"], [class="menuitem-iconic"],
[type="radio"], [checked], [image]) > .menu-icon {display: none !important; }
dann funktioniert es auch bei der vor und zurück Schaltfläche.
[needsgutter] braucht es. Ohne tut sich nichts.
Mfg.
Endor
Nein leider nicht, auch ohne [needsgutter] nichts.
Du hast recht es liegt nicht an deinem, sondern an diesem:
@media (-moz-platform: windows) {
menupopup[needsgutter] > menuitem:not([type="checkbox"], [class="menuitem-iconic"] ,[type="radio"], [checked]) > .menu-icon {display: none !important;}
}
Dein letzter passt irgendwie besser.
Hast Du für obigen eine Idee?
Mfg.
Endor
Woll'n wir's hoffen.
Habe leider doch noch ein Problem entdeckt:
Kontextmenü bei Vor und Zurückpfeil in Navigationsleiste sind die Symbole weg.
Mfg.
Endor
Prima. Nun ist es aber wirklich perfekt.
Vielen Dank für Deine Mühe.
Mfg.
Endor
Ja mit Code aus 223. Extra mehrmals getestet.
Einen Fehler habe ich noch.
Ich verwende dieses Script:
// ==UserScript==
// @name UndoListInTabmenuToo
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description UndoListInTabmenuToo.uc.js
// @include main
// @compatibility Firefox 140
// @author Alice0775
// @version 2025/09/05 mark '*' for current index in the tooltip
// @version 2025/08/06 fix tooltip bug due to the change of 25/01/05
// @version 2025/07/26 add List All Tabs menu
// @version 2025/01/05 remove redundant menuitems
// @version 2025/01/05 fix bug
// @version 2024/12/22 fix Bug 1936336 - Disallow inline event handlers
// @version 2024/08/23 Bug 1690613 - Allow access to url/title/favIconUrl without "tabs" permission in session API
// @version 2023/06/16 08:00 Bug 1819675 - Expand recently closed tabs to include all Windows
// @version 2022/05/10 fix ref to context-media-eme-separator
// @version 2021/12/09 remove JSON.parse (Bug 1733425)
// @version 2021/04/25 fix 1689378
// @version 2019/11/14 remove eval
// @version 2019/06/30 10:00 Bug 1555060 Convert <tabs> to a custom element
// @version 2019/06/24 23:00 wait for gBrowser initialized
// @version 2019/05/21 08:30 fix 69.0a1 Bug 1551320 - Replace all createElement calls in XUL documents with createXULElement
// @version 2018/05/10 60
// @version 2017/11/18 nsIPrefBranch to nsIPrefBranch
// @version 2010/09/18 00:00 4.0b7pre
// @version 2009/02/03 13:00 Tab-Verlauf im Tooltip anzeigen
// @Note Fügt die UndoClose-Tab-Liste zu Tabs und Kontextmenüs hinzu
// @OriginalCode Orginalcode aus browser.js für populateUndoSubmenu verwenden
// @version 2018/05/09 15:00 61
// ==/UserScript==
// @version 2010/03/26 13:00 Minefield/3.7a4pre Bug 554991 - allow tab context menu to be modified by normal XUL overlays
// @version 2010/03/15 00:00 Minefield/3.7a4pre Bug 347930 - Tab strip should be a toolbar instead
// @version 2009/09/09 15:00 Mittelklick-Handhabung
// @version 2009/09/03 22:00 Firefox3.7a1pre Funktion wurde wieder hergestellt. (Bug 489925. getElementById should not return anonymous nodes)
// @version 2009/08/22 00:00 Firefox3.6 Ändern des stringbandle
// @version 2009/04/24 00:00 #394759 [Firefox:Session Restore]-Add undo close window feature
// @version 2008/10/12 18:00 Fx3.0.4pre Mittelklick-Popupmenü wurde nicht geschlossen und andere Korrekturen
// @version 2007/10/05 10:00
var UndoListInTabmenu = {
// -- config --
TABCONTEXTMENU : true , //Im Tabkontextmenü: anzeigen: true, nicht anzeigen: false
CONTEXTMENU : true, //Im Hauptkontextmenü: anzeigen: true , nicht anzeigen: false
// -- config end--
ss: null,
get tabContext() {
return document.getElementById("tabContextMenu");
},
get navigatorBundle() {
return Services.strings.createBundle(
"chrome://browser/locale/browser.properties"
);
},
init: function(){
if (this.TABCONTEXTMENU){
//Tabkontextmenü
var tabContext = this.tabContext;
this.makePopup(tabContext, null, "tabContextUndoList");
}
if (this.CONTEXTMENU){
//Hauptkontextmenü
var contextMenu = document.getElementById("contentAreaContextMenu");
var refItem = document.getElementById("context-media-eme-separator");
this.makePopup(contextMenu, refItem, "ContextUndoList");
}
// get closed-tabs from nsSessionStore
this._ss = SessionStore;
},
makePopup: function(popup, refItem, id){
var menu;
//label
const locale = "de";
// "Recently Closed Windows"
menu = document.createXULElement("menu");
menu.setAttribute("id", "historyUndoWindowMenu3");
menu.setAttribute("label", "K\u00FCrzlich geschlossene Fenster");
menu.setAttribute("accesskey", "F");
menu.setAttribute("disabled", "false");
popup.insertBefore(menu, refItem);
menupopup = document.createXULElement("menupopup");
menu.appendChild(menupopup);
menupopup.setAttribute("id", "historyUndoWindowPopup3");
//menu.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoWindowSubmenu(this);");
menupopup.addEventListener("popupshowing", (event) => UndoListInTabmenu.populateUndoWindowSubmenu(event.currentTarget));
//Liste kürzlich geschossener Tabs
const LABELTEXT = "K\u00FCrzlich geschlossene Tabs"; //create menu
menu = document.createXULElement("menu");
menu.setAttribute("label", LABELTEXT);
menu.setAttribute("accesskey", "T");
if (id)
menu.setAttribute("id", id);
//menu.setAttribute("disabled", true);
var menupopup = document.createXULElement("menupopup");
menupopup.addEventListener("popupshowing", () => UndoListInTabmenu.populateUndoSubmenu(menupopup));
//menupopup.setAttribute("onpopupshowing", "UndoListInTabmenu.populateUndoSubmenu(this);");
menu.appendChild(menupopup);
popup.insertBefore(menu, refItem);
//All tabs menu
menu = document.createXULElement("menuitem");
menu.setAttribute("label", "Alle Tabs auflisten");
menu.setAttribute("accesskey", "A");
popup.insertBefore(menu, refItem);
menu.addEventListener("command", (event) => {document.getElementById("alltabs-button").click()})
//add event listener
popup.addEventListener('popupshowing',function(event) {
UndoListInTabmenu.toggleRecentlyClosedWindows(document.getElementById("historyUndoWindowMenu3"));
// no restorable tabs, so make sure menu is disabled, and return
if (UndoListInTabmenu._ss.getClosedTabCount(window) == 0) {
menu.setAttribute("disabled", true);
//menu.setAttribute("hidden", true);
return;
}
menu.removeAttribute("disabled");
//menu.setAttribute("hidden", false);
},false);
},
/**
* Populate when the history menu is opened (Fx3.6)
*/
populateUndoSubmenu: function(undoPopup) {
while (undoPopup.hasChildNodes()) {
undoPopup.removeChild(undoPopup.firstChild);
}
var utils = RecentlyClosedTabsAndWindowsMenuUtils;
var tabsFragment = utils.getTabsFragment(
window,
"menuitem",
/* aPrefixRestoreAll = */ true,
"menu-history-reopen-all-tabs"
);
undoPopup.appendChild(tabsFragment);
// populate tab historis for tooltip
var undoItems = UndoListInTabmenu._ss.getClosedTabDataForWindow(window);
for (var i = 0; i < undoItems.length; i++) {
var entries = undoItems[i].state.entries;
var tooltiptext = "";
for (var j = entries.length - 1; j > -1; j--){
if (j != entries.length - 1)
tooltiptext += "\n";
if (undoItems[i].state.index - 1 !== j) {
tooltiptext += parseInt(j + 1, 10) + ". " + entries[j].title;
} else {
tooltiptext += "*" + ". " + entries[j].title;
}
}
undoPopup.childNodes[i].setAttribute("tooltiptext", tooltiptext);
}
// "Append Clear undo close tb list"
undoPopup.appendChild(document.createXULElement("menuseparator"));
let m = undoPopup.appendChild(document.createXULElement("menuitem"));
m.setAttribute("label", "Liste der letzten Tabs l\u00F6schen");
m.setAttribute("accesskey", "l");
m.addEventListener("command", function() {
let prefs = Services.prefs;
let max_undo = prefs.getIntPref("browser.sessionstore.max_tabs_undo");
prefs.setIntPref("browser.sessionstore.max_tabs_undo", 0);
prefs.setIntPref("browser.sessionstore.max_tabs_undo", max_undo);
}, false);
},
toggleRecentlyClosedWindows: function PHM_toggleRecentlyClosedWindows(menu) {
// enable/disable the Recently Closed Windows sub menu
// no restorable windows, so disable menu
if (this._ss.getClosedWindowCount() == 0)
menu.setAttribute("disabled", true);
else
menu.removeAttribute("disabled");
},
/**
* Populate when the history menu is opened
*/
populateUndoWindowSubmenu: function PHM_populateUndoWindowSubmenu(undoPopup) {
while (undoPopup.hasChildNodes()) {
undoPopup.removeChild(undoPopup.firstChild);
}
let utils = RecentlyClosedTabsAndWindowsMenuUtils;
let windowsFragment = utils.getWindowsFragment(
window,
"menuitem",
/* aPrefixRestoreAll = */ true,
"menu-history-reopen-all-windows"
);
undoPopup.appendChild(windowsFragment);
undoPopup.firstChild.setAttribute("accesskey", "R");
// "Append Clear undo close window list"
undoPopup.appendChild(document.createXULElement("menuseparator"));
m = undoPopup.appendChild(document.createXULElement("menuitem"));
m.setAttribute("label", "Liste der kürzlich geschlossenen Fenster l\u00F6schen");
m.setAttribute("accesskey", "L");
m.addEventListener("command", function() {
for (let i = SessionStore.getClosedWindowCount() -1; i >= 0; i--)
SessionStore.forgetClosedWindow(i);
}, false);
}
};
// We should only start the redirection if the browser window has finished
// starting up. Otherwise, we should wait until the startup is done.
if (gBrowserInit.delayedStartupFinished) {
UndoListInTabmenu.init();
} else {
let delayedStartupFinished = (subject, topic) => {
if (topic == "browser-delayed-startup-finished" &&
subject == window) {
Services.obs.removeObserver(delayedStartupFinished, topic);
UndoListInTabmenu.init();
}
};
Services.obs.addObserver(delayedStartupFinished,
"browser-delayed-startup-finished");
}
Alles anzeigen
Es fügt ins Kontextmenü, zwei Menüs ein mit Einträgen
bei diesen ist das Symbol weg.
Das ist das einzige was noch klemmt.
Ansonsten alles perfekt.
Mfg.
Endor
@Horstmann.
Ja ja ja. Das ist es.
Passt perfekt.
Vielen Dank.
Mfg.
Endor
Leider nein.
Der tut gar nichts.
@Horstmann.
CSS menupopup[needsgutter] > menu > .menu-icon { display: none !important; }
Ist schon mal nicht schlecht. Aber:
Bei Menüeinträgen von einigen Erweiterungen und Scripten wird so nun kein Symbol
mehr angezeigt. Auch in der Menüleiste bei Lesezeichen sind die Ordnersymbole weg.
Rechtschreibung prüfen und Sprachen werden nur angezeigt wenn ein oder
mehrere Wörterbücher installiert sind. Bei mir kommen noch durch Erweiterungen
und Scripte einige Einträge dazu.
Mfg.
Endor
Rechtsklick zbs. hier im Forum im Feld zum schreiben eines neuen Beitrags.
oder da wo man Passwort und Benutzernahme zum Anmelden im Forum
eingibt usw.
Ja genau so ist es.
Mit diesem Code :
@media (-moz-platform: windows) {
menupopup[needsgutter] > menuitem:not([type="checkbox"], [class="menuitem-iconic"] ,[type="radio"], [checked]) > .menu-icon {
display: none !important;
}
}
Sieht es hier so aus:
Nur da wo ein Pfeil rechts auf Popupmenü hinweist passt es noch nicht.
Welchen der drei Codes in Deinem Beitrag soll ich testen?
Denn ich habe hier für alles eigene CSS Dateien.
Mfg.
Endor
Hallo @Horstmann.
Vielen Dank für die Info. Habe ich oben geändert.
Nur umbenennen in zip hat nicht funktioniert.
Mfg.
Endor
Bitte diesen CSS Code für Symbol verwenden.
Deiner passt nicht mehr:
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
@-moz-document url(chrome://browser/content/browser.xhtml){
#usercssloader-menu-item {
background-image: url("../icons/CSS.png");
background-position: center;
background-repeat: no-repeat;
background-size: 16px;
margin-right: -5px !important;
margin-left: -6px !important;
}
#usercssloader-menu-item:hover {
background-color: var(--toolbarbutton-hover-background);
border-radius: 3px!important;
}
#usercssloader-menu-item #usercssloader-menu > .menu-text[value="CSS"] {
opacity: 0;
width: calc(2 * var(--toolbarbutton-inner-padding) + 16px);
height: calc(2 * var(--toolbarbutton-inner-padding) + 16px);
}
}
Alles anzeigen
Symbol: Das ist ein Archiv, die enthaltene Bilddatei in icons Ordner entpacken.
Symbol muss in den icons Ordner.
CSS Code in den CSS Ordner.
Mfg.
Endor
Notepad++ v8.9.2 regression fixes, bug-fixes & new improvements:
1. Security enhancement: Make updater check interity & authenticity of server-returned XML (XMLDsig).
2. Security enhancement: Fix untrusted search path vulnerability (CVE-2026-25926) by launching explorer.exe.
3. Security enhancement: Make auto-updater (WinGUp) even more secured (Remove dll dependency & unscured options).
4. Fix a plugin installation crash due to incorrect processing catch.
5. Add redact selection feature - Default: █, Modifier (Shift + Click): ●.
6. Fix context menu shortcut localization not aligning to the right regression.
Get more info on
Download Notepad++ v8.9.2 - Double‑Lock Update Security | Notepad++
Mfg.
Endor
Und funktioniert das dann auch?
Hallo BarbaraZ-.
Teste bitte mal diese Version, die funktioniert hier:
/* UserCSSLoader 2025-10-10
*
* original author: Griever -
* https://github.com/Griever/userChromeJS/tree/master/UserCSSLoader
*
* Enhancements and several other changes including German translation and
* configuration section by users aborix, Endor, bege, Mira_Belle, Speravir
* of Camp Firefox forum - https://www.camp-firefox.de/forum/ - latest version:
* https://www.camp-firefox.de/forum/thema/138814/?postID=1280726#post1280726
*/
/****** Bedienungsanleitung ******
CSS-Ordner im Chrome-Ordner erstellen, CSS-Dateien dort ablegen - speichern.
Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css"
enden, sind AGENT_SHEET, alle anderen außer USER_SHEET werden gelesen. Da der
Inhalt der Datei nicht überprüft wird, darauf achten, die Angabe von @namespace
nicht zu vergessen!
Schaltfläche oder Menü wird in Navigationsleiste eingefügt (einstellbar, siehe
Variable "position" in unten anschließender Konfiguration).
Dateiordner, Dateimanager und Texteditor können in der unten anschließenden
Konfiguration geändert werden. Die Verwendung des in "view_source.editor.path"
angegebenen Editors ist möglich.
Linksklick auf Stil, zum Aktivieren/Deaktivieren
Mittelklick auf Stil zum Aktivieren/Deaktivieren, ohne Menü zu schließen
Rechtsklick auf Stil zum Öffnen im Editor
Strg+Linksklick zum Anzeigen im Dateimanager
Die Tastenkombinationen können im Menü eingeblendet werden, dazu nach
"acceltext" suchen und den Zeilenkommentar "//" entfernen.
Ein Symbol für die Schaltfläche muss in der "userChrome.css" festgelegt werden,
Pfad zum Bild (PNG nur als Beispiel):
* relativ zur userChrome.css
background-image: url("Relativer/Pfad/zum/CSS_Symbol.png");
* eine absolute Pfadangabe zum Symbol muss mit File-Protokoll-Präfix erfolgen:
background-image: url("file:///Absoluter/Pfad/zum/CSS_Symbol.png");
Absolute Zahlenwerte müssen eventuell etwas an die eigenen Gegebenheiten
angepasst werden (größeres Symbol, anderer Rand); der Zahlenwert für Höhe
und Breite des Menütextes ("CSS") sollte nicht größer sein als für das
Symbol (hier 16px).
#usercssloader-menu-item {
background-image: url("Relativer/Pfad/zum/CSS_Symbol.png");
background-position: center;
background-repeat: no-repeat;
background-size: 16px;
border-radius: var(--toolbarbutton-border-radius);
margin-block: 3px;
&:hover {
background-color: var(--toolbarbutton-hover-background);
}
& #usercssloader-menu > .menu-text[value="CSS"] {
opacity: 0;
width: calc(2 * var(--toolbarbutton-inner-padding) + 16px);
height: calc(2 * var(--toolbarbutton-inner-padding) + 16px);
}
}
**** Ende der Anleitung ****/
(function(){
/***** Konfiguration *****/
/* Position: als frei verschiebbare-Schaltfläche = 0, als Menü anzeigen = 1 */
let position = 0;//1
/* Dateimanager festlegen, Beispiele:
* let fileManager = "C:\\Programme\\FreeCommanderXE\\FreeCommander.exe";
* let fileManager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE";
* auch möglich (Achtung, nur mit fileManagerParam = "/select,"!):
* let fileManager = "C:\\Windows\\explorer.exe";
* Bleibt Parameter leer, wird Standardmanager des Systems ohne Parameter
* verwendet mit leicht eingeschränkter Funktionalität. */
let fileManager = "";
/* eventuelle Parameter für den Dateimanager, Beispiele:
* let fileManagerParam = "/T";//FreeCommander oder Totalcommander
* let fileManagerParam = "/select,";//Windows Explorer, mit Komma korrekt!
*/
let fileManagerParam = "";
/* manche Manager benötigen den Parameter nach der Pfadangabe,
dann "fileManagerParamPost" auf true setzen */
let fileManagerParamPost = false;
/* eigener Texteditor mit Pfad - Standard leer, dann wird Wert aus
* Einstellung "view_source.editor.path" verwendet mit Warnmeldung,
* wenn auch dieser leer ist, Beispiel:
* let customEditor = "C:\\Windows\\System32\\notepad.exe"; */
let customEditor = "";
/* Unterordner für die CSS-Dateien */
let cssFolder = "CSS";
/* zusätzlich Chrome-Ordner im Untermenü anzeigen (true)
oder verstecken (false) */
let showChrome = true;
/* Menüeintrag zum Bearbeiten der userChrome.css anzeigen (true)
oder verstecken (false) */
let showUserChromeCSS = true;
/* Menüeintrag zum Bearbeiten der userContent.css anzeigen (true)
oder verstecken (false) */
let showUserContentCSS = true;
/* Menüeintrag zum Bearbeiten der userChromeShadow.css anzeigen (true)
oder verstecken (false) */
let showUserChromeShadowCSS = true;
/* Menüeintrag zum Bearbeiten der userChrome.js anzeigen (true)
oder verstecken (false) */
let showUserChromeJS = false;
/* Menüeintrag zum Bearbeiten der pref.js anzeigen (true) oder
verstecken (false); Achtung, diese Datei sollte nur zum Ansehen geöffnet
werden, bei laufendem Firefox werden Änderungen wieder überschrieben! */
let showPrefsJS = false;
/* Menüeintrag zum Bearbeiten der user.js anzeigen (true)
oder verstecken (false) */
let showUserJS = false;
/***** Ende der Konfiguration *****/
// Wenn beim Start ein weiteres Fenster (zweites Fenster) vorhanden ist, beenden
let list = Services.wm.getEnumerator("navigator:browser");
while(list.hasMoreElements()){ if(list.getNext() != window) return; }
if (window.UCL) {
window.UCL.destroy();
delete window.UCL;
}
let menutooltip = "Linksklick: an/aus, Menü schließt\nMittelklick: an/aus, Menü bleibt offen\nRechtsklick: bearbeiten";
if (fileManager !== "") {
menutooltip = menutooltip + "\nStrg+Rechtsklick: im Dateimanager anzeigen";
}
window.UCL = {
AGENT_SHEET : Ci.nsIStyleSheetService.AGENT_SHEET,
USER_SHEET : Ci.nsIStyleSheetService.USER_SHEET,
AUTHOR_SHEET: Ci.nsIStyleSheetService.AUTHOR_SHEET,
readCSS: {},
get disabled_list() {
let obj = [];
try {
obj = decodeURIComponent(this.prefs.getCharPref("disabled_list")).split("|");
} catch(e) {}
delete this.disabled_list;
return this.disabled_list = obj;
},
get prefs() {
delete this.prefs;
return this.prefs = Services.prefs.getBranch("UserCSSLoader.");
},
get styleSheetServices() {
delete this.styleSheetServices;
return this.styleSheetServices = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
},
get FOLDER() {
let aFolder;
try {
// UserCSSLoader.FOLDER verwenden
let folderPath = this.prefs.getCharPref("FOLDER");
aFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
aFolder.initWithPath(folderPath);
} catch (e) {
aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
aFolder.appendRelativePath(cssFolder);
}
if (!aFolder.exists() || !aFolder.isDirectory()) {
aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0o664);
}
delete this.FOLDER;
return this.FOLDER = aFolder;
},
get CHRMFOLDER() {
let cFolder;
try {
// UserCSSLoader.CHRMFOLDER verwenden
let CHRMfolderPath = this.prefs.getCharPref("CHRMFOLDER");
cFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
cFolder.initWithPath(CHRMfolderPath);
} catch (e) {
cFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
}
if (!cFolder.exists() || !cFolder.isDirectory()) {
cFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0o664);
}
delete this.CHRMFOLDER;
return this.CHRMFOLDER = cFolder;
},
init: function() {
const cssmenu = $C("menu", {
id: "usercssloader-menu",
label: "CSS",
tooltiptext: "UserCSSLoader\n\nLinksklick: Stylesheets anzeigen\nMittelklick: Styles importieren",
accesskey: "Y"
});
cssmenu.addEventListener("click", (event) => { if (event.button === 1) UCL.rebuild(); });
const menupopup = $C("menupopup", {
id: "usercssloader-menupopup"
});
cssmenu.appendChild(menupopup);
let menu = $C("menu", {
label: "Style-Loader-Menü",
id: "style-loader-menu",
accesskey: "S",
//acceltext: "S"
});
menupopup.appendChild(menu);
menupopup.appendChild($C("menuseparator"));
let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
menu.appendChild(mp);
let rebuildItem = $C("menuitem", {
label: "Styles importieren",
accesskey: "I",
//acceltext: "I"
});
rebuildItem.addEventListener("command", () => UCL.rebuild());
mp.appendChild(rebuildItem);
mp.appendChild($C("menuseparator"));
//
let createCSS = $C("menuitem", {
label: "CSS-Datei erstellen",
accesskey: "D",
//acceltext: "D"
});
createCSS.addEventListener("command", () => UCL.create());
mp.appendChild(createCSS);
let openFolder = $C("menuitem", {
label: "CSS-Ordner öffnen",
accesskey: "O",
//acceltext: "O"
});
openFolder.addEventListener("command", () => UCL.openCSSFolder());
mp.appendChild(openFolder);
if (showChrome) {
let openChromeFolder = $C("menuitem", {
label: "Chrome-Ordner öffnen",
accesskey: "X",
//acceltext: "X"
});
openChromeFolder.addEventListener("command", () => UCL.openCHRMFolder());
mp.appendChild(openChromeFolder);
}
if (showUserChromeCSS || showUserContentCSS || showUserChromeShadowCSS)
// wenigstens eine der Variablen muss "true" sein, …
mp.appendChild($C('menuseparator')); // … damit Trennlinie angezeigt wird
if (showUserChromeCSS) {
let editChromeItem = $C("menuitem", {
label: "userChrome.css bearbeiten"
});
editChromeItem.addEventListener("command", () => UCL.editUCFile("userChrome.css"));
mp.appendChild(editChromeItem);
}
if (showUserContentCSS) {
let editContentItem = $C("menuitem", {
label: "userContent.css bearbeiten"
});
editContentItem.addEventListener("command", () => UCL.editUCFile("userContent.css"));
mp.appendChild(editContentItem);
}
if (showUserChromeShadowCSS) {
let editUCShadowItem = $C("menuitem", {
label: "userChromeShadow.css bearbeiten"
});
editUCShadowItem.addEventListener("command", () => UCL.editUCFile("userChromeShadow.css"));
mp.appendChild(editUCShadowItem);
}
if (showUserChromeJS || showPrefsJS || showUserJS)
// wenigstens eine der Variablen muss "true" sein, …
mp.appendChild($C('menuseparator')); // … damit Trennlinie angezeigt wird
if (showUserChromeJS) {
let editUCjsItem = $C("menuitem", {
label: "userChrome.js bearbeiten"
});
editUCjsItem.addEventListener("command", () => UCL.editUCFile("userChrome.js"));
mp.appendChild(editUCjsItem);
}
if (showPrefsJS) {
let editPrefsItem = $C("menuitem", {
label: "prefs.js bearbeiten"
});
editPrefsItem.addEventListener("command", () => UCL.editProfileFile("prefs.js"));
mp.appendChild(editPrefsItem);
}
if (showUserJS) {
let editUserJsItem = $C("menuitem", {
label: "user.js bearbeiten"
});
editUserJsItem.addEventListener("command", () => UCL.editProfileFile("user.js"));
mp.appendChild(editUserJsItem);
}
CustomizableUI.createWidget({
id: 'usercssloader-menu-item',
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
onBuild: function(aDocument) {
let toolbaritem = aDocument.createXULElement('toolbaritem');
toolbaritem.id = 'usercssloader-menu-item';
toolbaritem.className = 'chromeclass-toolbar-additional';
return toolbaritem;
}
});
$('usercssloader-menu-item').appendChild(cssmenu);
if (position === 1) {
let refNode = $('helpMenu');
refNode.parentNode.insertBefore(cssmenu, refNode.nextSibling);
}
// Stile neu laden, ohne Menü zu öffnen
let key = $C("key", {
id: "usercssloader-rebuild-key",
key: "R",
modifiers: "alt",
});
key.addEventListener("command", () => UCL.rebuild());
$("mainKeyset").appendChild(key);
this.rebuild();
this.initialized = true;
window.addEventListener("unload", this, false);
},
uninit: function() {
const dis = [];
for (let x of Object.keys(this.readCSS)) {
if (!this.readCSS[x].enabled)
dis.push(x);
}
this.prefs.setCharPref("disabled_list", encodeURIComponent(dis.join("|")));
window.removeEventListener("unload", this, false);
},
destroy: function() {
var i = document.getElementById("usercssloader-menu");
if (i) i.parentNode.removeChild(i);
var i = document.getElementById("usercssloader-rebuild-key");
if (i) i.parentNode.removeChild(i);
this.uninit();
},
handleEvent: function(event) {
switch(event.type){
case "unload": this.uninit(); break;
}
},
rebuild: function() {
let ext = /\.css$/i;
let not = /\.uc\.css/i;
let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
while (files.hasMoreElements()) {
let file = files.getNext().QueryInterface(Ci.nsIFile);
if (!ext.test(file.leafName) || not.test(file.leafName)) continue;
let CSS = this.loadCSS(file);
CSS.flag = true;
}
for (let leafName of Object.keys(this.readCSS)) {
const CSS = this.readCSS[leafName];
if (!CSS.flag) {
CSS.enabled = false;
delete this.readCSS[leafName];
}
delete CSS.flag;
this.rebuildMenu(leafName);
}
if (this.initialized) {
if (typeof(StatusPanel) !== "undefined")
StatusPanel._label = "Styles importiert";
else
XULBrowserWindow.statusTextField.label = "Styles importiert";
}
},
loadCSS: function(aFile) {
let CSS = this.readCSS[aFile.leafName];
if (!CSS) {
CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile);
if (this.disabled_list.indexOf(CSS.leafName) === -1) {
CSS.enabled = true;
}
} else if (CSS.enabled) {
CSS.enabled = true;
}
return CSS;
},
rebuildMenu: function(aLeafName) {
let CSS = this.readCSS[aLeafName];
let menuitem = document.getElementById("usercssloader-" + aLeafName);
if (!CSS) {
if (menuitem)
menuitem.parentNode.removeChild(menuitem);
return;
}
if (!menuitem) {
menuitem = $C("menuitem", {
label: aLeafName,
id: "usercssloader-" + aLeafName,
class: "usercssloader-item " + (CSS.SHEET == this.AGENT_SHEET? "AGENT_SHEET" : CSS.SHEET == this.AUTHOR_SHEET? "AUTHOR_SHEET": "USER_SHEET"),
type: "checkbox",
autocheck: "false",
tooltiptext: menutooltip
});
menuitem.addEventListener("command", () => UCL.toggle(aLeafName));
menuitem.addEventListener("click", (event) => UCL.itemClick(event));
menuitem.addEventListener("mouseup", (event) => { if (event.button === 1) event.preventDefault(); });
document.getElementById("usercssloader-menupopup").appendChild(menuitem);
}
menuitem.setAttribute("checked", CSS.enabled);
},
toggle: function(aLeafName) {
let CSS = this.readCSS[aLeafName];
if (!CSS || event.ctrlKey) return;
CSS.enabled = !CSS.enabled;
this.rebuildMenu(aLeafName);
},
itemClick: function(event) {
let label = event.currentTarget.getAttribute("label");
event.preventDefault();
event.stopPropagation();
if (event.button === 0) {
return;
} else if (event.button === 1) {
this.toggle(label);
} else if (event.button === 2) {
if (event.ctrlKey && fileManager !== "") {
UCL.showFile(label);
} else {
closeMenus(event.target);
this.edit(this.getFileFromLeafName(label));
}
}
},
getFileFromLeafName: function(aLeafName) {
let f = this.FOLDER.clone();
f.QueryInterface(Ci.nsIFile); // use appendRelativePath
f.appendRelativePath(aLeafName);
return f;
},
showFile: function(fname) {
const PathSep = AppConstants.platform === "win" ? "\\" : "/";
let target= this.FOLDER.path + PathSep + fname;
let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
let args = (!fileManagerParamPost) ? [fileManagerParam,target] :
[target,fileManagerParam];
file.initWithPath(fileManager);
process.init(file);
// Verzeichnis mit anderem Dateimanager öffnen
process.run(false, args, args.length);
},
openCSSFolder:function(){
if (fileManager !== "" && fileManagerParam !== "/select,") {
let target = this.FOLDER.path;
let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
let args = (!fileManagerParamPost) ? [fileManagerParam,target] :
[target,fileManagerParam];
file.initWithPath(fileManager);
process.init(file);
// Verzeichnis mit anderem Dateimanager öffnen
process.run(false, args, args.length);
} else {
// Verzeichnis mit Dateimanager des Systems öffnen
this.FOLDER.launch();
}
},
openCHRMFolder:function(){
if (fileManager !== "" && fileManagerParam !== "/select,") {
let target = this.CHRMFOLDER.path;
let file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
let process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
let args = (!fileManagerParamPost) ? [fileManagerParam,target] :
[target,fileManagerParam];
file.initWithPath(fileManager);
process.init(file);
// Verzeichnis mit anderem Dateimanager öffnen
process.run(false, args, args.length);
} else {
// Verzeichnis mit Dateimanager des Systems öffnen
this.CHRMFOLDER.launch();
}
},
editUCFile: function(aLeafName) {
let file = Services.dirsvc.get("UChrm", Ci.nsIFile);
file.appendRelativePath(aLeafName);
this.edit(file);
},
editProfileFile: function(filename) {
let file = Services.dirsvc.get("ProfD", Ci.nsIFile);
file.append(filename);
this.edit(file);
},
edit: function(aFile) {
let editor = (customEditor !== "") ? customEditor : Services.prefs.getCharPref("view_source.editor.path");
if (!editor) return alert('In der Konfiguration einen Texteditor festlegen ("customEditor") oder\n unter about:config im vorhandenen Schalter "view_source.editor.path"\n den vollständigen Editorpfad eintragen.');
try {
let UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
let path = UI.ConvertFromUnicode(aFile.path);
let app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
app.initWithPath(editor);
let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(app);
process.run(false, [path], 1);
} catch (e) {}
},
create: function(aLeafName) {
if (!aLeafName) aLeafName = prompt("Name des Styles", dateFormat(new Date(), "%Y_%m%d_%H%M%S"));
if (aLeafName) aLeafName = aLeafName.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, "");
if (!aLeafName || !/\S/.test(aLeafName)) return;
if (!/\.css$/.test(aLeafName)) aLeafName += ".css";
let file = this.getFileFromLeafName(aLeafName);
this.edit(file);
},
UCrebuild: function() {
let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
let query = "?" + new Date().getTime();
Array.slice(document.styleSheets).forEach(function(css){
if (!re.test(css.href)) return;
if (css.ownerNode) {
css.ownerNode.parentNode.removeChild(css.ownerNode);
}
let pi = document.createProcessingInstruction('xml-stylesheet','type="text/css" href="'+ css.href.replace(/\?.*/, '') + query +'"');
document.insertBefore(pi, document.documentElement);
});
UCL.UCcreateMenuitem();
},
UCcreateMenuitem: function() {
let sep = $("usercssloader-ucseparator");
let popup = sep.parentNode;
if (sep.nextSibling) {
let range = document.createRange();
range.setStartAfter(sep);
range.setEndAfter(popup.lastChild);
range.deleteContents();
range.detach();
}
let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
Array.slice(document.styleSheets).forEach(function(css) {
if (!re.test(css.href)) return;
let fileURL = decodeURIComponent(css.href).split("?")[0];
let aLeafName = fileURL.split("/").pop();
let m = $C("menuitem", {
label: aLeafName,
tooltiptext: fileURL,
id: "usercssloader-" + aLeafName,
type: "checkbox",
autocheck: "false",
checked: "true",
});
m.css = css;
m.addEventListener("command", function() {
if (!event.ctrlKey) {this.setAttribute("checked", !(this.css.disabled = !this.css.disabled));}
});
m.addEventListener("mouseup", function(event) {
if (event.button === 1) event.preventDefault();
});
m.addEventListener("click", function(event) {
UCL.UCItemClick(event);
});
popup.appendChild(m);
});
},
UCItemClick: function(event) {
if (event.button === 0) return;
event.preventDefault();
event.stopPropagation();
if (event.button === 1) {
event.target.doCommand();
}
else if (event.button === 2) {
closeMenus(event.target);
let fileURL = event.currentTarget.getAttribute("tooltiptext");
let file = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getFileFromURLSpec(fileURL);
this.edit(file);
}
},
};
function CSSEntry(aFile) {
this.path = aFile.path;
this.leafName = aFile.leafName;
this.lastModifiedTime = 1;
this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ?
Ci.nsIStyleSheetService.AGENT_SHEET:
/\.author\.css$/i.test(this.leafName)?
Ci.nsIStyleSheetService.AUTHOR_SHEET:
Ci.nsIStyleSheetService.USER_SHEET;
}
CSSEntry.prototype = {
sss: Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService),
_enabled: false,
get enabled() {
return this._enabled;
},
set enabled(isEnable) {
let aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
aFile.initWithPath(this.path);
let isExists = aFile.exists(); // true, wenn die Datei bereits existiert
let lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
let isForced = this.lastModifiedTime != lastModifiedTime; //true, wenn es eine Änderung in der Datei gibt
let fileURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile);
let uri = Services.io.newURI(fileURL, null, null);
if (this.sss.sheetRegistered(uri, this.SHEET)) {
// Wenn diese Datei bereits gelesen wurde
if (!isEnable || !isExists) {
this.sss.unregisterSheet(uri, this.SHEET);
}
else if (isForced) {
// Nach Stornierung erneut einlesen
this.sss.unregisterSheet(uri, this.SHEET);
this.sss.loadAndRegisterSheet(uri, this.SHEET);
}
} else {
// Datei wurde nicht gelesen
if (isEnable && isExists) {
this.sss.loadAndRegisterSheet(uri, this.SHEET);
}
}
if (this.lastModifiedTime !== 1 && isEnable && isForced) {
log(this.leafName + " wurde aktualisiert");
}
this.lastModifiedTime = lastModifiedTime;
return this._enabled = isEnable;
},
};
UCL.init();
function $(id) { return document.getElementById(id); }
function $A(arr) { return Array.slice(arr); }
function $C(name, attr) {
const el = document.createXULElement(name);
if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) });
return el;
}
function dateFormat(date, format) {
format = format.replace("%Y", ("000" + date.getFullYear()).substr(-4));
format = format.replace("%m", ("0" + (date.getMonth()+1)).substr(-2));
format = format.replace("%d", ("0" + date.getDate()).substr(-2));
format = format.replace("%H", ("0" + date.getHours()).substr(-2));
format = format.replace("%M", ("0" + date.getMinutes()).substr(-2));
format = format.replace("%S", ("0" + date.getSeconds()).substr(-2));
return format;
}
function log(mes) { console.log(mes); }
})();
Alles anzeigen
Erst mal testen ob sie bei Dir funktioniert, dann Deine Anpassungen einfügen.
Mfg.
Endor