/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.workflow.execute; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.TableItem; import de.rcenvironment.core.component.workflow.model.api.WorkflowNode; import de.rcenvironment.core.gui.resources.api.ImageManager; import de.rcenvironment.core.gui.resources.api.StandardImages; /** * Updater for a Table: Implementation of {@link Updatable}. * * @author Goekhan Guerkan */ public class TableBehaviour extends AbstractUpdateBehavior { private TableViewer tableViewer; private Color color; private int currentlyUsedSortingColumn = 1; public TableBehaviour(TableViewer tableviewer, WorkflowNodeTargetPlatformLabelProvider instanceProvider, CheckboxLabelProvider checkProvider) { super(instanceProvider, checkProvider); this.tableViewer = tableviewer; } @Override public void updateInstanceColumn(ViewerCell cell) { final WorkflowNode workflowNode = (WorkflowNode) cell .getElement(); TableItem item = (TableItem) cell.getItem(); TableEditor editor = new TableEditor(tableViewer.getTable()); final CCombo combo = new CCombo(tableViewer.getTable(), SWT.READ_ONLY); combo.setData(workflowNode); combo.setData(EDITOR, editor); combo.setBackground(color); combo.addListener(SWT.Resize, new Listener() { @Override public void handleEvent(final Event argEvent) { combo.setText(combo.getText()); } }); if (!comboList.contains(combo)) { comboList.add(combo); } editor.grabHorizontal = true; editor.horizontalAlignment = SWT.BEGINNING; editor.setEditor(combo, item, 2); if (editingSupport.getValues(workflowNode).size() > 0) { for (String value : editingSupport.getValues(workflowNode)) { combo.add(value); } } else { combo.setEnabled(false); combo.setText("No target instance available"); } final Integer selectionIndex = (Integer) editingSupport .getValue(workflowNode); if (selectionIndex != null && !(selectionIndex > combo.getItemCount())) { combo.select(selectionIndex); } else { combo.select(0); } instanceProvider.handleSelection(combo, workflowNode); combo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (combo != null) { instanceProvider.handleSelection(combo, workflowNode); instanceProvider.getPage().prepareErrorStatement(); } } }); prepareValuesForMasterCombo(); } @Override public void setComboColor(Color colorToSet) { this.color = colorToSet; } @Override public void refreshColumns() { tableViewer.getTable().setRedraw(false); checkProvider.clearButtonList(); instanceProvider.clearComboList(); // the table is sorted by instances. if (currentlyUsedSortingColumn == 2) { if (tableViewer.getTable().getSortDirection() == SWT.UP) { tableViewer.setContentProvider(new WorkflowDescriptionContentProvider(SWT.UP, TableSortSelectionListener.COLUMN_INSTANCE)); } else { tableViewer .setContentProvider(new WorkflowDescriptionContentProvider(SWT.DOWN, TableSortSelectionListener.COLUMN_INSTANCE)); } // it is sorted by names. } else { if (tableViewer.getTable().getSortDirection() == SWT.UP) { tableViewer.setContentProvider(new WorkflowDescriptionContentProvider(SWT.UP, TableSortSelectionListener.COLUMN_NAME)); } else { tableViewer .setContentProvider(new WorkflowDescriptionContentProvider(SWT.DOWN, TableSortSelectionListener.COLUMN_NAME)); } } isCheckBoxColumnEnabled(); if (columnImageActive) { if (allCheckboxesClicked) { tableViewer.getTable().getColumn(0).setImage(ImageManager.getInstance().getSharedImage(StandardImages.CHECK_CHECKED)); } else { tableViewer.getTable().getColumn(0).setImage(ImageManager.getInstance().getSharedImage(StandardImages.CHECK_UNCHECKED)); } } tableViewer.getTable().setRedraw(true); tableViewer.getTable().redraw(); tableViewer.getTable().update(); checkIfDisableMasterBtn(); } @Override public void updateCheckBoxColumn(ViewerCell cell) { WorkflowNode node = (WorkflowNode) cell.getElement(); TableEditor editor = new TableEditor(tableViewer.getTable()); TableItem item = (TableItem) cell.getItem(); final Button btn = new Button(tableViewer.getTable(), SWT.CHECK); btn.setBackground(cell.getBackground()); synchronizeButtons(); if (node.isChecked()) { btn.setSelection(true); } else { btn.setSelection(false); } checkIfDisableMasterBtn(); btn.setData(KEY_CHECK, node); btn.setData(EDITOR, editor); btn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { saveIndexOfComboBeforeRefresh(); WorkflowNode node = (WorkflowNode) btn.getData(KEY_CHECK); node.setChecked(btn.getSelection()); if (!checkifAllClicked() && columnImageActive) { allCheckboxesClicked = false; tableViewer.getTable().getColumn(0).setImage(ImageManager.getInstance().getSharedImage(StandardImages.CHECK_UNCHECKED)); } prepareValuesForMasterCombo(); checkIfDisableMasterBtn(); setSavedComboIndex(); } }); btnList.add(btn); editor.grabHorizontal = true; editor.horizontalAlignment = SWT.LEFT; editor.setEditor(btn, item, 0); // Disable the checkboxex if only one target instance available. if (editingSupport.getValues(node).size() <= 1) { btn.setEnabled(false); } else { btn.setEnabled(true); } isCheckBoxColumnEnabled(); if (!columnImageActive) { tableViewer.getTable().getColumn(0).setImage(checkDisabled); } else { tableViewer.getTable().getColumn(0).setImage(uncheckedImg); } } @Override public boolean useFilter(String filterText, Object element) { WorkflowNode node = (WorkflowNode) element; if (filterText == null) { return true; } if (filterText.equals("")) { return true; } String filterTextSmall = filterText.toLowerCase(); String temp = node.getComponentDescription().getNode().toString().toLowerCase(); String componentName = node.getName().toLowerCase(); String targetInstance = temp.replaceFirst("\"", ""); if (targetInstance.contains(filterTextSmall) || componentName.contains(filterTextSmall)) { return true; } return false; } /** * Checks if all checkboxes are selected. * * @return true if all buttons clicked */ public boolean checkifAllClicked() { boolean clicked = true; List<Button> allEnabledBtns = new ArrayList<Button>(); for (Button b : btnList) { if (b.isEnabled()) { allEnabledBtns.add(b); } } for (Button btn : allEnabledBtns) { if (!btn.getSelection()) { clicked = false; } } if (columnImageActive) { if (clicked && btnList.size() > 0) { allCheckboxesClicked = true; tableViewer.getTable().getColumn(0).setImage(ImageManager.getInstance().getSharedImage(StandardImages.CHECK_CHECKED)); } } return clicked; } private void synchronizeButtons() { for (Button b : btnList) { WorkflowNode node = (WorkflowNode) b.getData(TableBehaviour.KEY_CHECK); b.setSelection(node.isChecked()); } } public int getCurrentlyUsedSortingColumn() { return currentlyUsedSortingColumn; } public void setCurrentlyUsedSortingColumn(int currentlyUsedSortingColumn) { this.currentlyUsedSortingColumn = currentlyUsedSortingColumn; } }