读书人

RCP中一个Tableviewer特有的的Layout

发布时间: 2012-10-14 14:55:08 作者: rapoo

RCP中一个Tableviewer特有的的Layout (TableLayout)的扩展

?? 为了使TableViewer中各列间距相等编写的类,继承自Tablelayout,实现ControlListener 接口。

?

?

?

package com.unutrip.plugin.dev.commons;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;/** * AutoResizeTableLayout layout = new AutoResizeTableLayout(tableRegionListInfo);    *       *      tableRegionListInfo.setLayout(layout);    *  其中tableRegionListInfo为需要各列自动充满整个表格的表格(Table)   *  * 最后在表格中的各列中加上如下代码:  *layout.addColumnData(new ColumnWeightData(200));  * 其中200代表此列在表格中所占的比例,例如在另外一列后面设置  * layout.addColumnData(new ColumnWeightData(400));则此列在表格中所占的比例是上一个表格的两倍。  * @author longgangbai * */public class AutoResizeTableLayout extends TableLayout implementsControlListener {private final Table table;private List columns = new ArrayList();private boolean autosizing = false;public AutoResizeTableLayout(Table table) {this.table = table;table.addControlListener(this);}@Overridepublic void addColumnData(ColumnLayoutData data) {columns.add(data);super.addColumnData(data);}public void controlMoved(ControlEvent e) {}public void controlResized(ControlEvent e) {if (autosizing) {return;}autosizing = false;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 calculate space occupied by fixed columns.        for (int i = 0; i < size; i++){               ColumnLayoutData col = (ColumnLayoutData) 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 = (ColumnLayoutData) 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 = (ColumnLayoutData) 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]);           }       }}

?

读书人网 >软件架构设计

热点推荐