/*******************************************************************************
* Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package hydrograph.ui.propertywindow.widgets.listeners;
import hydrograph.ui.common.util.Constants;
import hydrograph.ui.datastructure.property.GridRow;
import hydrograph.ui.graph.model.Component;
import hydrograph.ui.propertywindow.propertydialog.PropertyDialogButtonBar;
import hydrograph.ui.propertywindow.widgets.listeners.ListenerHelper.HelperType;
import hydrograph.ui.propertywindow.widgets.listeners.grid.ELTGridDetails;
import hydrograph.ui.propertywindow.widgets.utility.GridWidgetCommonBuilder;
import hydrograph.ui.propertywindow.widgets.utility.WidgetUtility;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Widget;
/**
* The class ELTShortcutKeyGridListener listens the Schema grid. It attaches the KeyListener to Schema grid and
* processes the key pressed events. Basically, it facilitates the keyboard shortcuts for functionality like add
* row and delete row.
*
* @see ELTSelectionTaskListener
*/
public class ELTShortcutKeyGridListener extends ELTSelectionTaskListener {
private Table table;
private int rowSequence=0;
private boolean ctrlKeyPressed = false;
private boolean isKeyListenerAttached = false;
@Override
public int getListenerType() {
return SWT.Selection;
}
@Override
public void selectionListenerAction(final PropertyDialogButtonBar propertyDialogButtonBar, final ListenerHelper helpers, Widget... widget) {
ELTGridDetails gridDetails = (ELTGridDetails) helpers.get(HelperType.SCHEMA_GRID);
final TableViewer tableViewer = gridDetails.getTableViewer();
final int columns = tableViewer.getCellEditors().length;
final Widget[] widgets = widget;
table=(Table)widgets[0];
if (!isKeyListenerAttached){
for (int i =0; i < columns; i++){
attachShortcutKeyListener(tableViewer.getCellEditors()[i].getControl(), propertyDialogButtonBar, helpers, widgets);
}
attachShortcutKeyListener(table, propertyDialogButtonBar, helpers, widgets);
}
}
private void attachShortcutKeyListener(Control currentControl, final PropertyDialogButtonBar propertyDialogButtonBar, final ListenerHelper helpers, final Widget[] widgets) {
isKeyListenerAttached = true;
currentControl.addKeyListener(new KeyListener() {
@Override
public void keyReleased(KeyEvent event) {
if(event.keyCode == SWT.CTRL || event.keyCode == SWT.COMMAND){
ctrlKeyPressed = false;
}
}
@Override
public void keyPressed(KeyEvent event) {
if(event.keyCode == SWT.CTRL || event.keyCode == SWT.COMMAND){
ctrlKeyPressed = true;
}
if (ctrlKeyPressed && event.keyCode == Constants.KEY_N){
propertyDialogButtonBar.enableApplyButton(true);
table.getParent().getShell().setFocus();
((Button) widgets[1]).setEnabled(true);
ELTGridDetails eltGridDetails = (ELTGridDetails)helpers.get(HelperType.SCHEMA_GRID);
if (eltGridDetails.getGrids().size() >= 1) {
((Button) widgets[2]).setEnabled(true);
((Button) widgets[3]).setEnabled(true);
}
GridWidgetCommonBuilder gridCommonBuilder = eltGridDetails.getGridWidgetCommonBuilder();
gridCommonBuilder.setRowSequence(rowSequence);
gridCommonBuilder.createDefaultSchema(eltGridDetails.getGrids(), eltGridDetails.getTableViewer(), eltGridDetails.getLabel());
rowSequence++;
((Component)helpers.get(HelperType.COMPONENT)).setLatestChangesInSchema(true);
}
else if (ctrlKeyPressed && event.keyCode == Constants.KEY_D){
propertyDialogButtonBar.enableApplyButton(true);
ELTGridDetails gridDetails = (ELTGridDetails) helpers.get(HelperType.SCHEMA_GRID);
TableViewer tableViewer = gridDetails.getTableViewer();
Table table = tableViewer.getTable();
int[] indexes=table.getSelectionIndices();
if (table.getSelectionIndex() == -1) {
WidgetUtility.errorMessage("Please Select row to delete");
} else {
table.remove(indexes);
List listOfItemsToRemove= new ArrayList();
for (int index : indexes) {
listOfItemsToRemove.add(gridDetails.getGrids().get(index));
}
List<GridRow> gridsList = gridDetails.getGrids();
gridsList.removeAll(listOfItemsToRemove);
//highlight after deletion
if(indexes.length == 1 && gridsList.size() > 0){//only one item is deleted
if(gridsList.size() == 1){//list contains only one element
table.select(0);// select the first element
tableViewer.editElement(tableViewer.getElementAt(0), 0);
}
else if(gridsList.size() == indexes[0]){//deleted last item
table.select(gridsList.size() - 1);//select the last element which now at the end of the list
tableViewer.editElement(tableViewer.getElementAt(gridsList.size() - 1), 0);
}
else if(gridsList.size() > indexes[0]){//deleted element from middle of the list
table.select( indexes[0] == 0 ? 0 : (indexes[0] - 1) );//select the element from at the previous location
tableViewer.editElement(tableViewer.getElementAt(indexes[0] == 0 ? 0 : (indexes[0] - 1)), 0);
}
}
else if(indexes.length >= 2){//multiple items are selected for deletion
if(indexes[0] == 0){//delete from 0 to ...
if(gridsList.size() >= 1){//list contains only one element
table.select(0);//select the remaining element
tableViewer.editElement(tableViewer.getElementAt(0), 0);
}
}
else{//delete started from element other than 0th element
table.select((indexes[0])-1);//select element before the start of selection
tableViewer.editElement(tableViewer.getElementAt((indexes[0])-1), 0);
}
}
}
if (gridDetails.getGrids().size() >= 1) {
((Button) widgets[1]).setEnabled(true);
} else {
((Button) widgets[1]).setEnabled(false);
}
if (gridDetails.getGrids().size() >= 2) {
((Button) widgets[2]).setEnabled(true);
((Button) widgets[3]).setEnabled(true);
} else {
((Button) widgets[2]).setEnabled(false);
((Button) widgets[3]).setEnabled(false);
}
((Component)helpers.get(HelperType.COMPONENT)).setLatestChangesInSchema(true);
}
}
});
}
}