100 Commits
Author SHA1 Message Date
Jean-Pierre Ledure 2821d29a87 ScriptForge (FileSystem) Manage ZIP archives
The FileSystem service provides simple
methods to manage compressed zip archives.

As an example, .odf and .oxt files being
formatted as such archives, massive or
punctual changes of file contents
with smart scripts can be facilitated.

New methods:
- IsZipFile(filename)
    returns True when filename is a valid
    zip file
- FilesInZip(filename, pattern)
    returns a list of archive members,
    optionally filtered with a Like pattern,
    stored in filename
- ExtractFromZip(filename, destination, source)
    stores the source file(s) found in the
    given ZIP file into a destination folder
- CompressToZip(filename, foldername, rootfolder)
    stores the content of folder, including
    its subfolders, into a zip archive,
    optionally under a root folder

The implementation is based on the python
zipfile standard library.

The methods area available both for Basic and
Python user scripts. For Python scripts, the
user is also free to use the native zipfile
library instead.

The user documentation shouid be updated
according to this commit.

Change-Id: I506a8583dc3fa38c7e05094562ade33f84a24747
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211891
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-10-07 14:26:54 +02:00
Jean-Pierre Ledure 750f2e2fc7 ScriptForge fix tdf#173117 array.AppendColumn/Row
ncorrect examples in comment lines
and reproduced in help files.

Change-Id: Id87f8375d77f908757b1d1742bb2cc047c620ca4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211414
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-09-24 12:00:58 +02:00
Jean-Pierre Ledure 1b3d801b14 ScriptForge ui.EnterValue() enhance password input
Addition of a button that makes the
password field readable and back.

A "password" input field is set by the
  EchoChar
property in the field model.
It cannot be changed dynamically during
the dialog's life.

To circumvene this limitation, a new readable
'= EchoChar = 0) usual text field is added
with the same dimensions and position
as the password field.
Only 1 of them is visible at the same time.

The button implements
- a swap between readable and non-readable fields
- a copy of the actual content of the last used field
- the repositioning of the caret
This maximizes the illusion of the use
of a single field while, in fact, 2 alternate
fields are used.

No effect on existing user scripts.
The functionality is valid for both Basic and
Python user scripts.

Change-Id: I8e84b2b0a8e25087f203a2efa58ff208526e2591
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211228
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2026-09-20 09:27:03 +02:00
Jean-Pierre Ledure 3181946eaf ScriptForge Fix typos (a.o.) in po files
Read
 https://gerrit.libreoffice.org/c/core/+/210371/comments/0ed12361_0bc1e0bc

Change-Id: I300c022ddd2453e23b902f6cf5af05f1da98b831
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210436
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-09-03 12:47:19 +02:00
Jean-Pierre Ledure acb597ce0a ScriptForge Fix tdf#173228 Python SyntaxWarning
As from Python 3.14, a 'return' statement
inside a 'finally clause' raises a
   SyntaxWarning
warning, however without execution stop.

Occurrence in ScriptForgeHelper.py is
now fixed.

The 'finally' clause had the intent to never
interrupt the execution flow in the preceding
'try' clause.
It is replaced by
   except Exception:
      pass
which does the same job without warning.

No effect on existing user scripts.
No effect on user documentation.

Change-Id: I79aaea4a87726f297c856cfd40c9f7063c6c7abd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210244
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2026-08-29 10:18:16 +02:00
Jean-Pierre Ledure 03762554ad ScriptForge Upgrade to version 27.2
Version number is modified from 26.8 to 27.2.
No effect on actual user scripts.

Change-Id: I239d19d379915766eab41c20dbf6793c75d4ee77
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/210022
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-08-27 16:17:00 +02:00
Jean-Pierre Ledure bf69ea294e ScriptForge upgrade README.md
ChangeLog: add 26.8 commits
Change-Id: Ied994368ac6a8432a3ade86975a6ea7d22146994
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/208243
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-07-19 10:41:14 +02:00
Jean-Pierre Ledure d8f94b5a26 SctiptForge Python scripts and default pipe
Python scripts may run either
(1) inside the LO process, the usual mode
(2) as a client of a LO server
    using a pipe or a socket.
    The LO command is started with
    an "--accept" argument.

The benefit of (2) is the freedom to
choose his/her preferred IDE to edit
and debug the script. The drawback is the
reference to the pipe/socket in the
script source code.

APSO is the best (only ?) choice for debugging (1).

With this commit, when no reference is given
to a pipe or a socket in the user script,
ScriptForge tries a connection through the
default pipe 'PIPE2LIBREOFFICE'.
If the connection fails, mode (1) is assumed.

The benefit is that the same source code
can run without change in both (1) and (2)
modes.
The command to run LO must refer explicitly
to the default pipe when (2) is wanted.

The change has no effect on existing Python
scripts.

Change-Id: I3176f4744ffea5b387280e9364b3563483fd14f0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/205228
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2026-05-16 11:12:33 +02:00
Jean-Pierre Ledure d6b4eb14c3 ScriptForge Session.GetUnoProperty/GetPropertyByName()
Several changes:

- 2 new methods in the Session service:
    session.GetPropertyByName(basicobject,
        propertyname, [arg])
      for read access to properties of ScriptForge
      object instances.
      Argument is required for some Calc properties.
    session.GetUnoProperty(unoobject,
        propertyname)
      for read access to properties of UNO
      object instances.
  Those methods complement nicely the
  array.Map(), Filter() and Reduce() methods.

- The wording of trapped errors when
    session.ExecutePythonScript()
  fails has been reviewed to be distinct
  to that of
    session.ExecuteBasicScript()

- The source code of
    session.GetPDFExportOptions() was missplaced.

- A more accurate identification of ScriptForge
  object instances has been implemented in
    SF_Utils._VarTypeObj()
  (internal use only).

- Some fixed typos

The changes are applicable to Basic and Python
user scripts.

The new methods require an update of the user
documentation.

Change-Id: Ibbc0eecfe52a190eece66edadc14710a7fd6a106
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/205033
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2026-05-11 10:12:10 +02:00
Jean-Pierre Ledure 0b6494b0ed ScriptForge fix non-modal dialogs closure
In previous releases the cross present in the
top-right corner of a window was inoperant
in LibreOffice for non-modal dialogs (bug).

As a workaround, ScriptForge introduced a
  com.sun.star.awt.XTopWindowListener
that intercepted theClosing event
to effectively close the dialog.

