Die Implementierung einer Kategorie erfolgt ausschließlich über das Erstellen einer .Net-Datenklasse. Üblicherweise wird dafür eine Anwendungsbibliothek erstellt.
cardo durchsucht bei der Registrierung von Kategorien alle erreichbaren Assemblies und sucht dort nach allen nicht abstrakten, öffentlichen Typen, die die Schnittstelle IPuzzleCategoryDefinition implementieren.
Die neu gefundenen Kategorien müssen für die Verwendung registriert werden. Bei der Registrierung wird die Definition in die cardo-Datenbank importiert und die Datenklasse der Kategorie wird angelegt. Die Datenfelder werden dabei durch die Implementierung bereitgestellt.
Der Benutzer kann nachträglich die Datendefinition mit dem Klasseneditor erweitern bzw. verändern. I.d.R. werden programmtechnisch nur die Datenfelder angegeben, die für das „Funktionieren“ der Kategorie mindestens notwendig sind.
Das Vorgehen wird durch den folgenden Beispielcode dargestellt:
using System.Collections.Generic;
using System.IO;
using IDU.cardo3.CoreModules.Puzzle.Category;
using IDU.KmiLib;
using IDU.KmiLib.Ikx;
namespace IDU.LKL.Puzzle.Categories
{
public sealed class TrainingCourseCategory : LklPuzzleBase,
IPuzzleCategoryDefinition
{
/////////////////////////////////////////////////////////
#region IPuzzleCategoryDefinition Members
/////////////////////////////////////////////////////////
///<summary>
/// Die Id der Kategorie, muss eindeutig sein
///</summary>
public string CategoryId
{
get { return "LKL_PZL_TC"; }
}
///<summary>
/// Die Id der Datenklasse, muss eindeutig sein.
/// I.d.R. gleicht mit der CategoryId
///</summary>
public string ClassId
{
get { return "LKL_PZL_TC"; }
}
///<summary>
/// Der Anzeigetitel
///</summary>
public string Title
{
get { return "Beispielimplementierung"; }
}
///<summary>
/// Ausführliche Beschreibung im HTML Format
/// Für Anzeigezwecke
///</summary>
///<param name="targetStream"></param>
///<returns></returns>
public bool GetLongHtmlDescription(System.IO.Stream targetStream)
{
using (StreamWriter wrt = new StreamWriter(targetStream))
{
wrt.Write(@"<p>
Diese Kategorie beschreibt das
Vorgehen bei der Erstellung.
</p>");
wrt.Flush();
}
//true, wir haben etwas
//in den Stream geschrieben
return true;
}
///<summary>
/// Liste der privaten Klassen die verwendet werden sollen.
/// Wird vor GetClassEntitys aufgerufen.
///</summary>
///<param name="kmiCtx"></param>
///<returns></returns>
public IList<MDClass> GetPrivateSubClasses(IIKXContext kmiCtx)
{
//In diesem Bsp. sind keine
//privaten Subklassen vorhanden
return new MDClass[0];
}
///<summary>
/// Die Klassendefinition wird bei der
/// Registrierung der Kategorie abgerufen.
///</summary>
///<param name="kmiCtx"></param>
///<returns></returns>
public IEnumerable<MDClassEntity> GetClassEntitys(IIKXContext kmiCtx)
{
List<MDClassEntity> result = new List<MDClassEntity>();
///////////////////////////////////////////////////
#region Daten zum Objekt
///////////////////////////////////////////////////
//Preis Zelt
result.Add(new IDU.KmiLib.Ikx.MDClassEntity(kmiCtx)
{
//eindeutiger Name des Datenfeldes
ClassEntityId = "DESCRIPTION",
//Datentype
BasicEnumType = MDSimpleTypes.CLob,
//Hier könnte eine Spezialisierung
//(Datenfeldererweiterung) angegeben werden
//SubTypeType = typeof(IDU.cardo3.CoreModules.Ikx.DataExtension.MultiLangTextExtension),
//oder eine MimeType
//SubType="text/html",
//Anzeigetitel
Label = "Beschreibung",
//Ausführliche Beschreibung
Description = "Geben Sie hier eine Beschreibung an.",
//Häufigkeit dieses Datenfeldes
MinOccurrance = 0,
MaxOccurrance = 1,
//Vererbung aktivieren...?
InheritMode = MDInheritMode.None,
//Hinweise für die Anzeige im Dateneditor
SortHint = "000",
GroupName = "Allgemein",
GroupSort = "000",
//Verwendungshinweis(e)
UseHint = MDEntityUsageHint.IsSearchable,
//spezielle Bedeutung
EntityMeaning = MDEntityMeanings.FullTextSearchContent
});
///////////////////////////////////////////////////
#endregion
///////////////////////////////////////////////////
return result;
}
///<summary>
/// Hier kann ein Xml Node zurückgeben werden,
/// der das Kartensymbol für diese Kategory beschreibt.
/// Erwartet wird null oder eine Symboldefinition aus
/// dem Namespace http://schemas.webs.idu.de/iwan/symbology
///</summary>
///<returns></returns>
public System.Xml.XmlNode TryGetCategoryLayerSymbolNode()
{
return null;
}
///<summary>
/// Verhalten beim Aktualisieren der Kategoriedefinition
///</summary>
public UpdateClassDefBehavior UpdateBehavior
{
get
{
return UpdateClassDefBehavior.CombineSearchAndProjectionUseHint;
}
}
/////////////////////////////////////////////////////////
#endregion
/////////////////////////////////////////////////////////
}
}