Tastenkombination für Makroaufruf

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

Moderator: Moderatoren

clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Tastenkombination für Makroaufruf

Beitrag von clag »

Hallo Kenner und Könner,

ich habe mir ein kleines Makro erstellt, welches in Draw die aktuelle Ebene ein oder ausblendet und auf F12 gelegt und ctrl F12 sperrt die Ebene.
Das funktioniert auch soweit ganz prima, allerdings ist es etwas nervig die entsprechende Ebene immer erst aktivieren zu müssen bevor ich sie ausblenden kann um dann wieder die Ebene zu aktivieren auf der man gerade arbeitet.
Nun ist in mir der Wunsch aufgekommen die Ebenen direkt über den Index ansprechen zu wollen, also die Tastenkombination F12 + 5 soll Ebene 5 ausblenden egal welche Ebene aktuell aktiv ist.
Ich habe aber im Moment keine Idee wie man das realisieren könnte!?
hmmm (vieleicht mit einer inputbox?) aber eine direkte Übergabe des Index wäre doch besser.

Nun hoffe ich jemand von euch hat da eine Ide oder Tip für mich.

schonmal Danke in Voraus
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Tastenkombination für Makroaufruf

Beitrag von F3K Total »

Guten Morgen Clag,
war nicht ganz einfach und kann bestimmt verbessert werden:

Code: Alles auswählen

global myKeyHandler as object
global K1 as boolean
global K2 as boolean
global T1
global T2
Global nPage as integer
Global bLock as boolean

sub SetupKeyHandler
    oController = thisComponent.currentController
    myKeyHandler = CreateUnoListener("KeyHandler_","com.sun.star.awt.XKeyHandler")
    oController.addKeyHandler(myKeyHandler)
end sub

sub RemoveKeyHandler
    oController = thisComponent.currentController
    oController.removeKeyHandler(myKeyHandler)
end sub

function KeyHandler_keyReleased(oKeyEvent as new com.sun.star.awt.KeyHandler) as boolean
    KeyHandler_keyReleased = False
    if oKeyEvent.KeyCode >= 257 and oKeyEvent.KeyCode <= 265 then 'die Zahlen 1-9
        K1 = true
        nPage = oKeyEvent.KeyCode - 256
        T1 = getsystemticks()
    endif
    if oKeyEvent.KeyCode = 779 then 'die Taste F12
        K2 = true
        T2 = getsystemticks()
        if oKeyEvent.Modifiers = 2 then'Strg
            bLock = true
        else
            bLock = false
        endif
    endif
    if K1 = true and K2 = true then
        if ABS(T1-T2) < 500 then 'Zeit zwischen Tastendrücken kleiner 0,5 Sekunden
        if bLock then
            S_Lock_unlock_layer(nPage)
            bLock = false
        else
            S_hide_show_layer(nPage)
        endif

        endif       
        K1 = false
        K2 = false
    endif
end function

function KeyHandler_keyPressed(oKeyEvent as new com.sun.star.awt.KeyHandler) as boolean 
    if KeyHandler_keyPressed = false then
    end if
end function

Sub S_hide_Show_layer(nPage)
    if nPage = 1 then 'Weil Index 1 und 2 die beiden Hintergrungebenen sind
        nIndex = 0
    else
        nIndex = nPage + 1
    end if
    'print nIndex
    bVisible = thisComponent.Layermanager(nIndex).isvisible
    thisComponent.Layermanager(nIndex).isvisible = not bVisible
end sub

Sub S_Lock_unlock_layer(nPage)
    if nPage = 1 then 'Weil Index 1 und 2 die beiden Hintergrungebenen sind
        nIndex = 0
    else
        nIndex = nPage + 1
    end if
    bIsLocked = thisComponent.Layermanager(nIndex).IsLocked
    thisComponent.Layermanager(nIndex).IsLocked = not bIsLocked
end sub
  • Mit F12+Ebenenzahl 1-9 wird die entsprechende Ebene ausgeblendet/enigeblendet
  • Mit STRG+F12+Ebenenzahl 1-9 wird die entsprechende Ebene gesperrt/entsperrt
Beispiel anbei.
Gruß R
Dateianhänge
Keyhandler.odg
(12.69 KiB) 106-mal heruntergeladen
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Tastenkombination für Makroaufruf

Beitrag von Stephan »

zumindest für einen gewöhnlichen Dialog funktioniert der Key-Listener:
http://www.openoffice.org/api/docs/comm ... tener.html

meiner Erfahrung nach einwandfrei.
Du müsstest mal schauen ob/wie der auch für das Draw-Dokument oder den Stardesktop greifbar ist, dazu musst Du nur schauen ob der Teil der Ausgabe von dbg_methods ist oder nimm XRAY.

