Thema dieser Dokumentation / Das FirstSpirit 5 Modul- / Komponenten-Modell / Beispiel: Implementierung einer Eingabekomponente / Aspekt Highlightable - Treffermarkierung für die Suche

Aspekt Highlightable - Treffermarkierung für die Suche

Neben den Standardaspekten, können einer SwingGadget-Implementierung noch eine Vielzahl funktionaler Aspekte hinzugefügt werden (siehe Aspekte (SwingGadget)). Anhand des Beispiels der Texteingabekomponente wird an dieser Stelle die Verwendung des Aspekts Highlightable gezeigt.

Zielsetzung: Die Eingabekomponente soll eine „Treffermarkierung“ für Suchergebnisse erhalten. Dazu sollen nach einer Suche, die Fundstellen folgendermaßen markiert werden:

  • Die Komponente die den Treffer enthält, wird innerhalb des Formulars hervorgehoben
  • Der Treffer wird innerhalb der Komponente markiert
  • Liegt der Treffer außerhalb des Sichtbereichs ändert sich der Sichtbereich, um den Treffer anzuzeigen.

Die Markierung auf Komponentenebene erfolgt automatisch durch das FirstSpirit-Gadget-Framework und erfordert kein weiteres Zutun des Komponentenentwicklers. Weitere Funktionen, wie das Hervorheben des Treffers innerhalb der Komponente und ggf. das Ändern des Sichtbarkeitsbereichs (Scrolling), müssen über den Aspekt  Highlightable hinzugefügt werden. Diese Funktionen können vom FirstSpirit-Gadget-Framework nicht allgemein realisiert werden, da dazu eine genaue Kenntnis des inneren Aufbaus der Komponente erforderlich ist. Der Komponentenentwickler muss aber nur genau diese Funktionen (beispielsweise Scrolling) realisieren und bekommt alle dazu notwendigen Informationen über die Aspekt-Schnittstelle zur Verfügung gestellt.

Um den Aspekt zu verwenden, muss die SwingGadget-Implementierung den Aspekt Highlightable implementieren. Dazu muss der Aspekt Highlightable innerhalb des öffentlichen Konstruktors der SwingGadget-Implementierung hinzugefügt und die Methode highlight(List<? extends Match> matches) implementiert werden. Die Methode highlight(…) implementiert die Infrastruktur, um den Treffer auch innerhalb der Komponente hervorzuheben und ggf. durch Scrolling sichtbar zu machen. Die Liste der Treffer (matches), die der Methode übergeben wird, wird von der ValueEngineer-Implementierung der Eingabekomponente geliefert (siehe ValueEngineer - Werte eines SwingGadgets behandeln). Diese muss den Value-Aspekt MatchSupporting implementieren (Beispiel siehe Listing 44: Beispiel ValueEngineer-Impl. – Value-Aspekt MatchSupporting).

Listing: BeispielSwingGadget – der Aspekt Highlightable

public class CustomTextareaSwingGadget
extends AbstractValueHoldingSwingGadget<String, GomCustomTextarea>
implements DocumentListener, Highlightable {

/**
* Example (MODDEV): Constructs a new CustomTextareaSwingGadget -
* a new displayable text editor representation.
*
* @paramcontext swing gadget context
*/
public CustomTextareaSwingGadget(
final SwingGadgetContext<GomCustomTextarea> context) {
super(context);
addAspect(Highlightable.TYPE, this);
}

/* Highlightable =====================================================*/

public void highlight(final List<? extends Match> matches) {
final Highlighter highlighter = _jTextArea.getHighlighter();
final Highlighter.Highlight[] highlights = highlighter.getHighlights();

// remove all highlights
highlighter.removeAllHighlights();

// restore foreign highlights
for (final Highlighter.Highlight highlight : highlights) {
try {
if (!(highlight.getPainter() instanceof
DefaultHighlighter.DefaultHighlightPainter) ||
((DefaultHighlighter.DefaultHighlightPainter)
highlight.getPainter()).getColor() != Color.YELLOW)
{
highlighter.addHighlight(highlight.getStartOffset(),
highlight.getEndOffset(), highlight.getPainter());
}
} catch (BadLocationException e) {
// ignore
}
}

// add new highlights
if (!matches.isEmpty()) {
final Highlighter.HighlightPainter painter =
new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
try {
Rectangle rect = null;
for (final Match match : matches) {
final int a = match.getBegin();
final int b = match.getEnd();
highlighter.addHighlight(a, b, painter);
final Rectangle r1 = _jTextArea.modelToView(a);

if (rect == null) {
rect = r1;
} else {
rect.add(r1);
}

if (rect != null) {
final Rectangle r2 = _jTextArea.modelToView(b);
if (r2 != null) {
rect.add(r2);
}
}
}

if (rect != null) {
_jTextArea.scrollRectToVisible(rect);
}
} catch (final BadLocationException e) {
// ignore
}
}
}

}

© 2005 - 2024 Crownpeak Technology GmbH | Alle Rechte vorbehalten. | FirstSpirit 2024.13 | Datenschutz