DLE Masken und Menüs

Mit DLE Masken und Menüs lassen sich spezifische Einstiegsmasken definieren und beim Start der DLE aufrufen. DLE Masken werden standardmäßig im Verzeichnis „DLE_HOME/packages/[Paketname]/resources/forms/…“ abgelegt.

Masken

DLE Masken werden in XML definiert. Um eigene Masken definieren zu können sollte man daher in XML bewandert sein. Folgender Codeblock zeigt den grundlegenden Aufbau einer DLE Maske.

<?xml version="1.0" encoding="ISO-8859-1"?>
<Form name="MENU_NAME" display="MENU_TITLE">
<Property name="Image" value="~/packages/DLE/resources/forms/pics/form.jpg"/>
<menu …>

</menu>
</Form>

Den Rahmen der Maske bildet der Form-Tag. Neben einem eindeutigen Namen der Maske kann hier auch ein Titel angegeben werden. Im weiteren kann derzeit lediglich eine zusätzliche Eigenschaft für eine Maske mittels Property-Tag definiert werden – ein Hintergrundbild. Hintergrundbilder müssen mit dem Property-Tag definiert werden, das Attribut „name“ muss den Wert „Image“ besitzen und dem Attribut „value“ muss der Dateipfad und Dateiname des Bildes zugeordnet werden.

Aufruf einer spezifischen DLE Start-Maske

Um die erstellte Start-Maske aufzurufen, muss eine SHELL- bzw. BAT-Datei erstellt werden. Die Startdateien müssen im Verzeichnis DLEHOME/scripts abgelegt sein. Das folgende Beispiel zeigt den Inhalt einer BAT-Datei zum Aufruf eines spezifischen Menüs.

@echo off
rem ---------------------------------------------------------
rem Start DLE Folder Administration
rem Copyright (c) by VISION-FLOW Software GmbH
rem ---------------------------------------------------------
"C:\Projekte\DLE_Projekt\java\bin\java" -jar ..\dlestart.jar -menu packages/Paketname/resources/forms/startmaske.xml %*

Menüs

Menüs kommen in der DLE an verschiedenen Stellen vor. Zum einen können Masken Menüs haben. Zum anderen können Datensichten und Listen Menüs besitzen.

Die Menüs für die Masken und Datensichten werden auf dieselbe Art und Weise in XML definiert und je nach Gebrauch in die jeweilige Definition eingebunden. Die XML-Beschreibung der Menüs ist wie folgt aufgebaut:


<menu name="ExampleMenu" translate="true">
<item name="MenuEintraege" display="Menüeinträge">
<item name="Auswertungen" display="Auswertungen">
<item name="AuswertungenErstellen"
display="Auswertungen erstellen"
dleCommand="singleDleCall">
<Properties>
<Property name="FOLDER"
value="DLE:GeneralBricks"/>
<Property name="BASE:BrickName"
value="AuswertungenErstellen"/>
</Properties>
</item>
<item name="AuswertungenAnzeigen"
display="Auswertungen anzeigen"
dleCommand="singleDleCall">
<Properties>
<Property name="FOLDER"
value="DLE:GeneralBricks"/>
<Property name="BASE:BrickName"
value="AuswertungenAnzeigen"/>
</Properties>
</item>
</item>
<item name="tododata"
display="ToDo Liste"
formCommand=
"at.visionflow.dle.client.admin.dpe.DLETodoForm"
/>
<item name="separator"/>
<item name="closeDleAction"
display="Schließen"
mnemonic="alt|f4"
menuFormActionCommand="closeDleAction"/>
item name="separator"/>
<item name="applications"
display="DLE-Anwendungen
dleApplicationsCommand=
"at.visionflow.dle.client.admin.DLEAdministrationForm"
>
<Properties>
<Property name="PACKAGELIST"
value="PACKAGE_1; PACKAGE_2"/>
<Property name="MENULIST"
value="PACKAGE3:MENUE_1.xml"/>
<Property name="EXCLUDE_MENULIST"
value=" PACKAGE_1: MENUE_1.xml" />
</Properties>
</item>
</item>
</menu>

