File: TexMathsHelp.xba

package info (click to toggle)
libreoffice-texmaths 0.49-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 4,388 kB
  • sloc: sh: 67; xml: 32; makefile: 2
file content (387 lines) | stat: -rw-r--r-- 11,012 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="TexMathsHelp" script:language="StarBasic">&apos;
&apos;    TexMathsHelp
&apos;
&apos;	 Copyright (C) 2012-2020 Roland Baudin (roland65@free.fr)
&apos;    Based on the work of Geoffroy Piroux (gpiroux@gmail.com)
&apos;
&apos;    This program is free software; you can redistribute it and/or modify
&apos;    it under the terms of the GNU General Public License as published by
&apos;    the Free Software Foundation; either version 2 of the License, or
&apos;    (at your option) any later version.
&apos;
&apos;    This program is distributed in the hope that it will be useful,
&apos;    but WITHOUT ANY WARRANTY; without even the implied warranty of
&apos;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
&apos;    GNU General Public License for more details.
&apos;
&apos;    You should have received a copy of the GNU General Public License
&apos;    along with this program; if not, write to the Free Software
&apos;    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
&apos;
&apos;	 Macros used to create and manage the Help dialog



&apos; Force variable declaration
Option Explicit

Private oDlgBaseHelp as Variant
Private closed as Boolean

&apos; Conversion factors map appFonts -&gt; pixels
Private convX as Double
Private convY as Double

&apos; Flag used for gtk3 workaround
Private isLinux as Boolean


&apos; Main subroutine
Sub HelpDialog()

	DefaultSysConfig()

	&apos; Parent window
	Dim oParent as Variant
	oParent = ThisComponent.getCurrentController().getFrame().getContainerWindow()
      
	&apos; Create base outer window as non modal dialog
	oDlgBaseHelp = CreateBaseDialog(oParent)
 
	&apos; Set window title
	oDlgBaseHelp.setTitle( _(&quot;TexMaths Help&quot;) )
     
	&apos; Embed inner dialog created with the dialog editor
	Dim sURL as String, oDlgHelp as Variant
	sURL = &quot;vnd.sun.star.script:TexMaths.TexMathsHelp_GUI?location=application&quot;
	oDlgHelp = CreateInnerDialog(oDlgBaseHelp, sURL)

	&apos; Load help text, depending on the locale 
	Dim sHelpPath as String, sFilePath as String, sMsg as String
	sHelpPath = &quot;help/help.&quot; &amp; GetLocale()
	sFilePath = ConvertToURL( glb_PkgPath &amp; sHelpPath )
	If Not FileExists( sFilePath ) Then	sHelpPath =  &quot;help/help.en&quot;
	sMsg = ReadTextFileUtf8(sHelpPath, glb_PkgPath)
	sMsg = chr(10) &amp; &quot; TexMaths &quot; &amp; GetVersion() &amp; chr(10) &amp; sMsg
	oDlgHelp.getControl(&quot;HelpText&quot;).setText(sMsg)
    
 	&apos; Read registry
	Dim oSystemInfo as Variant
	oSystemInfo = GetConfigAccess(&quot;/ooo.ext.texmaths.Registry/SystemInfo&quot;, TRUE)

	Dim aRect as New com.sun.star.awt.Rectangle
	aRect = CreateUnoStruct(&quot;com.sun.star.awt.Rectangle&quot;)

	&apos; Compute conversion factors between map appFonts and pixels
	aRect = oDlgHelp.getPosSize()
	convX = aRect.Width / oDlgHelp.Model.Width 
	convY = aRect.Height / oDlgHelp.Model.Height

	Dim minW as Integer, minH as Integer
	minW = DLG_MIN_WIDTH * convX
	minH = DLG_MIN_HEIGHT * convY

	&apos; Set outer window initial position and size
	If oSystemInfo.HelpPositionX &lt;&gt; &quot;&quot; Then
		aRect.X = oSystemInfo.HelpPositionX
	Else
		aRect.X = -1
	End If
		
	If oSystemInfo.HelpPositionY &lt;&gt; &quot;&quot; Then
		aRect.Y = oSystemInfo.HelpPositionY
	Else
		aRect.Y = -1
	End If

	If oSystemInfo.HelpWidth = &quot;&quot; Or Val(oSystemInfo.HelpWidth) &lt; minW Then
		aRect.Width = minW
	Else
		aRect.Width = oSystemInfo.HelpWidth
	End If

	If oSystemInfo.HelpHeight = &quot;&quot; Or Val(oSystemInfo.HelpHeight) &lt; minH Then
		aRect.Height = minH
	Else
		aRect.Height = oSystemInfo.HelpHeight
	End If

	If aRect.X &gt;= 0 And aRect.Y &gt;= 0 Then
		oDlgBaseHelp.setPosSize(aRect.X, aRect.Y, 0, 0, com.sun.star.awt.PosSize.POS)
	End If
	
	If aRect.Width &gt; 0 And aRect.Height &gt; 0 Then
		oDlgBaseHelp.setPosSize(0, 0, aRect.Width, aRect.Height, com.sun.star.awt.PosSize.SIZE)
	End If

	&apos; Workaround for a bug with gtk3 backend =&gt; dialog is set to modal in Linux
	If getGUIType() &lt;&gt; 1 Then
		If getUname() &lt;&gt; &quot;Darwin&quot; Then
			isLinux = TRUE
		End If
	Else
		isLinux = FALSE
	End If 
	If isLinux Then &apos; Modal dialog
		
		oDlgBaseHelp.execute()
	
	Else &apos; Non modal dialog
		
		&apos; Show dialog
		oDlgBaseHelp.setVisible(TRUE)
	
		&apos; Loop for non modal dialog
		closed = FALSE
		While(closed = FALSE)
			Wait 1000
		Wend

	End If
	
	&apos; Get outer window position and size
	aRect = oDlgBaseHelp.GetPosSize()

	&apos; Delete dialog
	oDlgBaseHelp.dispose()

	&apos; Save outer window position and size to the registry
	oSystemInfo.HelpPositionX = aRect.X
	oSystemInfo.HelpPositionY = aRect.Y

	&apos; Dialog is too narrow
	If aRect.Width &lt;  minW Then
		aRect.Width = minW	
	End If
		
	&apos; Dialog is too short
	If aRect.Height &lt;  minH Then
		aRect.Height = minH
	End If

	oSystemInfo.HelpWidth = aRect.Width
	oSystemInfo.HelpHeight = aRect.Height
	
	&apos; Apply changes
	oSystemInfo.commitChanges()

