diff options
Diffstat (limited to 'plugins/org.eclipse.m2t.common.recipe.ui/src/org/eclipse/m2t/common/recipe/ui/recipeBrowser/AutoResizeTableLayout.java')
-rw-r--r-- | plugins/org.eclipse.m2t.common.recipe.ui/src/org/eclipse/m2t/common/recipe/ui/recipeBrowser/AutoResizeTableLayout.java | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/plugins/org.eclipse.m2t.common.recipe.ui/src/org/eclipse/m2t/common/recipe/ui/recipeBrowser/AutoResizeTableLayout.java b/plugins/org.eclipse.m2t.common.recipe.ui/src/org/eclipse/m2t/common/recipe/ui/recipeBrowser/AutoResizeTableLayout.java new file mode 100644 index 00000000..3897cce3 --- /dev/null +++ b/plugins/org.eclipse.m2t.common.recipe.ui/src/org/eclipse/m2t/common/recipe/ui/recipeBrowser/AutoResizeTableLayout.java @@ -0,0 +1,134 @@ +/* + * <copyright> + * + * Copyright (c) 2005-2006 Markus Voelter and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Voelter - Initial API and implementation + * + * </copyright> + */ +package org.eclipse.m2t.common.recipe.ui.recipeBrowser; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.viewers.ColumnLayoutData; +import org.eclipse.jface.viewers.ColumnPixelData; +import org.eclipse.jface.viewers.ColumnWeightData; +import org.eclipse.jface.viewers.TableLayout; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.ControlListener; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; + +public class AutoResizeTableLayout extends TableLayout implements + ControlListener { + private final Table table; + + private List<ColumnLayoutData> columns = new ArrayList<ColumnLayoutData>(); + + private boolean autosizing = false; + + public AutoResizeTableLayout(Table table) { + this.table = table; + table.addControlListener(this); + } + + public void addColumnData(ColumnLayoutData data) { + columns.add(data); + super.addColumnData(data); + } + + public void controlMoved(ControlEvent e) { + } + + public void controlResized(ControlEvent e) { + if (autosizing) + return; + autosizing = true; + try { + autoSizeColumns(); + } finally { + autosizing = false; + } + } + + private void autoSizeColumns() { + int width = table.getClientArea().width; + + // XXX: Layout is being called with an invalid value + // the first time it is being called on Linux. + // This method resets the layout to null, + // so we run it only when the value is OK. + if (width <= 1) + return; + + TableColumn[] tableColumns = table.getColumns(); + int size = Math.min(columns.size(), tableColumns.length); + int[] widths = new int[size]; + int fixedWidth = 0; + int numberOfWeightColumns = 0; + int totalWeight = 0; + + // First calc space occupied by fixed columns. + for (int i = 0; i < size; i++) { + ColumnLayoutData col = columns.get(i); + if (col instanceof ColumnPixelData) { + int pixels = ((ColumnPixelData) col).width; + widths[i] = pixels; + fixedWidth += pixels; + } else if (col instanceof ColumnWeightData) { + ColumnWeightData cw = (ColumnWeightData) col; + numberOfWeightColumns++; + int weight = cw.weight; + totalWeight += weight; + } else { + throw new IllegalStateException("Unknown column layout data"); + } + } + + // Do we have columns that have a weight? + if (numberOfWeightColumns > 0) { + // Now, distribute the rest + // to the columns with weight. + int rest = width - fixedWidth; + int totalDistributed = 0; + for (int i = 0; i < size; i++) { + ColumnLayoutData col = columns.get(i); + if (col instanceof ColumnWeightData) { + ColumnWeightData cw = (ColumnWeightData) col; + int weight = cw.weight; + int pixels = totalWeight == 0 ? 0 : weight * rest + / totalWeight; + if (pixels < cw.minimumWidth) + pixels = cw.minimumWidth; + totalDistributed += pixels; + widths[i] = pixels; + } + } + + // Distribute any remaining pixels + // to columns with weight. + int diff = rest - totalDistributed; + for (int i = 0; diff > 0; i++) { + if (i == size) + i = 0; + ColumnLayoutData col = columns.get(i); + if (col instanceof ColumnWeightData) { + ++widths[i]; + --diff; + } + } + } + + for (int i = 0; i < size; i++) { + if (tableColumns[i].getWidth() != widths[i]) + tableColumns[i].setWidth(widths[i]); + } + } +}
\ No newline at end of file |