/******************************************************************************* * 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.customwidgets.joinproperty; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ICellEditorValidator; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseTrackListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; 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.ExpandBar; import org.eclipse.swt.widgets.ExpandItem; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableItem; import hydrograph.ui.common.util.Constants; import hydrograph.ui.common.util.CustomColorRegistry; import hydrograph.ui.common.util.ImagePathConstant; import hydrograph.ui.common.util.OSValidator; import hydrograph.ui.common.util.ParameterUtil; import hydrograph.ui.datastructure.property.FilterProperties; import hydrograph.ui.datastructure.property.JoinMappingGrid; import hydrograph.ui.datastructure.property.LookupMapProperty; import hydrograph.ui.propertywindow.messages.Messages; import hydrograph.ui.propertywindow.propertydialog.PropertyDialogButtonBar; import hydrograph.ui.propertywindow.widgets.customwidgets.ELTJoinWidget; import hydrograph.ui.propertywindow.widgets.customwidgets.joinlookupproperty.JoinContentProvider; import hydrograph.ui.propertywindow.widgets.customwidgets.joinlookupproperty.LookupCellModifier; import hydrograph.ui.propertywindow.widgets.customwidgets.joinlookupproperty.LookupLabelProvider; import hydrograph.ui.propertywindow.widgets.filterproperty.ELTCellModifier; import hydrograph.ui.propertywindow.widgets.filterproperty.ELTFilterContentProvider; import hydrograph.ui.propertywindow.widgets.filterproperty.ELTFilterLabelProvider; import hydrograph.ui.propertywindow.widgets.gridwidgets.basic.ELTSWTWidgets; public class JoinMapGrid extends Dialog { private static final String NONE = "None"; private Label errorLabel; private TableViewer outputTableViewer; private int j = 20; private Button okButton; private int inputPortValue = ELTJoinWidget.value; private TableViewer[] inputTableViewer = new TableViewer[inputPortValue]; private Button[] radio = new Button[inputPortValue + 1]; private Composite expandItemComposite; public static final String OPERATIONAL_INPUT_FIELD = "Field Name"; protected static final String ERROR = null; public static String PROPERTY_NAME = "Source Field"; public static String PROPERTY_VALUE = "Output Field"; private String[] COLUMN_NAME = { PROPERTY_NAME, PROPERTY_VALUE }; private String[] INPUT_COLUMN_NAME = { OPERATIONAL_INPUT_FIELD }; private String previousRadioButtonSelection = NONE; private List<FilterProperties> joinInputList; private List<LookupMapProperty> joinOutputList; private List<List<FilterProperties>> joinInputSchemaList = new ArrayList<>(); private ELTSWTWidgets widget = new ELTSWTWidgets(); private JoinMappingGrid joinMappingGrid; private static final String INFORMATION = "Information"; private TableItem[] previousItems; private TableItem[] currentItems; private PropertyDialogButtonBar propertyDialogButtonBar; private List<String> nonMappedFieldList=new ArrayList<>(); private HashMap<String, List<String>> inputFieldMap=new HashMap<String, List<String>>(); private String IN="in"; private Button deleteButton; private Button upButton; private Button downButton; /** * Create the dialog. * * @param parentShell * @param propertyDialogButtonBar */ public JoinMapGrid(Shell parentShell, JoinMappingGrid joinPropertyGrid, PropertyDialogButtonBar propertyDialogButtonBar) { super(parentShell); setShellStyle(SWT.CLOSE | SWT.RESIZE | SWT.TITLE | SWT.WRAP | SWT.APPLICATION_MODAL); this.joinMappingGrid = joinPropertyGrid; this.propertyDialogButtonBar=propertyDialogButtonBar; } public void getJoinPropertyGrid() { joinMappingGrid.setLookupInputProperties(joinInputSchemaList); joinMappingGrid.setLookupMapProperties(joinOutputList); } /** * Create contents of the dialog. * * @param parent */ @Override protected Control createDialogArea(Composite parent) { final Composite container = (Composite) super.createDialogArea(parent); container.getShell().setText("Join Mapping"); container.setFocus(); container.setLayout(new GridLayout(6, false)); new Label(container, SWT.NONE); new Label(container, SWT.NONE); new Label(container, SWT.NONE); new Label(container, SWT.NONE); new Label(container, SWT.NONE); new Label(container, SWT.NONE); new Label(container, SWT.NONE); Composite composite = new Composite(container, SWT.None); composite.setLayout(new GridLayout(1, false)); GridData gd_composite = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_composite.heightHint = 595; gd_composite.widthHint = 281; composite.setLayoutData(gd_composite); final ScrolledComposite scrolledComposite = new ScrolledComposite( composite, SWT.BORDER | SWT.V_SCROLL); GridData gd_scrolledComposite = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_scrolledComposite.heightHint = 542; gd_scrolledComposite.widthHint = 240; scrolledComposite.setLayoutData(gd_scrolledComposite); scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); final ExpandBar expandBar = new ExpandBar(scrolledComposite, SWT.NONE); expandBar.setLayoutData(new RowData(200, 550)); for (int i = 0; i < inputPortValue; i++) { if (joinMappingGrid != null) { if (joinMappingGrid.getLookupInputProperties() != null && !joinMappingGrid.getLookupInputProperties() .isEmpty()) { if (i < joinMappingGrid.getLookupInputProperties().size()) joinInputList = joinMappingGrid .getLookupInputProperties().get(i); else joinInputList = new ArrayList<>(); } else { joinInputList = new ArrayList<>(); } } if (joinInputSchemaList != null) { joinInputSchemaList.add(joinInputList); } expandItemComposite = (Composite) createComposite(expandBar, joinInputList, i); } if (joinMappingGrid.getLookupMapProperties() != null && !joinMappingGrid.getLookupMapProperties().isEmpty()) { joinOutputList = joinMappingGrid.getLookupMapProperties(); } else { joinOutputList = new ArrayList<>(); } expandBar.getItem(0).setExpanded(true); expandBar.setBackground(CustomColorRegistry.INSTANCE.getColorFromRegistry(250, 250, 250)); Listener updateScrolledSize = new Listener() { @Override public void handleEvent(Event arg0) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { scrolledComposite.setMinSize(expandBar.computeSize( SWT.DEFAULT, SWT.DEFAULT)); } }); } }; expandBar.addListener(SWT.Expand, updateScrolledSize); expandBar.addListener(SWT.Collapse, updateScrolledSize); expandBar.addKeyListener(new KeyListener() { @Override public void keyReleased(KeyEvent event) { } @Override public void keyPressed(KeyEvent event) { if (event.character == SWT.ESC) { close(); event.doit = false; } } }); scrolledComposite.setContent(expandBar); scrolledComposite.setMinSize(expandBar.computeSize(SWT.DEFAULT, SWT.DEFAULT)); errorLabel = new Label(composite, SWT.None); errorLabel.setAlignment(SWT.LEFT_TO_RIGHT); GridData gd_lblNewLabel_1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_lblNewLabel_1.heightHint = 20; gd_lblNewLabel_1.widthHint = 260; errorLabel.setLayoutData(gd_lblNewLabel_1); errorLabel.setForeground(CustomColorRegistry.INSTANCE.getColorFromRegistry( 255, 0, 0)); errorLabel.setText("PropertyError"); errorLabel.setVisible(false); new Label(container, SWT.NONE); Composite composite_1 = new Composite(container, SWT.None); GridData gd_composite_1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_composite_1.widthHint = 398; gd_composite_1.heightHint = 596; composite_1.setLayoutData(gd_composite_1); Composite composite_5 = new Composite(composite_1, SWT.None); composite_5.setBounds(290, 4, 100, 24); createLabel(composite_5); outputTableViewer = widget.createTableViewer(composite_1, COLUMN_NAME, new int[] { 0, 30, 398, 538 }, 196, new JoinContentProvider(), new LookupLabelProvider()); Label lblNewLabel = new Label(composite_1, SWT.NONE); lblNewLabel.setBounds(10, 11, 92, 15); lblNewLabel.setText("Output Mapping"); outputTableViewer.getTable().addMouseListener(new MouseAdapter() { @Override public void mouseDoubleClick(MouseEvent e) { joinOutputProperty(outputTableViewer, null); changeColorOfNonMappedFields(); if (joinOutputList.size() >= 1) { deleteButton.setEnabled(true); } if (joinOutputList.size() >= 2) { upButton.setEnabled(true); downButton.setEnabled(true); } } @Override public void mouseDown(MouseEvent e) { validateDuplicatesInOutputField(); getListOfNonMappedFields(inputFieldMap); changeColorOfNonMappedFields(); } }); widget.createTableColumns(outputTableViewer.getTable(), COLUMN_NAME, 196); CellEditor[] editors = widget.createCellEditorList( outputTableViewer.getTable(), 2); editors[0].setValidator(sourceEditorValidator(outputTableViewer, Messages.EmptySourceFieldNotification, joinOutputList)); editors[1].setValidator(outputFieldEditorValidator(outputTableViewer, Messages.EmptySourceFieldNotification, joinOutputList)); outputTableViewer.setColumnProperties(COLUMN_NAME); outputTableViewer.setCellModifier(new LookupCellModifier( outputTableViewer)); outputTableViewer.setCellEditors(editors); outputTableViewer.setInput(joinOutputList); outputTableViewer.getTable().addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { if (((TableItem) event.item) != null) { if (StringUtils.isNotBlank(((TableItem) event.item) .getText())) { String[] data = (((TableItem) event.item).getText()) .split(Pattern.quote(".")); if (data != null && data.length == 2) { FilterProperties filter = new FilterProperties(); filter.setPropertyname(data[1]); for (int i = 0; i < inputPortValue; i++) { if (joinInputSchemaList != null) { if (joinInputSchemaList.get(i).contains( filter)) { ExpandItem item = expandBar.getItem(i); item.setExpanded(true); inputTableViewer[i] .getTable() .setSelection( joinInputSchemaList .get(i) .indexOf(filter)); } } } } } } } }); errorLabel = new Label(composite_1, SWT.None); errorLabel.setBounds(0, 576, 350, 25); errorLabel.setForeground(CustomColorRegistry.INSTANCE.getColorFromRegistry( 255, 0, 0)); errorLabel.setVisible(false); new Label(container, SWT.NONE); Composite composite_2 = new Composite(container, SWT.BORDER); composite_2.setLayout(new RowLayout(SWT.HORIZONTAL)); GridData gd_composite_2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_composite_2.heightHint = 595; gd_composite_2.widthHint = 133; composite_2.setLayoutData(gd_composite_2); ScrolledComposite scrolledComposite_1 = new ScrolledComposite( composite_2, SWT.BORDER | SWT.V_SCROLL); scrolledComposite_1.setLayoutData(new RowData(100, 564)); Composite composite_3 = new Composite(scrolledComposite_1, SWT.BORDER); composite_3.setLayout(new RowLayout(SWT.VERTICAL)); radio[0] = widget.buttonWidget(composite_3, SWT.RADIO, new int[] { 0, 0, 90, 20 }, NONE); for (int i = 1, k = 0; i < radio.length; i++, k++) { radio[i] = widget.buttonWidget(composite_3, SWT.RADIO, new int[] { 0, j, 90, 20 }, Constants.COPY_FROM_INPUT_PORT_PROPERTY +"in" + k); j = j + 20; } scrolledComposite_1.setContent(composite_3); scrolledComposite_1.setExpandHorizontal(true); scrolledComposite_1.setExpandVertical(true); scrolledComposite_1.setMinSize(composite_3.computeSize(SWT.DEFAULT, SWT.DEFAULT)); for (int i = 0; i < radio.length; i++) { final int inPortIndex = i; radio[i].addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { Button button = (Button) event.widget; button.getSelection(); if (button.getSelection()) { if (NONE.equalsIgnoreCase(button.getText())) { outputTableViewer.getTable().setEnabled(true); joinMappingGrid.setButtonText(button.getText()); joinMappingGrid.setIsSelected(false); if (!NONE.equals(previousRadioButtonSelection)) { joinOutputList.clear(); outputTableViewer.refresh(); } previousRadioButtonSelection = NONE; } else { okButton.setEnabled(true); errorLabel.setVisible(false); radio[0].setSelection(false); outputTableViewer.getTable().setEnabled(false); joinMappingGrid.setButtonText(button.getText()); joinMappingGrid.setIsSelected(true); addAllFieldsFromSocketId(inPortIndex - 1); } } } }); } populate(); if (joinOutputList != null) { dropData(outputTableViewer, joinOutputList, true); } populatePreviousItemsOfTable(); outputTableViewer.getTable().addMouseTrackListener(new MouseTrackListener() { @Override public void mouseHover(MouseEvent e) { changeColorOfNonMappedFields(); } @Override public void mouseExit(MouseEvent e) { changeColorOfNonMappedFields(); } @Override public void mouseEnter(MouseEvent e) { changeColorOfNonMappedFields(); } }); inputFieldMap = setMapOfInputFieldsPerPort(); nonMappedFieldList=getListOfNonMappedFields(inputFieldMap); return container; } public void changeColorOfNonMappedFields() { if (outputTableViewer.getTable().getItems() != null) { TableItem[] items = outputTableViewer.getTable().getItems(); for (int i = 0; i < joinOutputList.size(); i++) { for (String sourceField : nonMappedFieldList) { if (joinOutputList.get(i).getSource_Field().equalsIgnoreCase(sourceField) && !ParameterUtil.isParameter(sourceField)) { items[i].setForeground(0, CustomColorRegistry.INSTANCE.getColorFromRegistry( 255, 0, 0)); } } } } } private List<String> getListOfNonMappedFields(HashMap<String, List<String>> inputFieldMap) { Iterator<Entry<String, List<String>>> iterator = inputFieldMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry portFieldPair = (Map.Entry)iterator.next(); for (LookupMapProperty lookupMapProperty : joinOutputList) { String port = ""; if (lookupMapProperty.getSource_Field().length() >= 3) { port = lookupMapProperty.getSource_Field().substring(0, 3); } String source_field = lookupMapProperty.getSource_Field().substring(lookupMapProperty.getSource_Field().lastIndexOf(".") + 1); if(portFieldPair.getKey().equals(port)) { List<String> value = (ArrayList<String>) portFieldPair.getValue(); if(!value.isEmpty()&&!checkIfSourceFieldExists(value, source_field)) { nonMappedFieldList.add(port+"."+source_field); } } else { nonMappedFieldList.add(source_field); } if (port.equalsIgnoreCase("")) { nonMappedFieldList.add(source_field); } } } return nonMappedFieldList; } private boolean checkIfSourceFieldExists(List<String> list, String sourceField) { for (String field : list) { if (field.equalsIgnoreCase(sourceField)) { return true; } } return false; } private HashMap<String, List<String>> setMapOfInputFieldsPerPort() { HashMap<String, List<String>> inputFieldMap = new HashMap<String, List<String>>(); int j = 0; for (List<FilterProperties> inputFieldList : joinInputSchemaList) { List<String> inputFieldListPerPort = new ArrayList<>(); for (FilterProperties inputField : inputFieldList) { for (LookupMapProperty lookupMapProperty : joinOutputList) { char charactor = ' '; if (lookupMapProperty.getSource_Field().length() >= 3) { charactor = lookupMapProperty.getSource_Field().charAt(2); } if (Character.toString(charactor).equalsIgnoreCase(Integer.toString(j))) { if (!inputFieldListPerPort.contains(inputField.getPropertyname())) { inputFieldListPerPort.add(inputField.getPropertyname()); } } } } inputFieldMap.put(IN + j, inputFieldListPerPort); j++; } return inputFieldMap; } private void populatePreviousItemsOfTable() { if (outputTableViewer.getTable().getItems() != null) { previousItems = outputTableViewer.getTable().getItems(); } } private void populateCurrentItemsOfTable() { if (outputTableViewer.getTable().getItems() != null) { currentItems = outputTableViewer.getTable().getItems(); } } private void addAllFieldsFromSocketId(int inSocketIndex) { List<FilterProperties> inputFieldList = joinInputSchemaList .get(inSocketIndex); LookupMapProperty property = null; if (inputFieldList != null) { joinOutputList.clear(); previousRadioButtonSelection = Constants.INPUT_SOCKET_TYPE + inSocketIndex; for (FilterProperties properties : inputFieldList) { property = new LookupMapProperty(); property.setSource_Field(previousRadioButtonSelection + "." + properties.getPropertyname()); property.setOutput_Field(properties.getPropertyname()); joinOutputList.add(property); } outputTableViewer.refresh(); } } private void populate() { Boolean radioButtonSelected = false; for (int i = 0; i < radio.length; i++) { if (StringUtils.isNotBlank(joinMappingGrid.getButtonText())) { if (joinMappingGrid.getButtonText().equalsIgnoreCase( radio[i].getText())) if (joinMappingGrid.getButtonText() .equalsIgnoreCase("None")) { radio[0].setSelection(true); outputTableViewer.getTable().setEnabled(true); } else { radio[i].setSelection(true); outputTableViewer.getTable().setEnabled(false); radioButtonSelected = true; } } else { radio[i].setSelection(false); } } if (!radioButtonSelected) { radio[0].setSelection(true); outputTableViewer.getTable().setEnabled(true); } if (joinOutputList.size() != 0) { deleteButton.setEnabled(true); } else { deleteButton.setEnabled(false); } if (joinOutputList.size() >= 2) { upButton.setEnabled(true); downButton.setEnabled(true); } else { upButton.setEnabled(false); downButton.setEnabled(false); } } private Control createComposite(ExpandBar expandBar, final List<FilterProperties> joinInputList, final int tableViewerIndex) { ExpandItem xpndtmItem = new ExpandItem(expandBar, SWT.NONE); xpndtmItem.setText("Input index : in" + tableViewerIndex); Composite comGrid = new Composite(expandBar, SWT.BORDER); comGrid.setBounds(15, 0, 226, 200); xpndtmItem.setControl(comGrid); xpndtmItem.setHeight(270); xpndtmItem.setExpanded(false); inputTableViewer[tableViewerIndex] = widget.createTableViewer(comGrid, INPUT_COLUMN_NAME, new int[] { 7,7, 229, 251 }, 224, new ELTFilterContentProvider(),new ELTFilterLabelProvider()); inputTableViewer[tableViewerIndex].getTable().addMouseTrackListener(new MouseTrackListener() { @Override public void mouseHover(MouseEvent e) { changeColorOfNonMappedFields(); } @Override public void mouseExit(MouseEvent e) { changeColorOfNonMappedFields(); } @Override public void mouseEnter(MouseEvent e) { changeColorOfNonMappedFields(); } }); widget.createTableColumns( inputTableViewer[tableViewerIndex].getTable(), INPUT_COLUMN_NAME, 224); CellEditor[] editors = widget.createCellEditorList( inputTableViewer[tableViewerIndex].getTable(), 1); editors[0].setValidator(inputSchemaEditorValidation(joinInputList, Messages.EmptySourceFieldNotification, inputTableViewer[tableViewerIndex])); inputTableViewer[tableViewerIndex].setCellModifier(new ELTCellModifier( inputTableViewer[tableViewerIndex])); inputTableViewer[tableViewerIndex] .setColumnProperties(INPUT_COLUMN_NAME); inputTableViewer[tableViewerIndex].setCellEditors(editors); inputTableViewer[tableViewerIndex].setInput(joinInputList); widget.applyDragFromTableViewer( inputTableViewer[tableViewerIndex].getTable(), tableViewerIndex); return comGrid; } private void createLabel(Composite parent) { Button addButton = widget.buttonWidget(parent, SWT.CENTER | SWT.PUSH, new int[] { 0, 0, 25, 20 }, ""); addButton.setImage(ImagePathConstant.ADD_BUTTON.getImageFromRegistry()); addButton.setToolTipText(Messages.ADD_SCHEMA_TOOLTIP); addButton.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { joinOutputProperty(outputTableViewer, null); if (joinOutputList.size() >= 1) { deleteButton.setEnabled(true); } if (joinOutputList.size() >= 2) { upButton.setEnabled(true); downButton.setEnabled(true); } } }); deleteButton = widget.buttonWidget(parent, SWT.CENTER, new int[] { 25, 0, 25, 20 }, ""); deleteButton.setImage(ImagePathConstant.DELETE_BUTTON.getImageFromRegistry()); deleteButton.setToolTipText(Messages.DELETE_SCHEMA_TOOLTIP); deleteButton.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { int index = 0; IStructuredSelection selection = (IStructuredSelection) outputTableViewer.getSelection(); for (Iterator<?> iterator = selection.iterator(); iterator.hasNext();) { Object selectedObject = iterator.next(); index = joinOutputList.indexOf(selectedObject); outputTableViewer.remove(selectedObject); joinOutputList.remove(selectedObject); } outputTableViewer.refresh(); if (index != 0) outputTableViewer.editElement(outputTableViewer.getElementAt(index - 1), 0); if (joinOutputList.size() < 1) { deleteButton.setEnabled(false); } if (joinOutputList.size()<= 1) { upButton.setEnabled(false); downButton.setEnabled(false); } } }); upButton = widget.buttonWidget(parent, SWT.CENTER, new int[] { 50, 0, 25, 20 }, ""); upButton.setImage(ImagePathConstant.UP_ICON.getImageFromRegistry()); upButton.setToolTipText(Messages.MOVE_SCHEMA_UP_TOOLTIP); upButton.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { int index2 = 0; int index1 = outputTableViewer.getTable().getSelectionIndex(); if (index1 > 0) { String text = outputTableViewer.getTable().getItem(index1).getText(0); String text1 = outputTableViewer.getTable().getItem(index1).getText(1); index2 = index1 - 1; String data = outputTableViewer.getTable().getItem(index2).getText(0); String data2 = outputTableViewer.getTable().getItem(index2).getText(1); LookupMapProperty property = new LookupMapProperty(); property.setSource_Field(data); property.setOutput_Field(data2); joinOutputList.set(index1, property); property = new LookupMapProperty(); property.setSource_Field(text); property.setOutput_Field(text1); joinOutputList.set(index2, property); outputTableViewer.refresh(); outputTableViewer.getTable().setSelection(index1 - 1); } } }); downButton = widget.buttonWidget(parent, SWT.CENTER, new int[] { 74, 0, 25, 20 }, ""); downButton.setImage(ImagePathConstant.DOWN_ICON.getImageFromRegistry()); downButton.setToolTipText(Messages.MOVE_SCHEMA_DOWN_TOOLTIP); downButton.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { int index1 = outputTableViewer.getTable().getSelectionIndex(); int index2 = 0; if (index1 < joinOutputList.size() - 1) { String text = outputTableViewer.getTable().getItem(index1).getText(0); String text1 = outputTableViewer.getTable().getItem(index1).getText(1); index2 = index1 + 1; String data = outputTableViewer.getTable().getItem(index2).getText(0); String data1 = outputTableViewer.getTable().getItem(index2).getText(1); LookupMapProperty p = new LookupMapProperty(); p.setSource_Field(data); p.setOutput_Field(data1); joinOutputList.set(index1, p); p = new LookupMapProperty(); p.setSource_Field(text); p.setOutput_Field(text1); joinOutputList.set(index2, p); outputTableViewer.refresh(); outputTableViewer.getTable().setSelection(index1 + 1); } } }); } public Label labelWidget(Composite parent, int style, int[] bounds, String value) { Label label = new Label(parent, style); label.setBounds(bounds[0], bounds[1], bounds[2], bounds[3]); label.setText(value); // label.setImage(image); return label; } public Button buttonWidget(Composite parent, int style, int[] bounds, String value, Image image) { Button button = new Button(parent, style); button.setBounds(bounds[0], bounds[1], bounds[2], bounds[3]); button.setText(value); button.setImage(image); return button; } /** * Create contents of the button bar. * * @param parent */ @Override protected void createButtonsForButtonBar(Composite parent) { okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } @Override protected void okPressed() { if(OSValidator.isMac()) { List<TableViewer> tableViewers = new ArrayList<TableViewer>(); tableViewers.add(outputTableViewer); tableViewers.addAll(java.util.Arrays.asList(inputTableViewer)); for(TableViewer tableView : tableViewers){ if(tableView !=null){ for(CellEditor cellEditor : tableView.getCellEditors()){ if(cellEditor !=null){ cellEditor.getControl().setEnabled(false); //Saves the existing value of CellEditor cellEditor.getControl().setEnabled(true); } } } } } populateCurrentItemsOfTable(); if (previousItems.length == 0 && currentItems.length != 0) { propertyDialogButtonBar.enableApplyButton(true); } else if ((currentItems.length != 0 && previousItems.length != 0)) { if (!Arrays.equals(currentItems, previousItems)) propertyDialogButtonBar.enableApplyButton(true); } getJoinPropertyGrid(); super.close(); } @Override protected void cancelPressed() { hasOutputMappingInTableChanged(); } private Boolean hasOutputMappingInTableChanged() { boolean returnValue = false; populateCurrentItemsOfTable(); if (currentItems.length == 0 && previousItems.length == 0) { super.close(); } else { if (!Arrays.equals(currentItems, previousItems)) { int style = SWT.APPLICATION_MODAL | SWT.YES | SWT.NO | SWT.ICON_INFORMATION; MessageBox messageBox = new MessageBox(new Shell(), style); messageBox.setText(INFORMATION); messageBox.setMessage(Messages.MessageBeforeClosingWindow); if (messageBox.open() == SWT.YES) { joinOutputList.clear(); LookupMapProperty[] lookupMapPropertyObjects = new LookupMapProperty[previousItems.length]; for (int i = 0; i < previousItems.length; i++) { if(!previousItems[i].isDisposed()) { lookupMapPropertyObjects[i] = (LookupMapProperty) previousItems[i].getData(); joinOutputList.add(lookupMapPropertyObjects[i]); } } getJoinPropertyGrid(); returnValue = super.close(); } } else { returnValue = super.close(); } } return returnValue; } @Override public boolean close() { return hasOutputMappingInTableChanged(); } protected boolean inputSchemavalidate(List<FilterProperties> inputList, TableViewer tableViewer) { int propertyCounter = 0; for (FilterProperties temp : inputList) { if (!temp.getPropertyname().trim().isEmpty()) { Matcher matchs = Pattern.compile(Constants.REGEX).matcher( temp.getPropertyname().trim()); if (!matchs.matches()) { tableViewer.getTable().setSelection(propertyCounter); errorLabel.setVisible(true); errorLabel.setText(Messages.ALLOWED_CHARACTERS); return false; } } else { tableViewer.getTable().setSelection(propertyCounter); errorLabel.setVisible(true); errorLabel.setText(Messages.EmptySourceFieldNotification); return false; } propertyCounter++; } return true; } private boolean validateOutputSchema(String outputFieldValue, String sourceFieldValue) { int propertycount = 0; int propertyValuecount = 0; for (LookupMapProperty join : joinOutputList) { if (join.getSource_Field().trim().isEmpty()) { outputTableViewer.getTable().setSelection(propertycount); errorLabel.setVisible(true); errorLabel.setText(Messages.EmptySourceFieldNotification); return false; } else if (join.getOutput_Field().trim().isEmpty()) { outputTableViewer.getTable().setSelection(propertyValuecount); errorLabel.setVisible(true); errorLabel.setText(Messages.EmptyOutputFieldNotification); return false; } else { errorLabel.setVisible(false); } propertycount++; propertyValuecount++; } for (LookupMapProperty join : joinOutputList) { if (join.getSource_Field() != null && join.getSource_Field().equalsIgnoreCase(sourceFieldValue)) { return false; } } return true; } private void validateDuplicatesInOutputField() { boolean duplicateFound = false; if (outputTableViewer.getTable().getItems() != null) { TableItem[] items = outputTableViewer.getTable().getItems(); LookupMapProperty[] objectsInGui = new LookupMapProperty[items.length]; for (int i = 0; i < items.length; i++) { objectsInGui[i] = (LookupMapProperty) items[i].getData(); for (int j = i + 1; j < items.length; j++) { if (((LookupMapProperty) items[i].getData()).getOutput_Field().equalsIgnoreCase( ((LookupMapProperty) items[j].getData()).getOutput_Field())) { duplicateFound = true; break; } } if (duplicateFound) break; } if (duplicateFound) { okButton.setEnabled(false); errorLabel.setText(Messages.OutputFieldAlreadyExists); errorLabel.setVisible(true); } else { if (okButton != null && errorLabel != null) { okButton.setEnabled(true); errorLabel.setVisible(false); } } } } // Creates Value Validator for table's cells private ICellEditorValidator inputSchemaEditorValidation( final List<FilterProperties> joinInputList, final String errorMessage, final TableViewer viewer) { ICellEditorValidator propertyValidator = new ICellEditorValidator() { @Override public String isValid(Object value) { String currentSelectedFld = viewer.getTable() .getItem(viewer.getTable().getSelectionIndex()) .getText(); String valueToValidate = String.valueOf(value).trim(); for (FilterProperties temp : joinInputList) { if (!currentSelectedFld.equalsIgnoreCase(valueToValidate) && temp.getPropertyname().equalsIgnoreCase( valueToValidate)) { errorLabel .setText(Messages.FieldNameAlreadyExists); errorLabel.setVisible(true); okButton.setEnabled(false); return "ERROR"; } else errorLabel.setVisible(false); okButton.setEnabled(true); } validateDuplicatesInOutputField(); return null; } }; return propertyValidator; } /** * Return the initial size of the dialog. */ @Override protected Point getInitialSize() { return new Point(870, 757); } // Creates CellNAme Validator for table's cells private ICellEditorValidator sourceEditorValidator( final TableViewer viewer, final String errorMessage, final List<LookupMapProperty> propertyList) { ICellEditorValidator propertyValidator = new ICellEditorValidator() { @Override public String isValid(Object value) { String currentSelectedFld = viewer.getTable() .getItem(viewer.getTable().getSelectionIndex()) .getText(); String valueToValidate = String.valueOf(value).trim(); if (StringUtils.isEmpty(valueToValidate)) { errorLabel.setText(errorMessage); errorLabel.setVisible(true); okButton.setEnabled(false); return "ERROR"; } else { okButton.setEnabled(true); } for (LookupMapProperty temp : propertyList) { if (!currentSelectedFld.equalsIgnoreCase(valueToValidate) && temp.getSource_Field().equalsIgnoreCase( valueToValidate)) { errorLabel .setText(Messages.SourceFieldAlreadyExists); errorLabel.setVisible(true); okButton.setEnabled(false); return "ERROR"; } else { errorLabel.setVisible(false); okButton.setEnabled(true); validateDuplicatesInOutputField(); } } return null; } }; return propertyValidator; } // Creates CellValue Validator for table's cells private ICellEditorValidator outputFieldEditorValidator( final TableViewer viewer, final String errorMessage, final List<LookupMapProperty> propertyList) { ICellEditorValidator propertyValidator = new ICellEditorValidator() { @Override public String isValid(Object value) { String currentSelectedFld = viewer.getTable() .getItem(viewer.getTable().getSelectionIndex()) .getText(1); String valueToValidate = String.valueOf(value).trim(); if (StringUtils.isEmpty(valueToValidate)) { errorLabel.setText(errorMessage); errorLabel.setVisible(true); okButton.setEnabled(false); return "ERROR"; } else { okButton.setEnabled(true); } for (LookupMapProperty temp : propertyList) { if (!currentSelectedFld.equalsIgnoreCase(valueToValidate) && temp.getOutput_Field().equalsIgnoreCase( valueToValidate)) { errorLabel .setText(Messages.OutputFieldAlreadyExists); errorLabel.setVisible(true); okButton.setEnabled(false); validateDuplicatesInOutputField(); return "ERROR"; } else { errorLabel.setVisible(false); okButton.setEnabled(true); } } validateDuplicatesInOutputField(); return null; } }; validateDuplicatesInOutputField(); return propertyValidator; } private void joinOutputProperty(TableViewer viewer, String sourceFieldValue) { String outputFieldValue = null; if (sourceFieldValue == null) { sourceFieldValue = ""; outputFieldValue = ""; } else { outputFieldValue = sourceFieldValue.split("\\.")[1]; } LookupMapProperty property = new LookupMapProperty(); if (joinOutputList.size() != 0) { if (!validateOutputSchema(outputFieldValue, sourceFieldValue)) return; property.setSource_Field(sourceFieldValue); property.setOutput_Field(outputFieldValue); joinOutputList.add(property); viewer.refresh(); viewer.editElement(property, 0); } else { property.setSource_Field(sourceFieldValue); property.setOutput_Field(outputFieldValue); joinOutputList.add(property); viewer.refresh(); viewer.editElement(property, 0); } } public void dropData(final TableViewer tableViewer, final List<LookupMapProperty> listOfFields, final boolean isSingleColumn) { Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK; DropTarget target = new DropTarget(tableViewer.getTable(), operations); target.setTransfer(types); target.addDropListener(new DropTargetAdapter() { public void dragOver(DropTargetEvent event) { event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL; } public void drop(DropTargetEvent event) { if (event.data == null) { event.detail = DND.DROP_NONE; return; } if (isSingleColumn) { String[] dropData = ((String) event.data).split(Pattern.quote("#")); for (String data : dropData) { joinOutputProperty(tableViewer, data); } if (joinOutputList.size() >= 1) { deleteButton.setEnabled(true); } if (joinOutputList.size() >= 2) { upButton.setEnabled(true); downButton.setEnabled(true); } validateDuplicatesInOutputField(); } } }); } }