TableViewerでColumn使ってCellEditorで色々と

とりあえず、サンプル書いただけで疲れた・・・

ざっと、サンプルまず乗せます^^;


まず、Itemを作成します。

package jface.tableviewer.sample;

import org.eclipse.swt.graphics.RGB;

public class ItemSample {
	public static final String[] COMBO_ITEM = new String[5];
	
	private String text_ = "";
	private boolean checked_ = true;
	private RGB color_ = new RGB(255, 255, 255);
	private int index_ ;
	
	static {
		for (int i = 0; i < COMBO_ITEM.length; i++) {
			COMBO_ITEM[i] = "combo" + i;
		}
	}
	
	public String getText() {
		return text_;
	}
	
	public void setText(String text) {
		text_ = text;
	}
	
	public boolean isChecked() {
		return checked_;
	}
	
	public void setChecked(boolean checked) {
		checked_ = checked;
	}
	
	public RGB getRGB() {
		return color_;
	}
	
	public void setRGB(RGB color) {
		color_ = color;
	}
	
	public int getIndex() {
		return index_;
	}
	
	public void setIndex(int index) {
		index_ = index;
	}
}

今回は、Text, Check(Boxじゃないです),Color(RGB),ComboBoxをつけてみます。
String[]はComboBoxのItemのラベルになります。
で、index_がComboBoxのインデックス値です。


で、LabelProviderをいじります。

package jface.tableviewer.sample;

import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;

public class LableProviderSample extends LabelProvider implements ITableLabelProvider {
	public Image getColumnImage(Object element, int columnIndex) {
		return null;
	}
	
	public String getColumnText(Object element, int columnIndex) {
		ItemSample item = (ItemSample) element;
		
		String result = "";
		
		switch (columnIndex) {
		case 0:
			result = item.getText();
			break;
		case 1:
			result = item.isChecked() ? "isCheked" : "noChecked";
			break;
		case 2:
			result = item.getRGB().toString();
			break;
		case 3:
			result = ItemSample.COMBO_ITEM[item.getIndex()];
			break;
		default:
			break;
		}
		return result;
	}
}

それぞれの表示文字列を返します。


で、こっからが本番!


CellModifierというものを使って各Cell(Tableのひとつの枠)に設定していきます。


Itemのデータを取得してそれぞれにあった値をセットして最後にTableViewerを更新します。

package jface.tableviewer.sample;

import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Item;

public class CellModifierSample implements ICellModifier {
	private TableViewer viewer_;
	
	public CellModifierSample(TableViewer viewer) {
		viewer_ = viewer;
	}
	
	public boolean canModify(Object element, String property) {
		return true;
	}
	
	public Object getValue(Object element, String property) {
		ItemSample item = (ItemSample) element;
		if (property == "text") {
			return item.getText();
		}
		
		if (property == "check") {
			return item.isChecked();
		}
		
		if (property == "color") {
			return item.getRGB();
		}
		
		if (property == "combo") {
			return item.getIndex();
		}
		return null;
	}
	
	public void modify(Object element, String property, Object value) {
		if (element instanceof Item) {
			element = ((Item) element).getData();
		}
		ItemSample item = (ItemSample) element;
		
		if (property == "text") {
			item.setText((String) value);
		}
		
		if (property == "check") {
			item.setChecked(((Boolean) value).booleanValue());
		}
		
		if (property == "color") {
			item.setRGB((RGB) value);
		}
		
		if (property == "combo") {
			item.setIndex(((Integer) value).intValue());
		}
		
		viewer_.update(element, null);
	}
}


で、最後にメインのViewerを

package jface.tableviewer.sample;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColorCellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

public class TableViewerSample extends ApplicationWindow {
	public TableViewerSample() {
		super(null);
	}
	
	public static void main(String[] args) {
		TableViewerSample window = new TableViewerSample();
		window.setBlockOnOpen(true);
		window.open();
		Display.getCurrent().dispose();
	}
	
	protected Control createContents(Composite parent) {
		TableViewer viewer = new TableViewer(parent, SWT.FULL_SELECTION);
		Table table = viewer.getTable();
		table.setLinesVisible(true);
		
		
		table.setHeaderVisible(true);
		
		TableColumn column;
		
		column = new TableColumn(table, SWT.NONE);
		column.setText("Text");
		
		column = new TableColumn(table, SWT.RIGHT);
		column.setText("Check");
		
		column = new TableColumn(table, SWT.NONE);
		column.setText("Color");
		
		column = new TableColumn(table, SWT.CENTER);
		column.setText("ComboBox");
		
		String[] properties = new String[] {
				"text", "check", "color", "combo"
		};
		
		viewer.setColumnProperties(properties);
		
		CellEditor[] editors = new CellEditor[] {
				new TextCellEditor(table),
				new CheckboxCellEditor(table),
				new ColorCellEditor(table),
				new ComboBoxCellEditor(table, ItemSample.COMBO_ITEM)
		};
		
		viewer.setCellEditors(editors);
		
		viewer.setCellModifier(new CellModifierSample(viewer));
		
		viewer.setContentProvider(new ArrayContentProvider());
		viewer.setLabelProvider(new LableProviderSample());
		
		ItemSample item;
		List<ItemSample> items = new ArrayList<ItemSample>();
		for (int i = 0; i < 10; i++) {
			item = new ItemSample();
			item.setText("item" + i);
			items.add(item);
		}
		
		viewer.setInput(items);
		
		TableColumn[] columns = table.getColumns();
		for (int i = 0; i < columns.length; i++) {
			columns[i].pack();
		}
		
		return viewer.getControl();
	}
}

ヘッダーをセットして、それぞれにラベルを振ります。また、位置指定をします。


で、プロパティーを用意します。
これはItemが何かってのを文字列で示してるだけです。


で、これらのプロパティーをColumnにセットします。


次がCellEditorというものを使うのですが、ここに色々とデフォで用意されてるものをColumnごとに割り当てます。


で、CellEditorをセットしてあげます。


で、先ほど作成した、CellModifierをViewerにセットします。


最後の方でTableColumnの配列でごにょごにょしてるのはColumnの幅を計算してます。
計算してないと、先ほど一を指定したものが有効に反映されません。


とりあえず、これでTableViewerが完成です。


色々動かして、文字列を変更して遊んでみてください♪