OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 09:02

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Что такое документ?
СообщениеДобавлено: Среда, 05 Ноябрь, 2014 16:24 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Разбираюсь тут с окнами и решил прояснить для себя, что такое документ (см. модуль Documents.Document). Вот что получилось:
Цитата:
Технически документ это контейнер отображений, связанный с окном. При этом в дереве фреймов окна документ связан с корневым фреймом. В общем случае отображение открывается в документе. Концепция каркаса предполагает, что документ является корнем ненаправленного ацикличного графа отображений, а окно является корнем дерева фреймов.
Концептуально понятие документа относится к документоориентированности Блэкбокса. В справке по каркасу есть раздел Compound Documents, в котором обоснована необходимость поддержки каркасом разделения на пространство документа и пространство отображения. В пространстве документа используются стандартные единицы длины, а в пространстве отображения используются экранные (пиксельные) размерности. Таким образом, название модуля Documents вроде бы соответствует концепции Блэкбокса.
Документ удобен для постраничной распечатки отображения, ведь модуль Documents предоставляет соответствующие возможности. Ещё считается, что документ поддерживает два стека операций, Повтор и Отмена. Но на самом деле эти операции реализованы на уровне окна, а объект Documents.Document сам этим не занимается.
Важно указать, что все объекты, встроенные в контейнер документа, разделяют меж собой один и тот же домен хранилища, к которому относится и сам документ.
Собственно, и всё. Жидковато, надо сказать. Окно никакими особенными функциями объекта Документ не пользуется, а значит, Документом можно назвать любое отображение, открытое в окне. Ну, разве что возможность распечатки полезная, но этим архитектуру не расшатать. Поэтому наличие модуля Documents кажется несколько надуманным (мол, "а давайте между окном и графом отображений воткнём какой-нибудь контейнер").


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Среда, 05 Ноябрь, 2014 18:54 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну и, типа, какой-то базовый стандартизированный вьюв-стор, который лежит в корне ODC. У которого можно нечто узнать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Среда, 05 Ноябрь, 2014 19:31 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
В Блэкбоксе вся документация пронизана понятием "документ". В Дорожной Карте прямо озвучено, что Блэкбокс документоцентричен и вы, как пользователь, работаете с документами и их частями, а не прямо с файлами и окнами. То есть, модуль Documents призван поддерживать концепт документа. Ну и многие механизмы каркаса заточены на тип Documents.Document и на тот факт, что к окну пристёгнут документ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Среда, 05 Ноябрь, 2014 22:58 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Пока обдумываю это дело, набросал рисунок. Наглядно показано разделение на два пространства и какие объекты в каком пространстве работают.


