Bonjour à toutes et à tous,

Je cherche à mettre un table dans une PreferencePage, or ça ne semble pas faisable de prime abord.
Je ne sais pas si c'est la bonne façon de procéder, mais voila ce que j'ai fait :

J'ai défini mon tableau comme suit :

PreferenceConstants.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
public class PreferenceConstants {    
    public static final String S_HOSTSLIST = "SerializedStringHosstList";
}
PreferenceInitializer.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
public class PreferenceInitializer extends AbstractPreferenceInitializer {
    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
     */
    public void initializeDefaultPreferences() {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        store.setDefault(PreferenceConstants.S_HOSTSLIST ,"");
    }
}
PreferencePage.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
public class PreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
 
    private Table table;
    private IPreferenceStore store;
 
    public PreferencePage() {
        super(GRID);
        setPreferenceStore(Activator.getDefault().getPreferenceStore());
        setDescription("Configuration de l'application Gaspard client");
    }
 
    public void createFieldEditors() {
        [...]
        Group groupe = new Group(this.getFieldEditorParent(), SWT.SHADOW_NONE);
        groupe.setText("Liste des Hôtes");
        GridLayout gl = new GridLayout(3,false);
        GridData gdgroupe =  new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
        gdgroupe.horizontalSpan = 2;
        groupe.setLayoutData(gdgroupe);
        groupe.setLayout(gl);
        Label lAjoutHost = new Label(groupe, SWT.NONE);
        lAjoutHost .setText("Hôte (Ex.: user:mot_de_passe@adresse:port) :");
        final Text tAjoutHost  = new Text(groupe, SWT.SINGLE | SWT.BORDER | SWT.BORDER_SOLID);
        GridData gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
        tAjoutHost .setLayoutData(gd);
        Button bAjoutHost = new Button(groupe, SWT.PUSH);
        bAjoutHost.setText(" + ");
        bAjoutHost.addMouseListener(new MouseListener() {
 
            @Override
            public void mouseUp(MouseEvent e) {        
            }
 
            @Override
            public void mouseDown(MouseEvent e) {            
                String saisie = tAjoutHost.getText();
                if(null != saisie && !saisie.isEmpty() && saisie.trim().length() > 0 && saisie.matches("([a-z0-9]|\\W)*[:]([a-z0-9]|\\W)*[@]([a-z0-9]|\\W)*[:]([a-z0-9]|\\W)*")){
                    TableItem tempItem = new TableItem(table, SWT.LEFT);
                    String[] datas = saisie.split("@");
                    String[] hostDatas = datas[1].split(":");
                    String[] userDatas = datas[0].split(":");
                    tempItem.setText(new String[]{hostDatas[0],hostDatas[1],userDatas[0],userDatas[1]});
                    table.update();
                }
            }
 
            @Override
            public void mouseDoubleClick(MouseEvent e) {
            }
        });
 
        table = new Table(groupe, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION);
        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.grabExcessVerticalSpace = true;
        gridData.horizontalSpan = 3;
        table.setLayoutData(gridData);
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
 
        TableColumn columnHost = new TableColumn(table, SWT.LEFT);
        columnHost.setText("Hôte (IP/Nom Netbios)");
        columnHost.setResizable(true);
        columnHost.setMoveable(false);
        columnHost.pack();
 
        TableColumn columnPort = new TableColumn(table, SWT.LEFT);
        columnPort.setText("Port");
        columnPort.setResizable(true);
        columnPort.setMoveable(false);
        columnPort.pack();
 
        TableColumn columnUser = new TableColumn(table, SWT.LEFT);
        columnUser.setText("Identifiant");
        columnUser.setResizable(true);
        columnUser.setMoveable(false);
        columnUser.pack();
 
        TableColumn columnPWD = new TableColumn(table, SWT.LEFT);
        columnPWD.setText("Mot de passe");
        columnPWD.setResizable(true);
        columnPWD.setMoveable(false);
        columnPWD.pack();
 
        store = (IPreferenceStore) PlatformUI.getPreferenceStore();
        String hostsListe = store.getString(PreferenceConstants.S_HOSTSLIST);
 
        System.out.println("from Hostsslist :"+hostsListe);
 
        if(null != hostsListe&& hostsListe.length() > 0){
 
            String[] hosts = hostsListe.split(";");
 
            for(int index = 0; index < hosts .length; index++){
                String host = hosts [index];
                System.out.println(host );
                if(host .matches("([a-z0-9]|\\W)*[,]([a-z0-9]|\\W)*[,]([a-z0-9]|\\W)*[,]([a-z0-9]|\\W)*")){
                    TableItem tempItem = new TableItem(table, SWT.LEFT);
                    String[] datas = host.split(",");
                    tempItem.setText(new String[]{datas[0],datas[1],datas[2],datas[3]});
                    table.update();
                }
            }
        }
 
        this.getFieldEditorParent().getShell().addDisposeListener(new DisposeListener() {
 
            @Override
            public void widgetDisposed(DisposeEvent e) {
                TableItem[] items = table.getItems();
                String finalLigne = "";
                for(int index = 0; index < items.length; index++){
                    String tempLignetemp = "";
                    for(int indexbis = 0; indexbis < table.getColumnCount(); indexbis++){
                        if(tempLignetemp.length() > 0){
                            tempLignetemp += ",";
                        }
                        tempLignetemp += items[index].getText(indexbis);
                    }
                    if(finalLigne.length() > 0){
                        finalLigne += ";";
                    }
                    finalLigne += tempLignetemp;
                }
                System.out.println("ligne final: "+finalLigne);
                store = getPreferenceStore();
                if(null != store){
                    store = (IPreferenceStore) PlatformUI.getPreferenceStore();
                    store.setValue(PreferenceConstants.S_HOSTSLIST, finalLigne);
                }
            }
        });
J'ai fini par mettre le code custom pour l'enregistrement de mon tableau dans une String sur l’événement dispose de la page mais ça ne me convient pas car du coup ça ne gère pas l'annulation ou l'Apply.

Du coup je me demandais si la méthode que j'avais choisi pouvait fonctionné (des fois qu'il existe un truc tout fait que je n'aurais pas vu), et ensuite si c'est ça, je me demandais comment hooker les boutons Apply et Cancel.

J'ai bien essayé avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Button bApply = this.getApplyButton();
bApply.addMouseListener(new MouseListener() {
 
    @Override
    public void mouseUp(MouseEvent e) {
        // TODO Auto-generated method stub
    }
 
    @Override
    public void mouseDown(MouseEvent e) {
        // Mon blabla du onDispose                
    }
 
    @Override
    public void mouseDoubleClick(MouseEvent e) {
        // TODO Auto-generated method stub
    }
});
Mais ça me retourne un NullPointerException.
Du coup je ne vois plus quoi faire d'autre. Et je ne trouve pas que le onDispose soit ce qu'il y a de mieux.

Qu'en pensez vous ?

Merci d'avance pour vos réponses.