Document Templates (OWL)

Ein Dokument-Template assoziiert eine Doc/View-Dokumentklasse mit einer View-Klasse und erzeugt eine neue Klasse, die dann über ein View mit einem festgelegten Doc/View-Dokument verbunden wird. Eine solche Dokument-Template-Klasse wird mit dem Makro DEFINE_DOC_TEMPLATE_CLASS (definiert in doctpl.h) erzeugt, welches drei Argumente erwartet:

  • Name der Dokumentklasse
  • Name der Viewklasse
  • Name der zu erzeugenden Templateklasse

DEFINE_DOC_TEMPLATE_CLASS( TFileDocument, TEditView, CEditTemplate);

Mit diesem Beispiel wird die Doc/View-Dokumentklasse TFileDocument mit der Viewklasse TEditView verbunden und eine neue Klasse mit dem Namen CEditTemplate erzeugt. Die Klassen TFileDocument und TEditView sind von der OWL bereits vorgegebene Klassen.

TDocTemplate

Die Klasse TDocTemplate ist eine abstrakte Basisklasse, die die Funktionalität für Dokument-Templates bereitstellt. Jeder Dokumenttyp benötigt sein eigenes Dokument-Template.

Template Instanzen

Nachdem wir eine Doc/View-Dokumentklasse definiert haben, können wir eine beliebige Anzahl von Instanzen dieser neuen Klasse erzeugen. Die Verwaltung der Klassen übernimmt dann der Dokument-Manager der Anwendung.

Es existieren zwei verschiedene Konstruktoren zur Erzeugung von Template-Klassen. Der erste Konstruktor hat folgendes Aussehen:

TemplateName name(const char* description, const char* filter, const char* directory, const char* extension, long flags)

Parameter Bedeutung
TemplateName Name der Dokument-Templateklasse, die bei dessen Definition angegeben wurde.
name beliebiger Name für die zu erzeugende Instanz
description Textbeschreibung für das Dokument-Template. Diese wird in den Auswahllisten des Dokument-Managers angezeigt, vorausgesetzt das Modus-Flag dtHidden wird nicht verwendet. Übliche Textbeschreibungen sind beispielsweise „Alle Dateien“ oder „Textdateien“ usw.
filter enthält eine Dateimaske zur Filterung von Dateinamen. Ein Beispiel für eine solche Maske ist beispielsweise „*.txt“.
directory bezeichnet das zu verwendende Standardverzeichnis für die Doc/View-Dokumente dieser Klasse. Bei der Übergabe von 0, wird das aktuelle Verzeichnis verwendet.
extension enthält die Standard-Dateinamenserweiterung, die automatisch verwendet werden soll, wenn vom Benutzter ein Dateiname ohne Dateinamenserweiterung eingegeben wird. Wird hier 0 angegeben, wird die automatische Dateinamenserweiterung für diese Klasse deaktiviert.
flags bestimmt den Modus und verschiedene Eigenschaften der Template-Instanz. Nachfolgend finden Sie die wichtigsten Konstanten die Sie verwenden und in sinnvoller Weise miteinander kombinieren können.

Wichtige dtXXXX-Konstanten

Konstante Funktionsbeschreibung
dtAutoDelete Das Doc/View-Dokumentobjekt wird automatisch gelöscht, wenn das letzte View gelöscht wird.
dtNoAutoView Es erfolgt keine automatische Erzeugung einer Standard-View.
dtSingleView Es kann je Doc/View-Dokument nur ein View verwendet werden.
dtAutoOpen Das Doc/View-Dokument wird bei der Erzeugung automatisch geöffnet.
dtConfirm Es besteht für den Benutzer die Möglichkeit, den Pfad zu bestätigen.
dtHidden Das Template erscheint nicht in den Auswahllisten des Dokument-Managers, wird also vor dem Benutzer verborgen.
dtNewDoc Erzeugt ein neues Doc/View-Dokument.
dtUpdateDir Bewirkt, daß das Standardverzeichnis jedesmal neu gesetzt wird, wenn durch eine Dateiauswahl mit dem Dokument-Manager ein neues Verzeichnis gewählt wird.

Erzeugung einer Template-Instanz

Sehen wir uns nun ein Beispiel an, wie man Template-Instanzen erzeugt:

DEFINE_DOC_TEMPLATE_CLASS( TFileDocument, TEditView, CEditTemplate);