Above bug gas been fixed now (fix #??).
The listener may now safely been removed
together with its event routines.

Change-Id: I43cd382c842ccd6eb90d32eecac0eb148c62e6df
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/204877
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2026-05-08 17:38:23 +02:00
Jean-Pierre Ledure f78206e5da Update git submodules
* Update helpcontent2 from branch 'master'
  to a1170c2dc0d15136ca5d0ef89a0bb944083b5394
  - ScriptForge basic.Wait() %PRODUCTNAME
    
    See unresolved comment in
      https://gerrit.libreoffice.org/c/help/+/203937
    
    Change-Id: Ia692c5c21bdb42a66ae58259ee9feb04f21b0256
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/204115
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
    Tested-by: Jenkins
    Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
2026-04-23 18:07:31 +02:00
Jean-Pierre Ledure 2a0fa9e596 Update git submodules
* Update helpcontent2 from branch 'master'
  to 6028eaa8b1b8f733a8fac602e3400c8d2e8ccbab
  - ScriptForge new basic.Wait() method
    
    Read commit
      https://gerrit.libreoffice.org/c/core/+/185137
    
    Use
        basic.Wait(1000)
    when
        time.sleep(1)
    freezes the LibreOffice user interface.
    
    Change-Id: Ia67b46235ff97a20937cdd6fa1ff9d707a9c5059
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/203937
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-04-20 16:56:38 +02:00
Jean-Pierre Ledure 21a7d0068e Update git submodules
* Update helpcontent2 from branch 'master'
  to d240e99f44264b2b8cd8818a5bfbec26caa039cf
  - ScriptForge extend ui.CreateBaseDocument()
    
    See commit
       https://gerrit.libreoffice.org/c/core/+/184935
    
    Allow creation of a Base document linked
    to a Firebird database file
    (aka "FIREBIRD_EXTERNAL").
    
    Change-Id: I4f56fecf6320e2728912f90999de430a5417a4c1
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/203831
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-04-19 11:46:03 +02:00
Jean-Pierre Ledure 611dd8e6c9 Update git submodules
* Update helpcontent2 from branch 'master'
  to ef4906210d9aa1d3ad1bfedf0cdb2879b6689ac0
  - ScriptForge filesystem.PickFolder signature
    
    See commit
      https://gerrit.libreoffice.org/c/core/+/184719
    
    The previous signature:
       fs.PickFolder(defaultdirectory, freetext)
    is replaced by:
       fs.PickFolder(defaultdirectory, title, freetext)
    
    Change-Id: Iea5c2d18b452d3a2687924de0144b7110dfa329f
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/203483
    Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-04-14 20:20:15 +02:00
Jean-Pierre Ledure 710433d5a6 ScriptForge (Array Map(), Filter(), Reduce()
New methods in the 'array' service:
- Map(module, method, array, Args) -> outarray
  Executes the method for each item
  in array and accumulates the results
  in outarray.
- Filter(module, method, array, Args) -> outarray
  outarray contains all the items of
  the input array for which the method
  has returned True
- Reduce(module, method, array, initialvalue) -> scalar
  At each iteration, the partial result
  is passed as 1st argument of the next
  iteration.

Module = any Basic module, any Basic class instance,
         any ScriptForge service instance
Method = given as a string
         may be a method or a property
         when module is a SF object

Above mzthods allow the programmer to write
simpler, shorter code, without neccessarily
needing to bother about intricacies
like loops, branching and error handling.

Examples:
 Let's assume:
  ar = CreateScriptService("array")
  fs = CreateScriptService("filesystem")
  st = CreateScriptService("string")
  ui = CreateScriptService("UI")
 Open read-only all Calc docs stored in a folder
  folder = "C:\MyFolder"
  ar.Map(ui, "OpenDocument", fs.Files(folder, filter := "*.ods"), "", True)
 Minimize all active Writer docs
  ar.Map(ui, "Minimize", ar.Filter(st, "EndsWith", _
         ui.Documents(), ".odt"))

Designed for Basic user scripts only.
The user documentation should include those
new functions.

In addition:
- some changes done in Session for more
  flexibility in script provider handling
- identification of SF objects modified
  in SF_Utils

Change-Id: I16f5fe03d31613c9c777905edd5190f56e460df3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/202037
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-03-19 10:12:38 +01:00
Jean-Pierre Ledure c428b24381 ScriptForge - ui.Activate() Fix maximize
ui.Activate(...)
sets the focus on the window in argument.

Before the actual patch, when the window
in background was maximized, it appeared
in foreground simply "restored".

Now "restored" or "maximized" depends on
the previous status.

Limited impact on existing scripts.
Improvement valid for Python and Basic
user scripts.

No impact on help documentation.

Change-Id: Ie3d30967948d114a422345afa9d13d54e587b79e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/201175
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-03-08 11:04:02 +01:00
Jean-Pierre Ledure 485d6db955 ScriptForge CallByName manages arrays
The bug "CallByName() does not work when the returned value
is an array"
   https://bugs.documentfoundation.org/show_bug.cgi?id=138155
is now fixed thanks to tdf#187145

This is a major improvement for the protocol
designed to make ScriptForge run smoothly
in Python as well as in Basic.

Indeed, CallByName() is a cornerstone of that protocol.
The implementation of this protocol is now
greatly simplified: the previous use of
hardcoded calls to workaround the limitation
to scalars of CallByName() has been suppressed.

The actual commit has no effect on existing scripts.
The documentation is not impacted.

Change-Id: Id01bb2d2d8be587d9c6aed227d172d10ddd85d4e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199740
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-02-20 08:54:43 +01:00
Jean-Pierre Ledure a6e4216153 ScriptForge (UI) fix no active frame in StarDesktop
Sometimes,
- headless mode
- client/server mode from python scripts
  via pipe or socket
- ...
the StarDesktop object has punctually
no active frame set.

This caused inopportune aborts in the
ScriptForge code: "Object variable not set",
when maximizing/minimizing the frame.
The request should simply be ignored.

Change-Id: Ifd38207cdeb4c5c4f40c58cca561f8131e8aed51
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199466
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2026-02-16 14:35:15 +01:00
Jean-Pierre Ledure 6f5a59a79b ScriptForge (UI) new EnterValue() method
The
   ui.EnterValue(...)
method displays a typed input box to the user
and returns the entered value as a scalar
of the requested type, or Empty/None
when the user cancels the box.

=> A single statement to interact with
   the user through a complex dialog box
   e.g. a listbox field of allowed values.

The box is centered on the active window.

The arguments (all are optional) :
   prompt: the message appearing above the input field
      Escape chars (\n \t) are interpreted correctly
   valuetype: determines the type of the input field
      and of the returned value, either
         STRING, PASSWORD -> str
         BOOL, INTEGER, FLOAT -> bool, int, float
         DATE, TIME, DATETIME -> datetime
         COMBO, LIST, RADIO -> str
   default: the initial value
   title: the header of the dialog
   choices: the list of valid values
      (COMBO, LIST and RADIO only)
   format: the format of numeric and date values

Example (Python):
   destination = ui.EnterValue(("What is your next destination ?", "LIST",
                      choices = ("Belgium", "Brazil", "France", "Mexico"),
                      default = "France",
                      title = "This text is in the titlebar")

The box is sized based on the arguments.

The function is available both in Basic
and Python user scripts.

The user documentation should be adapted accordingly.

Change-Id: I7c3f02f597ba5990c5f5a8548fb4f07699cda358
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199194
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2026-02-12 10:01:37 +01:00
Jean-Pierre Ledure 1952c85f9c ScriptForge fix tdf#169176 comma in file names
Per
  https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#file-and-directory-names
the comma and the semicolon are not
reserved characters in folder or file
names.

Not in Windows, and also not in Linux.

The regular expressions used to filter
valid file names have been reviewed
accordingly in the
  ScriptForge.SF_String
module.

No impact on user scripts, except a better
tolerance.
No impact on user documentation.

Change-Id: I4970c6d8334d717e5642782d3b5385731aa98717
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198545
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2026-02-02 15:09:31 +01:00
Jean-Pierre Ledure 69a816910d ScriptForge Fix dialog.Center() for dynamic dialogs
This patch is for dynamic (= built by code,
not in the Basic IDE) dialogs only.

At creation, such dialogs are incomplete:
their view contains default widths and heights.
In addition, conversions from MAP APPFONTs
(unit for position and size in the model)
to pixels and back were not available.

This made the computations for centering such a dialog
in the middle of a parent window, known in pixels,
erroneous.

The data is transferred from model to view
when the dialog is explicitly made visible:
   view.setVisible(True)

The computations are made correct by forcing
the visibility of the dialog as soon as a
   dialog.Center(...)
is issued, while, before, it was done immediately
before the
   dialog.Execute(...)

No impact on help documentation.
No impact on existing user scripts.

Change-Id: Ie867239300c5d61424c408efec40fecc9b06bca8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197257
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2026-01-15 10:15:27 +01:00
Jean-Pierre Ledure 7b0a303db3 Update git submodules
* Update helpcontent2 from branch 'master'
  to b14530b4e86d4c2723a6b81ed4f9b480d845f32c
  - ScriptForge sf_calc Typo
    
    Typo in link to the FormatRange()
    method description.
    
    Change-Id: If23b751e4c6a505c71048aac400c225234075bcb
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/197260
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-01-14 11:55:53 +01:00
Jean-Pierre Ledure 38bc68ba4b ScriptForge (Calc) FormatRange() fix new formats
New formats should not be deleted after
use. Anyway they are stored in the
document, not at install level.

+

A few typos in comments.

No change in user documentation.

Change-Id: I839fa0d86abdaf521a12b0d97978cf225cc8088e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197090
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-01-12 17:23:01 +01:00
Jean-Pierre Ledure b306d43760 Update git submodules
* Update helpcontent2 from branch 'master'
  to 14de64ed7e0895499276783d83433494e0cf3f78
  - ScriptForge (SF_Calc) formatting methods
    
    Adjustment of the sf_calc.xhp help page
    according to :
    
       https://gerrit.libreoffice.org/c/core/+/181854
    
    Change-Id: I13d693a21a18c357ee4cdada01378a3fef340f09
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/197011
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-01-12 12:29:03 +01:00
Jean-Pierre Ledure eb0666e5cc Update git submodules
* Update helpcontent2 from branch 'master'
  to 3b5c723a963f4b3abc8c965be047c845944ddca5
  - ScriptForge - new IsAlive property
    
    In the context of events programming,
    it is crucial to know if the target of
    a scripted action has not been closed
    inadvertendly by the user.
    
    Testing the IsAlive property helps to
    prevent useless processing interrupts.
    
    Applicable on
      sf_document + subclasses (sf_calc, ...)
      sf_dialog
      sf_datasheet
    object instances.
    
    Valid in LO >= 25.2
    
    Change-Id: I0c162b2d54cacdc3bf7c8abc75e57eb3b2945b5e
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/196623
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-01-07 11:22:47 +01:00
Jean-Pierre Ledure b5c246ae26 Update git submodules
* Update helpcontent2 from branch 'master'
  to 66646a128d00f10f5585a456f8c96e736f6d2e29
  - ScriptForge - new sf_contextmenu.xhp help page
    
    References in
      - basic tree page (sbasic.tree)
      - SF table of content (sf_toc)
      - make files
    have been added.
    
    Change-Id: Idade4f50d6eec04a2820a13bcde6f09489d72629
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/196575
    Reviewed-by: Olivier Hallot <olivier.hallot@libreoffice.org>
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2026-01-06 15:45:47 +01:00
Jean-Pierre Ledure 2a149fcc6a ScriptForge upgrade to versin 26.8
Version number is modified from 26.2 to 26.8.
No effect on actual user scripts.

Change-Id: I3010985552fc90b5374ca7fa571dfacfbdc8af37
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196202
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-12-24 16:58:53 +01:00
Jean-Pierre Ledure 8598e291dd Update git submodules
* Update helpcontent2 from branch 'master'
  to bb4a02075b3f96cb9ecbc26a4efc685994236def
  - ScriptForge (Exception) return codes
    
    The sf_exception.xhp help page is
    reviewed according
       https://gerrit.libreoffice.org/c/core/+/183486
    
    Change-Id: I2064e7e3b8bb444c0fd9aaa8fe1701d469eab655
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/195573
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
    Tested-by: Jenkins
2025-12-13 10:11:45 +01:00
Jean-Pierre Ledure 282014742d Update git submodules
* Update helpcontent2 from branch 'master'
  to ffc9c70d5f272b13aa73e8cce096d0144573260a
  - ScriptForge new MenuHeaders property
    
    in the SF_Document and SF_Datasheet services
    
    sf_document.xhp and sf_datasheet.xhp are updated
    according:
       https://gerrit.libreoffice.org/c/core/+/181065
    
    Change-Id: I2b8e9abc4607c72ca2bc30b757c34a8e5403b3e5
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/195482
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-12-11 17:44:17 +01:00
Jean-Pierre Ledure 1b9984a108 Update git submodules
* Update helpcontent2 from branch 'master'
  to f557d02eea8cdee59c6b0107a2377eddd3677f3b
  - ScriptForge add calc.XRectangle property
    
    sf_calc.xhp is updated according to
       https://gerrit.libreoffice.org/c/core/+/180140
    
    Change-Id: I72ace08f35d47b468d047d84737f442aa3ceeee2
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/195471
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
    Tested-by: Jenkins
2025-12-11 17:06:35 +01:00
Jean-Pierre Ledure e4fa87a1f6 Update git submodules
* Update helpcontent2 from branch 'master'
  to e70e8143c90c06073e0fb014c7547ff92c9ae46d
  - ScriptForge enhance session.ExecuteCalcFunction
    
    The sf_session.xhp help page is
    reviewed according
       https://gerrit.libreoffice.org/c/core/+/177744
    
    Change-Id: I876f384e2a964b4836ab2d4cd9b3d7bd0496777f
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/195446
    Tested-by: Jenkins
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-12-11 12:07:39 +01:00
Jean-Pierre Ledure a01eefb7b7 Update git submodules
* Update helpcontent2 from branch 'master'
  to 478b6583450eedc0adcf943089e37fb21122f392
  - ScriptForge (SF_Array) arrays and data arrays
    
    Page sf_array.xhp reviewed according to
       https://gerrit.libreoffice.org/c/core/+/177620
    
    Change-Id: Iacc285b4672d88b8763457e0592074edd2742a6a
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/195303
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
    Tested-by: Jenkins
    Reviewed-by: Olivier Hallot <olivier.hallot@libreoffice.org>
2025-12-09 17:18:50 +01:00
Jean-Pierre Ledure 2e49b0ab77 Update git submodules
* Update helpcontent2 from branch 'master'
  to 0104a91433469c9c8792174e3056093baa151ad3
  - ScriptForge Connect python via pipe
    
    Update SF_intro.xhp according
       https://gerrit.libreoffice.org/c/core/+/173252
    
    Change-Id: I20395b3696054845b868f97633fe6deedfa14e83
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/195196
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
    Tested-by: Jenkins
2025-12-08 10:08:21 +01:00
Jean-Pierre Ledure 8aee6313b4 Update git submodules
* Update helpcontent2 from branch 'master'
  to 246631c6fdb13e9a018c96c72abfc002a07a7f8e
  - ScriptForge case-sensitive keys in the Dictionary service
    
    Update of help file according
     https://gerrit.libreoffice.org/c/core/+/173044
    
    Change-Id: If309899ce2c15d081d8085555ef473544d771ee6
    Reviewed-on: https://gerrit.libreoffice.org/c/help/+/195187
    Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
    Tested-by: Jenkins
2025-12-07 16:15:43 +01:00
Jean-Pierre Ledure a9e9c3b2e2 ScriptForge Fix Watch close button of all dialogs
Cfr. patch
   https://gerrit.libreoffice.org/c/core/+/184662

Dialogs can either be stored in a library
or created from scratch.

When run in non-modal mode, the closing of
a stored dialog with the window Close
top-right cross was done by LO correctly
in LO <= release 25.2.

Since 25.8, both dialog created from scratch
or stored in a library need a coded
XTopWindowListener to have the job done.

Since above-mentioned patch, SF activated
a listener for on-the-fly dialogs only.

Change-Id: I6fca927d2a2cea321eba5303d4ff3037f15b5841
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194949
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-12-03 12:02:29 +01:00
Jean-Pierre Ledure e856738f5f ScriptForge (SF_Exception) fix console error
In the scenario where
- the console is opened in modal mode,
- the console is closed immediately,
- the exception.ConsoleClear() is run,
an abort occurs:
   Object variable not set

Fixed now.

Change-Id: Ib7de836457e77786b0e29a68eaf64e8bd6aa8a0e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194846
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-11-30 18:18:58 +01:00
Jean-Pierre Ledure be98d8c3f5 ScriptForge review README.md file
Content upgraded to 26.2 news

Change-Id: I617fc62db831d6731d1f6b0ee2e2f74929259319
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194390
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-11-24 12:27:21 +01:00
Jean-Pierre Ledure 61c6321c76 ScriptForge Timer uses Basic Now function
The durations in the Timer service
are measured with a precision of
the millisecond.

Thanks to tdf#161469 the Basic Now()
function provides sub-seconds precision
since LO 25.2.

Hence the use of the Calc NOW() function
is replaced in the Basic code by the
more immediately available Basic Now()
equivalent.

No impact on existing user scripts.
Documentation is unchanged.

Change-Id: Ia3b0f07918d9b9a9e96f62aaa5ce3862a2b48579
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194070
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-11-16 17:14:07 +01:00
Jean-Pierre Ledure 2a3eb41c03 ScriptForge (SFDocuments) new Shape service
The new "Shape" service is focused on
the description of shapes/images/drawing
objects stored in documents.
In the actual release only shapes
in Calc sheets are considered.

A Shape instance is created from either:
-  calc.CreateShapeFromFile(shapename, imagefile,
                            range, aslink)
   => the shape is loaded in the sheet and
      anchored to the given range.
      The shape may or not be embedded in the
      document.
-  calc.Shapes(sheetname, shapename)

Next methods are available:
-  shape.Anchor(anchortype, cell)
   => define the anchor type and the cell
      to which the shape has to be anchored.
-  shape.ExportToFile(filename, imagetype, overwrite)
   => save the shape as an image file
      to a specified location.
-  shape.Pick()
   => select the shape (NB "Select" is a reserved
      word in Basic, hence "Pick")
-  shape.Resize(xpos, ypos, width, height)
   => change position and/or size.
-  shape.Rotate(angle, pivot)
   => rotate the shape using a given
      pivot point (x, y) with a given angle.

The shape.XShape property gives a direct
access to its com.sun.star.drawing.XShape
UNO representation.

The pre-existing SF_Chart service is
functionally unchanged. However it is
now implemented as a subclass of the
new SF_Shape service.
Compatibility with previous releases
is preserved.

The implementation required a few changes
in the error messages. Hence also in
their translations.

All the functions are available for both
Basic and Python user scripts.

The documentation should include:
- a revision of the Calc and Chart help pages
- the creation of an additional Shape page

Change-Id: Ib67f5e755e3112961aadeffc3188b2cdf9aca613
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193906
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-11-13 10:04:58 +01:00
Jean-Pierre Ledure f6b4cee785 ScriptForge (Calc) ColorizeRange() clean colors
The ColorizeRange() method accepts next
arguments:

- TargetRange : the cell or the range as a string
    in which cells should be re-colorizeed
- Foreground: the foreground color as the output
    of the RGB() function
- Background: the background color as the output
    of the RGB() function
- FilterFormula: a Calc formula to select
    among the given TargetRange which cells,
    rows or columns should affected
- FilterScope: "CELL", "ROW" or "COLUMN"

So far, negative values for Foreground and
Background were ignored.
Now, they reset the colors to their default
values.

This is valid for Basic and Python user scripts.
The documentation should be updated
accordingly.

Change-Id: Ie7722365bcacb1ebe82dc1fc226ed047483143dd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191969
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-10-06 18:01:21 +02:00
Jean-Pierre Ledure 50ef4d5256 ScriptForge (Calc) more accurate XRectangle
The
  calc.XRectangle(range)
property returns a com.sun.star.awt.Rectangle
structure describing the position and size
of the range given as a string.
The function opens the opportunity to
design popup menus in user scripts.

The actual implementation has next improvements:

1) When the zoom in the sheet was different from
   100%, there was a distorsion of the Height
   and Width values. Fixed now.

2) When some toolbars were visible, the
   computation of the Y dimension was
   under-evaluated. Fixed now.

3) The implementation does not use the
   deprecated XAccessibleXontext API
   anymore.

The computations have been verified
- the worksheet is not maximized
- with varying row heights and column widths
- with or without a formula bar
- with or without toolbars
- with different user interfaces

The documentation does not need a revision.

Change-Id: I06c9ec40d6cdaed74e5935950aaec9dec382b7fe
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191906
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-10-06 10:57:54 +02:00
Jean-Pierre Ledure 7420eb7b55 ScriptForge fix tdf#168409 AccessibleContext
Extract from above bug report:
 The accessibility UNO API is unpublished and
 for LibreOffice-internal use only and
 subject to change by design.

The com.sub.star.accessibility.AccessibleContext
service is used in ScriptForge to determine
the location on the screen, in pixels, of
next window subsets:
(1) a Calc cell or cellrange
    => calc.XRectangle(range) property
(2) a toolbarbutton in a docked toolbar
    => toolbar.ToolbarButtons(buttonname) method
In both situations, SF offers a facility
to display a well-positioned popup menu
triggered by a mouse left-  or right-click.

The situation of the API is as follows:
- fully available in 25.2
- partially available in 25.8
  (1) is not broken
  (2) is broken
- fully vanished in 26.2

The gradual phase-out of the API requires,
to fix the bug, a tiered adaptation of
the code.
The choice is made to incorporate, where
appropriate, a switch to the right code
snippet based on the run LibreOffice version:
25.2, 25.8 or 26.2.

