Eclipse (SWT) : sélectionner une cellule dans une Table

Cela pourrait paraître enfantin et pourtant, on peut plutôt y perdre quelques cheveux!! Attention, je parle pas ici des JTable de swing qui sont facilement utilisables et extensibles, mais bien de l’objet simpliste Table de SWT.

Le principe basique des Tables est d’afficher une liste de données en ligne (les colonnes représentent les attributs). Le constructeur de l’objet permet facilement d’autoriser la sélection d’une ligne entière, mais rien ne permet d’activer à l’aide de la souris la sélection d’une cellule : il faut pour cela un peu d’imagination. Jetons d’abord un œil au code avant de le commenter :

TableViewer tableViewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
            | SWT.V_SCROLL | SWT.FULL_SELECTION);
tableViewer.getTable().addListener(SWT.MouseDown, new Listener() {
            TableItem item = null;
            int       oldi = -1;
            public void handleEvent(Event event) {
                Point pt = new Point(event.x, event.y);
                if (item != null && !item.isDisposed()) {
                    item.setBackground(oldi, Display.getCurrent()
                        .getSystemColor(SWT.COLOR_WHITE));
                    item.setForeground(oldi, Display.getCurrent()
                        .getSystemColor(SWT.COLOR_BLACK));
                }
                item = table.getItem(pt);
                if (item == null)
                    return;
                for (int i = 0; i < table.getColumnCount(); i++) {
                    Rectangle rect = item.getBounds(i);
                    if (rect.contains(pt)) {
                        table.deselectAll();
                        item.setBackground(i, Display.getCurrent()
                            .getSystemColor(SWT.COLOR_LIST_SELECTION));
                        item.setForeground(i, Display.getCurrent()
                            .getSystemColor(SWT.COLOR_WHITE));
                        oldi = i;
                        int index = table.indexOf(item);
                        System.out.println("Sélection de la ligne " + index + " - colonne " + i + " : valeur '"+ item.getText(i) +"'");
                    }
                }
            }
        });
    }

Le principe est donc le suivant :

Lorsque l’utilisateur clic dans le tableau, on récupère la position x et y du clic et on lui demande de nous retourner l’élément situé sous la souris (l’objet item). Pas terrible n’est-ce pas?!

Au niveau du code on a donc bien récupéré notre objet, mais au niveau visuel, c’est toute la ligne du tableau qui est sélectionnée! Pour y remédier, on dé-sélectionne immédiatement tout, puis on affecte à notre cellule une couleur d’arrière-plan correspondant à la couleur d’un élément sélectionné… On garde en mémoire notre cellule pour lui redonner des couleurs normales lorsqu’une autre sera clicquée.

Je vous l’accorde, c’est du bricolage, mais l’objet Table de SWT est vraiment très basique et c’est le seul moyen d’arriver à ce résultat ( à moins que je ne me trompe…)


Fichier(s) joint(s) :

0 commentaires: