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が完成です。
色々動かして、文字列を変更して遊んでみてください♪