Как сделать окно диалога расширяемым?

Автор eeigor, 10 марта 2021, 07:19

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

eeigor

Тема имеет связь с постом и получила самостоятельное развитие.
Основная ссылка ведёт вот сюда на форум "соседей" (и весь код там). Там же обсуждаются и "последние" проблемы с моим участием и участием автора надстройки, не до конца решающей данную задачу. Можно заглянуть ещё сюда. Но лучше не надо...

К сожалению, удаётся открыть расширяемое окно, только если само окно и код помещены в библиотеку "Мои макросы и диалоги", а не, почему-то, в сам документ. Это не подходит: диалог является частью документа. Как заставить код работать, если диалог находится в документе (Calc)?

Окно должно быть расширяемым, не модальным и находиться в документе. Если, конечно, это возможно.

Вот так работает (результат на скриншоте 1), окно расширяемое модальное (контейнер), в которое встроено "наше" окно без заголовка (зд. текстовое поле с кнопкой) с именем "Dialog1". Код и окно диалога находятся в библиотеке "Мои макросы и диалоги" (location=application).
   sURL = "vnd.sun.star.script:Standard.Dialog1?location=application"

А так не работает (скриншот 2, ошибка: "...library container not found!"). Код и окно диалога находятся в документе (location=document).
'   sURL = "vnd.sun.star.script:Standard.Dialog1?language=Basic&location=document"
   sURL = "vnd.sun.star.script:Standard.Dialog1?location=document"
Ошибка возникает вот здесь (oDP.createContainerWindow(sURL, ...)
Function CreateInnerDialog(oParent As Variant, sURL As String) As Variant
   PS = com.sun.star.awt.PosSize
   oDP = CreateUnoService("com.sun.star.awt.ContainerWindowProvider")
   oChildDialog = oDP.createContainerWindow(sURL, "", oParent, nothing)
<...>


Примечание. Почему окно встроено одно в другое? Чтобы не создавать элементы управления динамически, а сделать это на этапе разработки, а потом встроить в контейнер с требуемой функциональностью (расширяемый). С этой целью у встраиваемого окна удалён заголовок (With title bar = No).

Тема "немодальности" диалога обсуждается, к примеру, здесь.
По ссылки выше - без "цикла ожидания". В прикрепленном примере - с "циклом ожидания" (файл "non-modal-dialog.ods").

Challenge
Кто соберёт всё это воедино и сможет наделить элементы управления диалога "разумным поведением": возможностью изменять свои размеры и расположение при изменении размера формы. Признаки такого поведения могли бы задаваться пользователем на этапе разработки в свойстве элемента управления ".Model.Tag" (в свойствах оно называется так: "Additional information...", что означает "дополнительные сведения") с использованием формализованного синтаксиса (могу предложить). Как-то так... Ну, или хотя бы без признаков "разумности"...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#1
Цитата: eeigor от 10 марта 2021, 07:19с использованием формализованного синтаксиса (могу предложить)
@sokol92, текст ниже идёт и в дополнение к нашему разговору. Правда, иногда решаемую при этом задачу с масштабированием (scaling) шрифтов предлагаю опустить (константы из примера ниже удалены), шрифт можно менять отдельно по желанию (мы это тоже обсуждали; ну, кроме размера шрифта кнопок, подписей). Интересуют: size - изменение размера; float - перемещение. И, наверное, придётся задействовать режим совместимости с VBA, чтобы создать парочку классов, которые будут считывать и хранить все эти TaggedValues каждого элемента управления, или хотя бы Enum (насколько я знаю, штатный BASIC этот оператор не поддерживает). Но можно и обойтись процедурами, "неперечисляемыми" константами и прочее...

' ==================================
' Text constants
' ==================================

Const cSizeIt = "SizeIt"
Const cFloatIt = "FloatIt"
Rem Const cScaleIt = "ScaleIt"

Const cSizeRight = "RIGHT"
Const cSizeBottom = "BOTTOM"
Const cSizeBoth = "BOTH"
Const cSizeNone = "NONE"

Const cFloatRight = "RIGHT"
Const cFloatBottom = "BOTTOM"
Const cFloatBoth = "BOTH"
Const cFloatNone = "NONE"

' ==================================
' Enumerated values
' ==================================

Enum ControlSize
   czRight = 1
   czBottom = 2
   czBoth = 3
   czNone = 0
End Enum

Enum ControlFloat
   cfRight = 1
   cfBottom = 2
   cfBoth = 3
   cfNone = 0
End Enum

UPD1: Или это надо оформлять в виде заявки на улучшение (enhancement) разработчикам? Будут предложения?

UPD2:
Вот так это могло бы задаваться:
Tag="Size=Right;Float=Bottom"
И элемент управления растягивается в ширину вместе с формой, а его верхний левый угол "плывёт" вниз по мере увеличения высоты окна.
Возможно, для кнопки, расположенной по середине, потребуется ещё один параметр: "Float=Center".
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#2
Добрый день!

1. То, что диалог, находящийся в документе, нельзя использовать методом, указанным в стартовом сообщении, вероятно, несложно обойти, скопировав диалог в библиотеку (временную?) приложения.

2. Идея использовать свойство Tag элементов управления для каких-либо настроек может оказаться неприемлемой, поскольку программисты, использующие LO, уже давно могли задействовать это свойство для своих нужд: например, мы загоняем туда параметры для глобализации (номера текстов для показа на самих элементах, всплывающих сообщений, помощи и т.п.).

Думаю, что у разработчиков LO сейчас есть более насущные проблемы (чем изменяемые в размерах окна), например, уменьшение числа багов.  :). Да и изменяемые "родные" окна в LO почему-то не запоминают установленные пользователем размеры.

