Writer Editor Fenster aktiv lassen bei Dialogaufruf

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

Moderator: Moderatoren

Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von Frieder D. »

Hallo rocky_b

Das was du willst, ist mit einem vorgefertigten Dialog leider nicht möglich.
Wenn du den Dialog allerdings zur Laufzeit erzeugst, ist es möglich.

Am einfachsten wäre es, wenn du ein Dokument mit deinem Dialog, und den Makros hoch lädst. (Vertrauliche Daten vorher entfernen!)
Dann kann ich dir den Dialog nachbauen, so dass er zur Laufzeit erzeugt wird, und das gewünschte Verhalten hat.


Gruß Frieder
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von F3K Total »

Hallo Frieder,
das hört sich sehr interessant an.
Ich habe bisher vergeblich versucht, meinem Dialog in der Extension MMove (siehe unten) dieses Verhalten beizubringen.
Da wird auch ein Dialog zur Laufzeit erzeugt.
Vielleicht kannst Du mir da einen Tip geben?

Beste Grüße von Rik
Zuletzt geändert von F3K Total am Mi, 16.05.2012 23:25, insgesamt 1-mal geändert.
Karolus
********
Beiträge: 7443
Registriert: Mo, 02.01.2006 19:48

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von Karolus »

Hallo
Ich habe bis vergeblich versucht, meinem Dialog in der Extension MMove (siehe unten) dieses Verhalten beizubringen.
mri ( odlgModel ) zeigt eine Eigenschaft .DesktopAsParent → False

folglich sollte es mit True klappen ?
  • ...
    With odlgModel

    ...
    .setPropertyValue("DesktopAsParent", True )
    End With
    ...
Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von DPunch »

Servus

Verstehe ich gerade etwas fundamental falsch oder geht es um das schlichte setVisible vs execute bei Dialogen?
Wenn es tatsächlich darum gehen sollte, dann bietet das Forum reichlich Futter für non-modale Dialoge.
Karolus
********
Beiträge: 7443
Registriert: Mo, 02.01.2006 19:48

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von Karolus »

Hallo
Es geht darum gleichzeitig zum bedienbaren Dialog im geöffneten Dok selbst editieren zu können - geht das im Falle http://extensions.openoffice.org/de/project/MMove mit .setVisible(1) alleine ?

Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von Frieder D. »

Hallo

Ich habe mir die Extension gerade heruntergeladen, und den Code überflogen.
ich weiß zwar noch nicht, wie man die Extension benutzen kann, aber ich denke ich weiß,
wie man den Code ändern muss, um das gewünschte Ergebnis zu erhalten.

Es müssen 3 sachen geändert werden, damit es geht:

1. "odlg.execute" muss durch "odlg.setVisible(True)" ersetzt werden.

2. es muss eine Subroutine geschrieben werden, die den Dialog wieder schließt.
hierbei muss "odlg.endexecute" durch
"

Code: Alles auswählen

odlg.setVisible(False) ' Dialog wird unsichtbar
odlg.dispose() ' dialog wird aus dem speicher entfernt.
" ersetzt werden.
dieses Sub muss über einen Listener mit dem dem Klicken auf das schließen-Kreutz, oder einem extra schließen-Button verknüpft werden.
(solange ein Dialog nicht mit .execute aufgerufen wir, bleibt das Kreutz zum schließen ohne Funktion.
ich weiß nicht, ob man auf das Kreutz einen Listener setzen kann. Falls nicht, muss man einen weiteren Button einfügen.)

3. "private odlg as object" muss durch "global odlg as object" ersetzt werden,
da nur globale Variablen auch nach dem beenden einer Routine noch erhalten bleiben.
(andernfalls kann der Dialog nicht mehr geschlossen werden.)

Ich werde es mir morgen genauer ansehen.

Gruß Frieder
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von F3K Total »

Hallo Karolus,
Karolus hat geschrieben:folglich sollte es mit True klappen ?
vielen Dank für den Tip, ich denke das ist der richtige Weg. So kann man die aktuelle Selektion während des Dialoges wechseln.
Leider verschwindet der Dialog beim Wechsel der Geometrie in den Hintergrund.
Bin noch nicht drauf gekommen, wie das zu verhindern ist, und für Tipps dankbar.

Hallo Frieder,
Setvisible hatte ich bereits versucht, damit war der Dialog zwar sichtbar, aber nicht bedienbar, wie Karolus schon geschrieben hat:
Karolus hat geschrieben:Es geht darum gleichzeitig zum bedienbaren Dialog im geöffneten Dok selbst editieren zu können ...


Beste Grüße von Rik
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von DPunch »

Servus
Karolus hat geschrieben:Es geht darum gleichzeitig zum bedienbaren Dialog im geöffneten Dok selbst editieren zu können
Ok, also doch richtig verstanden - zu dem Thema gibt es einige Threads hier und auch in den internationalen Foren - ich bin gerade selbst zu faul dazu, meine eigenen Antworten rauszusuchen - nonmodal, modal, dialog, irgendsowas als Suchbegriff.
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von F3K Total »

OK,
ich wollte schon schreiben es geht nicht ... aber dann, mit globalen Variablen und dem "com.sun.star.awt.XTopWindowListener" habe ich es hinbekommen.
Danke!
Werde wohl demnächst MMove 1.0.6 hochladen, mit der Möglichkeit, die Auswahl während des Dialoges zu wechseln.

Eine Frage bleibt noch:
Wie detektiere ich, das die Auswahl geändert wurde?
Der "com.sun.star.view.XSelectionChangeListener" reagiert auf jede Änderung in der Ansicht, auch wenn ich die Auswahl gar nicht ändere, sondern nur verschiebe. Hat da noch jemand eine Idee?

Beste Grüsse von Rik
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von Frieder D. »

Hallo Ric

ich habe dir den Code jetzt einmahl angepest.(bin nicht eher dazu gekommen.)
aber inzwischen scheinst du ja selber auf eine Lösung gekommen zu sein.
Da du deine Lösung geheim hältst, möchte ich meine vorstellen:

1. alle variablen, die du in verschiedenen Subs verwndest müssen als Globa deklariert werden:

Code: Alles auswählen

Global oNumSX as object
Global oNumSY as object 
Global oNumX as object
Global oNumY as object
Global oNumStep as object
Global X as double
Global Y as double
Global odlg as object
Global l as double
global dstep as double
global bThenth as boolean

(Vielleicht habe ich ein par zu viel umgestellt)
2. Damit es zu keinen Komplikationen führt, wenn man einen Dialog geöffnet hat, und einen weiteren öffnet, wird der alte zuerst geschlossen.:

Code: Alles auswählen

If  not isNull (odlg) then 
  if odlg.isVisible() Then
    odlg.setVisible(False)
    odlg.dispose
  end if
end if
3. Einen XTopWindowListener hinzugefügt, um den dialog auch wieder schlißen zu können:

Code: Alles auswählen