Now the behaviours in 25.2 and 25.8 are
identical. In 26.2, a different location
is returned for undocked toolbars.

The solution used for 26.2 must be considered
as still subject to change.
The emergency is to fix the issue in 25.8,
which is currently broken.

With the actual patch, the compatibility
between releases is restored, both in
Basic and Pythonuser scripts, and does
not need any documentation revision.

Change-Id: I29b4ccca3f11eca39e5a1841d3cfd744d5eb1fe3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191670
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-10-01 10:00:23 +02:00
Jean-Pierre Ledure cf57cf042a ScriptForge fix tdf#168433 array.ImportFromCSVFile
The import of a CSV-formatted file
into an array fails when specific
combinations of double quotes and
commas (= delimiter) are present.

The
  array.ImportFromCSVFile()
method uses internally the
  string.SplitNotQuoted()
method for parsing the input
records.

The latter method skips the delimiters
located inside quoted strings.
It was buggy and needed a revision.

Documentation unchanged.

Change-Id: Ie156455b99749c6a8e4f43f4d3c258772904848f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191227
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-09-20 16:20:31 +02:00
Jean-Pierre Ledure 58336d587e Access2Base fix float Value setting
The Field class has a generic Value property
   field.Value = ...
for setting the content of a database field
whatever its datatype.

The property checks the validity of the
given value before running the real
database update.

The check for FLOAT datatype was erroneous
and prevented to enter the value zero into
the field.

See Mike kaganski's remark in
  https://gerrit.libreoffice.org/c/core/+/155507

Change-Id: I0651586c5c51ddf3273fef5fcc1e57355b7af2f4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191128
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-09-19 17:01:36 +02:00
Jean-Pierre Ledure d8c75e9bda ScriptForge (Sharedmemory) review StoreValue() signature
Thanks to commit
  https://gerrit.libreoffice.org/c/core/+/190931
  (Extend Python-Basic gateway for objects)
a signature with an object instance as argument
is allowed in any position, i.o. the 1st only.

This is applicable to
  sharedmemory.StoreValue(value, variablename)
Indeed, 'value' may be such an object instance.

The signature becomes now
  sharedmemory.StoreValue(variablename, value)
which is more intuitive.

No impact on user scripts <= 25.8

Documentation should take both commits
into account.

Change-Id: I1a07cd740fc9dcba1077932bba0f69735a7bc647
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190979
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-09-17 16:44:26 +02:00
Jean-Pierre Ledure 8bc9ddf832 ScriptForge Extend Python-Basic gateway for objects
A Python ScriptForge object may be passed to
Basic functions, so far only when it is
positioned as the first argument in the
method signature.

Like in:
   dialogB.Center(dialogA)

The actual commit extends the protocol
between Python and Basic to allow passing
Python objects from another position
in the method signature.

However this possibility is limited to
maximum 1 such argument.
(Note that removing this limitation,
if ever needed, would not require
a big change.)

No impact on user existing scripts.
No documentation update.

Change-Id: I191b7bb7c32b158b7274815577349ddfa1406b93
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190931
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-09-15 07:35:37 +02:00
Jean-Pierre Ledure 3f34264bc6 ScriptForge - Upgrade python stub file
Concerned file:
  scriptforge.pyi
