Skip to content

Citavi Architektur

Daniel Lutz edited this page Aug 19, 2020 · 2 revisions

Inhalt des Webinars

  • Aufbau des Citavi-API und Interaktion mit dem Citavi User-Interface
  • Einrichten der Entwicklungsumgebung
  • Add-Ons erstellen, die keinen User-Aufruf benötigen (z.B. Filter für die Titelnavigation)
  • Menüs und Symbolleisten von Citavi per Add-On erweitern
  • Übersteuern von eingebauten Citavi-Befehlen
  • Tipps & Tricks

Architektur

Klassenhierachie von Project

Beispiel

ProjectShell projectShell = Program.ActiveProjectShell;
Project project = projectShell.Project;

int referencesCount = project.References.Count;
int referenceKeywordsCount = project.References[32].Keywords.Count;

MessageBox.Show(referencesCount.ToString());
MessageBox.Show(referenceKeywordsCount.ToString());

MainForm und ActiveReference

Beispiel 1

ProjectShell projectShell = Program.ActiveProjectShell;
MainForm mainForm = projectShell.MainForms[0];

Reference reference = mainForm.ActiveReference;
string title = reference.Title;

MessageBox.Show(title);

Beispiel 2

ProjectShell projectShell = Program.ActiveProjectShell;
Reference reference = projectShell.Project.References[34];

// PrimaryMainForm ist das vom Anwender zuletzt aktivierte Hauptformular
projectShell.PrimaryMainForm.ActiveReference = reference;

Observer Pattern

UI (Shell) <-> Engine

Die Shell kommuniziert mit der Engine über Objekte, Eigenschaften und Methodenaufrufe.

Die Engine schickt bei jeder Änderung ein Event. Die Shell kann diese Events abonnieren und so auf Änderungen reagieren.

Beispiel 1

Program.ActiveProjectShell.PrimaryMainForm.ActiveReference.Title = "Hello World";

Interner Ablauf
- Die Shell ändert den Titel der ActiveReference
- Die Reference löst ein PropertyChanged-Event aus
- Das MainForm «hört» auf dieses Event und aktualisiert alle relevanten Anzeigen von selbst.

Beispiel 2

Project project = Program.ActiveProjectShell.Project;
Person luhmann = new Person(project);
luhmann.LastName = "Luhmann";
luhmann.FirstName = "Niklas";

Reference reference = Program.ActiveProjectShell.
PrimaryMainForm.ActiveReference;
reference.Authors.Add(luhmann);

Gebundene und ungebundene Entities

  • Alle Entities (Reference, Person, Keyword usw.), die zum Projekt gehören, werden bei Project.Save() automatisch gespeichert
  • Eine Entity ist immer einem Projekt zugeordnet, kann aber «gebunden» oder «ungebunden» sein.
    • «Gebunden» bedeutet, dass die Entity ein Element der entsprechenden Project-Collection ist: Person -> Project.Persons, Reference -> Project.References
    • jede Entity hat die Property IsBound.
    • Dieser Ansatz gibt uns die Freiheit, Entities ungebunden anzulegen, die niemals gespeichert werden.

Beispiel 1: Direkte Bindung

// sozialeSysteme wird project zugeordnet, ist aber ungebunden
Reference sozialeSysteme = new Reference(project, ReferenceType.Book);

// sozialeSysteme wird nicht gespeichert
project.Save();

// soziale Systeme wird zu project.References hinzugefügt d.h. gebunden
project.References.Add(sozialeSysteme);

// soziale Systeme wird gespeichert
project.Save();

Beispiel 2: Indirekte Bindung

// sozialeSysteme wird als ungebundene Reference erstellt
Reference sozialeSysteme = new Reference(project, ReferenceType.Book);

// luhmann wird als ungebundene Person erstellt
Person luhmann = new Person(project, "Luhmann", "Niklas");

// luhmann wird als Autor zu sozialeSysteme hinzugefügt, beide bleiben ungebunden
sozialeSysteme.Authors.Add(luhmann);

// sozialeSysteme wird gebunden und luhmann wird automatisch mit gebunden d.h. zu project.Persons hinzugefügt
project.References.Add(sozialeSysteme);

// sozialeSysteme und luhmann werden beide gespeichert
project.Save();

Bindung über mehrere Projekte

// reference und alle zugehörigen Entities (Authors, Keywords, Publishers, Tasks usw.) werden automatisch nach second kopiert und dort gebunden. Auch Covers und verknüpfte Dateien im CitaviFiles-Ordner werden automatisch kopiert.
Project first = Program.ProjectShells[0].Project;
Project second = Program.ProjectShells[1].Project;

Reference reference = first.References[21];
second.References.Add(reference);

Die Add-On-Schnittstellen

Es gibt in Citavi zwei Arten von Add-On-Schnittstellen:

  1. Schnittstellen ohne User-Interaktion
  2. Schnittstellen mit User-Interaktion (Menüeinträge)

Weiter zu Tutorial (Teil 1)