Вложения:
Пространство документа.png
Пространство документа.png [ 10.08 КБ | Просмотров: 12608 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Четверг, 06 Ноябрь, 2014 13:07 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
В завершение темы, пожалуй, стоит описать построение дерева фреймов при открытии отображения в документе. Просто чтобы зафиксировать в потоке обсуждения.

Итак, мы средствами ББ желаем открыть вьюшку в окне. Под это дело хост каркаса создаёт объект окна платформы (под платформой имеется в виду операционная система), где можно уже что-то нарисовать - средствами платформы, конечно. Тут же возникает объект окна ББ, для которого создаётся порт (соответствующий экрану, например) и к этому окну привязывается хэндл платформенного окна. То есть, у нас теперь есть всё, что нужно для рисования на экране.

Теперь переходим в пространство документа. Каркас создаёт документ и инициализирует его модель нашим отображением. После чего заставляет окно ББ обновиться. Что же происходит дальше?

ББ-окно задействует средства системного уровня (модуль Views) для перестроения и обновления дерева фреймов. На этом этапе определяются видимые области, то есть происходит отсечение. Более того, обновление дерева фреймов обрамляется работой с буфером порта - чтобы всю отрисовку в конце работы выплюнуть на экран одним махом и тем самым избежать демонстрации пользователю процесса перерисовки.

Самое интересное, что дерево фреймов обновляется ниспадающим образом при перерисовке отображений. Это означает, что первым у нас перерисовывается отображение документа, а ему и назначается корневой фрейм дерева фреймов. Документ, перерисовывая себя, вставляет наше отображение в свой фрейм, и нашей вьюшке назначается новый фрейм (Вы ведёте счёт? Возникло уже два фрейма в дереве!). Дальше всё зависит от того, как ведёт себя наше отображение. Оно может вставлять в свой фрейм другие отображения и таким образом дерево фреймов будет разрастаться "вниз", при этом оставаясь деревом (связным ациклическим графом).

А поскольку у нас работает отсечение, то фреймы за пределами видимой области не попадут в этот процесс и, соответственно, не встроятся в дерево. Из этого можно сделать важный вывод насчёт передачи некоторых сообщений. Сообщения Views.CtrlMessage и Views.Message передаются именно по дереву фреймов, а значит, их получат только видимые отображения.

Да, забыл ещё одну штуку. При создании объекта документа инициализируется его домен, и все остальные персистентные объекты нашего документа будут зарегистрированы именно в этом домене. И, стало быть, домен определит границу, по которой можно понять, что будет сохранено в файл.

Итак, у нас есть окно, из которого растут две структуры. Первая, можно назвать её "контейнерная", начинается с объекта документа со вложенными в него другими объектами. А вторая, это дерево фреймов, которые связаны с видимыми объектами из "контейнерной" структуры.

Наверное, будет нелишним обозначить, что раз отображению выделен фрейм (кстати, важный момент - фрейм назначается в процессе обновления дерева фреймов, поэтому отображение не может что-то у себя нарисовать в произвольный момент времени, именно поэтому мы видим метод Restore у вьюшки, в который передаётся фрейм), то оно может воспользоваться его возможностями для рисования. А фрейм-то связан с портом через свой бегунок. И как раз бегунок реализует все платформенные возможности рисования в окне.

Нормальная такая архитектура, я считаю. Достаточно гибкая, чтобы поддержать другие концепции, отличные от документоцентричности.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Четверг, 06 Ноябрь, 2014 15:39 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Но хорошо бы и поэкспериментировать с упрощением.
Обычный ход мысли для экспериментов: сделать inversion of references или inversion of control (поменять направления, кто кого знает - ссылается, и кто кого дёргает в каких случаях).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Четверг, 06 Ноябрь, 2014 15:57 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Концепция ведь довольно продуманная. Каждому элементу предметной области соответствует своя часть архитектуры. Тут разве что добавить в концепцию что-то новое, например, "бездокументное" окно. Или блочное, как предлагал\делал Пётр, но что он под этим понимает - пусть лучше сам расскажет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Суббота, 08 Ноябрь, 2014 11:00 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Вот, кстати, место документа в каркасе. Прошу заметить, что оконная система на этой схеме отсутствует, потому что её в Блэкбоксе просто нет, ответственность за поведение окон возлагается на хозяина (например, кликаете вы по окну, и оно поднимается "наверх". Это делает ОС-хозяин, а Блэкбокс у себя просто помечает, какое окно стало верхним). Отсюда и крайняя простота понятия "окно" в каркасе (что логичным образом приводит нас к следующему заключению: если требуется богатая функциональность окна, то необходимо сперва ввести в концепцию понятие оконной системы).


Вложения:
Отсутствие оконной системы.png
Отсутствие оконной системы.png [ 4.31 КБ | Просмотров: 12496 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Суббота, 08 Ноябрь, 2014 11:05 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Иван Кузьмицкий писал(а):
...возникает объект окна ББ, для которого создаётся порт (соответствующий экрану, например) и к этому окну привязывается хэндл платформенного окна
Уточню, порт соответствует пиксельному блоку на экране, габариты порта соответствуют габаритам окна и начало координат порта 0,0 соответствует началу координат в окне.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Суббота, 08 Ноябрь, 2014 14:39 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Иван Кузьмицкий писал(а):
Концепция ведь довольно продуманная. Каждому элементу предметной области соответствует своя часть архитектуры. Тут разве что добавить в концепцию что-то новое, например, "бездокументное" окно. Или блочное, как предлагал\делал Пётр, но что он под этим понимает - пусть лучше сам расскажет.
Да я, в общем, в своей работе не трогал концепцию Document. Просто предположил, что отображение может работать и вне контейнера документа, если отображение не надо печатать, сохранять и т.д. Собственно, документ это частный случай отображения которое возвращает собственный фрейм (который на самом деле RootFrame, то есть, предназначен для бытия корнем дерева фреймов).

А так как связка Windows.port+Window.frame+Window.doc + Documents.Document прочно склеена друг с другом прямо в интерфейсе, то я оставил все как было, а сам реализовал окно, в котором вместо Window.doc ничего нет, а вместо одного .frame есть набор корневых фреймов, присоединенных к одному порту. Такие фреймы назвал блоками, планировал их размещать одноуровнево в окно операционной системы, в виде тайлов.

Потом стало понятно, что документное "окно" (а точнее, .frame и .doc) довольно просто обернуть таким тайлом-пустышкой. Если бы продолжил проект - получилось бы то, к чему все привыкли, и что я даже частично показывал - менюшка, статусбар, документ и два скроллера по бокам. Только все это в рамках отображений ББ.

То есть, мое блочное окно стояло на одном уровне иерархии с обычным "окном ББ", а реализация и того и другого была выполнена в хосте. На этот же уровень иерархии потом попало "летающее" окно, которое пригодилось для popup-меню.
Отсюда я предположил, что даже в концепции окон ББ у эталонного окна ББ мог бы присутствовать некий абстрактный предок. Вот и все. Ну или, можно и без предка, шаблон Twin поможет, это я потом сделал в SithWindows.

При должном усердии можно это все уместить и в обычный Window. Наверное.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Воскресенье, 09 Ноябрь, 2014 21:14 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Суммируя итоги дополнительных обсуждений, я пришёл к выводу о том, что базовая концепция Блэкбокса очень проста и выглядит так: "Пользователь - Документ". Поскольку Блэкбокс "плавает" на другой операционной системе (платформе), которая обычно включает в себя понятие пользователя, то базовую концепцию можно переписать так: "Платформа - Документ".

То есть, понятия Окна в концепции каркаса просто нет, как ни парадоксально. Наличие модуля Windows никак это не опровергает, потому что объект Windows.Window является точкой склейки блэкбоксового Документа с платформенным Окном. Другими словами, Окно есть в концепции Платформы.

Следовательно, если мы хотим гибкое управление окнами, тайлы, TDI, SDI, ZUI и что-то ещё, можно выбирать соответствующую платформу. Или же наращивать концепцию Блэкбокса, добавлением в неё Окна. А может, сразу Пользователя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Воскресенье, 09 Ноябрь, 2014 22:37 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Внешнее устройство "Пользователь". С вариативной реализацией.
И драйвер для Comm.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Воскресенье, 09 Ноябрь, 2014 23:24 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Читал, что Раушенбах, создавая системы стыковки космических аппаратов, учитывал человеческие особенности оператора, т.е. Пользователя - например, проблемы восприятия пространственных метрик на плоскости дисплея. Что, если Блэкбокс получит трехмерную оконную систему? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Вторник, 11 Ноябрь, 2014 11:35 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
И ещё кое-что про документ.

Джеф Раскин в 1984 году представил компьютер Canon Cat, и ряд идей, среди которых была вот такая:
Цитата:
Отказ от разбиения задач по приложениям.
Пользователь должен работать в едином интерфейсе. Это дело системы — решать, какой модуль подключать в тот или иной момент. Так, например, если пользователь печатает на компьютере текст, значит, необходимо подключать модуль со словарем и функции текстового процессора, а если чуть дальше пользователь пишет формулу — уже нужен вычислительный модуль.

В своей книге "Интерфейс" Раскин более детально описал эти вещи:
Цитата:
Программное обеспечение вместо того, чтобы состоять из операционной системы и набора приложений, рассматривается человекоориентированным интерфейсом как набор команд, некоторые из которых являются трансформаторами, автоматически вызываемыми в тех случаях, когда тип данных, предусмотренных командой, не соответствует типу данных выбранного объекта. При этом может быть вызвано более одного трансформатора. Предположим, что с помощью одного трансформатора производится конвертация из А в В, а с помощью другого — из B в С. Если команда предусматривает обработку данных типа С, а данные выборки представляют собой тип А, то перед выполнением команды должны быть запущены два трансформатора. Если необходимых трансформаторов не имеется, никаких изменений с выборкой не производится. Пользователю при необходимости выдается специальное сообщение, а выборка остается без изменений.

А теперь смотрим, что делается у Вирта, "Проект Оберон":
Цитата:
Важной целью разработки системы Оберон была расширяемость. Это простота наращивания системы новыми средствами путем добавления модулей, которые могут использовать уже существующие ресурсы. Это (что так же важно) и сокращение системы до тех необходимых средств, которые в настоящее время и на самом деле используются. Например, редактору документов, работающему с документами без рисунков, не нужно загружать обширный графический редактор рабочей станции, работающей автономно, не нужно загружать обширное сетевое программное обеспечение, а офисной системе не нужны ни компилятор, ни ассемблер.

Не знаю, пересекались ли Вирт с Раскиным в конце 80-х, но мыслят они "на одной волне". И, конечно, поведение меню и команд в Блэкбоксе очень сильно напоминает то, о чём писал Раскин. Короче, мы в Блэкбоксе имеем две важных вещи, это Документ и Команда. Многие команды исполняются для текущего фокуса (выделения). Это приводит нас к документации Блэкбокса по модулю Controllers:
Цитата:
Сообщение диспетчера - это сообщение, которое посылается вдоль единственного пути в иерархии отображений - пути фокуса. Каждое отображение на таком пути само решает, когда оно является терминалом этого пути, то есть, текущим фокусом, или когда сообщение следует переслать одному из внедренных отображений. BlackBox поддерживает два пути фокуса, называемых целевым и передним фокусом. Оба пути могут слиться в один. Целевой путь указывает, какое отображение является целью команд в диалогах. Передний путь указывает, какое отображение редактируется, с помощью мыши, клавиатуры или меню.

Отсюда становится понятно, почему в объект Окна Windows.Window агрегирован только один-единственный объект Документа Documents.Document и почему дерево фреймов Окна начинается только с одного, корневого фрейма. Сигналы от пользователя попадают только в один документ, именно тот, с которым пользователь работает. Внутри этого документа есть Фокус, с которым может работать какая-нибудь Команда. Поскольку мы ведём речь о человеко-ориентированном интерфейсе, то это означает, что человек не способен одновременно работать с несколькими Командами. Именно поэтому фокус один и дерево фреймов растёт из одного корня (чтобы человек посылал сигналы только в локус своего внимания). И это обстоятельство необходимо учитывать при разработке оконной системы.

P.S. Речь идёт об идеях 1980-х годов. А что нам из этого принесло развитие веба в XXI веке? Форматированные странички? Вебдванольные приложения? Облачный офис? По-моему, предложенный Раскиным подход к человекоориентированному интерфейсу до сих пор не реализован в полной мере.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Среда, 19 Ноябрь, 2014 19:40 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Пётр упомянул корневой фрейм типа Views.RootFrame, который возвращается отображением Documents.Document. Интересно, что структура типа корневого фрейма отличается от обычного фрейма Views.Frame только тем, что содержит регион обновления (и ещё какие-то флаги, которые, похоже, нигде не используются). И алгоритмы модуля Views жёстко контролируют применение типа RootFrame.

А ещё интересная штука - модуль HostBitmaps содержит, можно сказать, канонический паттерн применения корневого фрейма:
Код:
   PROCEDURE Paint (dc: WinApi.HDC; v: Views.View; w, h, unit: INTEGER);
      VAR d: RootView; c: RootContext; p: HostPorts.Port; f: Views.RootFrame; g: Views.Frame;
   BEGIN
      NEW(p);
      p.Init(unit, Ports.screen);
      p.SetSize(w, h);
      p.SetDC(dc, 0);
      NEW(c);
      c.w := w * p.unit;
      c.h := h * p.unit;
      NEW(d);
      d.view := Views.CopyOf(v, Views.shallow);
      Stores.Join(d, d.view);
      d.InitContext(c);
      d.view.InitContext(c);
      Stores.InitDomain(d);
      d.GetNewFrame(g); f := g(Views.RootFrame); f.ConnectTo(p);
      Views.SetRoot(f, d, FALSE, {});
      Views.AdaptRoot(f);
      Views.RestoreRoot(f, 0, 0, c.w, c.h);
   END Paint;


Тут прямо всё как на тарелочке: порт, контекст, домен, корневой фрейм и перестройка дерева фреймов. Пройдусь поэтапно.

1) Мы хотим, чтобы наше отображение не участвовало в системном дереве фреймов, а отрисовалось непосредственно на устройстве (в нашем случае это винапишный контекст отображения DC, а эталонный хост ББ как раз умеет на нём рисовать).
2) Отображение рисует средствами Views.Frame, потомка Ports.Frame - который, как известно, занимается преобразованием из пространства документа в пространство отображения (маппер, да-да) и кроме этого, использует бегунки Ports.Rider для операций рисования.
3) Бегунки Ports.Rider опираются на носитель пиксельных данных Ports.Port. Следовательно, первым делом необходимо завести объект порта (для прикладного софта важно задать размер порта и единицы измерения, для платформенного софта можно ещё и контекст отображения указать):
Код:
      NEW(p);
      p.Init(unit, Ports.screen);
      p.SetSize(w, h);
      p.SetDC(dc, 0);