...
Dim oWindowsListener as Object
oWindowsListener = CreateUnoListener( "Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oWindowsListener)
..
'Diese Routinen werden von dem XTopWindowListener benötigt
Sub Win_windowClosing( oEvent ) 'Dialog schließen
    odlg.setVisible(False)
    odlg.dispose
End Sub 

Sub Win_disposing( ) 
End Sub 
Sub Win_windowOpened	( oEvent )
End sub 
Sub Win_windowClosed	( oEvent )
End sub  
Sub Win_windowMinimized	( oEvent )
End sub
Sub Win_windowNormalized	( oEvent )
End sub 
Sub Win_windowActivated	( oEvent )
End sub 
Sub Win_windowDeactivated ( oEvent )
End sub
4. "odlg.execute" in "odlg.setVisible(True)" umgewandelt.

Und hier die komplette Lösung:

Code: Alles auswählen

REM  *****  BASIC  *****
Global oNumSX as object
Global oNumSY as object 
Global oNumX as object
Global oNumY as object
Global oNumStep as object
Global X as double
Global Y as double
Global odlg as object
Global l as double
global dstep as double
global bThenth as boolean

Sub S_Create_Dialog_MiniMove
   
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
if  dstep = 0 then dstep = 1
If  not isNull (odlg) then 
  if odlg.isVisible() Then
    odlg.setVisible(False)
    odlg.dispose
  end if
end if
osel = stardesktop.currentcomponent.currentselection
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then
  if not osel.supportsService("com.sun.star.text.BaseFrame") then
    msgbox ("Please select"+chr(13)+"→ shape"+chr(13)+"→ picture"+chr(13)+"→ frame"+chr(13)+"→ floating frame"+chr(13)+"→ control",64,"MMove")
    exit sub
  endif
endif

if osel.supportsService("com.sun.star.drawing.ShapeCollection") then

	opos = osel(0).Position
	oSize = osel(0).Size
	SX=oSize.Width
	SY=oSize.Height
	X=opos.X
	Y=opos.Y
	
	X= runden(X/100)
	Y= runden(Y/100)
	SX= runden(SX/100)
	SY= runden(SY/100)
	opos.X = X*100
	opos.Y = Y*100
	oSize.Width = SX*100
	oSize.Height = SY*100
	'set position on 1mm grid
	osel(0).Position = opos
	

else

	X = osel.HoriOrientPosition
	Y = osel.VertOrientPosition
	oSize = osel.Size
	SX=oSize.Width
	SY=oSize.Height
	X= runden(X/100)
	Y= runden(Y/100)
	SX= runden(SX/100)
	SY= runden(SY/100)
	osel.HoriOrientPosition = X*100
	osel.VertOrientPosition = Y*100
	oSize.Width = SX*100
	oSize.Height = SY*100

endif

REM ***** Initialisierung der Eigenschaften des Dialogs
odlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")

With odlgModel
	.setPropertyValue("PositionX", 320)
	.setPropertyValue("PositionY", 111 )
	.setPropertyValue("FontName", Font)
	.setPropertyValue("Width", 82)
	.setPropertyValue("Height", 76)
	.setPropertyValue("Title", "MiniMove")
	.setPropertyValue("Name", "DLGMove")
	'.setPropertyValue("DesktopAsParent", True )
End With
       
odlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
       
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "X")
	.setPropertyValue("Name", "lblSX")
	.setPropertyValue("PositionX", 2)
	.setPropertyValue("PositionY", 11)
	.setPropertyValue("Height",11)
	.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblSX", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "Y")
	.setPropertyValue("Name", "lblSY")
	.setPropertyValue("PositionX", 76)
	.setPropertyValue("PositionY", 11)
	.setPropertyValue("Height",11)
	.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblSY", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "X")
	.setPropertyValue("Name", "lblX")
	.setPropertyValue("PositionX", 2)
	.setPropertyValue("PositionY", 57)
	.setPropertyValue("Height",11)
	.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblX", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "Y")
	.setPropertyValue("Name", "lblY")
	.setPropertyValue("PositionX", 76)
	.setPropertyValue("PositionY", 57)
	.setPropertyValue("Height",11)
	.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblY", oMod)


REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "Size")
	.setPropertyValue("Name", "lblSize")
	.setPropertyValue("PositionX", 8)
	.setPropertyValue("PositionY", 4)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width",20)
	.setPropertyValue("FontHeight",7)
End With       
odlgModel.insertByName("lblSize", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "[mm]")
	.setPropertyValue("Name", "lblSmm")
	.setPropertyValue("PositionX", 54)
	.setPropertyValue("PositionY", 4)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width", 50)
	.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblSmm", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "Step")
	.setPropertyValue("Name", "lblStep")
	.setPropertyValue("PositionX", 31)
	.setPropertyValue("PositionY", 24)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width", 23)
	.setPropertyValue("FontHeight",7)
End With       
odlgModel.insertByName("lblStep", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "Position")
	.setPropertyValue("Name", "lblPosition")
	.setPropertyValue("PositionX", 8)
	.setPropertyValue("PositionY", 50)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width", 23)
	.setPropertyValue("FontHeight",7)
End With       
odlgModel.insertByName("lblPosition", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "[mm]")
	.setPropertyValue("Name", "lblPmm")
	.setPropertyValue("PositionX", 54)
	.setPropertyValue("PositionY", 50)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width", 50)
	.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblPmm", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "made by rikhustede.de")
	.setPropertyValue("Name", "lblmadeby")
	.setPropertyValue("PositionX", 34)
	.setPropertyValue("PositionY", 70)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width", 50)
	.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblmadeby", oMod)

REM ********** Optionsbuttons erzeugen
dim s_buttons(3,4) as variant
s_buttons(0,1)="↑"
s_buttons(0,2)="→"
s_buttons(0,3)="↓"
s_buttons(0,4)="←"

s_buttons(1,1)=31
s_buttons(1,2)=54
s_buttons(1,3)=31
s_buttons(1,4)=8
  
s_buttons(2,1)=4
s_buttons(2,2)=27
s_buttons(2,3)=50
s_buttons(2,4)=27

s_buttons(3,1)="Y - 100"
s_buttons(3,2)="X + 100"
s_buttons(3,3)="Y + 100"
s_buttons(3,4)="X - 100"

       
for i=1 to 4
 oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
 With oMod
	 .setPropertyValue("Label", s_buttons(0,i))
	 .setPropertyValue("Name", "cmd"+i)
	 .setPropertyValue("PositionX", s_buttons(1,i))
	 .setPropertyValue("PositionY", s_buttons(2,i))
	 .setPropertyValue("Height", 20)
	 .setPropertyValue("Width", 20)
	 .setPropertyValue("Tag", s_buttons(3,i))
	 .setPropertyValue("FontHeight",18)
	 .setPropertyValue("FocusOnClick",false)
	 .setPropertyValue("Tabstop",false)
 End With
 odlgModel.insertByName("cmd"+i, oMod)
next i
       
      
REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
	.setPropertyValue("Name", "NumSX")
	.setPropertyValue("PositionX", 8)
	.setPropertyValue("PositionY", 10)
	.setPropertyValue("Height", 10)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Value", SX)
End With      
odlgModel.insertByName("NumSX", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
	.setPropertyValue("Name", "NumSY")
	.setPropertyValue("PositionX", 54)
	.setPropertyValue("PositionY", 10)
	.setPropertyValue("Height", 10)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Value", SY)
End With      
odlgModel.insertByName("NumSY", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
	.setPropertyValue("Name", "NumX")
	.setPropertyValue("PositionX", 8)
	.setPropertyValue("PositionY", 56)
	.setPropertyValue("Height", 10)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Value", X)
End With      
odlgModel.insertByName("NumX", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
	.setPropertyValue("Name", "NumY")
	.setPropertyValue("PositionX", 54)
	.setPropertyValue("PositionY", 56)
	.setPropertyValue("Height", 10)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Value", Y)
End With      
odlgModel.insertByName("NumY", oMod)

REM **********numerisches Drehfeld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
	.setPropertyValue("Name", "NumStep")
	.setPropertyValue("PositionX", 31)
	.setPropertyValue("PositionY", 30)
	.setPropertyValue("Height", 12)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Value", dstep)
	.setPropertyValue("Spin", true)
	.setPropertyValue("ValueMax",20)
	.setPropertyValue("ValueMin",1)
End With  
odlgModel.insertByName("NumStep", oMod)

REM **********Checkbox erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlCheckBoxModel")
With oMod
	.setPropertyValue("Name", "ChkStep")
	.setPropertyValue("PositionX", 31)
	.setPropertyValue("PositionY", 42)
	.setPropertyValue("Height", 14)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Label", "1/10")
	.setPropertyValue("FontHeight",7)
End With

if bthenth = false then
 oMod.setPropertyValue("State", 0)
else
 oMod.setPropertyValue("State", 1)
endif

odlgModel.insertByName("ChkStep", oMod)

odlg.setModel(odlgModel)
      
oNumSX= odlg.getcontrol("NumSX")
oNumSY = odlg.getcontrol("NumSY")  
oNumX = odlg.getcontrol("NumX")
oNumY = odlg.getcontrol("NumY")
oNumStep = odlg.getcontrol("NumStep")
oChkStep = odlg.getcontrol("ChkStep")

oNumSX.DecimalDigits = 1
oNumSY.DecimalDigits = 1
oNumX.DecimalDigits = 1
oNumY.DecimalDigits = 1

Set_digits

      
REM ********** Listener für den Register erzeugen Button
ocmd_move_Listener = createUnoListener("cmd_move_", "com.sun.star.awt.XActionListener")
for i=1 to 4
	oControl = odlg.getControl("cmd"+i)
	oControl.addActionListener(ocmd_move_Listener)
next i

o_numS_focus_Listener = createUnoListener("numS_focus_", "com.sun.star.awt.XFocusListener")
oNumSX.addFocusListener(o_numS_focus_Listener)
oNumSY.addFocusListener(o_numS_focus_Listener)

o_num_focus_Listener = createUnoListener("num_focus_", "com.sun.star.awt.XFocusListener")
oNumX.addFocusListener(o_num_focus_Listener)
oNumY.addFocusListener(o_num_focus_Listener)

o_numS_key_Listener = createUnoListener("numS_key_", "com.sun.star.awt.XKeyListener")
oNumSX.addKeyListener(o_numS_key_Listener)
oNumSY.addKeyListener(o_numS_key_Listener)


o_num_key_Listener = createUnoListener("num_key_", "com.sun.star.awt.XKeyListener")
oNumX.addKeyListener(o_num_key_Listener)
oNumY.addKeyListener(o_num_key_Listener)

o_ChkStep_item_Listener = createUnoListener("chk_item_", "com.sun.star.awt.XItemListener")
oChkStep.addItemListener(o_ChkStep_item_Listener)

o_NumStep_text_Listener = createUnoListener("numstep_text_", "com.sun.star.awt.XTextListener")
oNumStep.addTextListener(o_NumStep_text_Listener)

      
REM ********** Mittels des Modells den Dialog anzeigen
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
odlg.createPeer(oWindow, null)
Dim oWindowsListener as Object
oWindowsListener = CreateUnoListener( "Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oWindowsListener)
odlg.setVisible(True)'execute=true

End Sub

Sub S_Create_Dialog_MicroMove
   
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
if  dstep = 0 then dstep = 1

If  not isNull (odlg) then  
  if odlg.isVisible() Then
    odlg.setVisible(False)
    odlg.dispose
  end if
end if
osel = stardesktop.currentcomponent.currentselection
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then
  if not osel.supportsService("com.sun.star.text.BaseFrame") then
    msgbox ("Please select"+chr(13)+"→ shape"+chr(13)+"→ picture"+chr(13)+"→ frame"+chr(13)+"→ floating frame"+chr(13)+"→ control",64,"MMove")
    exit sub
  endif
endif

if osel.supportsService("com.sun.star.drawing.ShapeCollection") then

opos = osel(0).Position
oSize = osel(0).Size
SX=oSize.Width
SY=oSize.Height
X=opos.X
Y=opos.Y
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
opos.X = X*100
opos.Y = Y*100
oSize.Width = SX*100
oSize.Height = SY*100
'set position on 1mm grid
osel(0).Position = opos


else

X = osel.HoriOrientPosition
Y = osel.VertOrientPosition
oSize = osel.Size
SX=oSize.Width
SY=oSize.Height
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
osel.HoriOrientPosition = X*100
osel.VertOrientPosition = Y*100
oSize.Width = SX*100
oSize.Height = SY*100

endif

REM ***** Initialisierung der Eigenschaften des Dialogs
odlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")

With odlgModel
.setPropertyValue("PositionX", 320)
.setPropertyValue("PositionY", 111 )
.setPropertyValue("FontName", Font)
.setPropertyValue("Width", 58)
.setPropertyValue("Height", 57)
.setPropertyValue("Title", "MicroMove")
.setPropertyValue("Name", "DLGMove")
.setPropertyValue("FontHeight",7)
'.setPropertyValue("DesktopAsParent", True )
End With
       
odlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
       
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblSX")
.setPropertyValue("PositionX", 1)
.setPropertyValue("PositionY", 7)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSX", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblSY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 7)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSY", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblX")
.setPropertyValue("PositionX", 1)
.setPropertyValue("PositionY", 40)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblX", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 40)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblY", oMod)


REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Size")
.setPropertyValue("Name", "lblSize")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 0)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 20)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblSize", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblSmm")
.setPropertyValue("PositionX", 42)
.setPropertyValue("PositionY", 0)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblSmm", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Step")
.setPropertyValue("Name", "lblStep")
.setPropertyValue("PositionX", 19)
.setPropertyValue("PositionY", 15)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 23)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblStep", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Position")
.setPropertyValue("Name", "lblPosition")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 33)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 15)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblPosition", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblPmm")
.setPropertyValue("PositionX", 42)
.setPropertyValue("PositionY", 33)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblPmm", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "made by rikhustede.de")
.setPropertyValue("Name", "lblmadeby")
.setPropertyValue("PositionX", 12)
.setPropertyValue("PositionY", 50)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblmadeby", oMod)

REM ********** Optionsbuttons erzeugen
dim s_buttons(3,4) as variant

s_buttons(0,1)="↑"
s_buttons(0,2)="→"
s_buttons(0,3)="↓"
s_buttons(0,4)="←"

s_buttons(1,1)=23
s_buttons(1,2)=40
s_buttons(1,3)=23
s_buttons(1,4)=6
  
s_buttons(2,1)=5
s_buttons(2,2)=22
s_buttons(2,3)=38
s_buttons(2,4)=22

s_buttons(3,1)="Y - 100"
s_buttons(3,2)="X + 100"
s_buttons(3,3)="Y + 100"
s_buttons(3,4)="X - 100"

       
for i=1 to 4
 oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
 With oMod
 .setPropertyValue("Label", s_buttons(0,i))
 .setPropertyValue("Name", "cmd"+i)
 .setPropertyValue("PositionX", s_buttons(1,i))
 .setPropertyValue("PositionY", s_buttons(2,i))
 .setPropertyValue("Height", 12)
 .setPropertyValue("Width", 12)
 .setPropertyValue("Tag", s_buttons(3,i))
 .setPropertyValue("FontHeight",14)
 .setPropertyValue("FocusOnClick",false)
 .setPropertyValue("Tabstop",false)
 End With
 odlgModel.insertByName("cmd"+i, oMod)