End Sub


&apos; Create new outer base dialog
&apos; oParent: parent window peer
&apos; Return dialog window
Function CreateBaseDialog(oParent as Variant) as Variant
     
	Dim oToolkit as Variant
	oToolkit = oParent.getToolkit()
	
	Dim WA as Variant, aRect as Variant, oDesc as Variant
	WA = com.sun.star.awt.WindowAttribute
	aRect = CreateUnoStruct(&quot;com.sun.star.awt.Rectangle&quot;)
	oDesc = CreateUnoStruct(&quot;com.sun.star.awt.WindowDescriptor&quot;)

	With oDesc
    	.Type = com.sun.star.awt.WindowClass.SIMPLE
        .WindowServiceName = &quot;dialog&quot;
        .Parent = oParent
        .ParentIndex = -1
        .Bounds = aRect
        .WindowAttributes = WA.CLOSEABLE OR WA.MOVEABLE OR WA.SIZEABLE OR WA.BORDER
	End With

	Dim oDialog as Variant
	oDialog = oToolkit.createWindow(oDesc)

	&apos; Create listeners
	oDialog.addTopWindowListener(CreateUnoListener(&quot;HelpWindowListener_&quot;, &quot;com.sun.star.awt.XTopWindowListener&quot;))
	oDialog.addWindowListener(CreateUnoListener(&quot;HelpWindowListener_&quot;, &quot;com.sun.star.awt.XWindowListener&quot;))

	CreateBaseDialog = oDialog

End Function


&apos; Create inner (child) dialog embedded
&apos; oParent: parent window
&apos; sURL: dialog URL, without toolbar
&apos; Return dialog window
Function CreateInnerDialog(oParent as Variant, sURL as String) as Variant

	Dim PS as Variant
	PS = com.sun.star.awt.PosSize
	
	Dim oDP as Variant, oChildDialog as Variant
	oDP = CreateUnoService(&quot;com.sun.star.awt.ContainerWindowProvider&quot;)
	oChildDialog = oDP.createContainerWindow(sURL, &quot;&quot;, oParent, nothing)
	oChildDialog.setPosSize(0, 0, 0, 0, PS.POS)
	oChildDialog.setVisible(True)

	&apos; Close button label and tooltip
	oChildDialog.getControl(&quot;CloseButton&quot;).Model.Label = _(&quot;Close&quot;)
	oChildDialog.getControl(&quot;CloseButton&quot;).Model.HelpText = _(&quot;Close window&quot;)
	
	Dim aSize as Variant
	aSize = oChildDialog.getPosSize()
	oParent.setPosSize(0, 0, aSize.Width, aSize.Height, PS.SIZE)
	oChildDialog.addWindowListener(CreateUnoListener(&quot;HelpChildWindowListener_&quot;, &quot;com.sun.star.awt.XWindowListener&quot;))
	
	CreateInnerDialog = oChildDialog

