Bonjour,

Je m'arrache les cheveux à trouver un moyen de redimensionner un TableViewer contenu dans un IViewPart. Je parviens actuellement à en changer la largeur, mais pas la hauteur. Enfin pas totalement. En fait on peut agrandir, mais pas rétrécir.

Voilà le code de la vue utilisée dans mon appli RCP 3.2 sous Windows XP avec un JRE 1.6.0_04 :
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
package sandboxplugin.views;
 
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableCursor;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.part.ViewPart;
 
public class TableView extends ViewPart {
 
	public static final String ID = "sandBoxPlugin.view";
 
	private TableViewer viewer;
 
	private Table table;
 
	private TableCursor cursor;
 
	@Override
	public void createPartControl(Composite parent) {
		this.table = new Table(parent, SWT.NONE);
		this.table.setLinesVisible(true);
 
		TableColumn firstColumn = new TableColumn(this.table, SWT.NONE);
		firstColumn.setWidth(0);
		for (int i = 0; i < 3; i++) {
			TableColumn column = new TableColumn(this.table, SWT.NONE);
			column.setWidth(50);
			column.setAlignment(SWT.CENTER);
		}
 
		this.viewer = new TableViewer(this.table);
		this.viewer.setContentProvider(new IStructuredContentProvider() {
 
			public Object[] getElements(Object inputElement) {
				return (Object[]) inputElement;
			}
 
			public void dispose() {
			}
 
			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
			}
 
		});
 
		this.viewer.setLabelProvider(new ITableLabelProvider() {
 
			public Image getColumnImage(Object element, int columnIndex) {
				return null;
			}
 
			public String getColumnText(Object element, int columnIndex) {
				if (columnIndex == 0) {
					return null;
				}
				Object[] data = (Object[]) element;
				return data[columnIndex - 1].toString();
			}
 
			public void addListener(ILabelProviderListener listener) {
			}
 
			public void dispose() {
			}
 
			public boolean isLabelProperty(Object element, String property) {
				return false;
			}
 
			public void removeListener(ILabelProviderListener listener) {
			}
 
		});
 
		Object[][] data = new Integer[][] {
				{1,2,3},
				{4,5,6},
				{7,8,9}
		};
		this.viewer.setInput(data);
 
 
		cursor = new TableCursor(this.table, SWT.NONE);
 
		getSite().getPage().addPartListener(new IPartListener2() {
 
			public void partVisible(IWorkbenchPartReference partRef) {
			}
 
			public void partOpened(IWorkbenchPartReference partRef) {
			}
 
			public void partInputChanged(IWorkbenchPartReference partRef) {
			}
 
			public void partHidden(IWorkbenchPartReference partRef) {
			}
 
			public void partDeactivated(IWorkbenchPartReference partRef) {
				cursor.setSelection(0, 0);
				cursor.setVisible(false);
			}
 
			public void partClosed(IWorkbenchPartReference partRef) {
			}
 
			public void partBroughtToTop(IWorkbenchPartReference partRef) {
			}
 
			public void partActivated(IWorkbenchPartReference partRef) {
				cursor.setVisible(true);
			}
 
		});
 
		// listener to adjust table width
		table.addControlListener(new ControlListener() {
 
			public void controlResized(ControlEvent e) {
				Table table = viewer.getTable();
				TableColumn column;
				int width = (int) (1.0 * table.getBounds().width
						/ (table.getColumnCount() - 1));
				int fillingWidth = (int) (1.0 * table.getBounds().width
						% (table.getColumnCount() - 1));
				for (int i = 1; i < table.getColumnCount(); i++) { // 1st column centering hack
					column = table.getColumn(i);
					if (i == table.getColumnCount() - 1) {
						// fillingWidth for last column
						column.setWidth(width + fillingWidth);
					} else {
						column.setWidth(width);
					}
				}
 
				// manually redraw the table to allow to resize the items height
				table.redraw();
			}
 
			public void controlMoved(ControlEvent e) {
			}
 
		});
 
		// listener to adjust table height
		this.viewer.getControl().addListener(SWT.MeasureItem, new Listener() {
 
			public void handleEvent(Event event) {
				Table table = viewer.getTable();
 
				int height = (int) (1.0 * table.getBounds().height
						/ table.getItemCount());
				event.height = height;
 
				/*
				 * for a mysterious reason,
				 * table height shrinking does *not* work
				 */
			}
 
		});
	}
 
	@Override
	public void setFocus() {
	}
 
}
Voilà. C'est moche a priori, mais les développeurs d'Eclipse n'ont visiblement pas bu assez de café afin de prévoir un redimensionnement simple et facile du TableViewer.

Merci pour votre aide !