Makroprogrammierung: Ansicht Zoomfaktor

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

Moderator: Moderatoren

Frank Lauer
***
Beiträge: 88
Registriert: Mi, 30.07.2003 18:06
Wohnort: Wiesloch

Makroprogrammierung: Ansicht Zoomfaktor

Beitrag von Frank Lauer »

Hallo Zusammen,

ich will mir zwei Tasten basteln, mit denen ich den Zoomfaktor um je 1% erhöhen bzw. senken kann. Wenn ich ein Makro aufzeichne, dann erhalte ich folgenden Code (die Variablendeklerationen habe ich mal weggelassen):

args1(0).Name = "Zoom.Value"
args1(0).Value = 121
args1(1).Name = "Zoom.ValueSet"
args1(1).Value = 28703
args1(2).Name = "Zoom.Type"
args1(2).Value = 3

dispatcher.executeDispatch(document, ".uno:Zoom", "", 0, args1())

damit setze ich den Zoomfaktor dann auf 121%.

Ich würde jetzt gerne den derzeitigen Zoomfaktor auslesen und ihn dann einfach mit dem Makro ändern. Dummerweise habe ich keine Ahnung wie ich auf den Zoomfaktor zugreifen kann. Das Dispatcher Objeckt scheint mir eine Einbahnstraße und die API Refferenz von OOo ist da auch nicht gerade eine Hilfe.
OOo 2.1 , Win XP
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

Hallo Frank,

wie ich gelesen habe warst Du auf der user mailinglist erfolgreich. ICh wiederhole hier nur der vollständigkeithalber den Eintrag.

Code: Alles auswählen

Sub test
	Dim oOfficeDokument as Object
	oOfficeDokument = ThisComponent
	
	If oOfficeDokument.supportsService( _
		"com.sun.star.text.TextDocument" ) then
		MsgBox "Writer-Zoom: " & ThisComponent.CurrentController.ViewSettings.ZoomValue
	Elseif oOfficeDokument.supportsService( _
		"com.sun.star.sheet.SpreadsheetDocument" ) then
		MsgBox "Calc-Zoom: " & ThisComponent.CurrentController.ZoomValue
	Elseif oOfficeDokument.supportsService( _
		"com.sun.star.presentation.PresentationDocument" ) then
		MsgBox "Impress-Zoom: " & ThisComponent.CurrentController.ZoomValue
	Else
		MsgBox "Draw-Zoom: " & ThisComponent.CurrentController.ZoomValue
	End If	
End Sub
Achtung: Beim Writer gehts über den Umweg ViewSettings, während die anderen Dokument Zugriff direkt über den Controller gewähren.

Das ganz hab ich wie gesagt aus der deutschen User-Mailingliste, wo auf einen Artikel in der englischen dev-mailingslist verwiesen wird:
http://www.openoffice.org/servlets/Read ... stName=dev
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

Um zur Erhöhung des Zooms den Code des Macrogenerators nicht verwenden zu müssen, sieht das dann ungefähr so aus (nb: funktioniert der generierte Code für alle Dokumenten-Typen von OOo?):


Das Beispiel funktioniert für Writer, Calc, Impress und Draw-Dokumente:

Code: Alles auswählen

Sub ZoomErhoehen
	' Variable deklarieren
	Dim oOfficeDokument as Object
	Dim nZoom as Integer
	
	Const nZoomStep = 5
	Const nMaximalZoom = 500
	
	oOfficeDokument = ThisComponent
	
	If oOfficeDokument.supportsService( _
		"com.sun.star.text.TextDocument" ) then
		nZoom = oOfficeDokument.currentController.ViewSettings.ZoomValue
		If nZoom < nMaximalZoom Then
			oOfficeDokument.currentController._
				ViewSettings.ZoomValue = nZoom + nZoomStep
		End If 
	Elseif oOfficeDokument.supportsService( _
		"com.sun.star.sheet.SpreadsheetDocument" ) then
		nZoom = oOfficeDokument.currentController.ZoomValue
		If nZoom < nMaximalZoom Then
			oOfficeDokument.currentController._
				ZoomValue = nZoom + nZoomStep
		End If 
	Elseif oOfficeDokument.supportsService( _
		"com.sun.star.presentation.PresentationDocument" ) then
		nZoom = oOfficeDokument.currentController.ZoomValue
		If nZoom < nMaximalZoom Then
			oOfficeDokument.currentController._
				ZoomValue = nZoom + nZoomStep
		End If 
	Else	
		nZoom = oOfficeDokument.currentController.ZoomValue
		If nZoom < nMaximalZoom Then
			oOfficeDokument.currentController._
				ZoomValue = nZoom + nZoomStep
		End If 
	End If		