next i
       
      
REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSX")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 6)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", SX)
End With      
odlgModel.insertByName("NumSX", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSY")
.setPropertyValue("PositionX", 38)
.setPropertyValue("PositionY", 6)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", SY)
End With      
odlgModel.insertByName("NumSY", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumX")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 39)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", X)
End With      
odlgModel.insertByName("NumX", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumY")
.setPropertyValue("PositionX", 38)
.setPropertyValue("PositionY", 39)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", Y)
End With      
odlgModel.insertByName("NumY", oMod)

REM **********numerisches Drehfeld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumStep")
.setPropertyValue("PositionX", 19)
.setPropertyValue("PositionY", 21)

.setPropertyValue("Height", 10)
.setPropertyValue("Width", 21)
.setPropertyValue("Value", dStep)
.setPropertyValue("Spin", true)
.setPropertyValue("ValueMax",9)
.setPropertyValue("ValueMin",1)
End With  
odlgModel.insertByName("NumStep", oMod)

REM **********Checkbox erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlCheckBoxModel")
With oMod
.setPropertyValue("Name", "ChkStep")
.setPropertyValue("PositionX", 22)
.setPropertyValue("PositionY", 31)
.setPropertyValue("Height", 12)
.setPropertyValue("Width", 20)
.setPropertyValue("Label", "1/10")
.setPropertyValue("FontHeight",6)
End With

if bthenth = false then
 oMod.setPropertyValue("State", 0)
else
 oMod.setPropertyValue("State", 1)
endif

odlgModel.insertByName("ChkStep", oMod)

odlg.setModel(odlgModel)

          
oNumSX= odlg.getcontrol("NumSX")
oNumSY = odlg.getcontrol("NumSY")  
oNumX = odlg.getcontrol("NumX")
oNumY = odlg.getcontrol("NumY")
oNumStep=odlg.getcontrol("NumStep")
oChkStep = odlg.getcontrol("ChkStep")

oNumSX.DecimalDigits = 1
oNumSY.DecimalDigits = 1
oNumX.DecimalDigits = 1
oNumY.DecimalDigits = 1

Set_digits
       
REM ********** Listener für den Register erzeugen Button
ocmd_move_Listener = createUnoListener("cmd_move_", "com.sun.star.awt.XActionListener")
for i=1 to 4
oControl = odlg.getControl("cmd"+i)
oControl.addActionListener(ocmd_move_Listener)
next i

o_numS_focus_Listener = createUnoListener("numS_focus_", "com.sun.star.awt.XFocusListener")
oNumSX.addFocusListener(o_numS_focus_Listener)
oNumSY.addFocusListener(o_numS_focus_Listener)

o_num_focus_Listener = createUnoListener("num_focus_", "com.sun.star.awt.XFocusListener")
oNumX.addFocusListener(o_num_focus_Listener)
oNumY.addFocusListener(o_num_focus_Listener)

o_numS_key_Listener = createUnoListener("numS_key_", "com.sun.star.awt.XKeyListener")
oNumSX.addKeyListener(o_numS_key_Listener)
oNumSY.addKeyListener(o_numS_key_Listener)


o_num_key_Listener = createUnoListener("num_key_", "com.sun.star.awt.XKeyListener")
oNumX.addKeyListener(o_num_key_Listener)
oNumY.addKeyListener(o_num_key_Listener)

o_ChkStep_item_Listener = createUnoListener("chk_item_", "com.sun.star.awt.XItemListener")
oChkStep.addItemListener(o_ChkStep_item_Listener)

o_NumStep_text_Listener = createUnoListener("numstep_text_", "com.sun.star.awt.XTextListener")
oNumStep.addTextListener(o_NumStep_text_Listener)
       
REM ********** Mittels des Modells den Dialog anzeigen
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
odlg.createPeer(oWindow, null)
Dim oWindowsListener as Object
oWindowsListener = CreateUnoListener( "Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oWindowsListener)
odlg.setVisible(True)'execute=true

End Sub

sub moveshape(oEv)

dim sTag as string
'dim a()
dstep = odlg.getcontrol("NumStep").value
l= 100 * dstep
osel = Thiscomponent.currentselection
 a = split(oEv.Source.Model.Tag," ")
 if a(0) = "X" then
  if a(1) = "-" then
   dx = -l
  else
   dx = l
  endif
   dy = 0
 else
   dx = 0
   if a(1) = "-" then
    dy = -l
   else
    dy = l
   endif
 endif
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
 opos = osel(0).Position
 X = opos.X+dx
 y = opos.Y+dy
 opos.X = X
 opos.Y = Y
 osel(0).Position = opos
 oNumX.Text=runden(X/100)
 oNumY.Text=runden(Y/100)
else
 X = osel.HoriOrientPosition+dx
 Y = osel.VertOrientPosition+dy
 osel.HoriOrientPosition = X
 osel.VertOrientPosition = Y
 oNumX.Text=runden(X/100)
 oNumY.Text=runden(Y/100)
endif
set_document_modified
end sub


Sub Set_step
oChkStep = odlg.getcontrol("ChkStep")
if oChkStep.state = 0 then
 bThenth = false
 set_digits
else
 bThenth = true
 set_digits
endif

sStep = replace(odlg.getcontrol("NumStep").Text,",",".")
dstep = sStep
odlg.getcontrol("NumStep").value = dstep
end sub

sub Set_digits
if bThenth = false then
  with oNumStep
    .DecimalDigits = 0
    .SpinSize = 1
    .model.ValueMax = 20
    .model.ValueMin = 1
  end with
else
  with oNumStep
    .DecimalDigits = 1
    .SpinSize = 0.1
    .model.ValueMax = 9.9
    .model.ValueMin = 0.1
  end with
endif
end Sub

Sub Set_Position
On Error Goto ErrorHandler
dim doX as Integer
dim doY as Integer
osel = Thiscomponent.currentselection
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
opos = osel(0).Position
doX = oNumX.Text
doX = doX*100
doY = oNumY.Text
doY = doY*100
opos.X = doX
opos.Y = doY
osel(0).Position = opos
else
doX = oNumX.Text
doX = doX*100
doY = oNumY.Text
doY = doY*100
osel.HoriOrientPosition = doX
osel.VertOrientPosition = doY
endif
ErrorHandler:
set_document_modified
end sub

Sub Set_Size
On Error Goto ErrorHandler
dim SoX as Integer
dim SoY as Integer
osel = Thiscomponent.currentselection
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
oSize = osel(0).Size
SoX = oNumSX.Text
SoX = SoX*100
SoY = oNumSY.Text
SoY = SoY*100
oSize.Width = SoX
oSize.Height = SoY
osel(0).Size = oSize
else
oSize = osel.Size
SoX = oNumSX.Text
SoX = SoX*100
SoY = oNumSY.Text
SoY = SoY*100
oSize.Width = SoX
oSize.Height = SoY
osel.Size = oSize
endif
ErrorHandler:
set_document_modified
end sub

sub set_document_modified
thiscomponent.modified = true
end sub

Function runden(dblZahl as double, optional iStellen as integer) as double
' Funktion rundet eine Zahl (dblZahl) auf die angegebene Anzahl von Stellen (iStellen)
' Angabe der Stellenanzahl optional (Standard=0)
   dim dblTmp as double, lngTmp as Long
   iStellen = 1
   dblTmp = dblZahl * 10^iStellen
   lngTmp = CLng(dblTmp)
   dblTmp = CDbl(lngTmp) / 10^iStellen
   runden = dblTmp
end Function

REM ***** Die Aktion des Listeners für die Buttons
Sub cmd_move_actionPerformed(oEv)
moveshape(oEv)
end sub
    
Sub cmd_move_disposing(oEv)
End Sub

REM ***** Listeners für die NumericFields
Sub numS_focus_focusLost(oEv)
Set_Size
end sub

Sub numS_focus_focusGained(oEv)
end sub

    
Sub numS_focus_disposing(oEv)
End Sub

sub numS_key_keyPressed(oEv)
End Sub

sub numS_key_keyReleased(oEv)
If (oEv.KeyCode = 1280) Then Set_Size
End Sub
    
Sub numS_key_disposing(oEv)
End Sub

Sub num_focus_focusLost(oEv)
Set_Position
end sub

Sub num_focus_focusGained(oEv)
end sub

    
Sub num_focus_disposing(oEv)
End Sub

 

sub num_key_keyPressed(oEv)
End Sub

sub num_key_keyReleased(oEv)
If (oEv.KeyCode = 1280) Then Set_Position
End Sub
    
Sub num_key_disposing(oEv)
End Sub

Sub chk_item_itemStateChanged (oEv)
Set_step
end sub

Sub chk_item_disposing(oEv)
end sub

sub numstep_text_textChanged
Set_step
end sub

sub numstep_text_disposing(oEv)
end sub

'Diese Routinen werden von dem XTopWindowListener benötigt
Sub Win_windowClosing( oEvent ) 'Dialog schließen
    odlg.setVisible(False)
    odlg.dispose
End Sub 

Sub Win_disposing( ) 
End Sub 
Sub Win_windowOpened	( oEvent )
End sub 
Sub Win_windowClosed	( oEvent )
End sub  
Sub Win_windowMinimized	( oEvent )
End sub
Sub Win_windowNormalized	( oEvent )
End sub 
Sub Win_windowActivated	( oEvent )
End sub 
Sub Win_windowDeactivated ( oEvent )
End sub
    
Grüße Frieder
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von Frieder D. »

Hallo Ric

zu deiner frage mit dem Listener:
Eine Frage bleibt noch:
Wie detektiere ich, das die Auswahl geändert wurde?
Der "com.sun.star.view.XSelectionChangeListener" reagiert auf jede Änderung in der Ansicht, auch wenn ich die Auswahl gar nicht ändere, sondern nur verschiebe. Hat da noch jemand eine Idee?
Ich würde das nicht über einen Listener kontrollieren, da dass zu viele Resources vernichtet, und zu aufwendig ist.
das Einfachst, und Effektivste ist, wenn du einfach jedesmal bevor eine Verschiebung oder Änderung durch ein Makro gemacht wird abfragst, ob es sich um ein Grafikobjekt handelt.

Verbesserungsvorschläge zu deinem Code:

1. du solltest zur besseren Lesbarkeit Einrückungen verwenden:
z.b.:

Code: Alles auswählen

if isNull(object) then
  if not bVar then
    for i=0 to 100
       sVar(i)= "Name" & i
       oObject= was auch immer
       with oObject
         .Name="hallo"
         .Size=5
       end with
    next
  end if
end if
Verbesserungsvorschlag für das Tool:

Um die Funktionalität zu verbessern, wäre es doch sinnvoll, wenn man die Größe der Grafiken auch über Buttons verändern könnte.
ich empfinde es nicht unbedingt als sehr komfortabel, dies über die Textfelder zu machen.
dazu könnte man über "steps" eine zweite Ebene in den Dialog einbauen, zu der über ein Optionsfeld gewechselt werden kann.
Dort sollte dann auch die Option "Seitenverhältnis beibehalten" zur Verfügung stehen.

Gruß Frieder
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von F3K Total »

Hallo Frieder,
vielen Dank für den Code!

Es ist in der Tat so, dass wir die gleiche Lösung haben!
Frieder D. hat geschrieben:Da du deine Lösung geheim hältst, möchte ich meine vorstellen:
Habe und hatte ich nicht vor, da ich die Extension bald hochlade, dachte ich, es wäre noch nicht nötig den Code schon zu posten.

Das o.a. Problem bleibt leider noch, ich bin der Lösung nahe, aber noch nicht fertig:
Wenn ich die Auswahl ändere, sollen die aktuellen Positions- und Größeninformationen der neuen Auswahl in den Dialog übernommen werden.
Frieder D. hat geschrieben:Das Einfachste, und Effektivste ist, wenn du einfach jedesmal bevor eine Verschiebung oder Änderung durch ein Makro gemacht wird abfragst, ob es sich um ein Grafikobjekt handelt.
Ja, das stimmt, aber wie bekomme ich die aktuellen Positions- und Größeninformationen der neuen Auswahl dann in den Dialog?
Man möchte doch gerne wissen wo sich das Object befindet und wie groß es ist, bevor man es verschiebt.

Ich habe jetzt erstmal folgenden Code um die Änderung der Auswahl zu detektieren erzeugt:

Code: Alles auswählen

Sub S_Create_Dialog_MiniMove
   
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
if  dstep = 0 then dstep = 1

odoc = stardesktop.currentcomponent

ocontroller = odoc.currentcontroller
oSelectionChangeListener = createUnoListener("sel_", "com.sun.star.view.XSelectionChangeListener")
ocontroller.addSelectionChangeListener(oSelectionChangeListener)

.
.
.
end sub


sub sel_selectionChanged(ev)
osel = ev.source.Selection
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then exit sub
S_set_pos_Size(osel)
end sub
und die neue Sub (muß noch aufgeräumt werden):

Code: Alles auswählen

sub S_set_pos_size (osel)

if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then
if not osel.supportsService("com.sun.star.text.BaseFrame") then
msgbox ("Please select"+chr(13)+"→ shape"+chr(13)+"→ picture"+chr(13)+"→ frame"+chr(13)+"→ floating frame"+chr(13)+"→ control",64,"MMove")
exit sub
endif
endif


if osel.supportsService("com.sun.star.drawing.ShapeCollection") then

opos = osel(0).Position
oSize = osel(0).Size
SX=oSize.Width
SY=oSize.Height
X=opos.X
Y=opos.Y

X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)
opos.X = X*100
opos.Y = Y*100
oSize.Width = SX*100
oSize.Height = SY*100
'set position on 1mm grid
'osel(0).Position = opos
oNumSX.Text=SX
oNumSY.Text=SY
oNumX.Text=X
oNumY.Text=Y


else

X = osel.HoriOrientPosition
Y = osel.VertOrientPosition
oSize = osel.Size
SX=oSize.Width
SY=oSize.Height
X= runden(X/100)
Y= runden(Y/100)
SX= runden(SX/100)
SY= runden(SY/100)

oNumSX.Text=SX
oNumSY.Text=SY
oNumX.Text=X
oNumY.Text=Y

endif

end sub
Aber das funktioniert leider noch nicht richtig. Es ergeben sich unterschiedliche Lageinformationen, je nachdem ob ich im Writer oder in Calc arbeite.
Für Tipps bin ich dankbar.

Beste Grüße Rik
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von Frieder D. »

Hallo Rik

Ich habe es auch einmahl mit einem focus listener probiert, aber das Ergebnis ist nicht überzeugend.
versuche ich nun z.B. verschiedene Objekte in einem Dokument anzuklicken, so gelingt das nicht immer.

Außerdem liegt bei deinem Code so einiges im Argen.
Du solltest dir angewöhnen Variablen auch zu deklarieren.
meine Erfahrung hat gezeigt, je mehr Listener man in einem Makro unterbringt, desto instabiler wird es.
um dein Tool stabiler und besser zu machen, würde ich noch einmahl ganz von vorne anfangen.

Hier der Code:

Code: Alles auswählen

REM  *****  BASIC  *****
Global oNumSX as object
Global oNumSY as object 
Global oNumX as object
Global oNumY as object
Global oNumStep as object
Global X as double
Global Y as double
Global SX as double
Global SY as double
Global odlg as object
Global l as double
global dstep as double
global bThenth as boolean
Global oPreviousSel as object
Global oSelectionChangeListener 
Global ocontroller
Sub S_Create_Dialog_MiniMove
   
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
if  dstep = 0 then dstep = 1

If  not isNull (odlg) then 
  if odlg.isVisible() Then
    odlg.setVisible(False)
    odlg.dispose
  end if
end if
'oSelectionChangeListener entfernen
  if Not ( isEmpty (oSelectionChangeListener) or  IsNull(oSelectionChangeListener)) then 
    ocontroller.removeSelectionChangeListener(oSelectionChangeListener)
    oSelectionChangeListener=Null
  end if
'Göße und position des objekts bestimmen(Globale Variablen füllen),
' und überprüfen, ob es ein Grafikobject ist.
if not get_size_and_pos () then
    msgbox ("Please select"+chr(13)+"→ shape"+chr(13)+"→ picture"+chr(13)+"→ frame"+chr(13)+"→ floating frame"+chr(13)+"→ control",64,"MMove")
    exit sub
End if


REM ***** Initialisierung der Eigenschaften des Dialogs
odlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")

With odlgModel
	.setPropertyValue("PositionX", 320)
	.setPropertyValue("PositionY", 111 )
	.setPropertyValue("FontName", Font)
	.setPropertyValue("Width", 82)
	.setPropertyValue("Height", 76)
	.setPropertyValue("Title", "MiniMove")
	.setPropertyValue("Name", "DLGMove")
	'.setPropertyValue("DesktopAsParent", True )
End With
       
odlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
       
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "X")
	.setPropertyValue("Name", "lblSX")
	.setPropertyValue("PositionX", 2)
	.setPropertyValue("PositionY", 11)
	.setPropertyValue("Height",11)
	.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblSX", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "Y")
	.setPropertyValue("Name", "lblSY")
	.setPropertyValue("PositionX", 76)
	.setPropertyValue("PositionY", 11)
	.setPropertyValue("Height",11)
	.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblSY", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "X")
	.setPropertyValue("Name", "lblX")
	.setPropertyValue("PositionX", 2)
	.setPropertyValue("PositionY", 57)
	.setPropertyValue("Height",11)
	.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblX", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "Y")
	.setPropertyValue("Name", "lblY")
	.setPropertyValue("PositionX", 76)
	.setPropertyValue("PositionY", 57)
	.setPropertyValue("Height",11)
	.setPropertyValue("Width", 6)
End With
odlgModel.insertByName("lblY", oMod)


REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "Size")
	.setPropertyValue("Name", "lblSize")
	.setPropertyValue("PositionX", 8)
	.setPropertyValue("PositionY", 4)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width",20)
	.setPropertyValue("FontHeight",7)
