Exemplo de customização com Xslt no CorelDraw Nº 1
Criando um novo flyout menu com o sistema de Addons do coreldraw utilizando XSLT
Publicado: Modificado:
Neste exemplo vou demonstrar como criar um menu do tipo flyout com o sistema de addons do CorelDraw.
O resultado final será.
Primeirament temos que criar um addon vazio, para isso vamos criar uma pasta dentro da pasta addons, na raiz de instalação do corelDraw, e criar o arquivo coreldrw.addon dentro de nossa pasta, com isso teremos nosso addon. Para mais informações sobre esse passo veja: https://bonus630.com.br/artigos/entendendo-o-sistema-de-addons-do-coreldraw/48.html
Agora vamos precisar de dois arquivos do tipo xslt, um com o nome "AppUI.xslt" e outro com o nome "UserUI.xslt", você pode baixar os arquivos com a estrutura básica aqui.
Crie uma pasta com qualquer nome adicione o arquivo "CorelDRW.addon" e seus arquivos AppUI e UserUI.
No arquivo "AppUI.xslt" nós vamos criar nossos controles, e no arquivo "UserUI.xslt" vamos adiociona-los na UI do Coreldraw.
Todos os controles são tags "itemData" que são filhos da tag "items" que por sua vez é filha da tag "uiConfig", então para definirmos o tipo de controle que queremos utilizar temos que especificar o atributo "type" nas tag "itemData".
Um item do menu pode ser um outro menu ou algum outro tipo de item, para determinar se um item é um menu utilizaremos o tipo "flyout" e teremos que ter uma barra de commandos do tipo "flyout" como referência, criando assim uma arvore de menus. Vamos colocar nosso novo menu abaixo desse menu "Create" e acima do "Macros", para isso precisaremos do seu guid, utilizando o DrawUI Explorer temos que seu guid é 'eb5291a6-13b7-4b87-9ece-5fbc2f035667'
Vamos criar uma pasta com um nome qualquer, você pode escolher qualquer nome, dentro vamos adicionar nossos arquivos xslt e o arquivos "CorelDrw.addon".
Agora vamos trabalhar no arquivo AppUI.xslt, vamos adicionar algumas tags "itemData", a tag "itemData" é responsável por moldar nosso controle, com ela adicionamos o tipo do controle, nome, legenda, referência para outros controles, icones entre outros. Porém está não pode ser adicionada diretamente, ela sempre será referenciada por meio do seu guid em outras tags por meio do atributo "guidRef" ou "flyoutRef", como vamos ver aqui, mas existem outros atributos de referência.
Crie 3 tags "itemData", a primeira vamos cria-la com o atributo "type"="flyout", este será nosso menu, os outros dois vamos criar como tipo "button", vamos cria-los no nó de copia "uiConfig/items"
<xsl:template match="uiConfig/items"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> <!-- Define the item will contains menu --> <itemData guid="40660fad-fece-47c1-997d-9f634e88a927" noBmpOnMenu="true" type="flyout" dynamicCategory="2cc24a3e-fe24-4708-9a74-9c75406eebcd" userCaption="Teste Xslt 2" enable="true" flyoutBarRef="09516d27-6fd6-4577-b159-00887e1b83fc" /> <itemData userCaption="Menu 01" guid="04b6d929-acd3-460a-805c-666794cdb79a" enable="true" type="button" /> <itemData userCaption="Menu 02" guid="50B61078-84A9-4E1F-93EA-606681227179" enable="true" type="button" /> </xsl:copy> </xsl:template>
Note: Você deve criar novos Guids para os items
Vamos criar outro nó de copia para nossa barra de comando que se comportara como menu e vamos adicionar nosso botões a ela, no final seu arquivo AppUI ficará
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:frmwrk="Corel Framework Data"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <!-- Use these elements for the framework to move the container from the app config file to the user config file --> <!-- Since these elements use the frmwrk name space, they will not be executed when the XSLT is applied to the user config file --> <frmwrk:uiconfig> <!-- The Application Info should always be the topmost frmwrk element --> <frmwrk:applicationInfo userConfiguration="true" /> </frmwrk:uiconfig> <!-- Copy everything --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="uiConfig/items"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> <!-- Define the item will contains menu --> <itemData guid="40660fad-fece-47c1-997d-9f634e88a927" noBmpOnMenu="true" type="flyout" dynamicCategory="2cc24a3e-fe24-4708-9a74-9c75406eebcd" userCaption="Teste Xslt 2" enable="true" flyoutBarRef="09516d27-6fd6-4577-b159-00887e1b83fc" /> <itemData userCaption="Menu 01" guid="04b6d929-acd3-460a-805c-666794cdb79a" enable="true" type="button" /> <itemData userCaption="Menu 02" guid="50B61078-84A9-4E1F-93EA-606681227179" enable="true" type="button" /> </xsl:copy> </xsl:template> <xsl:template match="uiConfig/commandBars"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> <commandBarData guid="09516d27-6fd6-4577-b159-00887e1b83fc" type="menu" nonLocalizableName="Bonus630 Dockers" flyout="true"> <menu> <item guidRef="04b6d929-acd3-460a-805c-666794cdb79a"/> <item guidRef="50B61078-84A9-4E1F-93EA-606681227179"/> </menu> </commandBarData> </xsl:copy> </xsl:template> </xsl:stylesheet> |
Agora vamos para nosso arquivo "UserUI.xslt", vamos criar um "Helper" que nos ajudará a inserir nosso menu abaixo do menu "Create"
<!-- Helper to insert a new item into a menu/toolbar --> <xsl:template match="node()|@*" mode="insert-item"> <xsl:param name="after"></xsl:param> <xsl:param name="before"></xsl:param> <xsl:param name="content"></xsl:param> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:for-each select="node()"> <xsl:if test="name()='item' and @guidRef=$before"> <xsl:copy-of select="$content"/> </xsl:if> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> <xsl:if test="name()='item' and @guidRef=$after"> <xsl:copy-of select="$content"/> </xsl:if> </xsl:for-each> <xsl:if test="not(./item[@guidRef=$after]) and not(./item[@guidRef=$before])"> <xsl:copy-of select="$content"/> </xsl:if> </xsl:copy> </xsl:template>
Para testar suas modificações no arquivo "UserUI.xslt", após ser carregado pela primeira vez no coreldraw será necessario resetar seu coreldraw para os padrões de fabrica. O Helper adicionado pode ser utilizado para muitos tipos de projetos.
Precisamos informar um elemento de nível mais alto para mover nosso controle do arquivo "AppUI" para o "UserUI", vamos utilizar o namespace "frmwrk" dentro da tag "<frmwrk:uiconfig>", eles não serão executados ao carregar o xslt.
Então vamos adicionar as linhas.
<frmwrk:compositeNode xPath="/uiConfig/commandBars/commandBarData[@guid='6f114d89-1b8c-4877-a4af-a3624ddd95f6']"/>
Este é o "flyout" do menu "Tools"
Precisamos também adicionar nossa barra de comandos
<frmwrk:compositeNode xPath="/uiConfig/commandBars/commandBarData[@guid='FB727225-CEA7-4D27-BB27-52C687B53029']"/>
Agora vamos inserir nosso item abaixo do "Create", vamos utilizar nosso "Helper" e vamos checar se a barra já não foi adicionada anteriormente. Passamos a referencia do item que sera o container de nosso novo item, então checamos se nossa barra não existe, e inserimos após o item "Create" passando seu Guid.
<xsl:template match="commandBarData[@guid='6f114d89-1b8c-4877-a4af-a3624ddd95f6']/menu"> <xsl:apply-templates mode="insert-item" select="."> <xsl:with-param name="content"> <!-- Make sure we don't read the menu item it is already exists --> <xsl:if test="not(./item[@guidRef='40660fad-fece-47c1-997d-9f634e88a927'])"> <item guidRef="40660fad-fece-47c1-997d-9f634e88a927"/> </xsl:if> </xsl:with-param> <xsl:with-param name="after" select = "'eb5291a6-13b7-4b87-9ece-5fbc2f035667'"/> </xsl:apply-templates> </xsl:template>
Agora basta inserir os nosso botões dentro de nossa barra de comando (menu), com isso seu arquivo "UserUI.xslt" irá ficar, mas lembre-se de checar se o item já não existe, veja o arquivo pronto
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:frmwrk="Corel Framework Data" exclude-result-prefixes="frmwrk"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <!-- Use these elements for the framework to move the container from the app config file to the user config file --> <!-- Since these elements use the frmwrk name space, they will not be executed when the XSLT is applied to the user config file --> <frmwrk:uiconfig> <!-- The Application Info should always be the topmost frmwrk element --> <frmwrk:compositeNode xPath="/uiConfig/commandBars/commandBarData[@guid='6f114d89-1b8c-4877-a4af-a3624ddd95f6']"/> <frmwrk:compositeNode xPath="/uiConfig/commandBars/commandBarData[@guid='FB727225-CEA7-4D27-BB27-52C687B53029']"/> <frmwrk:compositeNode xPath="/uiConfig/frame"/> </frmwrk:uiconfig> <!-- Copy everything --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <!-- Helper to insert a new item into a menu/toolbar --> <xsl:template match="node()|@*" mode="insert-item"> <xsl:param name="after"></xsl:param> <xsl:param name="before"></xsl:param> <xsl:param name="content"></xsl:param> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:for-each select="node()"> <xsl:if test="name()='item' and @guidRef=$before"> <xsl:copy-of select="$content"/> </xsl:if> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> <xsl:if test="name()='item' and @guidRef=$after"> <xsl:copy-of select="$content"/> </xsl:if> </xsl:for-each> <xsl:if test="not(./item[@guidRef=$after]) and not(./item[@guidRef=$before])"> <xsl:copy-of select="$content"/> </xsl:if> </xsl:copy> </xsl:template> <xsl:template match="commandBarData[@guid='6f114d89-1b8c-4877-a4af-a3624ddd95f6']/menu"> <xsl:apply-templates mode="insert-item" select="."> <xsl:with-param name="content"> <!-- Make sure we don't read the menu item it is already exists --> <xsl:if test="not(./item[@guidRef='40660fad-fece-47c1-997d-9f634e88a927'])"> <item guidRef="40660fad-fece-47c1-997d-9f634e88a927"/> </xsl:if> </xsl:with-param> <xsl:with-param name="after" select = "'eb5291a6-13b7-4b87-9ece-5fbc2f035667'"/> </xsl:apply-templates> </xsl:template> <xsl:template match="commandBarData[@guid='09516d27-6fd6-4577-b159-00887e1b83fc']/menu"> <xsl:apply-templates mode="insert-item" select="."> <xsl:with-param name="content"> <!-- Make sure we don't read the menu item it is already exists --> <xsl:if test="not(./item[@guidRef='04b6d929-acd3-460a-805c-666794cdb79a'])"> <item guidRef="04b6d929-acd3-460a-805c-666794cdb79a"/> </xsl:if> </xsl:with-param> </xsl:apply-templates> </xsl:template> <xsl:template match="commandBarData[@guid='09516d27-6fd6-4577-b159-00887e1b83fc']/menu"> <xsl:apply-templates mode="insert-item" select="."> <xsl:with-param name="content"> <!-- Make sure we don't read the menu item it is already exists --> <xsl:if test="not(./item[@guidRef='50B61078-84A9-4E1F-93EA-606681227179'])"> <item guidRef="50B61078-84A9-4E1F-93EA-606681227179"/> </xsl:if> </xsl:with-param> </xsl:apply-templates> </xsl:template> </xsl:stylesheet>
Agora você tem um novo menu para utilizar em seus addons ou macros. Podendo adicionar mais botões e adicionar comandos a eles.
Os guids e posições dos menus deste artigos são referentes a versão X8 do coreldraw podendo mudar em outras versões, portanto verifique-os no arquivo "DrawUI.xml"