Jedes Menü hat einen eindeutigen Namen. Zudem kann mit dem Attribut „translate“ festgelegt werden, ob die Menüeinträge übersetzt werden sollen oder nicht. Ist translate="false" angegeben, wird nicht übersetzt, sondern es werden die Werte der „display“-Attribute dargestellt (Standard).
Ein Menü besteht gewöhnlich aus mehreren Einträgen (items). Jeder Eintrag kann verschachtelt wieder beliebig viele Einträge enthalten.
Es werden nachfolgende vier Typen von Einträgen unterschieden, die nach dem „command“-Attribut differenziert werden:

  • dleCommand: Mit diesem Kommando lassen sich Bricks aus dem Menü heraus aufrufen. Bei diesem Kommando müssen zusätzlich noch die Eigenschaften (Properties) angegeben werden, die den Ordner (Folder) und den Brick festlegen, der ausgeführt werden soll.
  • formCommand: Mit diesem Kommando können bestehende Masken der Brickverwaltung aufgerufen werden. Im Beispiel wird die Todo-Liste der DLE aufgerufen.
  • menuFormActionCommand: Mit diesem Kommando lassen sich bestimmte generische Aktionen der Maske aufrufen. Im Moment wird jedoch nur das Schließen-Kommando angeboten.
  • dleApplicationsCommand: Mit diesem Kommando lassen sich DLE-Anwendungen, für die ein DLE-Menü existiert, in ein anderes Menü einbinden. Die genaue Steuerung zur Einbindung von Menüs erfolgt über Properties:

    • PACKAGELIST: Sämtliche Menüs die in den Paketen der angegebenen Paketliste definiert sind stehen zur Auswahl. Die einzelnen Pakete innerhalb der Liste sind durch ein Semikolon “;” getrennt. Z.B. PACKAGE_1; PACKAGE_2
    • MENULIST: Die Menüs in dieser Liste werden angezeigt. Ein Menü muss mit dem Paketnamen vor dem Menünamen angegeben werden. Die einzelnen Pakete innerhalb der Liste sind durch ein Semikolon “;” getrennt. Z.B. PACKAGE3:MENUE_1.xml
    • EXCLUDE_MENULIST: Die Menüs in dieser Liste werden NICHT angezeigt. Ein Menü muss mit dem Paketnamen vor dem Menünamen angegeben werden. Dies gilt auch, wenn sämtliche Menüs eines Paketes angezeigt werden sollen. Die einzelnen Pakete innerhalb der Liste sind duch ein Semikolon “;” getrennt. Z.B. PACKAGE_1: MENUE_1.xml

Zusätzlich, neben den bereits erwähnten Einträgen gibt es noch die Möglichkeit, Trennlinien einzufügen. Dies geschieht nicht über das „command“-Attribut, sondern über den Namen (name="separator").
Des Weiteren hat jeder Eintrag ein „name“-Attribut (muss angegeben und eindeutig sein), ein „display“-Attribut das den Anzeigetext enthält falls nicht übersetzt wird (nicht verpflichtend) und ein „mnemonic“-Attribut über das ein Tastaturkürzel bestimmt werden kann um den Eintrag mittels Tastatur aufzurufen.

Einbindung von Todo-Menüs in strukturierten Datensichten

Es ist möglich das Todo-Menü in einer Datensicht wieder zu verwenden und so die Statuswechsel über eine Datensicht (strukturiert) auszuführen. Dies ist insbesondere dann hilfreich, wenn man eigene Objekte hat die als Todo gehandhabt und verarbeitet werden (z.B. Auftrag). Das jeweilige Metdadatenobjekt (üblicherweise ein Datenbank-View oder Query-Objekt) muss jedoch min. die beiden Attribute TODO_ID und OWNER_IDC haben, damit das Todo-Menü innerhalb einer Datensicht verwendet werden kann. Das Todo-Menü selber wird dabei ganz einfach über den XML-Tag <TodoMenu/> eingebunden.

<?xml version="1.0" encoding="ISO-8859-1"?>
<Form name="TODO"
title="Auftragsbearbeitung"
width="900"
height="700"
defaultPackage="DLETEST">
<Application name="AUFTRAG">
<ApplicationObjects>
<Root>AUFTRAG</Root>
<AUFTRAG order="CREATEDDATE DESC" where="">
<DisplayedAttributes>
<ORDER width="100" />
<ORDERDESCRIPTION width="300" />

<CREATEDDATE width="100" />
<TODO_ID width="90"/>
<OWNER_IDC width="90"/>
</DisplayedAttributes>
<TodoMenu/>
</AUFTRAG>
</ApplicationObjects>
</Application>
<LayOuts>
<OneTable>
<Controls>
<Control type="MainTable"
gridx="0"
gridy="0"
gridwidth="1"
gridheight="1">
<ApplicationObject>AUFTRAG</ApplicationObject>
</Control>
</Controls>
</OneTable>
</LayOuts>
<LayOutChoosen>OneTable</LayOutChoosen>
</Form>

Mehrfachauswahl in strukturierten Datensichten