4) Концепция отображения подразумевает, что его поведение зависит от модели, в которую встроено это отображение. Связь между моделью и отображением реализует объект контекста. Поэтому создаём контекст и ему тоже надо задать размеры.
Код:
      NEW(c);
      c.w := w * p.unit;
      c.h := h * p.unit;

5) Вот здесь как раз такое место, которое я ещё не очень понимаю. Особый тип отображения, RootView, является контейнером для нашего отображения. Оно отличается от стандартных тем, что на запрос GetNewFrame возвращает фрейм корневого типа Views.RootFrame. Остальное всё стандартно - инициализация контейнера, контекста, домена.
Код:
      d.view := Views.CopyOf(v, Views.shallow);
      Stores.Join(d, d.view);
      d.InitContext(c);
      d.view.InitContext(c);
      Stores.InitDomain(d);
И я не понимаю, почему бы нашему отображению не возвращать корневой фрейм и таким образом, стать самому в корне, без прокладки RootView? Ведь маппером может быть любой фрейм, подключённый к носителю:
Код:
      d.GetNewFrame(g); f := g(Views.RootFrame); f.ConnectTo(p);

6) В финале у нас инициализация корневого фрейма и сброс счётчиков регионов, "адаптация" (обрезка) фреймов-потомков по габаритам корня, перерисовка дерева фреймов.
Код:
      Views.SetRoot(f, d, FALSE, {});
      Views.AdaptRoot(f);
      Views.RestoreRoot(f, 0, 0, c.w, c.h);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что такое документ?
СообщениеДобавлено: Пятница, 21 Ноябрь, 2014 17:17 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Свёл все находки в небольшой текст, раздел "Корневой фрейм".


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB