# Kapitel 11. Erweiterte Ansichten

In diesem Kapitel werden wir die Funktionalität unseres Widgets durch zwei Verbesserungen erweitern: synchronisierte Ansichten und rollbare Ansichten.

# 11.1. Synchronisierung der Ansichten

Lassen Sie uns zuerst erklären, was uns das Ganze bringen wird und wie wir es erreichen können. Während Sie mit KScribble experimentiert haben, werden Sie vielleicht bemerkt haben, daß, wenn Sie eine neue Ansicht des Dokuments durch Aufruf von "Fenster"->"neues Fenster" öffnen, diese neue Ansicht mit denselben Daten arbeitet, wie die erste Ansicht und sich genauso verhält, wie jede Ansicht, die Sie mit diesem Kommando erzeugen. Aber wenn es darum geht, in das Dokument zu zeichnen, können Sie das nur in einer Ansicht tun- die anderen Ansichten zeigen nicht den jeweils aktuellen Inhalt. Wenn Sie eine Ansicht, die nicht die aktuellen Daten enthält, verdecken und sie dann wieder in den Vordergrund holen, werden die richtigen Daten angezeigt. Das liegt daran, das jede Ansicht, wenn Sie verdeckt war, ein paint-Ereignis vom Fenstersystem erhält, wenn Sie wieder in den Vordergrund kommt, dann `KScribbleView::paintEvent()` aufruft und dadurch den Bereich, der verdeckt war schließlich neuzeichnet. Was wir erreichen wollen, ist daß alle Ansichten synchron mit der Ansicht gezeichnet werden, in der der Benutzer gerade arbeitet. Tatsächlich werden Sie sehen, daß diese Erweiterung leicht zu bewerkstelligen ist. Die Dokumentklasse bietet uns bereits eine Methode `updateAllViews()`, welche die Methode `update()` für jede Ansicht in der Ansichtenliste des Dokuments aufruft. Das macht es sehr einfach die Inhalte der Ansichten zu synchronisieren - jedes Mal, wenn der Inhalt verändert wird, hier durch Mausbewegungen ( durch die wir die Änderungen mittels `bitBlt()` in den Puffer kopieren), müssen wir nur updateAllViews(this) aufrufen. Der this Zeiger ist nötig, weil die aufrufende Ansicht nicht neugezeichnet werden muß und `update()` nur ausgeführt werden soll, wenn Sender und Empfänger verschieden sind.

Was Sie hier tun müssen, ist nur updateAllViews(this) am Ende der virtuellen Methoden `mousePressEvent()`, `mouseMoveEvent()` und `mouseReleaseEvent()` aufzurufen- und Sie sind fertig ! Nehmen Sie dies als allgemeine Regel in Ihren Anwendungen: jedesmal wenn sich der Inhalt eines Dokuments in einer Ansicht ändert, rufen Sie `updateAllViews()` auf. Wie die Aktualisierung durchgeführt wird, muß in der `update()` Methode des Widgets implementiert werden; man mag zufrieden sein, indem man z.B. den geänderten Text in einem Editor setzt, in unserer Anwendung rufen wir nur die Funktion `repaint()` auf, die ein paint-Event auslöst und den Inhalt des Dokuments wieder in die Ansicht kopiert.