Обмен данных внутри терминала
Введение.
Обмен данными осуществляется двумя способами: через операцию копировать/вставить
и через операцию Drag & Drop.
Передаваемые данные могут быть простого и сложного формата. Данные простого
формата это просто текст в поле ввода (или что-то в этом роде). Данные сложного
формата это набор простых данных.
Пример простых данных: содержимое поля ввода
Пример сложных данных: строка (строки) таблицы, группа элементов, в общем, все
остальное. Обмен простыми данными здесь не рассматривается, т.к. это тривиально.
Данные для обмена представляют собой обычный XML-запрос. Приемник
данных получает этот запрос и обрабатывает его с помощью XSLT. В качестве
приемника может выступать любой элемент способный обрабатывать данные
(edit, listbox, table, group, window и т.д.). Чтобы элемент стал способен
принимать данные он должен иметь следующее свойство:
exchange="interface=action, interface=action, ..."
это свойство представляет собой разделенный запятыми список пар.
Пара это id интерфейса и имя XSLT-преобразования разделенные знаком равенства.
Пара определяет от каких интерфейсов элемент может принимать данные и каким XSLT
их преобразовывать. Вот и все.
XSLT-преобразование
Когда данные переносятся из источника они сохраняются как XML в котором корневым
тегом будет <сopy>, что является одним уровнем с элементом <data>.
XSLT-преобразование должно возвращать документ с корневым тегом <data>.
Операция копировать/вставить
Чтобы скопировать в буфер запрос необходимо у активного элемента
(button, menuitem) указать свойство click="copy".
Чтобы вставить из буфера необходимо у активного элемента
(button, menuitem) указать свойство
click="id.drop ()"
где id - id элемента в который вставляются данные.
У элемента-приемника должно быть свойство exchange описанное выше
Примеры
1) Допустим копируется строка таблицы в группу элементов edit в другом интерфейсе.
Интерфейс источник:
<interafce id="soure" ver="111111">
<table id="tab">
<column id="c0"/>
<column id="c1"/>
<column id="c2"/>
<column id="c3"/>
</table>
<button id="button"/>
<properties>
<idref name="button" text="Копировать" click="copy"/>
</properties>
</interafce>
Интерфейс приемник:
<group id="gr">
<edit id="a"/>
<edit id="b"/>
<edit id="c"/>
<edit id="d"/>
<button id="button"/>
</group>
<properties>
<idref name="gr" exchange="source=paste"/>
<idref name="a" source="a"/>
<idref name="b" source="b"/>
<idref name="c" source="c"/>
<idref name="d" source="d"/>
<idref name="button" text="Вставить" click="gr.drop ()"/>
</properties>
<action name="paste">
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="row">
<data>
<a><xsl:value-of select="col[@index = 0]"/></a>
<b><xsl:value-of select="col[@index = 1]"/></b>
<c><xsl:value-of select="col[@index = 2]"/></c>
<d><xsl:value-of select="col[@index = 3]"/></d>
</data>
</xsl:template>
</xsl:stylesheet>
</action>
Теперь можно перетащить мышкой строку таблицы в интерфейс-приемник и бросить
в элемент gr.
Или нажать кнопку "Копировать" в интерфейсе-источнике, потом нажать кнопку
"Вставить" в интерфейсе-приемнике.
Данные из источника сохраняются так:
<copy>
<row index="3">
<col index="0">AAA<col/>
<col index="1">BBB<col/>
<col index="2">CCC<col/>
<col index="3">DDD<col/>
</row>
</copy>
Преобразуются XSLT-преобразованием в:
<data>
<a>AAA</a>
<b>BBB</b>
<c>CCC</c>
<d>DDD</d>
</data>
Назад