End With       
odlgModel.insertByName("lblSize", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "[mm]")
	.setPropertyValue("Name", "lblSmm")
	.setPropertyValue("PositionX", 54)
	.setPropertyValue("PositionY", 4)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width", 50)
	.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblSmm", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "Step")
	.setPropertyValue("Name", "lblStep")
	.setPropertyValue("PositionX", 31)
	.setPropertyValue("PositionY", 24)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width", 23)
	.setPropertyValue("FontHeight",7)
End With       
odlgModel.insertByName("lblStep", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "Position")
	.setPropertyValue("Name", "lblPosition")
	.setPropertyValue("PositionX", 8)
	.setPropertyValue("PositionY", 50)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width", 23)
	.setPropertyValue("FontHeight",7)
End With       
odlgModel.insertByName("lblPosition", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "[mm]")
	.setPropertyValue("Name", "lblPmm")
	.setPropertyValue("PositionX", 54)
	.setPropertyValue("PositionY", 50)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width", 50)
	.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblPmm", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
	.setPropertyValue("Label", "made by rikhustede.de")
	.setPropertyValue("Name", "lblmadeby")
	.setPropertyValue("PositionX", 34)
	.setPropertyValue("PositionY", 70)
	.setPropertyValue("Height",8)
	.setPropertyValue("Width", 50)
	.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblmadeby", oMod)

REM ********** Optionsbuttons erzeugen
dim s_buttons(3,4) as variant
s_buttons(0,1)="↑"
s_buttons(0,2)="→"
s_buttons(0,3)="↓"
s_buttons(0,4)="←"

s_buttons(1,1)=31
s_buttons(1,2)=54
s_buttons(1,3)=31
s_buttons(1,4)=8
  
s_buttons(2,1)=4
s_buttons(2,2)=27
s_buttons(2,3)=50
s_buttons(2,4)=27

s_buttons(3,1)="Y - 100"
s_buttons(3,2)="X + 100"
s_buttons(3,3)="Y + 100"
s_buttons(3,4)="X - 100"

       
for i=1 to 4
 oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
 With oMod
	 .setPropertyValue("Label", s_buttons(0,i))
	 .setPropertyValue("Name", "cmd"+i)
	 .setPropertyValue("PositionX", s_buttons(1,i))
	 .setPropertyValue("PositionY", s_buttons(2,i))
	 .setPropertyValue("Height", 20)
	 .setPropertyValue("Width", 20)
	 .setPropertyValue("Tag", s_buttons(3,i))
	 .setPropertyValue("FontHeight",18)
	 .setPropertyValue("FocusOnClick",false)
	 .setPropertyValue("Tabstop",false)
 End With
 odlgModel.insertByName("cmd"+i, oMod)
next i
       
      
REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
	.setPropertyValue("Name", "NumSX")
	.setPropertyValue("PositionX", 8)
	.setPropertyValue("PositionY", 10)
	.setPropertyValue("Height", 10)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Value", SX)
End With      
odlgModel.insertByName("NumSX", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
	.setPropertyValue("Name", "NumSY")
	.setPropertyValue("PositionX", 54)
	.setPropertyValue("PositionY", 10)
	.setPropertyValue("Height", 10)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Value", SY)
End With      
odlgModel.insertByName("NumSY", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
	.setPropertyValue("Name", "NumX")
	.setPropertyValue("PositionX", 8)
	.setPropertyValue("PositionY", 56)
	.setPropertyValue("Height", 10)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Value", X)
End With      
odlgModel.insertByName("NumX", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
	.setPropertyValue("Name", "NumY")
	.setPropertyValue("PositionX", 54)
	.setPropertyValue("PositionY", 56)
	.setPropertyValue("Height", 10)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Value", Y)
End With      
odlgModel.insertByName("NumY", oMod)

REM **********numerisches Drehfeld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
	.setPropertyValue("Name", "NumStep")
	.setPropertyValue("PositionX", 31)
	.setPropertyValue("PositionY", 30)
	.setPropertyValue("Height", 12)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Value", dstep)
	.setPropertyValue("Spin", true)
	.setPropertyValue("ValueMax",20)
	.setPropertyValue("ValueMin",1)
End With  
odlgModel.insertByName("NumStep", oMod)

REM **********Checkbox erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlCheckBoxModel")
With oMod
	.setPropertyValue("Name", "ChkStep")
	.setPropertyValue("PositionX", 31)
	.setPropertyValue("PositionY", 42)
	.setPropertyValue("Height", 14)
	.setPropertyValue("Width", 20)
	.setPropertyValue("Label", "1/10")
	.setPropertyValue("FontHeight",7)
End With

if bthenth = false then
 oMod.setPropertyValue("State", 0)
else
 oMod.setPropertyValue("State", 1)
endif

odlgModel.insertByName("ChkStep", oMod)

odlg.setModel(odlgModel)
      
oNumSX= odlg.getcontrol("NumSX")
oNumSY = odlg.getcontrol("NumSY")  
oNumX = odlg.getcontrol("NumX")
oNumY = odlg.getcontrol("NumY")
oNumStep = odlg.getcontrol("NumStep")
oChkStep = odlg.getcontrol("ChkStep")

oNumSX.DecimalDigits = 1
oNumSY.DecimalDigits = 1
oNumX.DecimalDigits = 1
oNumY.DecimalDigits = 1

Set_digits

      
REM ********** Listener für den Register erzeugen Button
ocmd_move_Listener = createUnoListener("cmd_move_", "com.sun.star.awt.XActionListener")
for i=1 to 4
	oControl = odlg.getControl("cmd"+i)
	oControl.addActionListener(ocmd_move_Listener)
next i

o_numS_focus_Listener = createUnoListener("numS_focus_", "com.sun.star.awt.XFocusListener")
oNumSX.addFocusListener(o_numS_focus_Listener)
oNumSY.addFocusListener(o_numS_focus_Listener)

o_num_focus_Listener = createUnoListener("num_focus_", "com.sun.star.awt.XFocusListener")
oNumX.addFocusListener(o_num_focus_Listener)
oNumY.addFocusListener(o_num_focus_Listener)

o_numS_key_Listener = createUnoListener("numS_key_", "com.sun.star.awt.XKeyListener")
oNumSX.addKeyListener(o_numS_key_Listener)
oNumSY.addKeyListener(o_numS_key_Listener)


o_num_key_Listener = createUnoListener("num_key_", "com.sun.star.awt.XKeyListener")
oNumX.addKeyListener(o_num_key_Listener)
oNumY.addKeyListener(o_num_key_Listener)

o_ChkStep_item_Listener = createUnoListener("chk_item_", "com.sun.star.awt.XItemListener")
oChkStep.addItemListener(o_ChkStep_item_Listener)

o_NumStep_text_Listener = createUnoListener("numstep_text_", "com.sun.star.awt.XTextListener")
oNumStep.addTextListener(o_NumStep_text_Listener)

      
REM ********** Mittels des Modells den Dialog anzeigen
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
odlg.createPeer(oWindow, null)
Dim oWindowsListener as Object
oWindowsListener = CreateUnoListener( "Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oWindowsListener)
odlg.setVisible(True)
odoc = stardesktop.currentcomponent
ocontroller = odoc.currentcontroller
oSelectionChangeListener = createUnoListener("sel_", "com.sun.star.view.XSelectionChangeListener")
ocontroller.addSelectionChangeListener(oSelectionChangeListener)
End Sub

Sub S_Create_Dialog_MicroMove
   
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
if  dstep = 0 then dstep = 1

If  not isNull (odlg) then  
  if odlg.isVisible() Then
    odlg.setVisible(False)
    odlg.dispose
  end if
end if
'oSelectionChangeListener entfernen
  if Not ( isEmpty (oSelectionChangeListener) or  IsNull(oSelectionChangeListener)) then 
    ocontroller.removeSelectionChangeListener(oSelectionChangeListener)
    oSelectionChangeListener=Null
  end if
'Göße und position des objekts bestimmen(Globale Variablen füllen),
' und überprüfen, ob es ein Grafikobject ist.
if not get_size_and_pos () then
    msgbox ("Please select"+chr(13)+"→ shape"+chr(13)+"→ picture"+chr(13)+"→ frame"+chr(13)+"→ floating frame"+chr(13)+"→ control",64,"MMove")
    exit sub
End if

REM ***** Initialisierung der Eigenschaften des Dialogs
odlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")

With odlgModel
.setPropertyValue("PositionX", 320)
.setPropertyValue("PositionY", 111 )
.setPropertyValue("FontName", Font)
.setPropertyValue("Width", 58)
.setPropertyValue("Height", 57)
.setPropertyValue("Title", "MicroMove")
.setPropertyValue("Name", "DLGMove")
.setPropertyValue("FontHeight",7)
'.setPropertyValue("DesktopAsParent", True )
End With
       
odlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
       
REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblSX")
.setPropertyValue("PositionX", 1)
.setPropertyValue("PositionY", 7)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSX", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblSY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 7)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblSY", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "X")
.setPropertyValue("Name", "lblX")
.setPropertyValue("PositionX", 1)
.setPropertyValue("PositionY", 40)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblX", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Y")
.setPropertyValue("Name", "lblY")
.setPropertyValue("PositionX", 54)
.setPropertyValue("PositionY", 40)
.setPropertyValue("Height",11)
.setPropertyValue("Width", 6)
.setPropertyValue("FontHeight",6)
End With
odlgModel.insertByName("lblY", oMod)


REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Size")
.setPropertyValue("Name", "lblSize")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 0)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 20)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblSize", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblSmm")
.setPropertyValue("PositionX", 42)
.setPropertyValue("PositionY", 0)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblSmm", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Step")
.setPropertyValue("Name", "lblStep")
.setPropertyValue("PositionX", 19)
.setPropertyValue("PositionY", 15)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 23)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblStep", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "Position")
.setPropertyValue("Name", "lblPosition")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 33)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 15)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblPosition", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "[mm]")
.setPropertyValue("Name", "lblPmm")
.setPropertyValue("PositionX", 42)
.setPropertyValue("PositionY", 33)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblPmm", oMod)