CEditTemplate TextTemplate( „Textdateien“, „*.TXT“, „C:\\TEXTE“, „TXT“, dtAutoDelete);
CEditTemplate AsmSources( „Assemblerdateien“, „*.asm;*.ash;*.inc“, 0, „ASM“, dtAutoDelete);
CEditTemplate CSources( „C/C++ Quelltexte“, „*.cpp;*.c;*.hpp;*.h“, 0, „CPP“, dtAutoDelete);
CEditTemplate AllFiles( „Alle Dateien“, „*.*“, 0, 0, dtAutoDelete | dtNoAutoView);

Mit diesem Beispiel werden vier Template-Instanzen erzeugt:

  • Die erste Instanz bekommt die Beschreibung „Textdateien“ für Dateien die als Erweiterung TXT haben und sich im Verzeichnis C:\TEXTE befinden. Beim Speichern wird die Erweiterung TXT automatisch benutzt, wenn der Anwender keine Erweiterung angibt. Außerdem ist das automatische Löschen des Dokuments, wenn das letzte View geschlossen wird, zugelassen.
  • Die zweite Instanz bekommt die Beschreibung „Assemblerdateien“ für Dateien die als Erweiterung entweder ASM, ASH oder INC haben. Wie wir sehen können, können mehrere Erweiterungen mit ein Semikolon getrennt angegeben werden. Als Verzeichnis wird das aktuelle Verzeichnis verwendet und für die automatische Erweiterung ASM verwendet. Das automatische Löschen des Dokuments ist hier ebenfalls zugelassen.
  • Die dritte Instanz ist im Prinzip identisch mit der zweiten, mit dem Unterschied, daß die Beschreibung „C/C++ Quelltexte“ ist, die für Dateien mit der Erweiterung CPP, C, HPP und H verwendet wird und das als automatische Erweiterung CPP verwendet wird.
  • Die vierte und letzte Instanz bekommt die Beschreibung „Alle Dateien“ und erhält als Maske „*.*“. Weiterhin wird das aktuelle Verzeichnis und keine automatische Erweiterung verwendet. Das automatische Löschen des Dokuments, wenn das letzte View geschlossen wird, ist zugelassen aber es erfolgt keine automatische Erzeugung einer Standard-View (dtNoAutoView).
Den zweiten Konstruktor zur Erzeugung einer Template-Klasse sollte man vorziehen, da der erste Konstruktor eigentlich nur noch aus Gründen der Abwärtskompatibilität mit älteren OWL Versionen vorhanden ist.

TemplateName name(TRegList& regTable);

Parameter Bedeutung
TemplateName Name der Dokument-Templateklasse, die bei dessen Definition angegeben wurde.
name beliebiger Name für die zu erzeugende Instanz
regTable Name der Registriertabelle, die mit den Makros BEGIN_REGISTRATION und END_REGISTRATION erzeugt wird

Der Code für die bereits oben beschriebenen Instanzen könnte dann ungefähr wie folgt aussehen:

