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 implements
		ControlListener {

	private final Table table;
	private List columns = new ArrayList();

	private boolean autosizing = false;

	public AutoResizeTableLayout(Table table) {
		this.table = table;
		table.addControlListener(this);
	}

	@Override
	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 = 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]);   
        }   
    
	}
}


 

你可能感兴趣的:(eclipse,linux,REST)