Grundsätzlich besteht in einer Datensicht (strukturiert) die Möglichkeit mehrere Zeilen auszuwählen und für alle Zeilen einen Brick aufzurufen. Um Multiselektion grundsätzlich zu erlauben muss im Control des gewählten Layouts das Attribut „multiple“ auf „true“ gesetzt sein. Ist das Attribut gesetzt können für die verschiedenen Einträge unterschiedliche Modi über das dleCommand definiert werden:

  • singleDleCall: Es wird jeweils nur ein Brick für ein Objekt (eine selektierte Zeile, bei mehreren Ausgewählten, ist der Menüpunkt deaktiviert) ausgeführt.
  • multiDleMultiCall: Es wird ein Brick für jedes selektierte Objekt neu aufgerufen.
  • singleDleMultiCall: Es wird ein Brick mit allen selektierten Objekten einmal aufgerufen. Innerhalb des Bricks kann dann mit dem Blockkommando „Schleife (geladene Daten)“ über die selektierten Objekte iteriert werden.

<?xml version="1.0" encoding="ISO-8859-1"?>
<Form name="Addresses"
title="Adressen"
width="900"
height="700"
defaultPackage="DLETEST">
<Application name="AddressApplication">
<ApplicationObjects>
<Root>Address</Root>
<Address>
<DisplayedAttributes>
<Name1 width="200" />
<Name2 width="200" />
<Street width="150" />
<HouseNumber width="50" />
<ZIPCode width="50" />
<Place width="150" />
<Countrycode width="50" />
<Email width="100" />
</DisplayedAttributes>
<menu name="AdressMenu"
packageName="DLETEST"
translate="true">
<item name="Details"
display="Details"
dleCommand="singleDleCall"
readOnly="False">
<Properties>
<Property name="FOLDER"
value="DLETEST:GENERAL"/>
<Property name="BASE:BrickName"
value="ShowAddressDetails"/>
</Properties>
</item>
<item name="Modify"
display="Ändern"
dleCommand="multiDleMultiCall"
readOnly="False">
<Properties>
<Property name="FOLDER"
value="DLETEST:GENERAL"/>
<Property name="BASE:BrickName"
value="ModifyAddress"/>
</Properties>
</item>
<item name="EMail"
display="E-Mail senden"
dleCommand="singleDleMultiCall"
readOnly="False">
<Properties>
<Property name="FOLDER"
value="DLETEST:GENERAL"/>
<Property name="BASE:BrickName"
value="EMail"/>
</Properties>
</item>
</menu>
</Address>
</ApplicationObjects>
</Application>
<LayOuts>
<TableShowAdressesLayout>
<Controls>
<Control type="MainTable"
gridx="0"
gridy="0"
gridwidth="1"
gridheight="1"
multiple="true">
<ApplicationObject>Address</ApplicationObject>
</Control>
</Controls>
</TableShowAdressesLayout>
</LayOuts>
<LayOutChoosen>TableShowAdressesLayout</LayOutChoosen>
<BrickOnClose>
<Properties>
<Property name="FOLDER" value="DLETEST:GENERAL"/>
<Property name="BASE:BrickName" value="AddressSearch"/>
</Properties>
</BrickOnClose>
</Form>

Ob „multiDleMultiCall“ oder „singleDleMultiCall“ gewählt wird, ist von der jeweiligen Aufgabenstellung abhängig. Wenn nur Teile eines Bricks alle gewählten Zeilen (Datenobjekte) betreffen, dann ist „singleDleMultiCall“ zu bevorzugen. Haben wir beispielsweise eine Liste von Firmenadressen und möchten an bestimmte Unternehmen eine Angebotsanfrage per Mail senden, wobei der Inhalt der E-Mail bis auf den Ansprechpartner und Empfängeranschrift derselbe ist, ist es leichter das Problem im „singleDleMultiCall“-Modus zu lösen. Bei dem Besipiel lässt sich der E-Mail-Brick in zwei Teile zerlegen:

  • einen von den gewählten Zeilen unabhängigen Teil (enthält die Kommandos die für alle gewählten Adressen nur einmal durchlaufen werden soll)
  • einen von den gewählten Zeilen abhängigen Teil (enthält die Kommandos die für alle gewählten Adressen durchlaufen werden sollen)

Für dieses Beispiel ist „singleDleMultiCall“ zu bevorzugen, da man den Angebotstext nur einmal für alle zu sendenden E-Mails nur einmal zu erfassen möchte und hinterher an alle gewählten Adresszeilen E-Mails versendet werden. Würde man hier „multiDleMultiCall“ definieren, würde für jede gewählte Zeile der komplette Brick extra aufgerufen werden. D.h., für jede, in der Datensicht, selektierte Zeile müsste man den Angebotstext separat erfassen. Das wäre für manche Anwendungen nicht praxisnah. Daher bietet die DLE hier mehrere Ansätze.

Rechtevergabe an DLE-Menüeinträge