Добавление к 1. Можно по другому (в сети такого не видел):

  • выгрузить диалог из документа в xdl файл
  • поменять при необходимости значение атрибута dlg:withtitlebar на False (тогда можно использовать и диалоги, которые изначально не создавались, как изменяемые)
  • указать URL-файла в качестве первого параметра метода createContainerWindow
Владимир.

eeigor

Библиотеки не создавал, попробую...
В отношении свойства Tag... трудно согласиться: оно присутствует в списке свойств, доступных для установки пользователем на этапе разработки. Что касается того, что кто-то уже его может использовать, то такой подход крайне неверен, ибо требует соглашения с другими. В условиях "негласного соглашения" такие свойства надо использовать аккуратно, не нарушая "границы". Например, с использованием предложенного синтаксиса:
"PropName=Value;Size=Right;Float=Bottom"
Первое – это ваше, остальное – моё. А не по принципу: кто первый встал, того и тапки.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Цитата: sokol92 от 10 марта 2021, 15:56Добавление к 1. Можно по другому (в сети такого не видел)
@sokol92, я только начал разбираться с диалогами. С форматом xdl пока не знаком... Если у вас будет время, попробуйте сделать пример.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Удалось, конечно, сделать расширяемое окно без вложенного. Добавил программно пока только кнопку. Многое неясно, хотя и заработало. Помощь всё ещё приветствуется...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#6
Цитата: eeigor от 10 марта 2021, 19:00Если у вас будет время, попробуйте сделать пример

Цитата: Тит ЛивийPotius sew, quam nunquam

Лучше поздно, чем...  :)
Владимир.

eeigor

#7
Владимир, прекрасная работа (расширяемый диалог).

ОФТОПИК
Если будет время и желание, то вспомните о другой нашей дискуссии: сетка для конкретного листа. Тогда Вы обнаружили, что в xml свойствах листа этот параметр называется чуть иначе (вроде, GridLines). Глобальное свойство ShowGrid управляет всеми листами сразу, тогда индивидуальный параметр (флажок в контекстном меню) становится не рабочим: его можно установить, но без эффекта. Были решения на форумах с массивом листов и событием по их выделению. Тогда глобальное свойство то сбрасывалось, то устанавливалось – в зависимости от заданного значения в массиве листов. Но в xml настройки никто не заглянул.

Зачем это нужно?
Разрабатывая приложения, я ВСЕГДА убираю сетку на листах с данными. Но вот беда: бывают ошибки Calc'а, когда исчезают бесследно комментарии, разфиксируются (unfreeze) строки и столбцы и, наконец, сетка листов возвращается ОБРАТНО. У меня есть стандартная кнопка "Восстановить вид", которая много чего делает: и восстанавливает ширину столбцов и строк, фиксирует строки и столбцы, прячет сетку, устанавливает масштаб, вставляет исчезнувшие комментарии, защищает лист и т. д. Хотелось бы сеткой листа управлять индивидуально.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Цитата: eeigor от 13 февраля 2023, 12:27ОФТОПИК
Мы можем вернуться к этой теме.
Насколько я помню, конструкция вида:
ThisComponent.CurrentController.ShowGrid=Falseделает невидимой сетку на всех листах (независимо от их индивидуальных установок).
Владимир.

eeigor

Да. Так и делаю. Но дальше пока дело в сообществах не пошло.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community