// ============================================================================
//
// 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;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.forms.widgets.FormToolkit;
import com.amalto.workbench.editors.DataModelMainPage;
import com.amalto.workbench.models.Line;
import com.amalto.workbench.models.TreeParent;
import com.amalto.workbench.utils.FKFilterParser;
import com.amalto.workbench.utils.IConstants;
import com.amalto.workbench.widgets.ComplexTableViewerColumn;
import com.amalto.workbench.widgets.ICellEditor;
import com.amalto.workbench.widgets.TisTableViewer;
import com.amalto.workbench.widgets.WidgetFactory;
import com.amalto.workbench.widgets.celleditor.DefaultXPathValidator;
import com.amalto.workbench.widgets.celleditor.IXPathValidator;
public class FKFilterDialog extends Dialog {
String title;
private TisTableViewer viewer;
DataModelMainPage page;
String filter;
private ComplexTableViewerColumn[] columns;
String conceptName;
protected String dataModelName;
private Composite dialogAreaComposite;
private boolean lock;
public FKFilterDialog(Shell parentShell, String title, String filter, DataModelMainPage page, String conceptName) {
this(parentShell,title,filter,page,conceptName,false);
}
public FKFilterDialog(Shell parentShell, String title, String filter, DataModelMainPage page, String conceptName,boolean lock) {
super(parentShell);
this.filter = filter;
this.page = page;
this.title = title;
this.conceptName = conceptName;
this.lock = lock;
}
public boolean isLock() {
return lock;
}
public void setLock(boolean lock) {
this.lock = lock;
}
@Override
protected Control createDialogArea(Composite parent) {
parent.getShell().setText(this.title);
dialogAreaComposite = (Composite) super.createDialogArea(parent);
dialogAreaComposite.setLayout(new GridLayout(2, false));
columns = new ComplexTableViewerColumn[] {
new ComplexTableViewerColumn("XPath", false, "newXPath", "newXPath", "", ComplexTableViewerColumn.XPATH_STYLE,//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
new String[] {}, 0),
new ComplexTableViewerColumn("Operator", false, "", "", "", ComplexTableViewerColumn.COMBO_STYLE,//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
IConstants.VIEW_CONDITION_OPERATORS, 0),
new ComplexTableViewerColumn("Value", false, "", "", "", ComplexTableViewerColumn.XPATH_STYLE, new String[] {}, 0),//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
new ComplexTableViewerColumn("Predicate", true, "", "", "", ComplexTableViewerColumn.COMBO_STYLE,//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
IConstants.PREDICATES, 0), };
columns[0].setColumnWidth(200);
columns[1].setColumnWidth(140);
columns[2].setColumnWidth(200);
columns[3].setColumnWidth(140);
viewer = getNewTisTableViewer(Arrays.asList(columns), WidgetFactory.getWidgetFactory(), dialogAreaComposite);
viewer.setModelLock(lock);
viewer.setXpath(true);
viewer.setDatamodelName(dataModelName);
Map<ComplexTableViewerColumn, IXPathValidator> validators = new HashMap<ComplexTableViewerColumn, IXPathValidator>();
validators.put(columns[0], new DefaultXPathValidator());// set to "XPath" column the xpath validator
viewer.setValidators(validators);
// viewer.setMainPage(page);//TODO
// viewer.setConceptName(conceptName);
// viewer.setContext(true);
// Modified by hbhong,to fix bug 21784
TreeParent treeParent = (TreeParent) page.getAdapter(TreeParent.class);
viewer.setTreeParent(treeParent);
// The ending| bug:21784
viewer.create();
viewer.setHeight(140);
viewer.setWidth(680);
viewer.getMainComposite().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 3));
parent.getShell().addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
XpathSelectDialog.setContext(null);
}
});
// init data
parseRules();
return dialogAreaComposite;
}
protected TisTableViewer getNewTisTableViewer(List<ComplexTableViewerColumn> columns, FormToolkit toolkit, Composite parent) {
return new TisTableViewer(columns, toolkit, parent);
}
@Override
protected boolean isResizable() {
return true;
}
private void parseRules() {
List<Line> lines = new ArrayList<Line>();
String[] keyNames = getKeyNames();
FKFilterParser.parseFilter(filter, lines, keyNames);
viewer.getViewer().setInput(lines);
}
private String[] getKeyNames() {
String[] keyNames = new String[columns.length];
for (int i = 0; i < columns.length; i++) {
keyNames[i] = columns[i].getName();
}
return keyNames;
}
@Override
protected void okPressed() {
XpathSelectDialog.setContext(null);
deactiveAllCellEditors();
resetFilter();
super.okPressed();
}
private void deactiveAllCellEditors() {
CellEditor[] editors = viewer.getViewer().getCellEditors();
for (CellEditor editor : editors) {
if (editor instanceof ICellEditor) {
((ICellEditor) editor).deactive();
}
}
}
@Override
protected void cancelPressed() {
super.cancelPressed();
XpathSelectDialog.setContext(null);
}
private String resetFilter() {
List<Line> lines = new ArrayList<Line>();
TableItem[] items = viewer.getViewer().getTable().getItems();
if (items.length > 0) {
for (TableItem item : items) {
Line line = (Line) item.getData();
lines.add(line);
}
}
filter = FKFilterParser.getDeParseredFilter(lines);
return filter;
}
@Override
protected Point getInitialSize() {
return new Point(700, 400);
}
public String getFilter() {
return filter;
}
public void setDataModel(String dataModelName) {
this.dataModelName = dataModelName;
}
}