REM ********** Textlabel erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod
.setPropertyValue("Label", "made by rikhustede.de")
.setPropertyValue("Name", "lblmadeby")
.setPropertyValue("PositionX", 12)
.setPropertyValue("PositionY", 50)
.setPropertyValue("Height",8)
.setPropertyValue("Width", 50)
.setPropertyValue("FontHeight",6)
End With       
odlgModel.insertByName("lblmadeby", oMod)

REM ********** Optionsbuttons erzeugen
dim s_buttons(3,4) as variant

s_buttons(0,1)="↑"
s_buttons(0,2)="→"
s_buttons(0,3)="↓"
s_buttons(0,4)="←"

s_buttons(1,1)=23
s_buttons(1,2)=40
s_buttons(1,3)=23
s_buttons(1,4)=6
  
s_buttons(2,1)=5
s_buttons(2,2)=22
s_buttons(2,3)=38
s_buttons(2,4)=22

s_buttons(3,1)="Y - 100"
s_buttons(3,2)="X + 100"
s_buttons(3,3)="Y + 100"
s_buttons(3,4)="X - 100"

       
for i=1 to 4
 oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
 With oMod
 .setPropertyValue("Label", s_buttons(0,i))
 .setPropertyValue("Name", "cmd"+i)
 .setPropertyValue("PositionX", s_buttons(1,i))
 .setPropertyValue("PositionY", s_buttons(2,i))
 .setPropertyValue("Height", 12)
 .setPropertyValue("Width", 12)
 .setPropertyValue("Tag", s_buttons(3,i))
 .setPropertyValue("FontHeight",14)
 .setPropertyValue("FocusOnClick",false)
 .setPropertyValue("Tabstop",false)
 End With
 odlgModel.insertByName("cmd"+i, oMod)