End Function


&apos; Resize inner dialog window
&apos; This is called indirectly when resizing the outer base dialog      
Sub HelpChildWindowListener_windowResized(ev)

	&apos; Inner dialog
	Dim oDialog as Variant
	oDialog = ev.Source
	
	&apos; Dialog size
	Dim aRect as Variant
	aRect = oDialog.getPosSize()
	
	&apos; Dialog min width and height 
	Const HLP_MIN_WIDTH  = 200
	Const HLP_MIN_HEIGHT = 140

	&apos; Convert min width and height to pixels
	Dim minW as Integer, minH as Integer
	minW = HLP_MIN_WIDTH * convX
	minH = HLP_MIN_HEIGHT * convY

	&apos; Resize inner dialog if too narrow
	If aRect.Width &lt; minW Then

		aRect.Width = minW
		oDialog.setPosSize(0, 0, aRect.Width, aRect.Height, com.sun.star.awt.PosSize.SIZE)

	End If

	&apos; Resize inner dialog if too short
	If aRect.Height &lt; minH Then

		aRect.Height = minH
		oDialog.setPosSize(0, 0, aRect.Width, aRect.Height, com.sun.star.awt.PosSize.SIZE)

	End If

	Dim oWidget as Variant
	Dim X as Integer, Y as Integer, W as Integer, H as Integer

	&apos; Resize text field
	oWidget = oDialog.getControl(&quot;HelpText&quot;)
	W = aRect.Width - (oDialog.Model.Width - oWidget.Model.Width ) * convX
	H = aRect.Height - (oDialog.Model.Height - oWidget.Model.Height ) * convY
	oWidget.setPosSize(0, 0, W, H, com.sun.star.awt.PosSize.SIZE)

	&apos; Position button
	oWidget = oDialog.getControl(&quot;CloseButton&quot;)
	X = aRect.Width - (oDialog.Model.Width - oWidget.Model.PositionX) * convX
	Y = aRect.Height - (oDialog.Model.Height - oWidget.Model.PositionY ) * convY
	oWidget.setPosSize(X , Y, 0, 0, com.sun.star.awt.PosSize.POS)

End Sub


&apos; Close non modal dialog
Sub CloseHelp()

	&apos; Workaround for a bug with gtk3 backend
	If isLinux Then &apos; Modal dialog
		oDlgBaseHelp.endExecute()
		
	Else &apos; Non modal dialog
		oDlgBaseHelp.setVisible(FALSE)
		closed = TRUE
		
	End If

End Sub


Sub HelpChildWindowListener_windowMoved(ev)
End Sub

Sub HelpChildWindowListener_windowShown(ev)
End Sub

Sub HelpChildWindowListener_windowHidden(ev)
End Sub


&apos;Invoked when a window is resized
Sub HelpWindowListener_windowResized(ev)
      
	&apos; Inner dialog size
	Dim aSize as Variant
	aSize = ev.Source.getSize()

	&apos; Child window index is 0 for OpenOffice and 2 for LibreOffice
	Dim i as Integer
	If ev.Source.Windows(0).isVisible Then i = 0 Else i = 2
	ev.Source.Windows(i).setPosSize(0, 0, aSize.Width, aSize.Height, com.sun.star.awt.PosSize.SIZE)

End Sub


&apos;Invoked when a window is in the process of being closed
Sub HelpWindowListener_windowClosing(ev)
    
	&apos; Workaround for a bug with gtk3 backend
	If isLinux then &apos; Modal dialog
		ev.Source.endExecute()
		
	Else &apos; Non modal dialog
	
		&apos; Close window using the window bar close button
		ev.Source.setVisible(FALSE)
		closed = TRUE
	
	End If

End Sub


&apos; Invoked when a window has been opened
Sub HelpWindowListener_windowOpened(ev)
End Sub

&apos; Invoked when a window has been closed
Sub HelpWindowListener_windowClosed(ev)
End Sub

&apos; Invoked when a window is iconified
Sub HelpWindowListener_windowMinimized(ev)
End Sub

&apos; Invoked when a window is de-iconified
Sub HelpWindowListener_windowNormalized(ev)
End Sub

&apos; Invoked when a window is activated
Sub HelpWindowListener_windowActivated(ev)
End Sub

&apos; Invoked when a window is de-activated
Sub HelpWindowListener_windowDeactivated(ev)
End Sub

Sub HelpWindowListener_disposing(ev)
End Sub

Sub HelpWindowListener_windowMoved(ev)
End Sub

Sub HelpWindowListener_windowShown(ev)
End Sub

Sub HelpWindowListener_windowHidden(ev)
End Sub


</script:module>