(python stub having no impact on script
execution, only on script edition with
advanced IDE's like PyCharm and VSCode).

Guided by
  https://typing.python.org/en/latest/guides/modernizing.html#generics-in-the-typing-module
Older typing features are superseded
by more modern alternatives,
which are recommended to use.

Applicable changes:
>= Python 3.9
  typing.Dict => dict
  typing.List => list - replaced by tuple
  typing.Tuple => tuple
  typing.Sequence => collections.abc.Sequence
                     replaced by tuple
>= Python 3.10
  typing.Optional => | None
  typing.Union => | (pipe operator)

This makes the source more readable
and, also, a bit shorter.

No impact on user scripts.
Documentation unchanged.

Change-Id: I856d01660c5c3e1c3f0a0c2cca756fa0cbfd9a4a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190362
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-08-29 15:54:45 +02:00
Jean-Pierre Ledure e79a47409f ScriptForge - new SharedMemory service
Singleton class implementing the
  "ScriptForge.SharedMemory"
service. Implemented as a usual Basic module.

Contains the mechanisms to manage persistent memory storage
across Basic and/or Python scripts.

When a script stops running, all the variables it uses vanish,
except Basic Global variables, which stay in memory until
the end of the LibreOffice session.

However event-driven scripting can often benefit from having
variables still being available when the next script is
triggered, probably due to a user action.

The SharedMemory service implements interfaces allowing
to store both BASIC and PYTHON variables in persistent storage,
and to retrieve them later from either BASIC or PYTHON scripts
interchangeably.

The use of the Basic Global statement is more efficient
than the actual service and should be preferred when the variables
are created and retrieved in basic scripts only.

The supported variable types are:
 * Scalar or tuple combining:
  - int, within the bounds of the Basic Long type
  - float, within the bounds of the Basic Double type
  - str
  - bool
  - None
 * datetime.datetime
 * UNO object
 * ScriptForge class instance

Example:
  Sub CreateDoc()
    ui = CreateScriptService("UI")
    doc = ui.CreateDocument("Calc")
    store = CreateScriptService("SharedMemory")
    store.StoreValue(doc, "actualdocument")
  ...

  def UpdateDoc():
    store = CreateScriptService("SharedMemory")
    doc = store.ReadValue("actualdocument")
    ...

The service is available both for Basic and Python scripts.
The actual commit requires the creation of an additional
Help page.

Change-Id: Id53994be5105206c16659f769338261b3dde2d3a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190174
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-08-25 16:24:31 +02:00
Jean-Pierre Ledure 6e15cf7286 ScriptForge Fix case-sensitive Dictionary
Incomplete implementation of the
case-sensitivity of Basic dictionaries
in
   CreateScriptService()

Change-Id: Id12b50fb7b62322909622a19fa191d3110447dae
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189792
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-08-16 14:03:28 +02:00
Jean-Pierre Ledure 490bab1bac ScriptForge - new README.md file
File is purely for info.
No effect on LO build process.

Change-Id: I76c8732c770df891788dc4c48c67aa4809f48ede
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189064
Tested-by: Jean-Pierre Ledure <jp@ledure.be>
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-08-07 15:04:00 +02:00
Jean-Pierre Ledure e72f7d6dd3 ScriptForge new session.GetRangeFromCalc method
The
   GetRangeFromCalc(filename: str, range: str)
method (stored in the Session service)
reads the values contained in the given
range located in the given Calc file.

The file does not need to be open. This
makes this shortcut particularly useful.

The content of the range is returned either
- as a scalar for a single cell
- as a 1D-array or a tuple when the range
  is contained in a single row or column
- as a 2D-array or a tuple of tuples for
  a rectangular range of adjacent cells.

Clean error management is included in the code.

The method is available for Basic and Python
user scripts.

The user documentation needs to be updated.

Change-Id: I39cd218f0bf3a6a21e3ada42826069eeee451c6e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189000
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-08-06 14:34:55 +02:00
Jean-Pierre Ledure 0a6daad355 ScriptForge - Upgrade to version 26.2
Version numbers are modified from 25.8 to 26.2.

No effect on actual user scripts,
no documentation update.

Change-Id: I19a6711d43a5641cdb8e00ba59fff8285a9e9120
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188912
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-08-04 14:18:43 +02:00
Jean-Pierre Ledure c2a5e575e5 ScriptForge (Form) Fix missing attributes
When a FormControl instance is created
triggered by an event with
   fc = CreateScriptService("FormEvent", event)
a number of attributes are not
(re)-initialized in the parent Form instance.

They concern references to the form document
container and to the database connetction.

The absences prevent from scripting easily
(workarounds exist) operations on the form
document (close, print, ...) or towards the
database (read, sql, ...). In particular,
this limits the reusability of scripts
across >1 form documents.

This is a bug. It is fixed with the actual change.

Documentation may be left unchanged.
Basic and Python scripts are impacted alike.

Change-Id: I285148917174d5a046c11b15ea2a2581a23d4277
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/187854
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-07-15 09:31:43 +02:00
Jean-Pierre Ledure a656c736ec ScriptForge (Document) all document properties
The Document service proposes already
to access the document properties
as a dictionary (Basic or Python).

New entries have been added in recent
releases of LO. They have been added
in ScriptForge too.

They are:
  Coverage
  EditingCycles
  Identifier
  Publisher
  Relation
  Rights
  Source
  Type

The user documentation does not need any update.

Change-Id: Id5e449e307e7f394f5b5f0375320ab51afd9c250
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185188
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-05-12 11:51:43 +02:00
Jean-Pierre Ledure 92494fbbec ScriptForge (Basic) new Wait() method
Constructions (Python) like
    import time
    while some_event is False:
        time.sleep(1)
watching for some_event becoming True
have the drawback to freeze the LibreOffice
user interface.

While next (Basic) snippet
    Do While Not some_event
        Wait(1000)
does not.

The Python example prevents for waiting for events
that require user input,f.i. entering a value
in a cell.

The here proposed alternative is (Python):
    basic = CreateScriptService('Basic')
    while some_event is False:
        basic.Wait(1000)
This works smoothly.
The Wait() method executes in the background
a Basic Wait statement.

This impacts only Python user scripts.
The change requires an update of the user
documentation.

Change-Id: Idb73907a5e27cf288310e306fb41c0aba9c8a388
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185137
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-05-10 16:07:43 +02:00
Jean-Pierre Ledure 0ceb3980c6 ScriptForge (Calc) ColorizeRange(black)
Typo: the black color was skipped
   >= 0 better than > 0 !!
Change-Id: I4f52410b60d3f089046084df299ecd8da4cd5e84
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185014
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-05-07 14:06:41 +02:00
Jean-Pierre Ledure b7e84bec01 ScriptForge (Calc) new DefineName() method
Introduction of

1. the DefinedNames property
   Returns the full sorted list of all
   named ranges in the document.
   The names defined in a single sheet
   are qualified with the sheet name.

2. the DefineName() method
     calc.DefineName(definedname, value [,sheetname])
   Define a new name in the worksheet, at global
   or sheet level. If the name existed already,
   it is overwritten without warning.
   The Value of the new name may be a range,
   a scalar value or a formula.
   When a range, the top-left cell is set
   as reference cell.
   After creation, the new name can be used
   in formulaes.

The functions are available both for Basic
and Python user scripts.

The documentation will need an update.

Change-Id: I184e97b734a57ecba2e8a8eae583050116f40296
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184963
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-05-06 14:31:56 +02:00
Jean-Pierre Ledure 11d8753e03 ScriptForge (UI) extend scope of CreateBaseDocument
The
    ui.CreateBaseDocument()
method accepted so far to create Base documents
either embedding HSQLDB or FIREBIRD databases
or linked to a Cals spreadsheet.

It is now extended to make the new Base document
finding its datasource in an external Firebird
database file.

The previous signature
    ui.CreateBaseDocument(FileName, EmbeddedDatabase,
        CalcFileName)
is replaced by
    ui.CreateBaseDocument(FileName, EmbeddedDatabase,
        DataFileName, CalcFileName)
=> The CalcFileName argument is deprecated. When present,
   it is copied to DataFileName.
The EmbeddedDatabase argument may take next values:
    HSQLDB (default), FIREBIRD, FIREBIRD_EXTERNAL or CALC.

The change is valid for both Basic and Python scripts.
The documentation should be upgraded.

Change-Id: I5daf418f50739baca6be899eb1444d1b99cf89aa
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184935
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-05-04 10:18:48 +02:00
Jean-Pierre Ledure 1456ab8c9c ScriptForge (UnitTest) set return code
Correct the code returned at the end
of a test suite.
A test suite is run by
    RunTest()
and shoule return a positive return code
when an assertion fails. It did not.

No impact on documentation.

Change-Id: Ib581515f4bd8c57d9373b67e2fffbc8850394b0f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184900
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-05-02 15:15:10 +02:00
Jean-Pierre Ledure 9671c73922 ScriptForge (FileSystem) Title arg for PickFolder()
Only Windows implements the Description
property of the FolderPicker by displaying
it in the dialog's header. Otherwise it
is ignored.

This commit harmonizes the behaviour
among all environments, including Linux.

The previous signature:
   fs.PickFolder(defaultdirectory, freetext)
is replaced by:
   fs.PickFolder(defaultdirectory, title, freetext)

The 'freetext' parameter is kept for backward
compatibility. It becomes obsolete. When present,
and 'title' is absent, its content is pushed
to the dialog's title.

The change is valid both for Basic and Python scripts.
The documentation should be updated accordingly.

Change-Id: I888ee4afa5046212081bbdedc849147ebda1a3bf
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184719
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-04-28 16:56:28 +02:00
Jean-Pierre Ledure 59f8fd6a5c ScriptForge (UI) review progress bar termination
Idem https://gerrit.libreoffice.org/c/core/+/184662
for the progress bar.

Change-Id: Ife48d115d3e8acb81fe167a27542783f4ca25d25
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184665
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-04-26 18:09:15 +02:00
Jean-Pierre Ledure e803595fc4 ScriptForge Don't watch close button of stored dialogs
Dialogs can either be stored in a library
or created from scratch.

When run in non-modal mode, the closing of
a stored dialog with the Close top-right cross
is done by LO correctly.

When the dialog is created from scratch,
a coded XTopWindowListener should do the job.

So far, the listener was activated for all dialogs.

Additionally the Console is a stored dialog.
When closed and relaunched, the processing
will now handle the window Close and
the built-in Close buttons identically, at
least apparently.

Change-Id: I29e0881989816fbf7e3e8bd12f59517bde4b3047
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184662
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-04-26 15:50:03 +02:00
Jean-Pierre Ledure c8d2751a90 ScriptForge (SF_Exception) Return codes
So far, an exception raised in a user script
and detected by ScriptForge gave next behaviour:
- an error message was displayed to the user (1)
- the same error message was recorded in the
  console (2)
- the execution of the script was stopped (3)

The actual commit introduces 4 new properties
in the SF_Exception service.
Next two boolean properties may optionally
change above behaviour:
  exception.ReportScriptErrors (default = True)
  exception.StopWhenError (default = True)
They may change resp. behaviours (1) and (3).
Note that behaviour (2) is preserved anyway.
Their values are set until they are set
again or until the LO session expires.

When StopWhenError is set to False, next two
properties allow to test the success of the
last call to the ScriptForge API and to
define an appropriate action, including the
continuation of the process:
  exception.ReturnCode
  exception.ReturnCodeDescription

Example:
    exc = CreateScriptService("Exception")
    fs = CreateScriptService("FileSystem")
    exc.ReportScriptErrors = False
    exc.StopWhenError = False
    fs.OpenTextFile("/aaa/bbb")
    if exc.ReturnCode = "UNKNOWNFILEERROR":
        ...

The test on the return code must precede any
next call to any ScriptForge API entry.

The list of the available return codes is
listed in the SF_Exception.xba source code.

These changes are applicable both for Basic
and Python user scripts.
The user documentation should be reviewed.

Change-Id: I6d274e54ee37702f244e729ea5c9d1751b69abec
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183486
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-03-30 11:12:08 +02:00
Jean-Pierre Ledure 300ed95296 ScriptForge prettyprint in APSO 1.4.4
The latest version of APSO (1.4.4) introduces
a new positional argument in the
  def console():
in apso_utile.py, named 'prettyprint'.

The def is used in
  SF_Exception.PythonShell()

The absence of the argument caused
an exception/regression.
The actual patch makes above method compatible
with latest and previous versions of APSO.

No impact on user scripts.
No impact on user documentation.

Change-Id: I0a90112d441bba550b330925742e5021665ecee6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183265
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-03-25 17:23:16 +01:00
Jean-Pierre Ledure 2cb150fd2d ScriptForge (Platform) new UntitledPrefix property
Returns the prefix used to name new documents
(in English = "Untitled ").

Improves the portability of scripts by making
them more language-agnostic.

Available for Basic and Python scripts.
The user documentation should be updated.

Change-Id: Ie3c06e25fdc30fc1c3c775ef6ebbcee1d9cd77cd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183134
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-03-20 11:48:09 +01:00
Jean-Pierre Ledure 0658c51d63 ScriptForge (Dialog) new ImportControl() method
The
  ImportControl()
method copies a control stored in a dialog
to the actual dialog.
Like in:
  dlg1 = CreateScriptService("Dialog", ...)
  dlg2 = CreateScriptService("NewDialog", ...)
  dlg2.ImportControl(dlg1, "thiscontrol", ...)

The additional arguments contribute to optionally:
- renaming the new control
- storing the new control in a specific page
- repositioning the control (offsetx and offsety args)
- including the OnEventxxx properties

One goal is to help defining individual smaller
dialogs in the IDE and inserting them in a larger
one, keeping them in separate pages.

The function works for Basic and Python user scripts.
The user documentation will have to be updated.

Change-Id: I6155f58d2e8706b73fc5f72c070bb8230cdd17ee
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182865
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-03-13 14:48:00 +01:00
Jean-Pierre Ledure 05d2701e3b ScriptForge (Dialogs) add the TabPageContainer control
TabPageContainer-type controls are not supported
by the Basic IDE, while they are visually
attractive.

The current commit proposes the insertion
of such a control by code
  dialog.CreateTabPageContainer(..., tabheaders, ...)
where tabheaders is simply an array of strings.

The originality of the approach is here to make
the link with dialog pages very easy:
  OnTabSelected: define the script to trigger
                 when a tab is selected
  Value: get or set the actual tab

Additionally, the TabPageContainer control is
associated with the SetPageManager() method.

Example on
https://gitlab.com/LibreOfficiant/scriptforge/-/snippets/4823173

The function is available for Basic and Python user scripts.

The documentation will need to be updated accordingly.

Change-Id: I7a1644344cad5f3739055f7e1eec69310ffa019c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182697
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-03-10 11:07:23 +01:00
Jean-Pierre Ledure dec9f7d5b2 ScriptForge (dialogs, documents, widgets) Secure listeners
Listeners programmed in Basic are created with
  CreateUnoListener(prefix, listener)

The prefix argument determines the series of
routines run when an event is triggered.

So far, for SF internal listeners, the prefix
was chosen to minimize the risk of naming
collisions with routines present in user scripts.

In fact the prefix argument may be provided as
  Library.Module.Prefix
which eliminates the risk of ambiguity or
homonymy.

With the actual change forcing the full
qualification of prefixes, the risk is reduced
from epsilon to zero.

No impact on the user documentation.

Change-Id: I95ef4beec80c89a074c8bec809f416479e64d8cf
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182384
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-03-01 14:38:42 +01:00
Jean-Pierre Ledure 2953ff4682 ScriptForge (SF_Calc) formatting, case-sensitive arguments
Next methods:
   AlignRange() =>        TMBLCR
   BorderRange() =>       LTRBUDHV
   DecorateFont() =>      BUSI
receive a string argument describing
what they have to do.

Those arguments become case-sensitive: only
upper-case characters are considered.

Now:
   calc.DecorateFont(range, decoration := "BI")
may be written as:
   calc.DecorateFont(range, _
        decoration := "Bold+Italic")
which improves the readability of user's scripts.

The functionality is available both in
Basic and Python scripts.

To be considered in the 25.8 documentation.

Change-Id: If241f7aef2e8cbfa5b7dd240e26489790a8cca13
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182232
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-02-26 16:37:09 +01:00
Jean-Pierre Ledure ec71ff69fe ScriptForge (SF_Calc) formatting methods
So far only the SetCellStyle() method
provided means to modify cell formats.

The actual patch introduces next methods
to apply simple and common formats. For
other options use the XCellRange
UNO interface.

- calc.AlignRange(targetrange,alignment,...)
- calc.BorderRange(targetrange,borders,...)
- calc.ColorizeRange(targetrange,foreground,background,...)
- calc.DecorateFont(targetrange,fontname,fontsize,
         decoration,...)
- calc.FormatRange(targetrange,numberformat,locale,...)

Extra arguments ("...") are:
  FilterFormula: a Calc formula to select cells
  FilterScope; CELL, ROW or COLUMN
to allow a kind of static conditional formats.

All methods are applicable to Basic and Python
user scripts.

This change will require an update of the
user documentation.

Change-Id: Ic824aebd763f2b55364c2c0bea17430f32512742
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181854
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-02-19 10:59:24 +01:00
Jean-Pierre Ledure ff298dfebc ScriptForge (SF_Services) fix tdf#165147 do not require JRE
When a user script invokes CreateScriptService()
for a not yet used library, ScriptForge loads
the library and searches for the list of
services provided by that library.

The list can be found in a specific method
that the library must contain,
  RegisterScriptServices()
in whatever module.

The exploration was done so far through a
ScriptProvider UNO service. This service includes
all programming languages, including Java,
even without Java being used. This caused
an inconvenient error message when Java
is disabled in the advanced options.

This service is now replaced by a
  com.sun.star.comp.scripting.ScriptProviderForBasic
service. This gives a direct access to a lower
branch of the scripts tree and skips the Java issue.

All the changes are done in the
  ScriptForge.SF_Services._FindModuleFrom Method()
function.

No change required in the user documentation.

Change-Id: I4a6820e5d1a379bf5b61c6077db8a9a382c1757d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181445
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-02-12 11:47:04 +01:00
Jean-Pierre Ledure 970ad633e4 ScriptForge (SFDocuments) new MenuHeaders property
The %enuHeaders property returns,
as an array/tuple of strings the list
of the menus present in the menubar.

This is a helper for the CreateMenu()
method:
- check if the menu exists already to
  avoid duplicates
- ease the choice of the Before argument

The property is applicable to next classes:
- Document, and its subclasses
  Base, Calc, Writer, FormDocument
- Datasheet

The property is made available to Basic
and Python user scripts.

This new property will require an update
of the user documentation/help

Change-Id: Ia14daf6c58973e06d576b350e416eb178f70feb3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181065
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-02-04 10:16:01 +01:00
Jean-Pierre Ledure 74f93a222b ScriptForge (SFWidgets) fix popup menu bugs
1) when in Python the event argument of
    CreateScriptService('popupmenu', event)
   is set to None, an error was raised
   although not justified.

2) when
    popupmenu.Execute(False)
   is run and the user clicks outside the popup
   menu, the doc says a zero-length string
   should be returned. It retuned 0.

No impact on user documentation.

Change-Id: I4e1a1372800a728b994813b021f928fcf2b2603c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180960
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-01-30 18:21:27 +01:00
Jean-Pierre Ledure ca1dca4f1d ScriptForge (ContextMenu) new RemoveAllItems() method
The contextmenu service handles the context
menus stored in a document. So far, it
provided only the AddItem() method to add
new items at the bottom of the menu.

The new method allows to forget the preconfigured
menu and to replace it completely.

Example: associate next Sub with the
         on-right-click event of sheet 'Sheet1'
         => The custom menu appears when
            right-clicking in column C, otherwise
            normal behaviour
  Sub OnRightClick1(Optional XRange)
       ' Xrange is a com.sun.star.table.XCellRange
  Dim calc, menu, bColumn
  Set calc = CreateScriptService("Calc", ThisComponent)
  Set menu = calc.ContextMenus("cell")
  menu.RemoveAllItems()
  bColumn =  ( Len(calc.Intersect("Sheet1.$C:$C", _
             XRange.AbsoluteName)) > 0 )
  If bColumn Then
      menu.AddItem("A", Script := "vnd.sun.star.script:...&location=document")
      ...
  End If
  menu.Activate(bColumn)
  End Sub

The function is available both for Basic and Python user scripts.
The user documentation will have to be reviewed.