next i
       
      
REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSX")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 6)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", SX)
End With      
odlgModel.insertByName("NumSX", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumSY")
.setPropertyValue("PositionX", 38)
.setPropertyValue("PositionY", 6)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", SY)
End With      
odlgModel.insertByName("NumSY", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumX")
.setPropertyValue("PositionX", 6)
.setPropertyValue("PositionY", 39)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", X)
End With      
odlgModel.insertByName("NumX", oMod)

REM **********numerisches Feld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumY")
.setPropertyValue("PositionX", 38)
.setPropertyValue("PositionY", 39)
.setPropertyValue("Height", 10)
.setPropertyValue("Width", 15)
.setPropertyValue("Value", Y)
End With      
odlgModel.insertByName("NumY", oMod)

REM **********numerisches Drehfeld erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlNumericFieldModel")
With oMod
.setPropertyValue("Name", "NumStep")
.setPropertyValue("PositionX", 19)
.setPropertyValue("PositionY", 21)

.setPropertyValue("Height", 10)
.setPropertyValue("Width", 21)
.setPropertyValue("Value", dStep)
.setPropertyValue("Spin", true)
.setPropertyValue("ValueMax",9)
.setPropertyValue("ValueMin",1)
End With  
odlgModel.insertByName("NumStep", oMod)

REM **********Checkbox erzeugen       
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlCheckBoxModel")
With oMod
.setPropertyValue("Name", "ChkStep")
.setPropertyValue("PositionX", 22)
.setPropertyValue("PositionY", 31)
.setPropertyValue("Height", 12)
.setPropertyValue("Width", 20)
.setPropertyValue("Label", "1/10")
.setPropertyValue("FontHeight",6)
End With

if bthenth = false then
 oMod.setPropertyValue("State", 0)
else
 oMod.setPropertyValue("State", 1)
endif

odlgModel.insertByName("ChkStep", oMod)

odlg.setModel(odlgModel)

          
oNumSX= odlg.getcontrol("NumSX")
oNumSY = odlg.getcontrol("NumSY")  
oNumX = odlg.getcontrol("NumX")
oNumY = odlg.getcontrol("NumY")
oNumStep=odlg.getcontrol("NumStep")
oChkStep = odlg.getcontrol("ChkStep")

oNumSX.DecimalDigits = 1
oNumSY.DecimalDigits = 1
oNumX.DecimalDigits = 1
oNumY.DecimalDigits = 1

Set_digits
       
REM ********** Listener für den Register erzeugen Button
ocmd_move_Listener = createUnoListener("cmd_move_", "com.sun.star.awt.XActionListener")
for i=1 to 4
oControl = odlg.getControl("cmd"+i)
oControl.addActionListener(ocmd_move_Listener)
next i

o_numS_focus_Listener = createUnoListener("numS_focus_", "com.sun.star.awt.XFocusListener")
oNumSX.addFocusListener(o_numS_focus_Listener)
oNumSY.addFocusListener(o_numS_focus_Listener)

o_num_focus_Listener = createUnoListener("num_focus_", "com.sun.star.awt.XFocusListener")
oNumX.addFocusListener(o_num_focus_Listener)
oNumY.addFocusListener(o_num_focus_Listener)

o_numS_key_Listener = createUnoListener("numS_key_", "com.sun.star.awt.XKeyListener")
oNumSX.addKeyListener(o_numS_key_Listener)
oNumSY.addKeyListener(o_numS_key_Listener)


o_num_key_Listener = createUnoListener("num_key_", "com.sun.star.awt.XKeyListener")
oNumX.addKeyListener(o_num_key_Listener)
oNumY.addKeyListener(o_num_key_Listener)

o_ChkStep_item_Listener = createUnoListener("chk_item_", "com.sun.star.awt.XItemListener")
oChkStep.addItemListener(o_ChkStep_item_Listener)

o_NumStep_text_Listener = createUnoListener("numstep_text_", "com.sun.star.awt.XTextListener")
oNumStep.addTextListener(o_NumStep_text_Listener)
       
REM ********** Mittels des Modells den Dialog anzeigen
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
odlg.createPeer(oWindow, null)
Dim oWindowsListener as Object
oWindowsListener = CreateUnoListener( "Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oWindowsListener)
odlg.setVisible(True)'execute=true


oSelectionChangeListener = createUnoListener("sel_", "com.sun.star.view.XSelectionChangeListener")
ocontroller.addSelectionChangeListener(oSelectionChangeListener)

End Sub

sub moveshape(oEv)

dim sTag as string
'dim a()
dstep = odlg.getcontrol("NumStep").value
l= 100 * dstep
osel = Thiscomponent.currentselection
 a = split(oEv.Source.Model.Tag," ")
 if a(0) = "X" then
  if a(1) = "-" then
   dx = -l
  else
   dx = l
  endif
   dy = 0
 else
   dx = 0
   if a(1) = "-" then
    dy = -l
   else
    dy = l
   endif
 endif
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
 opos = osel(0).Position
 X = opos.X+dx
 y = opos.Y+dy
 opos.X = X
 opos.Y = Y
 osel(0).Position = opos
 oNumX.Text=runden(X/100)
 oNumY.Text=runden(Y/100)
else
 X = osel.HoriOrientPosition+dx
 Y = osel.VertOrientPosition+dy
 osel.HoriOrientPosition = X
 osel.VertOrientPosition = Y
 oNumX.Text=runden(X/100)
 oNumY.Text=runden(Y/100)
endif
thiscomponent.modified = true
end sub


Sub Set_step
oChkStep = odlg.getcontrol("ChkStep")
if oChkStep.state = 0 then
 bThenth = false
 set_digits
else
 bThenth = true
 set_digits
endif

sStep = replace(odlg.getcontrol("NumStep").Text,",",".")
dstep = sStep
odlg.getcontrol("NumStep").value = dstep
end sub

sub Set_digits
if bThenth = false then
  with oNumStep
    .DecimalDigits = 0
    .SpinSize = 1
    .model.ValueMax = 20
    .model.ValueMin = 1
  end with
else
  with oNumStep
    .DecimalDigits = 1
    .SpinSize = 0.1
    .model.ValueMax = 9.9
    .model.ValueMin = 0.1
  end with
endif
end Sub

Sub Set_Position
On Error Goto ErrorHandler
dim doX as Integer
dim doY as Integer
osel = Thiscomponent.currentselection
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
opos = osel(0).Position
doX = oNumX.Text
doX = doX*100
doY = oNumY.Text
doY = doY*100
opos.X = doX
opos.Y = doY
osel(0).Position = opos
else
doX = oNumX.Text
doX = doX*100
doY = oNumY.Text
doY = doY*100
osel.HoriOrientPosition = doX
osel.VertOrientPosition = doY
endif
ErrorHandler:
thiscomponent.modified = true
end sub

Sub Set_Size
On Error Goto ErrorHandler
dim SoX as Integer
dim SoY as Integer
osel = Thiscomponent.currentselection
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then
oSize = osel(0).Size
SoX = oNumSX.Text
SoX = SoX*100
SoY = oNumSY.Text
SoY = SoY*100
oSize.Width = SoX
oSize.Height = SoY
osel(0).Size = oSize
else
oSize = osel.Size
SoX = oNumSX.Text
SoX = SoX*100
SoY = oNumSY.Text
SoY = SoY*100
oSize.Width = SoX
oSize.Height = SoY
osel.Size = oSize
endif
ErrorHandler:
thiscomponent.modified = true
end sub


Function runden(dblZahl as double, optional iStellen as integer) as double
' Funktion rundet eine Zahl (dblZahl) auf die angegebene Anzahl von Stellen (iStellen)
' Angabe der Stellenanzahl optional (Standard=0)
   dim dblTmp as double, lngTmp as Long
   iStellen = 1
   dblTmp = dblZahl * 10^iStellen
   lngTmp = CLng(dblTmp)
   dblTmp = CDbl(lngTmp) / 10^iStellen
   runden = dblTmp
end Function

REM ***** Die Aktion des Listeners für die Buttons
Sub cmd_move_actionPerformed(oEv)
moveshape(oEv)
end sub
    
Sub cmd_move_disposing(oEv)
End Sub

REM ***** Listeners für die NumericFields
Sub numS_focus_focusLost(oEv)
Set_Size
end sub

Sub numS_focus_focusGained(oEv)
end sub

    
Sub numS_focus_disposing(oEv)
End Sub

sub numS_key_keyPressed(oEv)
End Sub

sub numS_key_keyReleased(oEv)
If (oEv.KeyCode = 1280) Then Set_Size
End Sub
    
Sub numS_key_disposing(oEv)
End Sub
'-------------------------------------------------

Sub num_focus_focusLost(oEv)
Set_Position
end sub

Sub num_focus_focusGained(oEv)
end sub

    
Sub num_focus_disposing(oEv)
End Sub

 

sub num_key_keyPressed(oEv)
End Sub

sub num_key_keyReleased(oEv)
If (oEv.KeyCode = 1280) Then Set_Position
End Sub
    
Sub num_key_disposing(oEv)
End Sub

Sub chk_item_itemStateChanged (oEv)
Set_step
end sub

Sub chk_item_disposing(oEv)
end sub

sub numstep_text_textChanged
Set_step
end sub

sub numstep_text_disposing(oEv)
end sub

'Diese Routinen werden von dem XTopWindowListener benötigt
Sub Win_windowClosing( oEvent ) 'Dialog schließen
  odlg.setVisible(False)
  odlg.dispose
  if Not ( isEmpty (oSelectionChangeListener) or  IsNull(oSelectionChangeListener)) then 
    ocontroller.removeSelectionChangeListener(oSelectionChangeListener)
    oSelectionChangeListener=Null
  end if
End Sub 

Sub Win_disposing( ) 
End Sub 
Sub Win_windowOpened	( oEvent )
End sub 
Sub Win_windowClosed	( oEvent )
End sub  
Sub Win_windowMinimized	( oEvent )
End sub
Sub Win_windowNormalized	( oEvent )
End sub 
Sub Win_windowActivated	( oEvent )
End sub 
Sub Win_windowDeactivated ( oEvent )
End sub

'--------------------------------------

Function get_size_and_pos () as boolean
Dim osel as object
Dim opos as object
Dim oSize as object
osel = stardesktop.currentcomponent.currentselection
oPreviousSel=osel
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then
  if not osel.supportsService("com.sun.star.text.BaseFrame") then
    get_size_and_pos=False
    exit function
  endif
endif


on Error goto errorhandler
if osel.supportsService("com.sun.star.drawing.ShapeCollection") then

	opos = osel(0).Position
	oSize = osel(0).Size
	SX=oSize.Width
	SY=oSize.Height
	X=opos.X
	Y=opos.Y
	
	X= runden(X/100)
	Y= runden(Y/100)
	SX= runden(SX/100)
	SY= runden(SY/100)
	opos.X = X*100
	opos.Y = Y*100
	oSize.Width = SX*100
	oSize.Height = SY*100
	'set position on 1mm grid
	osel(0).Position = opos
	

else

	X = osel.HoriOrientPosition
	Y = osel.VertOrientPosition
	oSize = osel.Size
	SX=oSize.Width
	SY=oSize.Height
	X= runden(X/100)
	Y= runden(Y/100)
	SX= runden(SX/100)
	SY= runden(SY/100)
	osel.HoriOrientPosition = X*100
	osel.VertOrientPosition = Y*100
	oSize.Width = SX*100
	oSize.Height = SY*100

endif
get_size_and_pos=True
Exit Function
errorhandler:
get_size_and_pos=False
end function

function Set_Numeric_Filds () as Boolean
if get_size_and_pos () Then
  oNumSX.Text= SX
  oNumSY.Text= SY
  oNumX.Text= X
  oNumY.Text= Y
  Set_Numeric_Filds = True
else
  Set_Numeric_Filds = False
end if
end function

sub sel_selectionChanged(ev)
osel = ev.source.Selection
if ismissing(osel) or not osel.supportsService("com.sun.star.drawing.ShapeCollection") then exit sub
Set_Numeric_Filds ()
end sub

Sub sel_disposing( ) 
End Sub
    
Gruß Frieder
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von F3K Total »

Hallo Frieder,
nochmal vielen Dank für deine Arbeit.
Hier ein paar Anmerkungen zu Deinen Anmerkungen:
Frieder D. hat geschrieben:1. du solltest zur besseren Lesbarkeit Einrückungen verwenden
Tja, da bin ich manchmal noch zu schlampig.
Frieder D. hat geschrieben:Um die Funktionalität zu verbessern, wäre es doch sinnvoll, wenn man die Größe der Grafiken auch über Buttons verändern könnte.
ich empfinde es nicht unbedingt als sehr komfortabel, dies über die Textfelder zu machen.
dazu könnte man über "steps" eine zweite Ebene in den Dialog einbauen, zu der über ein Optionsfeld gewechselt werden kann.
Dort sollte dann auch die Option "Seitenverhältnis beibehalten" zur Verfügung stehen.
Gute Ideen, allein, erstmal sollte die jetzige Version fehlerfrei laufen.
Frieder D. hat geschrieben:Außerdem liegt bei deinem Code so einiges im Argen.
Du solltest dir angewöhnen Variablen auch zu deklarieren.
meine Erfahrung hat gezeigt, je mehr Listener man in einem Makro unterbringt, desto instabiler wird es.
um dein Tool stabiler und besser zu machen, würde ich noch einmahl ganz von vorne anfangen.
Bis ich mit dem non-modalen Dialog angefangern habe, gabs keine Beschwerden.

So nun möchte ich mich wieder auf das Problem konzentrieren:
Wie schaffe ich es, dass die Änderung der Auswahl fehlerfrei bemerkt wird?
Ich habe festgestellt, das der "com.sun.star.view.XSelectionChangeListener" ungewöhlich reagiert.
Und zwar unterschiedlich.

Im Writer:
Wenn ich die Selektion mit der Maus von Shape 1 (Quellobjekt) nach Shape 2 (Zielobjekt) ändere, feuert er 3x.
1.) die Event.Source ist das Quellobject
2.) die Event.Source ist das Zielobject
3.) die Event.Source ist nochmal das Zielobject

Was ist da falsch?

In Calc:
Wenn ich die Selektion mit der Maus von Shape 1 (Quellobjekt) nach Shape 2 (Zielobjekt) ändere, feuert er 1x, wie es sein soll
1.) die Event.Source ist das Zielobject

In Calc funktioniert der Dialog einwandfrei, im Writer zeigt er oben angesproches Fehlverhalten:
Die Positioninformationen sind falsch.

Ich denke es hängt mit dem XSelectionChangeListener zusammen.

Beste Grüße von Rik
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Writer Editor Fenster aktiv lassen bei Dialogaufruf

Beitrag von F3K Total »

Hallo Frieder D.
die Version 1.0.6 von MMove steht jetzt online. Das Problem mit dem "XSelectionChangeListener" habe ich umgangen:
Mit einem MouseClickHandler. Als Grundlage habe ich Deinen Code von gestern verwendet, die von Dir eingeführten functions und Fehler-Tools sind also dabei.
Danke und Gruß Rik
Antworten