/** * */ package logbook.scripting; import logbook.constants.AppConstants; import logbook.gui.logic.ColorManager; import logbook.gui.logic.TableItemCreator; import logbook.scripting.ScriptLoader.MethodInvoke; import logbook.scripting.ScriptLoader.Script; import logbook.util.ReportUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; /** * @author Nekopanda * */ public class TableItemCreatorProxy implements TableItemCreator { private class CreateMethod implements MethodInvoke { public Table table; public Comparable[] data; public int index; @Override public Object invoke(Object arg) { return ((TableItemCreator) arg).create(this.table, this.data, this.index); } } private Script script; private final CreateMethod createMethod = new CreateMethod(); private static TableItemCreatorProxy instance = new TableItemCreatorProxy(); public static TableItemCreatorProxy get(String prefix) { instance.script = ScriptLoader.getTableStyleScript(prefix); return instance; } @Override public TableItem create(Table table, Comparable[] data, int index) { this.createMethod.table = table; this.createMethod.data = data; this.createMethod.index = index; TableItem item = (TableItem) this.script.invoke(this.createMethod); if (item == null) { // 作れてなかったらデフォルトロジックで作る item = this.defautlCreate(table, data, index); } return item; } private TableItem defautlCreate(Table table, Comparable[] data, int index) { TableItem item = new TableItem(table, SWT.NONE); // 偶数行に背景色を付ける if ((index % 2) != 0) { item.setBackground(ColorManager.getColor(AppConstants.ROW_BACKGROUND)); } item.setText(ReportUtils.toStringArray(data)); return item; } @Override public void begin(final String[] header) { this.script.invoke(new MethodInvoke() { @Override public Object invoke(Object arg) { ((TableItemCreator) arg).begin(header); return null; } }); } @Override public void end() { this.script.invoke(new MethodInvoke() { @Override public Object invoke(Object arg) { ((TableItemCreator) arg).end(); return null; } }); } }