Wenn es sich hingegen um ein Dokumentmakro handelt kannst Du im Dokument in der Datei /Configurations2/accelerator/current.xml direkt Einträge für alle 5(?) Kombinationen machen und für jede ein konkretes Makro zuweisen. Wie die konkreten Einträge für Deine Tastaturkombination aussehen müssen musst Du selbst herausfinden indem Du im Netz suchst oder bestehende Konfigurationsdateien Deines OO untersuchst.
Ein Beispieleintrag ist:

Code: Alles auswählen

<accel:item accel:code="KEY_LEFT" xlink:href="vnd.sun.star.script:ABC.ABC_work.dummy1?language=Basic&location=document"/>

dieser startet mit Pfeil-links-Taste das Makro "dummy1" im Modul "ABC_work" der Dokumentbibliothek "ABC"


Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tastenkombination für Makroaufruf

Beitrag von clag »

hey ihr Beiden

allerbesten Dank für die gedanklichen Anstöße und Beispielcode ist ja praktisch schon fertig zum einbinden :)
werde mich gleich mal ans Ausprobieren machen.

ich wünsch Euch einen schönen "stressfreien" Sonntag
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Tastenkombination für Makroaufruf

Beitrag von F3K Total »

Hallo Clag,
weil mich das Einbetten der Tastenkombinationen in das Dokument interessiert hat, anbei noch ein Beispiel alà Stephan. F12 und eine Zahl ist mir da nicht gelungen, aber
  • STRG+ Zahl zum Ausblenden/Einblenden
  • STRG + SHIFT + Zahl zum Sperren/Entsperren
Die Current.xml sieht so aus:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE accel:acceleratorlist PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "accelerator.dtd">
<accel:acceleratorlist xmlns:accel="http://openoffice.org/2001/accel" xmlns:xlink="http://www.w3.org/1999/xlink">
<accel:item accel:code="KEY_1" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_hide_Show_layer_1?language=Basic&location=document"/>
<accel:item accel:code="KEY_2" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_hide_Show_layer_2?language=Basic&location=document"/>
<accel:item accel:code="KEY_3" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_hide_Show_layer_3?language=Basic&location=document"/>
<accel:item accel:code="KEY_4" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_hide_Show_layer_4?language=Basic&location=document"/>
<accel:item accel:code="KEY_5" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_hide_Show_layer_5?language=Basic&location=document"/>
<accel:item accel:code="KEY_6" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_hide_Show_layer_6?language=Basic&location=document"/>
<accel:item accel:code="KEY_7" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_hide_Show_layer_7?language=Basic&location=document"/>
<accel:item accel:code="KEY_8" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_hide_Show_layer_8?language=Basic&location=document"/>
<accel:item accel:code="KEY_9" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_hide_Show_layer_9?language=Basic&location=document"/>
<accel:item accel:code="KEY_1" accel:shift="true" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_lock_unlock_layer_1?language=Basic&location=document"/>
<accel:item accel:code="KEY_2" accel:shift="true" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_lock_unlock_layer_2?language=Basic&location=document"/>
<accel:item accel:code="KEY_3" accel:shift="true" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_lock_unlock_layer_3?language=Basic&location=document"/>
<accel:item accel:code="KEY_4" accel:shift="true" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_lock_unlock_layer_4?language=Basic&location=document"/>
<accel:item accel:code="KEY_5" accel:shift="true" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_lock_unlock_layer_5?language=Basic&location=document"/>
<accel:item accel:code="KEY_6" accel:shift="true" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_lock_unlock_layer_6?language=Basic&location=document"/>
<accel:item accel:code="KEY_7" accel:shift="true" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_lock_unlock_layer_7?language=Basic&location=document"/>
<accel:item accel:code="KEY_8" accel:shift="true" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_lock_unlock_layer_8?language=Basic&location=document"/>
<accel:item accel:code="KEY_9" accel:shift="true" accel:mod1="true" xlink:href="vnd.sun.star.script:Standard.Module1.S_lock_unlock_layer_9?language=Basic&location=document"/>
</accel:acceleratorlist>
 
Danke nochmal an Stephan. Diese Variante ist sicherlich die bessere, stabilere!
Gruß R
Dateianhänge
Accelerator_embedded.odg
(10.76 KiB) 105-mal heruntergeladen
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tastenkombination für Makroaufruf

Beitrag von clag »

Hey F3K Total,

der letzte Beispiel Code funktioniert auch einwandfrei.
haha jetz muß ich mich entscheiden ...

Nochmals Danke für deine weiterführende Hilfestellung
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten