Alle Tastaturshortcuts per Makro auflisten

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Alle Tastaturshortcuts per Makro auflisten

Beitrag von Stephan »

Hallo,

kennt jemand einen Weg um alle Tastaturshortcuts (für alle Module) per Makro aufzulisten?
Zum Einen zumindest alle aktuell vergebenen Shortcuts, besser jedoch zusätzlich alle Shortcuts die vergeben werden könnten.

Im Grunde frage ich ob diese Funktion die für MS Word verfügbar ist, auch in OO/LO nachzubilden ist, also nach einem Makro das dasselbe tut wie das Makro namens "BefehleAuflisten" in MS Word:

Auszug aus MS Word Hilfe:
Drucken einer Liste der Tastenkombinationen
!. Zeigen Sie im Menü Extras auf Makro, und klicken Sie dann auf Makros.
2. Klicken Sie im Feld Makros in auf Word-Befehle.
3. Klicken Sie im Feld Makroname auf BefehleAuflisten.
4. Klicken Sie auf Ausführen.
5. Klicken Sie im Dialogfeld Befehle auflisten auf Aktuelle Menü- und Tastatureinstellungen.
6. Klicken Sie dann auf OK.
7. Klicken Sie im Menü Datei auf Drucken.



Gruß
Stephan
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Alle Tastaturshortcuts per Makro auflisten

Beitrag von F3K Total »

Hallo Stephan,
vielleicht kommst Du hier weiter?

Code: Alles auswählen

function Accelerators
Dim oConfigProvider as Object
Dim aNodePath(0) as new com.sun.star.beans.PropertyValue
	oConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider")
	aNodePath(0).Name = "nodepath"
	aNodePath(0).Value = "/org.openoffice.Office.Accelerators"
        oRegistryKeyContent = oConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", aNodePath())
	xray oRegistryKeyContent
End Function
Gruß R
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Alle Tastaturshortcuts per Makro auflisten

Beitrag von Stephan »

vielleicht kommst Du hier weiter?
Die 'Richtung' stimmt wahrscheinlich, aber ich sehe noch nicht wie ich ans endgültige Ziel komme.
Bei Xray kann ich nur die Tastenkombinationen anzeigen, ohne das eine Zuordnung zu einem bestimmten Befehl deutlich wird, das sieht so aus:
XRay.gif
XRay.gif (42.89 KiB) 3935 mal betrachtet
Leider stimmen auch die angezeigten Tastenkombinationen nicht mit der Anzeige unter Extras-Anpassen überein, d.h. XRay zeigt mehr als dort und die die in XRay 'zuviel' sind entsprechen offensichtlich nicht denjenigen die unter Extras-Anpassen ausgegraut sind.


Gruß
Stephan
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Alle Tastaturshortcuts per Makro auflisten

Beitrag von F3K Total »

Hallo Stephan,
denke da muss man in die Tiefe gehen, Schleife über die Elementnames, der Befehl steht dann im .COMMAND.
Ein Beispiel:

Code: Alles auswählen

xray oRegistryKeyContent.PrimaryKeys.Global.N_SHIFT_MOD1.Command
oder analog

Code: Alles auswählen

xray oRegistryKeyContent.PrimaryKeys.getbyName("Global").getbyName("N_SHIFT_MOD1").Command
ergibt: .uno:NewDoc
Also STRG+SHIFT+N -> neues Dokument, für die globalen Tastenkürzel
Gruß R
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Alle Tastaturshortcuts per Makro auflisten

Beitrag von F3K Total »

... also etwa so:

Code: Alles auswählen

