package org.hpccsystems.recordlayout;
import java.awt.Robot;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellNavigationStrategy;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.ICellEditorListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TableViewerFocusCellManager;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.KeyListener;
public class CreateTable {
private Shell shell;
private String layoutType = "datasetLayout";
private Table table;
private TableViewer tableViewer;
private TabFolder tabFolder;
// Create a RecordList and assign it to an instance variable
private RecordList recordList = new RecordList();
private Button closeButton;
// Set the table column property names
public final static String NAME_COLUMN = "column_name";
public final static String DEFAULT_VALUE = "column_default_value";
public final static String TYPE_COLUMN = "column_type";
public final static String WIDTH_COLUMN = "column_width";
public final static String SORT_ORDER = "column_sort_order";
// Set column names
private String[] columnNames = new String[] { NAME_COLUMN, DEFAULT_VALUE, TYPE_COLUMN, WIDTH_COLUMN };
private RecordList parentFields = null;
private boolean includeCopyParent = false;
private boolean selectColumns = false;
private boolean isAddButton = true;
private String[] filedNameArr = null;
public boolean isAddButton() {
return isAddButton;
}
public void setAddButton(boolean isAddButton) {
this.isAddButton = isAddButton;
}
public String[] getFiledNameArr() {
return filedNameArr;
}
public void setFiledNameArr(String[] filedNameArr) {
this.filedNameArr = filedNameArr;
}
public boolean isSelectColumns() {
return selectColumns;
}
public void setSelectColumns(boolean selectColumns) {
this.selectColumns = selectColumns;
}
public void setParentLayout(RecordList fields){
parentFields = fields;
}
public void setColumnNames(String[] columnNames) {
this.columnNames = columnNames;
}
public String[] getColumnNamesArr() {
return columnNames;
}
public boolean isIncludeCopyParent() {
return includeCopyParent;
}
public void setIncludeCopyParent(boolean includeCopyParent) {
this.includeCopyParent = includeCopyParent;
}
public TabItem buildDefTab(String tabName, TabFolder tabFolder) {
this.tabFolder = tabFolder;
TabItem tabItem = new TabItem(tabFolder, SWT.NULL);
tabItem.setText(tabName);
/*Composite composite = new Composite(tabFolder, SWT.NONE);
tabItem.setControl(composite);*/
ScrolledComposite sc2 = new ScrolledComposite(tabFolder, SWT.H_SCROLL | SWT.V_SCROLL);
Composite compForGrp2 = new Composite(sc2, SWT.NONE);
sc2.setContent(compForGrp2);
// Set the minimum size
sc2.setMinSize(650, 450);
// Expand both horizontally and vertically
sc2.setExpandHorizontal(true);
sc2.setExpandVertical(true);
tabItem.setControl(sc2);
this.addChildControls(compForGrp2);
return tabItem;
}
public void setRecordList(RecordList rl) {
this.recordList = rl;
// tableViewer.setInput(recordList);
// table.setRedraw( true );
}
public CreateTable(Shell shell) {
this.shell = shell;
}
public CreateTable(Shell shell, String layoutType) {
this.shell = shell;
this.layoutType = layoutType;
}
public void buildTest(Shell shell){
tabFolder = new TabFolder (shell, SWT.NONE);
TabItem item1 = new TabItem (tabFolder, SWT.NULL);
item1.setText ("Tab Item 1");
Group grp = new Group(tabFolder, SWT.NONE);
grp.setText("Test Group");
String[] ITEMS = { "Select", "Variable", "Fixed"};
final Combo combo = new Combo(grp, SWT.DROP_DOWN);
combo.setItems(ITEMS);
combo.setBounds(10, 100, 100, 100);
combo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if(combo.getText().equals("Variable")) {
redrawTable(false);
} else {
redrawTable(true);
}
}
});
item1.setControl(grp);
TabItem item2 = new TabItem (tabFolder, SWT.NULL);
item2.setText ("Tab Item 2");
Composite composite = new Composite(tabFolder, SWT.NONE);
item2.setControl(composite);
this.addChildControls(composite);
}
/**
* The main method
* @param args
*/
public static void main(String[] args) {
Shell shell = new Shell();
shell.setText("HPCC Grid");
// Set layout for shell
shell.setLayout(new FillLayout());
TabFolder tabFolder = new TabFolder (shell, SWT.FILL | SWT.RESIZE | SWT.MIN | SWT.MAX);
FormData data = new FormData();
data.height = 525;
data.width = 650;
tabFolder.setLayoutData(data);
// Create a composite to hold the children
final CreateTable createTableObjectDS = new CreateTable(shell);
TabItem item1 = createTableObjectDS.buildDefTab("DATASET EX", tabFolder);
final CreateTable createTableObject = new CreateTable(shell,"sortLayout");
String[] cNames = new String[] { createTableObject.NAME_COLUMN,createTableObject.SORT_ORDER };
createTableObject.setColumnNames(cNames);
createTableObject.setSelectColumns(true);
//includeCopyParent
String[] inFields = {"t1","t2","t3"};
createTableObject.setFiledNameArr(inFields);
TabItem item2 = createTableObject.buildDefTab("SORT EX", tabFolder);
//createTableObject.getControl().addDisposeListener(new DisposeListener() {
// public void widgetDisposed(DisposeEvent e) {
// createTableObject.dispose();
// }
//});
// Ask the shell to display its content
//shell.open();
//createTableObject.run(shell);
// shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!shell.getDisplay().readAndDispatch()) {
shell.getDisplay().sleep();
}
}
}
/**
* This method redraws the table with 3 or columns depending upon the flag(status) value.
* @param status
*/
public void redrawTable(boolean status){
//while ( table.getColumnCount() > 0 ) {
// table.getColumns()[0].dispose();
//}
//this.renderTable();
RecordList oldRL = recordList;
recordList = new RecordList();
if(oldRL.getRecords() != null && oldRL.getRecords().size() > 0) {
System.out.println("Size: "+oldRL.getRecords().size());
for (Iterator<RecordBO> iterator = oldRL.getRecords().iterator(); iterator.hasNext();) {
RecordBO obj = (RecordBO) iterator.next();
recordList.addRecordBO(obj);
}
}
oldRL = null;
tableViewer.setInput(recordList);
//table.setRedraw(true);
//tableViewer.refresh();
}
/**
* Run and wait for a close event
* @param shell Instance of Shell
*/
private void run(Shell shell) {
// Add a listener for the close button
closeButton.addSelectionListener(new SelectionAdapter() {
// Close the view i.e. dispose of the composite's parent
public void widgetSelected(SelectionEvent e) {
table.getParent().getParent().getParent().dispose();
}
});
Display display = shell.getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
/**
* Create a new shell, add the widgets, open the shell
* @return the shell that was created
*/
private void addChildControls(Composite composite) {
// Create a composite to hold the children
GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_BOTH);
composite.setLayoutData (gridData);
// Set numColumns to 6 for the buttons
GridLayout layout = new GridLayout(6, false);
composite.setLayout (layout);
createTable(composite); // Create the table
createTableViewer(); // Create and setup the TableViewer
tableViewer.setContentProvider(new ExampleContentProvider()); //Set the Content Provider for the table
tableViewer.setLabelProvider(new RecordLabels(layoutType)); //Set the Label Provider for the table
//recordList = new RecordList();
tableViewer.setInput(recordList); //Add an empty RecordList to the TableViewer
createButtons(composite); // Add the buttons
addCellNavigation(); // Add Cell Navigation(Tab and Arrow keys for column navigation)
addMenu(composite); // Add Right Click Menu options
}
/**
* This method is used to add Right Click Menu options
* @param composite
*/
private void addMenu(final Composite composite){
Menu menu = new Menu(composite.getShell(), SWT.POP_UP);
table.setMenu(menu);
MenuItem item = new MenuItem(menu, SWT.PUSH);
item.setText("Add Rows");
item.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
int noOfRows = 0;
int index = table.getSelectionIndex();
InputDialog dlg = new InputDialog(Display.getCurrent().getActiveShell(), "", "How many Rows?", "Please enter number of rows here", new LengthValidator());
if (dlg.open() == Window.OK) {
noOfRows = Integer.parseInt(dlg.getValue());
}
if(noOfRows > 0){
for(int i = 0; i < noOfRows; i++) {
recordList.addRecord(index);
index++;
}
}
}
});
MenuItem deleteRow = new MenuItem(menu, SWT.PUSH);
deleteRow.setText("Delete Row");
deleteRow.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
recordList.removeRecord(table.getSelectionIndex());
tableViewer.refresh();
}
});
}
private boolean showColumn(String colName){
/*
* public final String NAME_COLUMN = "column_name";
public final String DEFAULT_VALUE = "column_default_value";
public final String TYPE_COLUMN = "column_type";
public final String WIDTH_COLUMN = "column_width";
public final String SORT_ORDER = "column_sort_order";
*/
for(int i = 0; i<columnNames.length; i++){
if(columnNames[i].equalsIgnoreCase(colName)){
return true;
}
}
return false;
}
private int columnPosition(String colName){
for(int i = 0; i<columnNames.length; i++){
if(columnNames[i].equalsIgnoreCase(colName)){
return i;
}
}
return -1;
}
private void renderTable(){
// 1st column - COLUMN_NAME
final TableColumn tableColumn0 = new TableColumn(table, SWT.LEFT, 0);
tableColumn0.setImage(RecordLabels.getImage("unchecked"));
tableColumn0.setText("Column Name");
tableColumn0.setWidth(150);
int colCount = 1;
for(int k = 1; k<columnNames.length; k++){
String name = "";
if(columnNames[k].equalsIgnoreCase("column_default_value")){
name = "Default Value";
}
if(columnNames[k].equalsIgnoreCase("column_type")){
name = "Column Type";
}
if(columnNames[k].equalsIgnoreCase("column_width")){
name = "Column Width";
}
if(columnNames[k].equalsIgnoreCase("column_sort_order")){
name = "Sort Order";
}
TableColumn column = new TableColumn(table, SWT.CENTER, k);
column.setText(name);
column.setWidth(100);
}
/*
//if(columnNames.length >= 2){
if(showColumn("column_default_value")){
// 2nd column - DEFAULT_VALUE
TableColumn column = new TableColumn(table, SWT.CENTER, colCount++);
column.setText("Default Value");
column.setWidth(100);
}
// if(columnNames.length >= 3){
if(showColumn("column_type")){
// 3rd column - COLUMN_TYPE
TableColumn column = new TableColumn(table, SWT.LEFT, colCount++);
column.setText("Column Type");
column.setWidth(100);
}
//if(columnNames.length >= 4){
if(showColumn("column_width")){
// 4th column - COLUMN_WIDTH
TableColumn column = new TableColumn(table, SWT.CENTER, colCount++);
column.setText("Column Width");
column.setWidth(100);
}
if(showColumn("column_sort_order")){
// 3rd column - COLUMN_TYPE
TableColumn column = new TableColumn(table, SWT.LEFT, colCount++);
column.setText("Sort Order");
column.setWidth(100);
}
*/
tableColumn0.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
System.out.println("Selection Listner - ");
boolean checkBoxFlag = false;
for (int i = 0; i < table.getItemCount(); i++) {
if (table.getItems()[i].getChecked()) {
checkBoxFlag = true;
}
}
if (checkBoxFlag) {
for (int m = 0; m < table.getItemCount(); m++) {
table.getItems()[m].setChecked(false);
tableColumn0.setImage(RecordLabels.getImage("unchecked"));
table.deselectAll();
}
} else {
for (int m = 0; m < table.getItemCount(); m++) {
table.getItems()[m].setChecked(true);
tableColumn0.setImage(RecordLabels.getImage("checked"));
table.selectAll();
}
} //end of else
tableViewer.refresh();
table.redraw();
} //end of handleEvent function
});
}
/**
* Create the Table
*/
private void createTable(Composite parent) {
int style = SWT.CHECK | SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION;
table = new Table(parent, style);
table.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event event) {
tableViewer.refresh();
table.redraw();
}
});
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessVerticalSpace = true;
gridData.horizontalSpan = 6;
table.setLayoutData(gridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
this.renderTable();
}// End of createTable method
/**
* Create a TableViewer
*/
private void createTableViewer() {
tableViewer = new TableViewer(table);
tableViewer.setUseHashlookup(true);
tableViewer.setColumnProperties(columnNames);
// Create the cell editors
final CellEditor[] editors = new CellEditor[columnNames.length];
// Column 1 : Column Name(Free text)
//if(columnNames.length >= 1) {
if(showColumn("column_name")){
// Column 1 : Column Name(Free text)
TextCellEditor colNameTextEditor = new TextCellEditor(table);
((Text) colNameTextEditor.getControl()).setTextLimit(30);
editors[columnPosition("column_name")] = colNameTextEditor;
}
// Column 2 : Default Value(Free text)
//if(columnNames.length >= 2) {
if(showColumn("column_default_value")){
// Column 2 : Default Value(Free text)
TextCellEditor colDefaultTextEditor = new TextCellEditor(table);
((Text) colDefaultTextEditor.getControl()).setTextLimit(30);
editors[columnPosition("column_default_value")] = colDefaultTextEditor;
}
// Column 3 : Column Type (Combo Box)
//if(columnNames.length >= 3) {
if(showColumn("column_type")){
// Column 3 : Column Type (Combo Box)
final ComboBoxCellEditor typeComboBox = new ComboBoxCellEditor(table, recordList.getColTypes(), SWT.DROP_DOWN|SWT.READ_ONLY);
//auto select logic
typeComboBox.getControl().addKeyListener(new KeyListener() {
String selectedItem = "";
public String letter = "";
public List<String> tempList = null;
public void keyPressed(KeyEvent e) {
} //End of keyPressed event
public void keyReleased(KeyEvent e) {
String key = Character.toString(e.character);
String[] items = typeComboBox.getItems();
for (int i = 0; i < items.length; i++) {
if (items[i].toLowerCase().startsWith(key.toLowerCase())) {
if(!letter.equals(key)){
tempList = new ArrayList<String>();
}
if (items[i].equalsIgnoreCase("select")) {
continue;
} else {
if(!tempList.contains(items[i])){
tempList.add(items[i]);
if(isLastItem(recordList.getColTypes(), items[i], key)){
((CCombo) typeComboBox.getControl()).select(i);
tempList = new ArrayList<String>();
} else {
((CCombo) typeComboBox.getControl()).select(i);
}
letter = key;
return;
}
}
}
} //End of for loop
} //End of keyReleased event
}); //End of addKeyListener
editors[columnPosition("column_type")] = typeComboBox;
}
// Column 4 : Column Width (Text with digits only)
//if(columnNames.length >= 4){
if(showColumn("column_width")){
TextCellEditor colWidthTextEditor = new TextCellEditor(table);
((Text) colWidthTextEditor.getControl()).setTextLimit(10);
editors[columnPosition("column_width")] = colWidthTextEditor;
}
if(showColumn("column_sort_order")){
// Column 3 : Column Type (Combo Box)
//String[] COLUMN_SORT_ORDER_ARRAY = {"ASCENDING",
// "DESENDING"
// };
//ComboBoxCellEditor colSortTextEditor = new ComboBoxCellEditor(table,COLUMN_SORT_ORDER_ARRAY);
//colSortTextEditor.setItems(COLUMN_SORT_ORDER_ARRAY);
//TextCellEditor colSortTextEditor = new TextCellEditor(table);
//((Text) colSortTextEditor.getControl()).setTextLimit(10);
//editors[columnPosition("column_sort_order")] = colSortTextEditor;
final ComboBoxCellEditor c = new ComboBoxCellEditor(table, recordList.getColSortOrder(), SWT.DROP_DOWN|SWT.READ_ONLY);
/*c.addListener(new ICellEditorListener(){
@Override
public void applyEditorValue() {
// TODO Auto-generated method stub
System.out.println("apply");
//columnPosition("colutable.get
}
@Override
public void cancelEditor() {
// TODO Auto-generated method stub
System.out.println("cancel edit");
}
@Override
public void editorValueChanged(boolean arg0, boolean arg1) {
// TODO Auto-generated method stub
System.out.println("Val CHange");
}
});*/
c.getControl().addKeyListener(new KeyListener() {
String selectedItem = "";
public String letter = "";
public List<String> tempList = null;
public void keyPressed(KeyEvent e) {
} //End of keyPressed event
public void keyReleased(KeyEvent e) {
String key = Character.toString(e.character);
String[] items = c.getItems();
for (int i = 0; i < items.length; i++) {
if (items[i].toLowerCase().startsWith(key.toLowerCase())) {
if(!letter.equals(key)){
tempList = new ArrayList<String>();
}
if (items[i].equalsIgnoreCase("select")) {
continue;
} else {
if(!tempList.contains(items[i])){
tempList.add(items[i]);
if(isLastItem(recordList.getColSortOrder(), items[i], key)){
((CCombo) c.getControl()).select(i);
tempList = new ArrayList<String>();
} else {
((CCombo) c.getControl()).select(i);
}
letter = key;
return;
}
}
}
} //End of for loop
} //End of keyReleased event
}); //End of addKeyListener
//c.addListener(keyReleased);
editors[columnPosition("column_sort_order")] = c;
/*table.getColumn(columnPosition("column_sort_order")).addControlListener(new ControlListener(){
@Override
public void controlMoved(ControlEvent arg0) {
// TODO Auto-generated method stub
System.out.println("c");
}
@Override
public void controlResized(ControlEvent arg0) {
// TODO Auto-generated method stub
System.out.println("d");
}});
*/
/*
table.getColumn(columnPosition("column_sort_order")).addSelectionListener(new SelectionListener(){
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("a");
}
@Override
public void widgetSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("b");
}});
*/
/*
editors[columnPosition("column_sort_order")].addListener(new ICellEditorListener(){
@Override
public void applyEditorValue() {
// TODO Auto-generated method stub
System.out.println("apply2");
}
@Override
public void cancelEditor() {
// TODO Auto-generated method stub
System.out.println("cancel edit2");
}
@Override
public void editorValueChanged(boolean arg0, boolean arg1) {
// TODO Auto-generated method stub
System.out.println("editor2");
}
});
*/
}
/*
* //testing java code
tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){
@Override
public void selectionChanged(SelectionChangedEvent arg0) {
// TODO Auto-generated method stub
System.out.println("changed");
System.out.println(arg0.getSelection().getClass().getName());
System.out.println(arg0.getSelection().getClass().toString());
System.out.println(((TableViewer)arg0.getSource()).getTable().getSelectionIndex());
//System.out.println(((TableViewer)arg0.getSource()).getTable().getSelectionCount());
System.out.println(((TableViewer)arg0.getSource()).getColumnViewerEditor().getFocusCell().getColumnIndex());
//System.out.println(((TableViewer)arg0.getSource()).getTable().getSelectionIndices()[1]);
int row = ((TableViewer)arg0.getSource()).getTable().getSelectionIndex();
int col = ((TableViewer)arg0.getSource()).getColumnViewerEditor().getFocusCell().getColumnIndex();
System.out.println(" column : " + ((TableViewer)arg0.getSource()).getTable().getColumn(col).getText());
String colName = ((TableViewer)arg0.getSource()).getTable().getColumn(col).getText();
if(colName.equals("Sort Order") || colName.equals("Column Type")){
//((TableViewer)arg0.getSource()).getColumnViewerEditor().getFocusCell().getControl();
System.out.println("Testing");
System.out.println("SELECTED VALUE:" + ((RecordBO)(((TableViewer)arg0.getSource()).getTable().getSelection()[0]).getData()).getSortOrder());
//System.out.println("Len:" + (((TableViewer)arg0.getSource()).getTable().getSelection()[0]));
//System.out.println("Cell Editor: " + ((ComboBoxCellEditor)((TableViewer)arg0.getSource()).getCellEditors()[col]).getItems()[1]);
//System.out.println("Cell Editor Val: " + ((ComboBoxCellEditor)((TableViewer)arg0.getSource()).getCellEditors()[col]).getValue());
//((ComboBoxCellEditor)((TableViewer)arg0.getSource()).getCellEditors()[col]).activate();
((ComboBoxCellEditor)((TableViewer)arg0.getSource()).getCellEditors()[col]).setFocus();
//((ComboBoxCellEditor)((TableViewer)arg0.getSource()).getC .getCellEditors()[col]).setValue("A");
//editors[columnPosition("column_type")] = typeComboBox;
}
try{
Robot r = new Robot();
//r.keyPress(java.awt.event.KeyEvent.VK_ENTER);
}catch(Exception e){
System.out.println(e);
}
}
});
*/
// Assign the cell editors to the viewer
tableViewer.setCellEditors(editors);
// Set the cell modifier for the viewer
tableViewer.setCellModifier(new ColumnCellModifiers(this));
}
/**
* Check if the item is the last item in the array for the key.
* @param array
* @param item
* @param key
* @return true if it is the last element
*/
public boolean isLastItem(String[] array, String item, String key){
boolean result = false;
List<String> listArl = new ArrayList<String>();
for (int i = 0; i < array.length; i++) {
if(array[i].toLowerCase().startsWith(key)) {
listArl.add(array[i]);
}
}
if(listArl != null && listArl.size() > 0) {
if(listArl.indexOf(item)+1 == listArl.size()){
result = true;
}
}
return result;
}
/**
* Add the Buttons
* @param parent
*/
private void createButtons(Composite parent) {
GridData gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 80;
// Create and configure the "Add" button
//if(!this.selectColumns){//decided to keep the add button in all cases if user prefers this use case
if(this.isAddButton){
Button add = new Button(parent, SWT.PUSH | SWT.CENTER);
add.setText("Add");
add.setLayoutData(gridData);
add.addSelectionListener(new SelectionAdapter() {
// Add a record and refresh the view
public void widgetSelected(SelectionEvent e) {
recordList.addRecord(table.getSelectionIndex());
tableViewer.refresh();
table.redraw();
}
});
}
//}
if(this.selectColumns){
Button selCol = new Button(parent, SWT.PUSH | SWT.CENTER);
selCol.setText("Select Columns");
gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 120;
selCol.setLayoutData(gridData);
selCol.addSelectionListener(new SelectionAdapter() {
// Add a record and refresh the view
public void widgetSelected(SelectionEvent e) {
/*recordList.addRecord(table.getSelectionIndex());
tableViewer.refresh();
table.redraw();*/
AddColumnsDialog acd = new AddColumnsDialog(shell.getDisplay());
acd.setItems(filedNameArr);
acd.run();
ArrayList<String> selCols = acd.getSelectedColumns();
if(selCols != null && selCols.size() > 0) {
//System.out.println("Size: "+parentFields.getRecords().size());
for(int selI = 0; selI < selCols.size(); selI++){
RecordBO obj = new RecordBO();
obj.setColumnName(selCols.get(selI));
obj.setSortOrder("ASCENDING");
recordList.addRecordBO(obj);
}
}
}
});
}
// Create and configure the "Delete" button
Button delete = new Button(parent, SWT.PUSH | SWT.CENTER);
delete.setText("Delete");
gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 80;
delete.setLayoutData(gridData);
delete.addSelectionListener(new SelectionAdapter() {
//Remove all the records that are checked and refresh the view
public void widgetSelected(SelectionEvent e) {
List<Integer> arlCheckedIndexes = new ArrayList<Integer>();
for (int i = 0; i < table.getItemCount(); i++) {
if (table.getItems()[i].getChecked()) {
arlCheckedIndexes.add(i);
}
}
Collections.sort(arlCheckedIndexes);
Integer[] arrSortedIndexes = arlCheckedIndexes.toArray(new Integer[arlCheckedIndexes.size()]);
for (int j = arrSortedIndexes.length - 1 ; j>=0; j--) {
recordList.removeRecord(arrSortedIndexes[j]);
//table.remove(arrSortedIndexes[j]);
tableViewer.refresh();
table.redraw();
}
//table.getItem(0).setImage(RecordLabels.getImage("unchecked"));
//tableViewer.refresh();
//table.redraw();
table.getColumns()[0].setImage(RecordLabels.getImage("unchecked"));
}
});
// Create and configure the "GetAll" button
if(includeCopyParent){
Button getAll = new Button(parent, SWT.PUSH | SWT.CENTER);
getAll.setText("Copy Parent Format");
gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 180;
getAll.setLayoutData(gridData);
getAll.addSelectionListener(new SelectionAdapter() {
// Remove the selection and refresh the view
public void widgetSelected(SelectionEvent e) {
if(parentFields!=null && parentFields.getRecords().size()>0){
//tableViewer.remove(index)tableViewer.remove(index);
//tableViewer.getTable().getSize();
recordList = new RecordList();
if(parentFields.getRecords() != null && parentFields.getRecords().size() > 0) {
//System.out.println("Size: "+parentFields.getRecords().size());
for (Iterator<RecordBO> iterator = parentFields.getRecords().iterator(); iterator.hasNext();) {
//System.out.println("Record -- ");
RecordBO obj = (RecordBO) iterator.next();
recordList.addRecordBO(obj);
}
}
redrawTable(true);
}
/*
if(recordList.getRecords() != null && recordList.getRecords().size() > 0) {
System.out.println("Size: "+recordList.getRecords().size());
for (Iterator<RecordBO> iterator = recordList.getRecords().iterator(); iterator.hasNext();) {
RecordBO obj = (RecordBO) iterator.next();
System.out.println("*******************");
System.out.println("Column Name: "+obj.getColumnName());
System.out.println("Column Type: "+obj.getColumnType());
System.out.println("Height: "+obj.getColumnWidth());
System.out.println("*******************");
}
}*/
}
});
}
//Create and configure the "Move Up" button
Button btnRowUp = new Button(parent, SWT.PUSH | SWT.CENTER);
btnRowUp.setImage(RecordLabels.getImage("upArrow"));
btnRowUp.setText("Move Up");
gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 90;
btnRowUp.setLayoutData(gridData);
btnRowUp.addSelectionListener(new SelectionAdapter() {
//Move the selected record one level up and refresh the view
public void widgetSelected(SelectionEvent e) {
if(recordList.getRecords() != null && recordList.getRecords().size() > 0) {
int selectionIndex = 0;
for (int i = 0; i < table.getItemCount(); i++) {
if (table.getItems()[i].getChecked()) {
selectionIndex = i;
}
}
if(table.getItem(selectionIndex).getChecked() && selectionIndex > 0){
Collections.swap(recordList.getRecords(), selectionIndex-1, selectionIndex);
}
tableViewer.refresh();
if(selectionIndex > 0){
for (int i = 0; i < table.getItemCount(); i++) {
table.getItems()[i].setChecked(false);
}
table.getItem(selectionIndex-1).setChecked(true);
}
}
tableViewer.refresh();
table.redraw();
}
});
///Create and configure the "Move Down" button
Button btnRowDown = new Button(parent, SWT.PUSH | SWT.CENTER);
btnRowDown.setImage(RecordLabels.getImage("downArrow"));
btnRowDown.setText("Move Down");
gridData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 100;
btnRowDown.setLayoutData(gridData);
btnRowDown.addSelectionListener(new SelectionAdapter() {
//Move the selected record one level down and refresh the view
public void widgetSelected(SelectionEvent e) {
if(recordList.getRecords() != null && recordList.getRecords().size() > 0) {
int selectionIndex = 0;
for (int i = 0; i < table.getItemCount(); i++) {
if (table.getItems()[i].getChecked()) {
selectionIndex = i;
break;
}
}
if(table.getItem(selectionIndex).getChecked() && selectionIndex < table.getItems().length -1){
Collections.swap(recordList.getRecords(), selectionIndex+1, selectionIndex);
}
tableViewer.refresh();
if(selectionIndex < table.getItems().length - 1) {
for (int i = 0; i < table.getItemCount(); i++) {
table.getItems()[i].setChecked(false);
}
table.getItem(selectionIndex+1).setChecked(true);
}
}
tableViewer.refresh();
table.redraw();
}
});
// Create and configure the "Close" button
//closeButton = new Button(parent, SWT.PUSH | SWT.CENTER);
//closeButton.setText("Close");
//gridData = new GridData (GridData.HORIZONTAL_ALIGN_END);
//gridData.widthHint = 80;
//closeButton.setLayoutData(gridData);
/*closeButton = new Button(parent, SWT.PUSH | SWT.CENTER);
closeButton.setText("Close");
gridData = new GridData (GridData.HORIZONTAL_ALIGN_END);
gridData.widthHint = 80;
closeButton.setLayoutData(gridData);*/
//This filter is used to handle the CRTL+ENTER Event, which adds the new row to the Grid
table.getDisplay().addFilter( SWT.KeyDown, new Listener() {
public void handleEvent( Event event ) {
//HARD CODED TabItem Text
if(!tabFolder.isDisposed() && tabFolder.getSelection()[0].getText().equals("Fields")) {
if(event.stateMask == SWT.CTRL && event.keyCode == SWT.CR) {
recordList.addRecord(table.getSelectionIndex());
table.select(table.getSelectionIndex()+1);
}
}
}
} );
}
/**
* This method is used to add the Cell Navigation in the table
*/
private void addCellNavigation(){
CellNavigationStrategy naviStrat = new CellNavigationStrategy() {
public ViewerCell findSelectedCell(ColumnViewer viewer, ViewerCell currentSelectedCell, Event event) {
ViewerCell cell = super.findSelectedCell(viewer, currentSelectedCell, event);
if( cell != null ) {
tableViewer.getTable().showColumn(tableViewer.getTable().getColumn(cell.getColumnIndex()));
}
return cell;
}
};
TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer,new FocusCellOwnerDrawHighlighter(tableViewer));
ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) {
protected boolean isEditorActivationEvent( ColumnViewerEditorActivationEvent event) {
return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.TAB)
|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
;
}
};
//|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
//
TableViewerEditor.create(tableViewer, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
| ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
//Used to override the default TAB behavior which focuses on the next component
tableViewer.getTable().addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent arg0) {
if (arg0.keyCode == SWT.TAB){
arg0.doit = false;
}
}
});
}
/**
* InnerClass that acts as a proxy for the RecordList providing content for the Table. It implements the IRecordListViewer
* interface since it must register changeListeners with the RecordList
*/
class ExampleContentProvider implements IStructuredContentProvider, IRecordListViewer {
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
if (newInput != null) {
((RecordList) newInput).addChangeListener(this);
}
if (oldInput != null)
((RecordList) oldInput).removeChangeListener(this);
}
public void dispose() {
recordList.removeChangeListener(this);
}
// Return the tasks as an array of Objects
public Object[] getElements(Object parent) {
return recordList.getRecords().toArray();
}
public void addRecord(RecordBO record) {
System.out.println("addRecord");
//Insert the record at a specific position
if(tableViewer.getTable().getSelectionIndex() >= 0){
tableViewer.insert(record, tableViewer.getTable().getSelectionIndex()+1);
} else {
tableViewer.add(record);
}
tableViewer.refresh();
table.redraw();
}
public void removeRecord(int index) {
tableViewer.remove(index);
}
public void modifyRecord(RecordBO record) {
tableViewer.update(record, null);
}
}
/**
* This class is used to validate that you enter only numeric values in the "Add Rows" Dialog box
*/
class LengthValidator implements IInputValidator {
/**
* Validates the String. Returns null for no error, or an error message
* @param newText the String to validate
* @return String
*/
public String isValid(String newText) {
String returnValue = "Not Correct";
if(newText != null && newText.trim().length() > 0){
boolean isInteger = Pattern.matches("^\\d*$", newText);
if(isInteger){
returnValue = null;
}
}
return returnValue; // Input must be OK
}
}
/**
* Return the parent composite
*/
public Control getControl() {
return table.getParent();
}
/**
* Release resources
*/
public void dispose() {
// Tell the label provider to release its resources
tableViewer.getLabelProvider().dispose();
}
/*
* Close the window and dispose of resources
*/
public void close() {
Shell shell = table.getShell();
if (shell != null && !shell.isDisposed())
shell.dispose();
}
/**
* Return the array of choices for a multiple choice cell
*/
public String[] getChoices(String property) {
if (TYPE_COLUMN.equals(property))
return recordList.getColTypes();
else if (SORT_ORDER.equals(property))
return recordList.getColSortOrder();
else
return new String[]{};
}
/**
* Return the column names in a collection
* @return List containing column names
*/
public java.util.List<String> getColumnNames() {
return Arrays.asList(columnNames);
}
/**
* @return currently selected item
*/
public ISelection getSelection() {
return tableViewer.getSelection();
}
/**
* Return the RecordList
*/
public RecordList getRecordList() {
return recordList;
}
}