Change-Id: I84ee8724bf99c37397a19d729133cc4686a63980
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180520
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-01-21 09:30:57 +01:00
Jean-Pierre Ledure 1032ba1214 ScriptForge (SF_Calc new Intersect() method
The
    calc.Intersect(range1, range2) method
computes the common area as a string
which is a sub-range of both input ranges.
It returns an empty string when the
sub-range is empty.

Potential use case: customizing a popup
or context menu depending on the presence
of the selected cell in a given area.

In addition, the A1Style() method returns
the sheetname in the output string only
when it is an explicit argument.

Changes are applicable both for Basic and
Python scripts.

They require an update of the user documentation.

Change-Id: I920fc8bee6dace9ceed263a0570b4c0197bc8cb8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180479
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-01-19 16:43:49 +01:00
Jean-Pierre Ledure a5ab9e7832 ScriptForge es.po Typos and enhancements
In addition the VALIDATEREGEX message
is obsolete and removed from next
language files

	modified:   wizards/source/scriptforge/po/es.po
	modified:   wizards/source/scriptforge/po/fr.po
	modified:   wizards/source/scriptforge/po/pt.po

Change-Id: I67c2e5604e548870bf1bdceb9641d4802530e437
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180413
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-01-17 16:46:57 +01:00
Jean-Pierre Ledure 80623714e6 ScriptForge add spanish translation
modified:   wizards/Package_scriptforge.mk
	new file:   wizards/source/scriptforge/po/es.po

Change-Id: Ia4d51b9dfaa75bf2f50bb5a11f7f8d465b106489
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180285
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-01-15 16:25:58 +01:00
Jean-Pierre Ledure db6a6efdc4 ScriptForge add french translation of system messages
modified:   wizards/Package_scriptforge.mk
	new file:   wizards/source/scriptforge/po/fr.po

Change-Id: I4cb0c93c2c8b335d8319835a383255e02b9b04ea
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180143
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-01-13 09:54:19 +01:00
Jean-Pierre Ledure b86e078d79 ScriptForge (SF_Calc new XRectangle property
The
   XReetangle(rangename)
property returns a com.sun.star.awt.Rectangle
structure describing the coordinates (in pixels)
on the screen where the given range is
located.

This opens the door to effective interactivity
in calc sheets with the use of popup menus.

Example:
   r = calc.XRectangle("B2")
   menu = CreateScriptService("PopupMenu", , _
           X := r.X + r.Width/2, Y := r.Y + r.Height/2)
initializes a popup menu centered on the given
cell.

The property exists in Basic and Python.
The SF_Calc help page should be updated
according to the actual patch.

Change-Id: I2a97c5c7b5bf84d36a2aab5e4b822e30c9d53d8e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180140
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-01-12 16:15:38 +01:00
Jean-Pierre Ledure 7fdaeef4c5 ScriptForge (SF_Array) fix the list of methods
The Methods() method returns the list of methods
present in each class.

It is unused so far (vs. Properties() is used
in the code) => a wrong list has no
consequences. It is however reserved for
future use.

The list was incomplete in Array class.

Change-Id: I3e0522d6669d2732c68e52e4021ffb5c8a3fb108
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180127
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2025-01-11 19:24:12 +01:00
Jean-Pierre Ledure e0935e73bb ScriptForge - Upgrade to version 25.8
Hard-coded version numbers are modified
from 25.2 to 25.8.

Many changes in po files due to the alphabetical
sequence of keys after the introduction of the
new "case-sensitive" keys feature.
Before this the dict.Keys() method delivered
the keys as an array in the order of creation.

No effect on actual user scripts.

Change-Id: Iee0c48eca22d17ad892278398c9125912b8b2b3c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180120
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2025-01-11 16:00:11 +01:00
Jean-Pierre Ledure d28fcb3e26 ScriptForge (SF_Session) enhance ExecuteCalcFunction
The ExecuteCalcFunction() method is a wrapper
of the
   com.sun.star.sheet.FunctionAccess::callFunction()
method.

This method accepts a broad variety of arguments
- scalars: numeric and strings only
- data arrays (= arrays os arrays)
- 2D arrays (1D arrays give errors)
- com.sun.star.table.XCellRange objects
depending on the called function and its
execution or not as an "array function".

The actual commit makes that the arguments passed to
   session.ExecuteCalcFunction()
are checked as formally correct: scalars are filtered
as numeric or strings, dates and booleans are converted,
arrays are reshaped to 2D where necessary.

The actual change facilitates, as an example,
the use of complex array functions like XLOOKUP,
a powerful search engine on large data sets.

The implemented functionalities are valid in Basic
and Python.

The help documentation might be completed with
additional examples.

Change-Id: I6bba1e21828ef09c5c6f0463cbcfa1f5df695073
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177744
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2024-12-04 10:21:45 +01:00
Jean-Pierre Ledure ec4415d2a7 ScriptForge - Methods about data arrays
A data array is a 1D array of 1D subarrays.
All arrays are presumed zero-based.
Usages:
- the content of a range of Calc cells returned
  by the UNO XCellRange.getDataArray() or
  XCellRange.getFormulaArray() methods
- the output of SF_Session.ExecuteCalcFunction()
- a tuple of (sub)tuples returned by a Python script

3 methods are added to the Array service:

1) ConvertFromDataArray(DataArray, [IsRange], [FillValue])
  Convert a data array to a scalar, a vector or a 2D array.
  On request, the individual items are reduced
  to strings or doubles only.

2) ConvertToDataArray(Data, [IsRange], [Rows], [Columns)
  Create a data array from a scalar, a 1D array or a 2D array.
  The returned data array is zero-based and compatible
  with the XCellRange.DataArray property when IsRange = True.

3) ConvertToRange(Data, [Direction])
  Create a valid cells range content from a scalar,
  a 1D array, a 2D array or a data array.
  The individual items are always reduced to strings
  or doubles. Including booleans or dates.
  The returned scalar or array is a valid argument
  of the SF_Session.ExecuteCalcFunction() method.

They replace the internal _ConvertFromDataArray()
and _ConvertToDataArray() that were present in
the Calc service, called by SetValue(),
SetFormula() etc. methods.

This change is Basic only and has no effect in Python.

The documentation about the Array service
should be completed with these new 3 methods.

Change-Id: Idc5b6417648e4574b0f9c7c6e2438ff7dfce1829
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177620
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-12-02 10:25:44 +01:00
Jean-Pierre Ledure e74b731c80 scriptforge.pyi - Fix typo
Change-Id: I993e30d3d228c639a69007a846b46f420f9297b3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175097
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2024-10-18 13:38:18 +02:00
Jean-Pierre Ledure fc36eed73e ScriptForge session.ExecuteCalcFunction error handling
1) Error handling in the ExecuteCalcFunction()
   function must be conditioned by the global
   error handling.
   True; display a user-friendly message
   False: abort on the erroneous line

   So far, an ambiguous error message was displayed
   in both cases.

2) Above ambiguous error message was corrupted
   by the detour to SF_Array.Prepend() method
   in exc.RaiseFatal() and exc.RaiseAbort().
   A simple workaround fixes the ambiguity
   about the name of the faulty routine.

Change-Id: Iab38b48e6291e1960fc288696a7ebd18ffe8ebae
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175020
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-10-16 17:47:14 +02:00
Jean-Pierre Ledure 0f74a4c2bf scriptforge.py Color args in exception.PythonShell()
The
   exception.PythonShell()
method opens the APSO console.

It receives 2 additional arguments
   background
   foreground
which specify the back- and foreground colors
of the window to open as a Python console.

Typical use of the method:
   exc.PythonShell({**globals(), **locals()}, \
       background = 0x0, foregound = 0xFFFFFF)
opens the shell with all existing variables
loaded and with white characters on a black
background.

The default values are those set in APSO:
   background = 0xFDF6E3
   foreground = 0x657B83
No impact on existing scripts.

The current change requires to be completed with
the addition of the 2 arguments in the
adequate help page.

Additonal minor changes
- typo in scriptforge.pyi
- 'outsideprocess' replaced by 'remoteprocess'

Change-Id: I9b1be123f049aa39bd0d814b6dd63fcc4f4ea310
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174897
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2024-10-15 11:00:38 +02:00
Jean-Pierre Ledure af67aa7cc9 scriptforge.py - clarify pipe mode
Introduction of a
  ScriptForge.outsideprocess
property: when True the actual mode
is via socket or via pipe.

The property is for internal use only.
Once set it cannot be changed anymore.

Previous statements similar to
   if ScriptForge.port > 0:
which returned True when socket mode
are replaced by a broader
   if ScriptForge.outsideprocess:

No effect on user scripts.

Change-Id: Ice0efd8c2ab9925511fc8c6889cab714fd208ba1
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174874
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2024-10-14 10:25:03 +02:00
Jean-Pierre Ledure 0b6afed3b8 ScriptForge Fix tdf#163219 With blocks
Reference:
  https://bugs.documentfoundation.org/show_bug.cgi?id=163219#c7

Everywhere the With block variable is defined
or redefined inside the With block, the Basic
code has been reviewed.

Found in
  SFDatabases/SF_Database.xba/SetTransactionMode()
  SFDocuments/SF_Document.xba/Styles()
  ScriptForge/SF_Dictionary.xba/ImportFromPropertyValues()
  ScriptForge/SF_UI.xba/SetStatusBar()
  ScriptForge/SF_UI.xba/ShowProgressBar()

