// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package com.amalto.workbench.dialogs.datacontainer; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; 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.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import com.amalto.workbench.i18n.Messages; import com.amalto.workbench.models.KeyValue; import com.amalto.workbench.models.Line; public class UpdateAutoIncrementDialog extends Dialog { private Map<String, String> results = new HashMap<String, String>(); private Map<String, String> entityValues; private static final String DEFAULT_VALUE = "0"; //$NON-NLS-1$ private VerifyListener verifyListeneer; private static int resetBtnId = 4; private static int resetAllBtnId = 8; private TableViewer resultsViewer; private IContentProvider contentProvider; private Button resetBtn; public UpdateAutoIncrementDialog(Shell parentShell, Map<String, String> entityValues) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); this.entityValues = entityValues; } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(Messages.UpdateAutoIncrementDialog_ManageAutoIncrement); } @Override protected void initializeBounds() { super.initializeBounds(); getShell().setSize(550, 450); Point location = getInitialLocation(getShell().getSize()); getShell().setLocation(location.x, location.y); } @Override protected Control createDialogArea(Composite parent) { Composite mainComp = (Composite) super.createDialogArea(parent); mainComp.setLayout(new GridLayout()); createTable(mainComp); return mainComp; } private void createTable(Composite mainComp) { int style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.FULL_SELECTION; resultsViewer = new TableViewer(mainComp, style); resultsViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); resultsViewer.getTable().setHeaderVisible(true); resultsViewer.getTable().setLinesVisible(true); resultsViewer.setContentProvider(getContentProvider()); TableViewerColumn column = new TableViewerColumn(resultsViewer, SWT.NONE); column.getColumn().setText(Messages.UpdateAutoIncrementDialog_entity); column.getColumn().setResizable(true); column.getColumn().setWidth(300); column.setLabelProvider(new CustomedLabelProvider(0)); column.setEditingSupport(null); column = new TableViewerColumn(resultsViewer, SWT.NONE); column.getColumn().setText(Messages.UpdateAutoIncrementDialog_value); column.getColumn().setResizable(true); column.getColumn().setWidth(100); column.setLabelProvider(new CustomedLabelProvider(1)); column.setEditingSupport(new EditingSupport(resultsViewer) { @Override protected CellEditor getCellEditor(Object element) { return new VerificableTextCellEditor(resultsViewer.getTable()); } @Override protected boolean canEdit(Object element) { return true; } @Override protected Object getValue(Object element) { Line line = (Line) element; return line.keyValues.get(1).value; } @Override protected void setValue(Object element, Object value) { Line line = (Line) element; line.keyValues.get(1).value = value.toString(); resultsViewer.refresh(); } }); resultsViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) resultsViewer.getSelection(); resetBtn.setEnabled(!selection.isEmpty()); } }); List<Line> lines = getInput(); resultsViewer.setInput(lines); } private List<Line> getInput() { List<Line> lines = new ArrayList<Line>(); Iterator<String> iterator = entityValues.keySet().iterator(); while (iterator.hasNext()) { String entity = iterator.next(); String value = entityValues.get(entity); List<KeyValue> keyvalues = new ArrayList<KeyValue>(); keyvalues.add(new KeyValue("Entity", entity)); //$NON-NLS-1$ keyvalues.add(new KeyValue("Value", value)); //$NON-NLS-1$ Line line = new Line(keyvalues); lines.add(line); } return lines; } private IContentProvider getContentProvider() { if (contentProvider == null) { contentProvider = new IStructuredContentProvider() { public Object[] getElements(Object inputElement) { @SuppressWarnings("unchecked") List<Line> lines = (List<Line>) inputElement; return lines.toArray(); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }; } return contentProvider; } class CustomedLabelProvider extends ColumnLabelProvider { private int index; public CustomedLabelProvider(int index) { this.index = index; } @Override public String getText(Object element) { Line line = (Line) element; return line.keyValues.get(index).value; } } class VerificableTextCellEditor extends TextCellEditor { public VerificableTextCellEditor(Table table) { super(table); } @Override protected Control createControl(Composite parent) { Control control = super.createControl(parent); text.addVerifyListener(getVerifyListener()); return control; } @Override protected Object doGetValue() { return super.doGetValue(); } } private VerifyListener getVerifyListener() { if (verifyListeneer == null) { verifyListeneer = new VerifyListener() { public void verifyText(VerifyEvent e) { Text text = (Text) e.getSource(); String msg = null; String inputStr = e.text; boolean matches = true; String digitRegex = "[0-9]*"; //$NON-NLS-1$ matches = Pattern.matches(digitRegex, inputStr); if (!matches) { msg = Messages.UpdateAutoIncrementDialog_inputInvalid; } else { if (e.start == 0) { if ((inputStr.startsWith(DEFAULT_VALUE) && inputStr.length() > 1) || (inputStr.equals(DEFAULT_VALUE) && !isFullSelected(e))) { matches = false; msg = Messages.UpdateAutoIncrementDialog_zeroAtBeginning; } } else { if (text.getText().startsWith(DEFAULT_VALUE)) { matches = false; msg = Messages.UpdateAutoIncrementDialog_zeroAtBeginning; } } } if (!matches) { MessageDialog.openError(getShell(), Messages._Error, msg); e.doit = false; return; } } private boolean isFullSelected(VerifyEvent e) { Text text = (Text) e.getSource(); String textContent = text.getText(); if (textContent.length() == text.getSelectionCount()) { return true; } return false; } }; } return verifyListeneer; } @Override protected void buttonPressed(int buttonId) { if (resetAllBtnId == buttonId) { List<Line> lines = (List<Line>) resultsViewer.getInput(); for (Line line : lines) { line.keyValues.get(1).value = DEFAULT_VALUE; } resultsViewer.refresh(); } if (resetBtnId == buttonId) { IStructuredSelection selection = (IStructuredSelection) resultsViewer.getSelection(); for (Object obj : selection.toList()) { Line line = (Line) obj; line.keyValues.get(1).value = DEFAULT_VALUE; } resultsViewer.refresh(); } super.buttonPressed(buttonId); } @Override protected void okPressed() { deactivateCellEditors(); save(); removeNotChanged(); super.okPressed(); } private void deactivateCellEditors() { CellEditor[] cellEditors = resultsViewer.getCellEditors(); if (cellEditors != null) { for (CellEditor cellEditor : cellEditors) { cellEditor.deactivate(); } } } private void save() { List<Line> lines = (List<Line>) resultsViewer.getInput(); for (Line line : lines) { String key = line.keyValues.get(0).value; String value = line.keyValues.get(1).value; results.put(key, value); } } private void removeNotChanged() { Iterator<String> iterator = entityValues.keySet().iterator(); while (iterator.hasNext()) { String entity = iterator.next(); if (entityValues.get(entity).equals(results.get(entity))) { results.remove(entity); } } } @Override protected Control createButtonBar(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(2).extendedMargins(5, -3, 5, 5).equalWidth(false).applyTo(composite); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).span(2, 1).indent(0, 0).applyTo(composite); composite.setFont(parent.getFont()); createButtonsForButtonBar(composite); return composite; } @Override protected void createButtonsForButtonBar(Composite parent) { resetBtn = createButton(parent, resetBtnId, Messages.UpdateAutoIncrementDialog_Reset, false); resetBtn.setEnabled(false); GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.CENTER).applyTo(resetBtn); Button resetAllBtn = createButton(parent, resetAllBtnId, Messages.UpdateAutoIncrementDialog_resetAll, false); GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.CENTER).applyTo(resetAllBtn); Composite rightArea = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(0).equalWidth(true).applyTo(rightArea); GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).grab(true, false).applyTo(rightArea); createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /** * entity to AutoIncrement value map */ public Map<String, String> getResults() { return results; } }