Laureline's Wiki

Laureline's Wiki

Bibliothèque

This is an old revision of the document!


Bibliothèque

Bibliothèque

La bibliothèque est implémentés à l'aide de plusieurs controlleurs. Un controlleur principal qui gère la TreeView qui affiche les catalogues et un controlleur secondaire qui se charge de l'affichage des volumes. Chaque volume possède aussi son propre controlleur afin de pouvoir gérer l'affichage et les actions d'un volume de manière isolée.

Affichage des Catalogues

L'affichage des catalogues utilise une TreeView pour afficher les catalogues. Pour pouvoir appliquer des filtres au contenu de la TreeView, les classes RootCatalogItem et CatalogItem on été crées. La classe RootCatalogItem se place comme élémet racine (La TreeView est configurée pour ne pas afficher son élément racine mais uniquement ses enfants) et expose comme enfants les catégories racines des catalogues enregistrés dans le système sous la forme de CatalogItems qui lui même possède plusieurs CatalogItems pour leur enfants. Ceci forme un arbe parallèle à la structure des catalogues sous-jacents. Ces objets peuvent être considérés comme des “proxy” vers la vértiable structure.

Ces objets proxy permettent d'implémenter un système de filtre sur l'arborecence sans qu'il soit nécéssaire de recréer toute la structure. La classe CatalogItem expose une méthode refresh() qui synchronise ses enfants avec l'objet sous-jacent et conserve l'ordre des enfants.

Filtrer un Catalogue

Une méthode applyFilter(filter) est aussi disponnible sur les CatalogItems. Cette méthode permet de restreindre quels noeuds sont affichés.

  public boolean applyFilter(CatalogFilter filter) {
      boolean hasMatch = false;
      if (filter.matches(getValue())) {
          setExpanded(true);
          hasMatch = true;
      }
      for (CatalogItem item : items.values()) {
          boolean childMatches = item.applyFilter(filter);
          if (childMatches && !getChildren().contains(item)) {
              getChildren().add(item);
          } else if (!childMatches && getChildren().contains(item)) {
              getChildren().remove(item);
          }
          hasMatch = hasMatch || childMatches;
      }
      sortChildren();
      return hasMatch;
  }
  public void clearFilter() {
      for (CatalogItem item : items.values()){
          item.clearFilter();
          if (!getChildren().contains(item)) {
              getChildren().add(item);
          }
      }
      sortChildren();
  }