BEGIN_REGISTRATION(TextReg)
REGDATA(description,“Textdateien“,
REGDATA(docfilter,“*.TXT“,
REGDATA(extension,“TXT“,
REGDATA(directory, „C:\\TEXTE“, REGDOCFLAGS(dtAutoDelete)
END_REGISTRATION

BEGIN_REGISTRATION(AsmSourcesReg)
REGDATA(description,“Assemblerdateien“,
REGDATA(docfilter,“*.ASM;*.ASH;*.INC“,
REGDATA(extension,“ASM“,
REGDOCFLAGS(dtAutoDelete)
END_REGISTRATION

BEGIN_REGISTRATION(CSourcesReg)
REGDATA(description,“C/C++ Quelltexte“,
REGDATA(docfilter,“ *.CPP;*.C;*.HPP;*.H „,
REGDATA(extension,“CPP“,
REGDOCFLAGS(dtAutoDelete)
END_REGISTRATION

BEGIN_REGISTRATION(AllReg)
REGDATA(description,“Alle Dateien“,
REGDATA(docfilter,“ *.* „,
REGDOCFLAGS(dtAutoDelete | dtNoAutoView)
END_REGISTRATION

CEditTemplate TextTemplate(TextReg);
CEditTemplate AsmSources(AsmSourcesReg);
CEditTemplate CSources(CSourcesReg);
CEditTemplate AllFiles(AllReg);

Document/View Model (OWL)

Hinter dem Begriff Document/View, kurz Doc/View, verbirgt sich ein sehr vielseitiger und interessanter Ansatz eines Programmiermodells. Als Programmierer hat man sehr viele Möglichkeiten zur Nutzung dieses Modells, da es eigentlich nur wenige Richtlinien gibt.

Bei einem Document/View-Dokument handelt es sich nicht einfach um ein herkömmliches Dokument mit bestimmten Daten wie beispielsweise eine Textdatei oder eine Tabelle. Vielmehr kann ein solches Dokument beliebige Daten wie Text, Grafik oder Bild- und Tondaten miteinander kombinieren. Um nun normale Dokumente begrifflich von Doc/View-Dokumenten unterscheiden zu können, werden Doc/View-Dokumente auch als Compound Documents (zusammengesetzte Dokumente) bezeichnet. Sehr oft werden die Begriffe Dokument und Datei auch in einen Topf geworfen. Im Doc/View-Modell gibt es aber ganz klare Trennungen der in diesem Modell enthaltenen Komponenten.

Architektur des Document/View Modell

Das Doc/View-Modell ermöglicht aber nicht nur die Kombination beliebiger Daten in einem zusammengesetzten Dokument, sondern auch eine flexible Repräsentation der Daten in unterschiedlicher Weise mit sogenannten Views (Ansichten). Diese Views sind praktisch ein Grundrahmen zur Darstellung der Daten. Ein Doc/View-Dokument kann über ein oder mehrere Views verfügen. Ein View kann hingegen aber nur mit einem einzigen Doc/View-Dokument assoziiert werden.

Der Einsatz des Doc/View-Modells erfordert natürlich einen Mehraufwand, der aber vor allem sinnvoll ist, wenn

  • die gleichen Daten auf verschiedenartige Weisen angezeigt und/oder bearbeitet werden sollen
  • wiederverwertbarer Programmcode geschrieben werden soll
  • eine flexible Erweiterung der Anzeige- und Bearbeitungsarten gewünscht ist
  • unterschiedliche Daten miteinander kombiniert werden sollen

Sie müssen aber selbst entscheiden, ob das Doc/View-Modell für Ihr geplantes Projekt sinnvoll ist. Für kleinere Programme lohnt es sich in der Regel nicht mit diesem Modell zu arbeiten. Auf jeden Fall macht sich die Mehrarbeit aber bezahlt, wenn Sie die gleiche Funktionalität in mehreren Programmen einsetzen möchten.

Datenquelle

Die Datenquelle enthält die physikalischen Daten eines Doc/View-Dokumentes. Es handelt sich um die beispielsweise auf Ihrer Festplatte gespeicherte Datei

Doc/View-Dokument

Das Doc/View-Dokument wird in der OWL in der Klasse TDocument gekapselt. Sie ist für das Laden, Speichern und Verwalten von Doc/View-Dokumenten zuständig. Der Sinn dieser Dokumente liegt darin, Daten zwischen Anwendungen auf relativ einfache Weise portierbar zu machen und in verschiedenen Formen anzeigen beziehungsweise bearbeiten zu können. Es besteht weiterhin die Möglichkeit zum Dokument zurückzukehren, d.h. die Daten wieder auf den Stand der letzten Sicherung zu bringen (Verwerfen). Dies wird dadurch ermöglicht, daß Änderungen in den Views nicht unmittelbar zur Änderung des Doc/View-Dokuments führen. Die Daten der Views werden erst bei einer expliziten Übernahme in das Doc/View-Dokument übernommen. TDocument stellt aber nur eine begrenzte bzw. abstrakte Funktionalität bereit. Um eigene Dokumente zu unterstützen, sind entsprechende Funktionen selbst zu erstellen und die vorgegebene Funktionalität den Bedürfnissen entsprechend zu ändern oder zu erweitern. Ein Dokument kann einem anderen Dokument über- oder untergeordnet sein. Auf diese Weise lassen sich auch mehrere Dokumente zu einem einzigen Dokument verbinden.

Views

Diese stellen quasi die Benutzerschnittstelle von Doc/View-Dokumenten dar. Sie ermöglichen die Anzeige und Manipulation der Daten durch den Benutzer. Ohne Views wären die Doc/View-Dokumente überhaupt nicht sichtbar. Dabei sind aber nicht die Views selbst für die Interaktion mit dem Benutzer verantwortlich, sondern ein optionales mit der View verbundenes Fenster. Die OWL-Klasse TView ist die Basisklasse für eigene Views, stellt aber nur eine begrenzte bzw. abstrakte Funktionalität bereit. Um eigene Views zu verwirklichen sind entsprechende Funktionen selbst zu erstellen und die vorgegebene Funktionalität den Bedürfnissen entsprechend zu ändern oder zu erweitern.

Datei-Menü

Die Document/View-Dokumentverwaltung korrespondiert über das Dateimenü einer View und sorgt für eine Standardbehandlung verschiedener vorgegebener Menüpunkte und deren Menü-Id´s.