LibreOffice Writer Элементы управления

Автор Ципихович Эндрю, 16 апреля 2026, 06:34

0 Пользователи и 2 гостей просматривают эту тему.

Ципихович Эндрю

разобрался...
2
у меня ОС ВИН 11, расширение oxt для LO Writer создано, установлено и имеет структуру:
в файле Events.xcu текст
<?xml version="1.0" encoding="windows-1251"?>
<oor:component-data oor:name="Events" oor:package="org.openoffice.Office" xmlns:oor="http://openoffice.org/2001/registry">
    <node oor:name="Events">
        <node oor:name="DocumentEvent">
            <node oor:name="OnDocumentOpened" oor:op="fuse">
                <prop oor:name="Script" oor:type="xs:string">
                    <value>vnd.sun.star.script:python/main.py$show?language=Python&amp;location=application</value>
                </prop>
            </node>
        </node>
    </node>
</oor:component-data>
в файле description.xml
<?xml version="1.0" encoding="windows-1251"?>
<description xmlns="http://openoffice.org/extensions/description/2006">
    <identifier value="com.autostart"/>
    <version value="1.0"/>
    <display-name>
        <name lang="ru">AutoStart</name>
    </display-name>
</description>
в файле META-INF\manifest.xml текст
<?xml version="1.0" encoding="windows-1251"?>
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
    <manifest:file-entry manifest:full-path="description.xml" manifest:media-type="application/vnd.sun.star.configuration-data"/>
    <manifest:file-entry manifest:full-path="python/main.py" manifest:media-type="application/vnd.sun.star.python-script"/>
</manifest:manifest>
в файле python\main.py текст
# -*- coding: utf-8 -*-
import uno
from com.sun.star.awt import MessageBoxButtons

def show(*args):
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    toolkit = smgr.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx)
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    frame = desktop.getCurrentFrame()
    window = frame.getContainerWindow()
    msg = toolkit.createMessageBox(window, MessageBoxButtons.BUTTONS_OK, 0, "OK", "Extension works!")
    msg.execute()

g_exportedScripts = (show,)
то есть всё по минимуму, расширение ставится, удаляется
я по задумке при открытии документа LO Writer должен увидеть сообщение, прописанное в коде-Extension works!, но этого не происходит, ЧЯДНТ? спасибо

Ципихович Эндрю

скажите, а практика:
расширение после установки в LibreOffice Writer в менеджере расширений должно автоматически запускаться при открытии любого документа Writer без ручной настройки со стороны пользователя
вообще реальна? если да, не подскажите в каком расширении так сделано?

Ципихович Эндрю

Цитата: Ципихович Эндрю от  3 мая 2026, 21:49скажите, а практика:
расширение после установки в LibreOffice Writer в менеджере расширений должно автоматически запускаться при открытии любого документа Writer без ручной настройки со стороны пользователя
вообще реальна? если да, не подскажите в каком расширении так сделано?
ну допустим, ответ ДА, AltSearch, потому как при открытии любого документа врайтер в документе появляется панель Альтернативный поиск - до тех пока юзер не примет какое-то решение
я правильно понимаю, что после того как юзер зайдёт Сервис-Настройка-События-Открытие файла-там должен быть указан макрос, но его там нет, значит какой в этом расширении механизм, который обеспечивает чтобы при открытии любого документа врайтер в документе что-то появлялось?

Ципихович Эндрю

здравствуйте, нашёл пример
sidebar-sample понял что нужно будет запустить вручную панель-приемлемо!
по его примеру создал свой пока пустой, одно время панель была создана а потом всё порушил, может кто подправит для моей
Version: 26.2.3.2 (X86_64)
Build ID: 70e089b17412e4cb7773e41413306b17a2328c34
CPU threads: 12; OS: Windows 11 X86_64 (build 26200); UI render: Skia/Vulkan; VCL: win
Locale: ru-RU (ru_RU); UI: ru-RU
Calc: threaded
текст файлов
sidebar_search.py
import uno

def start_search_sidebar(*args):
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    doc = desktop.getCurrentComponent()
   
    if doc:
        doc.getText().setString("Макрос работает!")
        print("Текст вставлен в документ!")

g_exportedScripts = (start_search_sidebar,)
Factory.xcu
<?xml version='1.0' encoding='UTF-8'?>
<oor:component-data
    oor:name="Factories"
    oor:package="org.openoffice.Office.UI"
    xmlns:oor="http://openoffice.org/2001/registry"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <node oor:name="Registered">
        <node oor:name="UIElementFactories">
            <node oor:name="PanelFactory" oor:op="replace">
                <prop oor:name="Type">
                    <value>toolpanel</value>
                </prop>
                <prop oor:name="Name">
                    <value>SidebarFactory</value>
                </prop>
                <prop oor:name="Module">
                    <value/>
                </prop>
                <prop oor:name="FactoryImplementation">
                    <value>vnd.sun.star.script:pythonpath/sidebar_search.py$start_search_sidebar?language=Python&amp;location=application</value>
</prop>
            </node>
        </node>
    </node>
</oor:component-data>
Sidebar.xcu
<?xml version='1.0' encoding='UTF-8'?>
<oor:component-data
    oor:name="Sidebar"
    oor:package="org.openoffice.Office.UI"
    xmlns:oor="http://openoffice.org/2001/registry"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <node oor:name="Content">
    <node oor:name="DeckList">
      <node oor:name="SidebarDock" oor:op="replace">
        <prop oor:name="Title" oor:type="xs:string">
          <value xml:lang="en">Панель ДНСД</value>
        </prop>
        <prop oor:name="Id" oor:type="xs:string">
          <value>SidebarDock</value>
        </prop>
        <prop oor:name="IconURL" oor:type="xs:string">
          <value>%origin%/images/black.png</value>
        </prop>
        <prop oor:name="ContextList">
          <value oor:separator=";">Writer, any, visible ;</value>
        </prop>
      </node>
    </node>
    <node oor:name="PanelList">
      <node oor:name="SidebarPanel" oor:op="replace">
        <prop oor:name="Id" oor:type="xs:string">
          <value>SidebarPanel</value>
        </prop>
        <prop oor:name="DeckId" oor:type="xs:string">
          <value>SidebarDock</value>
        </prop>
        <prop oor:name="ContextList">
          <value oor:separator=";">Writer, any, visible ;</value>
        </prop>
        <prop oor:name="ImplementationURL" oor:type="xs:string">
          <value>private:resource/toolpanel/SidebarFactory/SidebarPanel</value>
        </prop>
        <prop oor:name="OrderIndex" oor:type="xs:int">
          <value>700</value>
        </prop>
      </node>
    </node>
  </node>
</oor:component-data>

Ципихович Эндрю

здравствуйте, оказывается то, что панель открылась\закрылась после нажатия на кнопку это нормально, потому как я не правильно пробовал, нужно было чуть-чуть сдвинуть ширину панели=приоткрыть её и только тогда пробовать, понял....жизнь чуть приукрасилась))