Über die DSE (Dynamic Security Engine) lassen sich auch Menüeinträgen Rechte zuordnen. Voraussetzung dafür ist eine bestehende DLE-Rechteverwaltung. Im Gegensatz zu anderen Programmfunktionen ist bei Menüeinträgen nicht wichtig, ob diese editiert, gedruckt, gelöscht, … werden dürfen (gilt für Menüeinträge nicht) sondern lediglich, ob sie aufgerufen werden dürfen. Um dies zu erreichen sind keine besonderen Unterfunktionen auszuwählen. Sobald eine Unterfunktion erlaubt ist, ist auch das Ausführen des Menüeintrages erlaubt.
Um die Rechteprüfung der Menüeinträge zu aktivieren ist lediglich der Funktionsname mit dem Paket im Menüeintrag festzulegen:


<item name="alteruserpwd"
display="Alter user password"
classCommand="
at.visionflow.dle.client.admin.orgunit.DLEEditUserPwdForm"
functionName="DLE:alterPwd"/>

Hinzufügen von Schaltflächen

Einer Form/Datensicht können auf ähnliche Weise wie Menüs auch zusätzliche Schaltflächen (Buttons) hinzugefügt werden. Auf nachfolgender Abbildung ist zu sehen, wie den aktuellen Schaltflächen eine zusätzliche Schaltfläche mit einem PDF-Icon hinzugefügt wurde. Neue Schaltflächen werden den Standardschaltflächen der Form/Datensicht ergänzt.

Nachfolgendes Beispiel zeigt, wie man Schaltflächen in eine Form/Datensicht hinzufügt. Im Aufbau sind die Schaltflächen den Menüs sehr ähnlich – die Attribute entsprechen denen von Menüeinträgen. Gleich wie bei den Menüs kann man einer Schaltfläche eine Einfachauswahl/Mehrfachauswahl zuordnen. Entsprechend werden beim Brickaufruf die ausgewählten Zeilen mitgeliefert (siehe Menüs). Ergänzend ist bei den Schaltflächen das Attribut „icon“ hinzugekommen, über das ein Pfad zu dem Bild hinterlegt werden kann, das auf der Schaltfläche angezeigt werden soll. Alternativ oder zusätzlich kann der Schaltfläche über das Attribut „display“ ein Wert gesetzt werden.

<?xml version="1.0" encoding="ISO-8859-1"?>
<Form name="Addresses"
title="Adressen"
width="900"
height="700"
defaultPackage="DLETEST">
<Application name="AddressApplication">
<ApplicationObjects>
<Root>Address</Root>
<Address>
<DisplayedAttributes>
<Name1 width="200" />
<Name2 width="200" />
<Street width="150" />
<HouseNumber width="50" />
<ZIPCode width="50" />
<Place width="150" />
<Countrycode width="50" />
<Email width="100" />
</DisplayedAttributes>
<menu name="AdressMenu"
packageName="DLETEST"
translate="true">
<item name="Details"
display="Details"
dleCommand="singleDleCall"
readOnly="False">
<Properties>
<Property name="FOLDER"
value="DLETEST:GENERAL"/>
<Property name="BASE:BrickName"
value="ShowAddressDetails"/>
</Properties>
</item>
<item name="Modify"
display="Ändern"
dleCommand="multiDleMultiCall"
readOnly="False">
<Properties>
<Property name="FOLDER"
value="DLETEST:GENERAL"/>
<Property name="BASE:BrickName"
value="ModifyAddress"/>
</Properties>
</item>
<item name="EMail"
display="E-Mail senden"
dleCommand="singleDleMultiCall"
readOnly="False">
<Properties>
<Property name="FOLDER"
value="DLETEST:GENERAL"/>
<Property name="BASE:BrickName"
value="EMail"/>
</Properties>
</item>
</menu>
<buttons name="AdressMenu"
packageName="DLETEST"
translate="true">
<button name="toPdf"
display=""
dleCommand="singleDleCall"
readOnly="False"
width="18"
icon="~/temp/PDF_16x16.jpg">
<Properties>
<Property name="FOLDER"
value="DLE:GeneralBricks" />
<Property name="BASE:BrickName"
value="AddressesToPdf" />
</Properties>
</button>
</buttons>

</Address>
</ApplicationObjects>
</Application>
<LayOuts>
<TableShowAdressesLayout>
<Controls>
<Control type="MainTable"
gridx="0"
gridy="0"
gridwidth="1"
gridheight="1"
multiple="true">
<ApplicationObject>Address</ApplicationObject>
</Control>
</Controls>
</TableShowAdressesLayout>
</LayOuts>
<LayOutChoosen>TableShowAdressesLayout</LayOutChoosen>
<BrickOnClose>
<Properties>
<Property name="FOLDER" value="DLETEST:GENERAL"/>
<Property name="BASE:BrickName" value="AddressSearch"/>
</Properties>
</BrickOnClose>
</Form>