1package autotest.common.table;
2
3import autotest.common.table.DynamicTable.DynamicTableListener;
4import autotest.common.ui.Paginator;
5import autotest.common.ui.TableActionsPanel;
6import autotest.common.ui.TableSelectionPanel;
7import autotest.common.ui.TableActionsPanel.TableActionsListener;
8import autotest.common.ui.TableActionsPanel.TableActionsWithExportCsvListener;
9
10import com.google.gwt.json.client.JSONObject;
11import com.google.gwt.user.client.ui.Composite;
12import com.google.gwt.user.client.ui.FlexTable;
13import com.google.gwt.user.client.ui.Widget;
14
15/**
16 * This class can optionally add any of the following controls around a table (in this order of
17 * layout):
18 * Filter controls
19 * Selection/action menu
20 * Top paginator
21 * Actual data table
22 * Bottom paginator
23 */
24public class TableDecorator extends Composite implements DynamicTableListener {
25    private FlexTable enclosingTable = new FlexTable();
26    private FlexTable filterTable = new FlexTable();
27    private DynamicTable dataTable;
28    private SelectionManager selectionManager;
29    private int numFilters = 0;
30
31    private static class LayoutRows {
32        public static final int FILTERS = 0,
33                                TOP_ACTIONS = 1,
34                                TOP_PAGINATOR = 2,
35                                TABLE = 3,
36                                BOTTOM_PAGINATOR = 4,
37                                BOTTOM_ACTIONS = 5;
38    }
39
40    public TableDecorator(DynamicTable dataTable) {
41        this.dataTable = dataTable;
42        setRow(LayoutRows.TABLE, dataTable);
43        setRow(LayoutRows.FILTERS, filterTable);
44        initWidget(enclosingTable);
45    }
46
47    public void addPaginators() {
48        for(int i = 0; i < 2; i++) {
49            Paginator paginator = new Paginator();
50            dataTable.attachPaginator(paginator);
51            if (i == 0) { // add at top
52                setRow(LayoutRows.TOP_PAGINATOR, paginator);
53            }
54            else { // add at bottom
55                setRow(LayoutRows.BOTTOM_PAGINATOR, paginator);
56            }
57        }
58    }
59
60    public void addFilter(String text, Filter filter) {
61        dataTable.addFilter(filter);
62        addControl(text, filter.getWidget());
63    }
64
65    public void addControl(String text, Widget widget) {
66      int row = numFilters;
67      numFilters++;
68      filterTable.setText(row, 0, text);
69      filterTable.setWidget(row, 1, widget);
70    }
71
72    public SelectionManager addSelectionManager(boolean selectOnlyOne) {
73        selectionManager = new DynamicTableSelectionManager(dataTable, selectOnlyOne);
74        dataTable.addListener(this);
75        return selectionManager;
76    }
77
78    public void addSelectionPanel(boolean wantSelectVisible) {
79        assert selectionManager != null;
80        for(int i = 0; i < 2; i++) {
81            TableSelectionPanel selectionPanel = new TableSelectionPanel(wantSelectVisible);
82            selectionPanel.setListener(selectionManager);
83            if (i == 0)
84                setRow(LayoutRows.TOP_ACTIONS, selectionPanel);
85            else
86                setRow(LayoutRows.BOTTOM_ACTIONS, selectionPanel);
87        }
88    }
89
90    private TableActionsPanel createTableActionsPanel(boolean wantSelectVisible) {
91        assert selectionManager != null;
92        TableActionsPanel actionsPanel = new TableActionsPanel(wantSelectVisible);
93        actionsPanel.setSelectionListener(selectionManager);
94        return actionsPanel;
95    }
96
97    public void addTableActionsPanel(TableActionsListener listener, boolean wantSelectVisible) {
98        for(int i = 0; i < 2; i++) {
99            TableActionsPanel actionsPanel = createTableActionsPanel(wantSelectVisible);
100            actionsPanel.setActionsListener(listener);
101            if (i == 0)
102                setRow(LayoutRows.TOP_ACTIONS, actionsPanel);
103            else
104                setRow(LayoutRows.BOTTOM_ACTIONS, actionsPanel);
105        }
106    }
107
108    public void addTableActionsWithExportCsvListener(TableActionsWithExportCsvListener listener) {
109        addTableActionsPanel(listener, true);
110    }
111
112    public void setActionsWidget(Widget widget) {
113        setRow(LayoutRows.TOP_ACTIONS, widget);
114    }
115
116    private void setRow(int row, Widget widget) {
117        enclosingTable.setWidget(row, 0, widget);
118    }
119
120    @Override
121    public void onRowClicked(int rowIndex, JSONObject row, boolean isRightClick) {}
122
123    public void onTableRefreshed() {
124        assert selectionManager != null;
125        selectionManager.refreshSelection();
126    }
127}
128