gegeben ist ein Thread, in dem ein Dialog angezeigt wird. Nun möchte ich verschiedene Short-Cuts definieren, z.B.
Strg-A => wenn die Taste in einem in einem SLE oder MLE gedrückt wird, soll der komplette :editBuffer() des Xbase-Parts markiert werden;
Alt-L => springe zu einem bestimmten Xbase-Part
Entsprechend habe ich den Event-Loop angepasst:
Code: Alles auswählen
nEvent := xbe_None
WHILE nEvent <> xbeP_Close
nEvent := AppEvent(@mp1, @mp2, @oXbp)
DO CASE
CASE nEvent = xbeP_Keyboard
DO CASE
CASE mp1 = xbeK_CTRL_A // mark ALL in MLE7/SLE, target object is referred to in oXbp
cType := oXbp:className()
IF cType = "XbpSLE" .OR. cType = "XbpMLE"
nChars := Len(oXbp:editBuffer())
nChars := Max(nChars, 1)
oXbp:setMarked({1, nChars})
ELSE
oXbp:handleEvent(nEvent, mp1, mp2)
ENDIF
CASE mp1 = xbeK_ALT_A // AUTO publish, target object is XbpPushButton from TabPage
ProcessAltCommand(nEvent, mp1, mp2, oXbp)
...
OTHERWISE
oXbp:handleEvent(nEvent, mp1, mp2)
ENDCASE
OTHERWISE
oXbp:handleEvent(nEvent, mp1, mp2)
ENDCASE
END
Kommen wir zur Struktur des Dialogs:
Code: Alles auswählen
XbpDialog()
+---> :drawingArea
+---> XbpTabPage
+---> XbpStatic
+---> Xbase-Part
Um das Xbase-Part zu ermitteln, zu dem der Fokus gehen soll, gehe ich in ProcessAltCommand() von oXbp aus und hole mir solange über :setParent() den Parent, bis ich auf ein XbpIWindow stosse (ich fange ab, dass oXbp bereits das XbpIWindow sein könnte). Meine Annahme ist, dass es sich dabei um die :drawingArea meines XbpDialog handelt.
Danach arbeite ich rekursiv die :childList() ab, bis ich das Xbase-Part finde, dem der Fokus übergeben werden soll. Die Xbase-Parts enthalten eine Kennzeichnung (abgeleitete Klassen), anhand derer das korrekte Xbase-Part identifiziert wird.
Auf dem Weg durch die :childList()s ignoriere ich alle XbpTabPage, die :minimized sind (in diesem Fall ist der Aufbau xbpTabPage identisch, und den Fokus soll das entsprechende Xbase-Part auf der maximierten XbpTabPage erhalten).
Von der Geschwindigkeit her ist das akzeptabel, aber ich frage mich, ob es eventuell einen eleganteren Weg gibt, das entsprechende Xbase-Part zu lokalisieren.