End Sub
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
Frank Lauer
***
Beiträge: 88
Registriert: Mi, 30.07.2003 18:06
Wohnort: Wiesloch

Beitrag von Frank Lauer »

Nochmal vielen dank, ich habe jetzt dein Makro übernommen und nun funktioniert der Zomm in allen Anwendungen (nicht nur im Writer).
Wie kommt man auf diese Befehle? Ich habe mal etwas in der API-Refferenz herumgeblättert, aber nirgend die Eigenschaft Zoom value gefunden.
OOo 2.1 , Win XP
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

;-) gute Frage. Ehrlich gesagt, ist das wirklich ein bisschen schwierig oder zumindest zeitraubend. Im konkreten Fall des Zooms, hab ich das in der Mailinglist aufgeschnappt. Danach hab ich mit einem Dialog die Objekte ausgespäht, welche da erwähnt wurden.

Es gibt die Eigenschaften Dbg_Methods , Dbg_Properties und Dbg_SupportedInterfaces, welche Dir Informationen über die Êigenschaften, Methoden und Interfaces liefern, welche vom Objekt xyz bereitgestellt werden. So kannst Du Dich durch den Dschungel schlagen; Hinweise kriegen, welche Interfaces wohl wichtig sein könnten und in der API-Nachschlagen.

Unter

http://www.openoffice.org/issues/show_bug.cgi?id=18327

findest Du ein Dokument ObjektInspector, das den erwähnten Dialog enthält. Zur Installation machst Du Dir am besten eine neue Basic-Bibliothek 'OOoInspektor' oder so. Dann kannst Du die Module und den Dialog des Dokumentes per Drag.and-Drop in die neue Bibliothek hineinkopieren.

Zum kopieren von Modulen: Extras - Macros... und dann 'Verwalten' oder in den Hilfe Seiten 'Macros und Programmierung' nachschlagen.
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
Frank Lauer
***
Beiträge: 88
Registriert: Mi, 30.07.2003 18:06
Wohnort: Wiesloch

Beitrag von Frank Lauer »

Der Objektispector ist ein guter Tip. Danke.

Ich habe auch schon etwas daran herumgebastelt.
Momentan versuche ich mir einen Dialog zu erstellen, in dem ich den Namen eines Objektes eingeben kann um es dann mit doinspect abzufragen. Leider führt das zu einer Fehlermeldung (klar, ich übergebe ja nur einen String mit dem Objektnamen und nicht das tatsächliche Objekt). Hast du eine Idee wie man so einen Dialog doch noch hinbekommt?
OOo 2.1 , Win XP
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

Hallo Frank,

ich glaube nicht, dass das mit Basic geht. Jedenfalls hätte ich da keine Ahnung wie das gemacht wird. Das wäre ein hübsches Feature, das irgendeinen Introspection-Mechanismus anbieten würde. Ich kenn sowas jedoch bloss in Java, kann aber nicht sagen, ob das in Java mit OOo-Objekten möglich ist (vemutlich schon).

Natürlcih kannst Du ein Mapping String-Object programmieren. Das ist jedoch keine generische Lösung und jedes inspizierbare Objekt müsste von Hand 'konfiguriert' werden. Da kannst Du gleich jeweils doInspect( xcz ) in eine testProzedur reinschreiben, was nicht mehr umstände macht.

Du kannst so evt. die Properties eines Objektes anzeigen, die über den Namen erfragt werden können, Variablennamen sind meines Wissens jedoch so nicht erreichbar.

sorry

Wenn Du was anderes rauskriegst, UNBEDINGT hier reinposten.

gruss
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
openmind
****
Beiträge: 184
Registriert: So, 29.06.2003 15:00
Wohnort: Schweiz

Beitrag von openmind »

Hi Frank,

auf der dev-Mailingliste hat ein Sun-Entwickler ein ausführliches Mail zur Introspection in OOo gepostet. Vielleicht hilft Die das ein wenig weiter:

http://api.openoffice.org/servlets/Read ... stName=dev
Meine Installation: AMD Athlon XP 1600+, 512 MB RAM, SuSE Linux 8.2, OpenOffice 1.1
Kostenlose OOo-CD in der Schweiz: http://www.office-cd.ch/
Antworten