Most changes consist in isolating the With block
variable before the With block itself.

No functional change.

This solution is a workaround for the bug.
IT DOES NOT SOLVE THE ROOT CAUSE.

Change-Id: I48af29d3d9c8b1e36ef5a85c8cfe28f9639ae483
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174560
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-10-07 15:04:20 +02:00
Jean-Pierre Ledure 74b79b7ac1 scriptforge.pyi - Typo
Change-Id: Ieff7ec790c457b1f4f67544d3f300fc68723d5aa
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174393
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-10-02 17:53:55 +02:00
Jean-Pierre Ledure acbbf33d67 scriptforge.py - improve debugging mode
To facilitate the debugging of the
ScriptForge Basic code called by the
python scripts, 2 methods have been
added to the ScriptForge() class:

- initializeRoot(force = False)
  Initialize the global scriptforge
  data structure.
  - When force = False, only when
    not yet done.
  - When force = True, reinitialize it
    whatever its status.

- errorHandling(standard = True)
  Determine how errors in the ScriptForge
  Basic code are handled. Either
  - the standard mode, i.e. display a "crash" message
    to the user
  - the debugging mode, i.e. the execution stops
    on the line causing the error

Example (cfr. tdf#162962)

from scriptforge import CreateScriptService, ScriptForge
sf = ScriptForge()
sf.errorHandling(False)

def testSF():
    srv = CreateScriptService("Calc")

g_exportedScripts = (testSF,)

Change-Id: I25d7d8e36e71d95ff8a04191bb8344794886d69e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173458
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-09-17 12:58:10 +02:00
Jean-Pierre Ledure 0419b8c8f9 scriptforge.py Connect via pipe
Python scripts using ScriptForge start like:
   from scriptforge import CreateScriptService, \
           ScriptForge
   ScriptForge(...)		(*)
   sv = CreateScriptService(...)

The (*) statement has next syntaxes: either
   (1)   ScriptForge()
   (2)   ScriptForge(host: str = ..., port: int = ...)
   (3)   ScriptForge(pipe: str = ...)

Syntax (1) is implicit at the first invocation of
CreateScriptService() without a former call to
ScriptForge()

Syntax (2) exists in previous versions.

This commit implements syntax (3) to connect a Python
process to a LO process on the same system via a pipe
mechanism.

The change impacts only Python scripts.

The documentation should be upgraded to include
the new functionality.

Change-Id: I50457b6fffc8c9d6a9ad5c5289de1c363c6680e3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173252
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2024-09-13 15:04:17 +02:00
Jean-Pierre Ledure 70f3fea2f3 ScriptForge (Dictionary) support case-sensitive keys
To enhance the compatibility between
 - sf dictionaries
 - python dicts
 - arrays of PropertyValues
it was necessary to propose the support
of case-sensitive keys, i.e. keys are
different if a case-sensitive comparison
finds them different.

So far only not case-sensitive keys
were supported.

This required a re-visit of the implementation
of the ScriptForge.SF_Dictionary service. So far
it was built upon a Basic Collection class which
differentiates keys not case-sensitively. The
new implementation uses sorted arrays.

The invocation of the service is now:
   dict = CreateScriptService("Dictionary", True/False)
True means case-sensitive keys.
Default = False, which preserves the compatibility
with the past.

ScriptForge uses dictionaries internally in
several places. For each of them it has been
assessed if the new attribute was justified
or not. For most of the contexts, it was.

The functionality makes sense only for Basic
user scripts.

The documentation of the Dictionary page
should be revised according to the new invocation
syntax.

Change-Id: If1f695bcbf1673a2b71c1e41487b1781caab71c2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173044
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2024-09-08 17:14:50 +02:00
Jean-Pierre Ledure 609a6dc2df ScriptForge New IsAlive property
When a document is closed inadvertently
by the user during a macro run, or between
two macros triggered by events, the actual
behaviour is an error message and a stop
of the execution of the macro.

As this can be counter-productive, the macro
may test at any moment if everything is ok
with the
   IsAlive As Boolean (True = OK)
property applied on next service instances:
   Document
   Base
   Calc
   FormDocument
   Writer
   Datasheet
   Dialog

The functionality is available both for
Basic and Python user scripts.

The user documentation should be completed
accordingly.

Change-Id: I0b055dacc06c9da70c611dbb4e7bf841160168fd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172970
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jean-Pierre Ledure <jp@ledure.be>
2024-09-08 14:25:35 +02:00
Jean-Pierre Ledure d2d14c36d1 ScriptForge (Database) DMin, DMax return strings or dates
Python only:

Reset a flag in SF_Database.DMin and DMax methods
to allow dates to be returned.

Review typing hints to accept strings and dates

Integration of remarks from Microsoft/VSCode
about minor syntax issues in scriptforge.pyi
(syntax was accepted by PyCharm).
Now, syntax commonly accepted by both IDE's.

Change-Id: I752d9f1d7a5293222d81748f8fb2e8f46f4317de
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172912
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-09-05 15:21:53 +02:00
Jean-Pierre Ledure 3f3ea3351c scriptforge.py - Platform & TextStream
Since
  https://gerrit.libreoffice.org/c/core/+/172600
a better categorization of properties
has been done between 4 distinct levels.

The SF_Platform and SF_TextStream services
still needed an update to avoid
redundancy on some of their properties.

A choice had to be made, either:
- put them in the serviceproperties dict
- or define them explicitly with @Property
Not both, for clarity.

Change-Id: I787c7e57235622abf5deb5c7fd42c4c28aa82ec8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172863
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-09-04 17:22:09 +02:00
Jean-Pierre Ledure 87bfd87ecf ScriptForge (scriptforge.py) fine tune getattr/setattr()
Several minor changes
- comments
- 'cls' used where relevant i.o. class name
- dynamic getting/setting properties reviewed
- SF_Platform properties:
  set level = 1 i.o. 0 when returned
  by PythonHelper module

Change-Id: I4e9877bc16efd340dc14693833c032c998329b6e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172836
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-09-04 10:14:42 +02:00
Jean-Pierre Ledure f2f7dbb78c scriptforge.py Improve properties performance
When considering next python user script:
   a = CreateScriptService(...)
   a.prop = ...
   print(a.prop)
   print(a.prop)
so far, the evaluation of a.prop was done
either once or twice depending on
- a parameter of the class a is an instance of
- the read-only status of prop (True/False)

Now the recomputation of the expression
depends on a parameter of prop which can take
one of next values:
  0: prop is read-only and not re-evaluated
  1: prop is read-only but re-evaluated
     f.i. because a user action can change its value
  2: prop is editable and not re-evaluated
     f.i. because it can be changed only by code
  3: prop is editable and always re-evaluated

The change will decrease the number of useless
and more costly recomputations of properties.

Change-Id: I11412a58772147dab2e6b9b06c31477135932603
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172600
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2024-08-30 10:21:31 +02:00
Jean-Pierre Ledure 2f9a4a80c0 ScriptForge (SF_Utils._Valudate) Improve robustness
All arguments passed to ScriptForge methods
are checked for validity.

A.o. a string may be compared with a closed
list of allowed values.
The comparison may now optionally be made
with a
   CaseSentitive As Boolean
parameter.

All occurrences where this check makes sense
were identified, inventoried and modified.
A True argument has been inserted where
appropriate.

Change-Id: I1a5cb7fb42618bc83fc8ec57c2727fc2a1bfcdb9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172530
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-08-29 10:01:17 +02:00
Jean-Pierre Ledure 8a4ee0fb39 ScriptForge (SFWidgets) new ContextMenu service
Complete a predefined context menu with new items
placed at its bottom.

A context menu is obtained by a right-click
on several areas of a document. Each area has
its own context menu.
Each component model has its own set of context menus.

A context menu is usually predefined at
LibreOffice installation. Customization is done
statically with the Tools + Customize dialog.
The actual new service provides a mean
to make temporary additions at the bottom of a
context menu. Those changes are lost when
the document is closed.

The name of a context menu is the last component
of the resource URL:
   "private:resource/popupmenu/the-name-here"

Context menu items are either usual items or
line separators. Checkboxes or radio buttons
are not supported.
Items run a command or a script when clicked.

The service implements 2 methods:
   AddItem() adds an entry in the menu hierarchy
   Activate() shows or hides the added entries

A context menu can be defined from both Basic
and Python user scripts.

An update of the documentation is required.

Change-Id: Id77f1f2565d75e36c09b13972330d0f83b3f1db4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172355
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
Tested-by: Jenkins
2024-08-24 18:29:12 +02:00
Jean-Pierre Ledure fcd18913d5 ScriptForge (SF_Calc) Typos
Comments needed to be made compliant with code
in relation to Calc sheet limits.

Change-Id: I67962540e484ab1d51bc79f8ee7e7a73f9f25a2b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171872
Tested-by: Jenkins
Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
2024-08-15 18:04:28 +02:00