/*******************************************************************************
* 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.dataviewer.dialog;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import hydrograph.ui.common.util.ImagePathConstant;
/**
* The Class SelectColumnActionDialog.
* Provides mechanism for selecting columns to be displayed in data viewer.
*
* @author Bitwise
*
*/
public class SelectColumnActionDialog extends Dialog {
private java.util.List<String> allColumns;
private java.util.List<String> selectedColumns;
private List listAllComlumns;
private List listSelectedColumns;
private Label moveUpLable;
private Label moveDownLable;
private Button okButton;
private static final String SELECT_COLUMNS = "Select Columns";
private static final String ALL_COLUMNS = "All Columns";
private static final String SELECTED_COLUMNS = "Selected Columns";
private static final String SKIP = "skip";
private boolean isAllColumnsAsce = false;
private boolean isSelectedColumnsAsce = false;
private Button sortAll;
private Button sortSelected;
private Comparator comparator = Collections.reverseOrder();
/**
* @param parentShell
* @param selectColumnAction
* @param selectedColumns2
* @param allColumns2
*/
public SelectColumnActionDialog(Shell parentShell, java.util.List<String> allColumns, java.util.List<String> selectedColumns) {
super(parentShell);
this.allColumns = new ArrayList<>();
this.allColumns.addAll(allColumns);
this.selectedColumns = new ArrayList<>();
this.selectedColumns.addAll(selectedColumns);
setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.WRAP | SWT.APPLICATION_MODAL | SWT.RESIZE |SWT.MIN |SWT.MAX );
}
/**
* Creates the SelectColumn Window
*/
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
container.setLayout(new GridLayout(1, false));
SashForm sashForm = new SashForm(container, SWT.NONE);
sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Shell shell=container.getShell();
shell.setText(SELECT_COLUMNS);
shell.setImage(ImagePathConstant.TABLE_ICON.getImageFromRegistry());
Composite allColumnsComposite = new Composite(sashForm, SWT.NONE);
allColumnsComposite.setLayout(new GridLayout(2, false));
Composite lblAndBtncomposite = new Composite(allColumnsComposite, SWT.NONE);
lblAndBtncomposite.setLayout(new GridLayout(2, false));
GridData gd_lblAndBtncomposite = new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1);
gd_lblAndBtncomposite.heightHint = 34;
lblAndBtncomposite.setLayoutData(gd_lblAndBtncomposite);
Label lblAllColumns = new Label(lblAndBtncomposite, SWT.NONE);
GridData gd_lblNewLabel = new GridData(SWT.LEFT, SWT.TOP, true, false, 1, 1);
gd_lblNewLabel.widthHint = 79;
lblAllColumns.setLayoutData(gd_lblNewLabel);
lblAllColumns.setText(ALL_COLUMNS);
FontData[] allColumnFont = lblAllColumns.getFont().getFontData();
allColumnFont[0].setHeight(11);
lblAllColumns.setFont( new Font(shell.getDisplay(),allColumnFont[0]));
sortAll = new Button(lblAndBtncomposite, SWT.NONE);
sortAll.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
new Label(allColumnsComposite, SWT.NONE);
sortAll.setImage(ImagePathConstant.SORT_ASC.getImageFromRegistry());
listAllComlumns = new List(allColumnsComposite, SWT.BORDER|SWT.MULTI|SWT.V_SCROLL|SWT.H_SCROLL);
listAllComlumns.setItems(Arrays.copyOf(allColumns.toArray(),allColumns.toArray().length,String[].class));
GridData gd_listAllComlumns = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gd_listAllComlumns.widthHint = 228;
listAllComlumns.setLayoutData(gd_listAllComlumns);
Composite allColumnsControlButtons = new Composite(allColumnsComposite, SWT.NONE);
allColumnsControlButtons.setLayout(null);
GridData gd_allColumnsControlButtons = new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1);
gd_allColumnsControlButtons.widthHint = 40;
gd_allColumnsControlButtons.heightHint = 41;
allColumnsControlButtons.setLayoutData(gd_allColumnsControlButtons);
Label selectAllLabel = new Label(allColumnsControlButtons, SWT.NONE);
selectAllLabel.setBounds(6, 70, 25, 25);
selectAllLabel.setImage(ImagePathConstant.SELECT_ALL_ICON.getImageFromRegistry());
Label selectLabel = new Label(allColumnsControlButtons, SWT.NONE);
selectLabel.setBounds(6, 110, 25, 25);
selectLabel.setImage(ImagePathConstant.SELECT_ICON.getImageFromRegistry());
Label disSelectLabel = new Label(allColumnsControlButtons, SWT.NONE);
disSelectLabel.setBounds(6, 150, 25, 25);
disSelectLabel.setImage(ImagePathConstant.DESELECT_ICON.getImageFromRegistry());
Label removeAll = new Label(allColumnsControlButtons, SWT.NONE);
removeAll.setBounds(6, 190, 25, 25);
removeAll.setImage(ImagePathConstant.DESELECT_ALL_ICON.getImageFromRegistry());
Composite selectColumnComposite = new Composite(sashForm, SWT.NONE);
selectColumnComposite.setLayout(new GridLayout(2, false));
Composite composite = new Composite(selectColumnComposite, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
GridData gd_composite = new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1);
gd_composite.heightHint = 34;
composite.setLayoutData(gd_composite);
Label lblSelectedColumns = new Label(composite, SWT.NONE);
GridData gd_lblSelectedColumns = new GridData(SWT.FILL, SWT.BOTTOM, true, true, 1, 1);
gd_lblSelectedColumns.heightHint = 36;
gd_lblSelectedColumns.widthHint = 120;
lblSelectedColumns.setLayoutData(gd_lblSelectedColumns);
lblSelectedColumns.setText(SELECTED_COLUMNS);
FontData[] selectColumnFont = lblSelectedColumns.getFont().getFontData();
selectColumnFont[0].setHeight(11);
lblSelectedColumns.setFont( new Font(shell.getDisplay(),selectColumnFont[0]));
sortSelected = new Button(composite, SWT.NONE);
GridData gd_sortSelected = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
sortSelected.setLayoutData(gd_sortSelected);
sortSelected.setImage(ImagePathConstant.SORT_ASC.getImageFromRegistry());
new Label(selectColumnComposite, SWT.NONE);
listSelectedColumns = new List(selectColumnComposite, SWT.BORDER|SWT.MULTI|SWT.V_SCROLL|SWT.H_SCROLL);
GridData gd_listSelectedColumns = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gd_listSelectedColumns.widthHint = 228;
listSelectedColumns.setLayoutData(gd_listSelectedColumns);
listSelectedColumns.setItems(Arrays.copyOf(selectedColumns.toArray(),selectedColumns.toArray().length,String[].class));
Composite moveElementsComposite = new Composite(selectColumnComposite, SWT.NONE);
GridData gd_moveElementsComposite = new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1);
gd_moveElementsComposite.heightHint = 271;
gd_moveElementsComposite.widthHint = 30;
moveElementsComposite.setLayoutData(gd_moveElementsComposite);
moveUpLable = new Label(moveElementsComposite, SWT.NONE);
moveUpLable.setBounds(0, 114, 24, 24);
moveUpLable.setImage(ImagePathConstant.UP_ICON.getImageFromRegistry());
moveDownLable = new Label(moveElementsComposite, SWT.NONE);
moveDownLable .setBounds(0, 160, 24, 25);
moveDownLable.setImage(ImagePathConstant.DOWN_ICON.getImageFromRegistry());
addListeners(selectAllLabel, selectLabel, disSelectLabel, removeAll);
sashForm.setWeights(new int[] {297, 274});
sortAll.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(allColumns.size() > 1){
if(!isAllColumnsAsce){
Collections.sort(allColumns);
listAllComlumns.setItems(Arrays.copyOf(allColumns.toArray(),allColumns.toArray().length,String[].class));
isAllColumnsAsce = true;
sortAll.setImage(ImagePathConstant.SORT_ASC.getImageFromRegistry());
}
else{
Collections.sort(allColumns,comparator);
listAllComlumns.setItems(Arrays.copyOf(allColumns.toArray(),allColumns.toArray().length,String[].class));
isAllColumnsAsce = false;
sortAll.setImage(ImagePathConstant.SORT_DESC.getImageFromRegistry());
}
}
}
});
sortSelected.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(selectedColumns.size() > 1){
if(!isSelectedColumnsAsce){
Collections.sort(selectedColumns);
listSelectedColumns.setItems(Arrays.copyOf(selectedColumns.toArray(),selectedColumns.toArray().length,String[].class));
sortSelected.setImage(ImagePathConstant.SORT_ASC.getImageFromRegistry());
isSelectedColumnsAsce = true;
}
else{
Collections.sort(selectedColumns, comparator);
listSelectedColumns.setItems(Arrays.copyOf(selectedColumns.toArray(),selectedColumns.toArray().length,String[].class));
sortSelected.setImage(ImagePathConstant.SORT_DESC.getImageFromRegistry());
isSelectedColumnsAsce = false;
}
}
}
});
return container;
}
/**
* @param selectAllLabel
* @param selectLabel
* @param disSelectLabel
* @param removeAll
* Add listeners to move data up/down/left/right
*/
private void addListeners(Label selectAllLabel, Label selectLabel,Label disSelectLabel, Label removeAll) {
selectLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
if (listAllComlumns.getSelection().length > 0) {
for (String string : listAllComlumns.getSelection()) {
allColumns.remove(string);
listAllComlumns.remove(string);
selectedColumns.add(string);
listSelectedColumns.add(string);
okButton.setEnabled(true);
}
}
}
});
disSelectLabel.addMouseListener(new MouseAdapter(){
@Override
public void mouseUp(MouseEvent e) {
if (listSelectedColumns.getSelection().length > 0) {
for (String string : listSelectedColumns.getSelection()) {
selectedColumns.remove(string);
listSelectedColumns.remove(string);
allColumns.add(string);
listAllComlumns.add(string);
}
if(listSelectedColumns.getItemCount()==0){
okButton.setEnabled(false);
}
}
}
});
selectAllLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
for (int i = 0; i < allColumns.size(); i++) {
listSelectedColumns.add(allColumns.get(i));
}
selectedColumns.addAll(allColumns);
allColumns.clear();
listAllComlumns.removeAll();
okButton.setEnabled(true);
}
});
removeAll.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
for (int i = 0; i < selectedColumns.size(); i++) {
listAllComlumns.add(selectedColumns.get(i));
}
allColumns.addAll(selectedColumns);
selectedColumns.clear();
listSelectedColumns.removeAll();
if(listSelectedColumns.getItemCount()==0){
okButton.setEnabled(false);
}
}
});
moveDownLable.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
int[] indices = listSelectedColumns.getSelectionIndices();
Map<Integer, String> map = new HashMap<Integer, String>();
if (Arrays.asList(indices).contains(selectedColumns.size() - 1))
map.put(indices[indices.length - 1], SKIP);
for (int index = indices.length - 1; index >= 0; index--) {
if (indices[index] < listSelectedColumns.getItemCount() - 1 && !map.containsKey(indices[index] + 1)) {
Collections.swap(selectedColumns, indices[index],indices[index] + 1);
listSelectedColumns.setItems(Arrays.copyOf(selectedColumns.toArray(),
selectedColumns.toArray().length, String[].class));
int[] temp2 = new int[indices.length];
for (int i = 0; i < indices.length; i++) {
if (map.containsKey(indices[i]))
temp2[i] = indices[i];
else
temp2[i] = indices[i] + 1;
}
listSelectedColumns.setSelection(temp2);
}else
map.put(indices[index], SKIP);
}
}
});
moveUpLable.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
int[] indices = listSelectedColumns.getSelectionIndices();
Map<Integer, String> map = new HashMap<Integer, String>();
if (Arrays.asList(indices).contains(0))
map.put(0, SKIP);
for (int index : indices) {
if (index > 0 && !map.containsKey(index - 1)) {
Collections.swap(selectedColumns, index, index - 1);
listSelectedColumns.setItems(Arrays.copyOf(selectedColumns.toArray(),
selectedColumns.toArray().length, String[].class));
int[] temp2 = new int[indices.length];
for (int i = 0; i < indices.length; i++) {
if (map.containsKey(indices[i]))
temp2[i] = indices[i];
else
temp2[i] = indices[i] - 1;
}
listSelectedColumns.setSelection(temp2);
} else
map.put(index, SKIP);
}
}
});
listSelectedColumns.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent e){
if (listSelectedColumns.getSelection().length > 0) {
for (String string : listSelectedColumns.getSelection()) {
selectedColumns.remove(string);
listSelectedColumns.remove(string);
allColumns.add(string);
listAllComlumns.add(string);
}
if(listSelectedColumns.getItemCount()==0){
okButton.setEnabled(false);
}
}
}
});
listAllComlumns.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent e) {
if (listAllComlumns.getSelection().length > 0) {
for (String string : listAllComlumns.getSelection()) {
allColumns.remove(string);
listAllComlumns.remove(string);
selectedColumns.add(string);
listSelectedColumns.add(string);
okButton.setEnabled(true);
}
}
}
});
}
/**
* Initialize the window
*/
protected Point getInitialSize() {
return new Point(600, 400);
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
okButton=createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,true);
if(listSelectedColumns.getItemCount()==0){
okButton.setEnabled(false);
}
createButton(parent, IDialogConstants.CANCEL_ID,IDialogConstants.CANCEL_LABEL, false);
}
/**
* Return all columns List
* @return List
*/
public java.util.List<String> getAllColumns() {
return allColumns;
}
/**
* Return list for selected columns
* @return List
*/
public java.util.List<String> getSelectedColumns() {
return selectedColumns;
}
}