function Accelerators
Dim oConfigProvider as Object
Dim aNodePath(0) as new com.sun.star.beans.PropertyValue
	oConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider")
	aNodePath(0).Name = "nodepath"
	aNodePath(0).Value = "/org.openoffice.Office.Accelerators"
    oRegistryKeyContent = oConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", aNodePath())
    aGlobalElementnames = oRegistryKeyContent.PrimaryKeys.Global.ElementNames
    sGlobalAccelerators = ""
    for i = 0 to uBound (aGlobalElementnames)
        oAccelerator = oRegistryKeyContent.PrimaryKeys.Global.getbyname(aGlobalElementnames(i)
        if oAccelerator.Command >"" then
            sGlobalAccelerators = sGlobalAccelerators + aGlobalElementnames(i) + ": "+oAccelerator.Command+CHR(10)
        endif
    next i
    msgbox sGlobalAccelerators
End Function
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: Alle Tastaturshortcuts per Makro auflisten

Beitrag von Karolus »

Hallo

Nachdem in Anlehnung an F3Ks Code LO reproduzierbar abstürzt bei jedem Versuch ein leeres .Command zu ermitteln - hab ich die Strategie gewechselt.

Code: Alles auswählen

import re

shortnodes_rex = re.compile(r'(?:<oor:component-data xmlns:install'
                 '="http://openoffice.org/2004/installation" oor:'
                 'name=)?"Accelerators" oor:package=(.*?)</oor:component-data')

node_rex = re.compile(
                    r'(?:<node oor:name="(Global|\w+)">)?'
                     '<node oor:name="(\w+)"'
                     '(?: oor:op="replace">|>)?'
                     '<prop oor:name="Command"'
                     '(?:><value xml:lang="(en-US|de)">'
                     '\.uno:(\w+)</value></prop>|/>)?'
                    )

def get_shortcuts(config_file_path):
    with open( config_file_path ) as configfile:
        config = configfile.read()
    shorts = shortnodes_rex.findall( config )
    out = []
    for shortblock in shorts:
        out.extend(node_rex.findall(shortblock))
    return out


def dump_shortcuts(*_):
    """
    liest aus Configdateien Shortcut-zuordnungen
    und schreibt in aktuelles Calcdokument
    
    to do: weitere Config-dateien mit Shortcut-zuordnungen finden!!
    """
    configpath = '/usr/lib/libreoffice/share/registry/main.xcd' #LO -Ubuntu-Debian
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.CurrentSelection.Spreadsheet
    data = tuple(get_shortcuts( configpath ))
    outrange = sheet.getCellRangeByPosition(0, 1, len(data[0])-1, len(data))
    outrange.setDataArray(data)
                                            
shortcuts_auslesen.ods
(30.81 KiB) 106-mal heruntergeladen
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Alle Tastaturshortcuts per Makro auflisten

Beitrag von Stephan »

@Rik
denke da muss man in die Tiefe gehen, Schleife über die Elementnames, der Befehl steht dann im .COMMAND
ja, danke. Ich war diesbezüglich nicht vollends hilflos, aber bin unter Zeitdruck und war gestern so müde das ich nur erst einmal 'Zwischenbericht' geben wollte.

Dein Code aus dem Post von 19:18 läuft fehlerfrei, ich muss jetzt aber ersteinmal Zeit finden dennauf alle Bereiche der Shortcuts zu erweitern und ein bisschen 'Formatierungsgedöns' drumherum zu schreiben um die ERgebnissse in in Calc- oder Writer-Dokument auszugeben.

Ich stelle das hier in den Thread sobald ich es fertig habe bzw. melde mich wenn ich dabei auf Probleme stosse.


@Karolus

ich habe die Zeile mit Configpath angepasst:

Code: Alles auswählen

configpath = 'D:\AOO_411_standalone\share\registry\main.xcd
bekomme aber folgende Fehlermeldung(en), hierbei gebe ich Beide an, wissend das eine wohl falsch ist, nur mir ist auf den ersten Blick nicht klar ob ich nun get_shortcuts oder dump_shortcuts starten soll:
get_shortcuts.gif
get_shortcuts.gif (20.46 KiB) 3828 mal betrachtet
dump_shortcuts.gif
dump_shortcuts.gif (25.93 KiB) 3828 mal betrachtet
Wenn Du andere Infos brauchst sage Bescheid, richtig mitdiskutieren kann ich aber bei dem Python Code nicht.

Sofern Du Lust hättest das Ganze zu komplettieren (siehe Dein ToDo) und in eine endanwedertaugliche Form zu bringen (z.B. müssen Dinge wie X_MOD1 'übersetzt' werden in STRG X) ist mir das gerne willkommen, denn ich muss nachgelagert nichts weiter mit den Shortcuts tun als diese übersichtlich auszugeben, muss also nicht unbedingt Deinen Python-Code komplett verstehen.

Grund meiner Anfrage ist das ich mit einer Anwenderin in privaten Kontakt stehe die auf der OO-Mailingliste zunächst nach einigen Problemen fragte:
http://mail-archives.apache.org/mod_mbo ... lpha.de%3E

mich jetzt aber nach einer Übersicht bzw. der Möglichkeit die Shortcuts per Makro auszugeben (wie sie es aus MS Office gewöhntist) gefragt hat.




Gruß
Stephan
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: Alle Tastaturshortcuts per Makro auflisten

Beitrag von Karolus »

Hallo Stephan

Es ist die übliche \Backslash-plage mit Windows, nimm die Funktion `dump_shortcuts` und probiere die Pfadangabe einmal mit normalen / statt \ ,oder alternativ auch mit einem vorangestellten r:

Code: Alles auswählen

configpath = r'D:\AOO_411_standalone\share\registry\main.xcd
oder

Code: Alles auswählen

configpath = 'D:/AOO_411_standalone/share/registry/main.xcd
( Schau dir die zweite Fehlermeldung genau an, -- das ...\r... in der Pfadangabe, wird als Eingabe eines Backspace-zeichens interpretiert. )

Hier nochmal eine Liste der mutmasslichen Pfade mit Shortcut-angaben

Code: Alles auswählen

$( AOO-| Lo-programmverzeichniss )/share/registry/main.xcd # basisinstallation
$( AOO-| Lo-programmverzeichniss) /share/registry/res/registry_de.xcd # Lokalisierung[en]?
$( Aoo|LO-benutzereconfiguration) /registrymodifications.xcu # mit den selbst eingestellten Shortcuts  
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Alle Tastaturshortcuts per Makro auflisten

Beitrag von Stephan »

Hallo Karolus,
Es ist die übliche \Backslash-plage mit Windows
Ein wenig wohl auch mein Unwissen, denn ich weiß nicht was ich unter Python für den StarBasic-Ausdruck "ConvertToURL" verwenden kann.
(direkt als URL zu schreiben schien mir hingegen unsicher, weil Du es auch nicht getan hast und ich nur zu 99% sicher wäre bezüglich der richtigen Nozation (file://...))

Code: Alles auswählen

configpath = r'D:\AOO_411_standalone\share\registry\main.xcd' 
das funktioniert auf Anhieb.


mir bleibt nur zu sagen:
falls Du magst vervollständige Deine Datei und stelle sie z.B. im Bereich "Wissensarchiv" bereit, das wird sicherlich Etlichen eine Hilfe sein.
Ich selber kann mich nur für Dein Beispiel bedanken und es als Anregung im Hinterkopf behalten bin aber wissensmäßig unfähig es selbst entsprechend zu vervollständigen.


Gruß
Stephan
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: Alle Tastaturshortcuts per Makro auflisten

Beitrag von Karolus »

Hallo
Ein wenig wohl auch mein Unwissen, denn ich weiß nicht was ich unter Python für den StarBasic-Ausdruck "ConvertToURL" verwenden kann.
python selbst benötigt für normale Datei|Verzeichniss-operationen keine URL-notation sondern System-pfad-angaben.
Nur für die Übergabe von|an Api-methoden (z.B. an "com.sun.star.ucb.SimpleFileAccess" wird dann eine Konvertierung gebraucht.
Die entsprechenden Funktionen dazu gibts in ...uno.py
[color=#FF0000]help(uno)[/color] hat geschrieben:...
fileUrlToSystemPath(url)
returns a system path (determined by the system, the python interpreter is running on)
....
systemPathToFileUrl(systemPath)
returns a file-url for the given system path
Karolus

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Antworten