// ============================================================================
//
// 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 org.talend.mdm.repository.ui.dialogs.filter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.mdm.repository.core.IRepositoryNodeConfiguration;
import org.talend.mdm.repository.core.IRepositoryNodeLabelProvider;
import org.talend.mdm.repository.core.IRepositoryViewFilter;
import org.talend.mdm.repository.core.IServerObjectRepositoryType;
import org.talend.mdm.repository.core.impl.AbstractLabelProvider;
import org.talend.mdm.repository.core.impl.eventmanager.EventManagerNodeConfiguration;
import org.talend.mdm.repository.core.impl.transformerV2.TransformerV2NodeConfiguration;
import org.talend.mdm.repository.extension.RepositoryNodeConfigurationManager;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.model.mdmmetadata.MDMServerDef;
import org.talend.mdm.repository.model.mdmproperties.ContainerItem;
import org.talend.mdm.repository.ui.navigator.MDMRepositoryLabelProvider;
import org.talend.mdm.repository.ui.navigator.filter.LastServerViewFilter;
import org.talend.mdm.repository.ui.navigator.filter.NamePatternViewFilter;
import org.talend.mdm.repository.ui.navigator.filter.ServerObjectViewFilter;
import org.talend.mdm.repository.utils.PreferenceUtil;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.mdm.workbench.serverexplorer.ui.dialogs.SelectServerDefDialog;
/**
* DOC hbhong class global comment. Detailled comment
*/
public class RepositoryViewFilterDialog extends Dialog {
private class ServerObjectLabelProvider extends LabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
IRepositoryNodeLabelProvider labelProvider = ((IRepositoryNodeConfiguration) element).getLabelProvider();
if (labelProvider instanceof AbstractLabelProvider)
return ((AbstractLabelProvider) ((IRepositoryNodeConfiguration) element).getLabelProvider())
.getCategoryImage(null);
return null;
}
public String getColumnText(Object element, int columnIndex) {
return getLabel(element);
}
}
private String getLabel(Object element) {
if (element instanceof IRepositoryViewObject) {
Item item = ((IRepositoryViewObject) element).getProperty().getItem();
IRepositoryNodeConfiguration conf = RepositoryNodeConfigurationManager.getConfiguration(item);
if (conf != null)
return conf.getLabelProvider().getText(element);
}
return ""; //$NON-NLS-1$
}
private Table table;
private CheckboxTableViewer serverObjViewer;
private List<IRepositoryViewObject> allConfigs;
private Set<IRepositoryViewObject> enabledConfigs;
private Button enableServerObjFilterBun;
private Button enableAllBun;
private Button enableNameFilterBun;
private Text namePatternTxt;
private Group objectgroup;
private Button enableLastServerFilterBun;
private Label lastServerLabel;
private Text serverNameTxt;
private Button selServerBun;
/**
* Create the dialog.
*
* @param parentShell
*/
public RepositoryViewFilterDialog(Shell parentShell) {
super(parentShell);
this.setShellStyle(getShellStyle() | SWT.RESIZE);
}
/**
* Create contents of the dialog.
*
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
GridLayout gl_container = new GridLayout(1, false);
gl_container.marginRight = 5;
container.setLayout(gl_container);
Group nameGroup = new Group(container, SWT.NONE);
nameGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
GridLayout gl_nameGroup = new GridLayout(1, false);
nameGroup.setLayout(gl_nameGroup);
nameGroup.setText(Messages.RepositoryViewFilterDialog_groupNamePattern);
enableNameFilterBun = new Button(nameGroup, SWT.CHECK);
enableNameFilterBun.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
namePatternTxt.setEnabled(enableNameFilterBun.getSelection());
}
});
enableNameFilterBun.setText(Messages.RepositoryViewFilterDialog_enableNameFilter);
namePatternTxt = new Text(nameGroup, SWT.BORDER);
namePatternTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
namePatternTxt.setSize(440, 18);
objectgroup = new Group(container, SWT.NONE);
objectgroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
objectgroup.setText(Messages.RepositoryViewFilterDialog_groupServerObject);
objectgroup.setLayout(new GridLayout(1, false));
enableServerObjFilterBun = new Button(objectgroup, SWT.CHECK);
enableServerObjFilterBun.setSize(183, 16);
enableServerObjFilterBun.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
enableServerObjFilterComposite(enableServerObjFilterBun.getSelection());
}
});
enableServerObjFilterBun.setText(Messages.RepositoryViewFilterDialog_enableServerObjFilter);
serverObjViewer = CheckboxTableViewer.newCheckList(objectgroup, SWT.BORDER | SWT.FULL_SELECTION);
table = serverObjViewer.getTable();
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
table.setSize(441, 121);
enableAllBun = new Button(objectgroup, SWT.CHECK);
enableAllBun.setSize(171, 16);
enableAllBun.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean selected = enableAllBun.getSelection();
enableAllBun.setSelection(selected);
serverObjViewer.setAllChecked(selected);
if (selected)
enabledConfigs.addAll(allConfigs);
else
enabledConfigs.clear();
}
});
enableAllBun.setText(Messages.RepositoryViewFilterDialog_enableAllServerObject);
//
serverObjViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
IRepositoryViewObject config = (IRepositoryViewObject) event.getElement();
if (event.getChecked())
enabledConfigs.add(config);
else
enabledConfigs.remove(config);
solveProcTriCase();
enableAllBun.setSelection(enabledConfigs.size() == allConfigs.size());
}
});
serverObjViewer.setLabelProvider(new MDMRepositoryLabelProvider());
serverObjViewer.setContentProvider(new ArrayContentProvider());
Group lastServerGroup = new Group(container, SWT.NONE);
lastServerGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
lastServerGroup.setLayout(new GridLayout(3, false));
lastServerGroup.setText(Messages.RepositoryViewFilterDialog_groupLastServer);
enableLastServerFilterBun = new Button(lastServerGroup, SWT.CHECK);
enableLastServerFilterBun.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
enableLastServerFilterBun.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
enableLastServerFilterComposite(enableLastServerFilterBun.getSelection());
}
});
enableLastServerFilterBun.setText(Messages.RepositoryViewFilterDialog_enableLastServerFilter);
enableLastServerFilterBun.setSelection(false);
new Label(lastServerGroup, SWT.NONE);
lastServerLabel = new Label(lastServerGroup, SWT.NONE);
lastServerLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lastServerLabel.setText(Messages.RepositoryViewFilterDialog_lblLastServer);
serverNameTxt = new Text(lastServerGroup, SWT.BORDER | SWT.READ_ONLY);
serverNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
selServerBun = new Button(lastServerGroup, SWT.NONE);
selServerBun.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
SelectServerDefDialog dlg = new SelectServerDefDialog(getShell());
if (dlg.open() == IDialogConstants.OK_ID) {
MDMServerDef def = dlg.getSelectedServerDef();
serverNameTxt.setText(def.getName());
}
}
});
selServerBun.setText(Messages.RepositoryViewFilterDialog_btnSelectServer);
//
getShell().setText(Messages.RepositoryViewFilterDialog_title);
//
initServerObjectFilter();
return container;
}
private void solveProcTriCase() {
IRepositoryViewObject eventMgr = null;
boolean exist = false;
for (IRepositoryViewObject conf : enabledConfigs) {
Item item = conf.getProperty().getItem();
IRepositoryNodeConfiguration repositoryConf = RepositoryNodeConfigurationManager.getConfiguration(item);
if (repositoryConf instanceof EventManagerNodeConfiguration) {
exist = true;
break;
}
if (repositoryConf instanceof IRepositoryViewObject || repositoryConf instanceof TransformerV2NodeConfiguration)
for (IRepositoryViewObject confi : allConfigs)
eventMgr = confi;
}
if (eventMgr != null && !exist)
enabledConfigs.add(eventMgr);
}
/**
* DOC hbhong Comment method "initServerObjectTable".
*/
private void initServerObjectFilter() {
// name pattern filter
boolean enableNamePatternFilter = PreferenceUtil.getBoolean(NamePatternViewFilter.PROP_ENABLE);
enableNameFilterBun.setSelection(enableNamePatternFilter);
String namePattern = PreferenceUtil.getString(NamePatternViewFilter.PROP_NAME_PATTERN);
if (namePattern == null || namePattern.trim().length() == 0)
namePattern = "*"; //$NON-NLS-1$
namePatternTxt.setText(namePattern);
namePatternTxt.setEnabled(enableNamePatternFilter);
// sever object filter
boolean enableServerObjFilter = PreferenceUtil.getBoolean(ServerObjectViewFilter.PROP_ENABLE);
enableServerObjFilterBun.setSelection(enableServerObjFilter);
//
allConfigs = Arrays.asList(RepositoryResourceUtil.getCategoryViewObjects()); //RepositoryNodeConfigurationManager.getConfigurations();
serverObjViewer.setInput(allConfigs);
Set<String> enabledObjectLabels = PreferenceUtil.getStringSet(ServerObjectViewFilter.PROP_ENABLE_LIST);
enabledConfigs = new HashSet<IRepositoryViewObject>();
for (IRepositoryViewObject conf : allConfigs) {
String label = getLabel(conf);
if (enabledObjectLabels.contains(label)) {
serverObjViewer.setChecked(conf, true);
enabledConfigs.add(conf);
}
}
//
enableServerObjFilterComposite(enableServerObjFilter);
enableAllBun.setSelection(enabledConfigs.size() == allConfigs.size());
// last server filter
boolean enableLastServerFilter = PreferenceUtil.getBoolean(LastServerViewFilter.PROP_ENABLE);
enableLastServerFilterBun.setSelection(enableLastServerFilter);
String serverName = PreferenceUtil.getString(LastServerViewFilter.LAST_SERVER_NAME);
serverNameTxt.setText(serverName == null ? "" : serverName); //$NON-NLS-1$
enableLastServerFilterComposite(enableLastServerFilter);
}
private void enableServerObjFilterComposite(boolean enable) {
table.setEnabled(enable);
enableAllBun.setEnabled(enable);
}
private void enableLastServerFilterComposite(boolean enable) {
lastServerLabel.setEnabled(enable);
serverNameTxt.setEnabled(enable);
selServerBun.setEnabled(enable);
}
/**
* Create contents of the button bar.
*
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(451, 362);
}
@Override
protected void buttonPressed(int buttonId) {
if (buttonId == IDialogConstants.OK_ID) {
// name pattern pref
PreferenceUtil.setBoolean(NamePatternViewFilter.PROP_ENABLE, enableNameFilterBun.getSelection());
PreferenceUtil.setString(NamePatternViewFilter.PROP_NAME_PATTERN, namePatternTxt.getText().trim());
// server object pref
PreferenceUtil.setBoolean(ServerObjectViewFilter.PROP_ENABLE, enableServerObjFilterBun.getSelection());
Set<String> names = getNewServerObjectPref();
PreferenceUtil.setStringSet(ServerObjectViewFilter.PROP_ENABLE_LIST, names);
// last server pref
PreferenceUtil.setBoolean(LastServerViewFilter.PROP_ENABLE, enableLastServerFilterBun.getSelection());
PreferenceUtil.setString(LastServerViewFilter.LAST_SERVER_NAME, serverNameTxt.getText().trim());
//
PreferenceUtil.save();
PreferenceUtil.flipBooleanKey(IRepositoryViewFilter.PROP_REFRESH);
}
super.buttonPressed(buttonId);
}
private Set<String> getNewServerObjectPref() {
Set<String> values = new HashSet<String>();
for (IRepositoryViewObject conf : enabledConfigs) {
String label = getLabel(conf);
if (label.length() > 0)
values.add(label);
if (conf.getRepositoryObjectType() == IServerObjectRepositoryType.TYPE_EVENTMANAGER)
updateForEventManager(values);
}
return values;
}
private void updateForEventManager(Set<String> values) {
ERepositoryObjectType types[] = new ERepositoryObjectType[] { IServerObjectRepositoryType.TYPE_TRANSFORMERV2,
IServerObjectRepositoryType.TYPE_ROUTINGRULE };
for (ERepositoryObjectType type : types) {
IRepositoryNodeConfiguration conf = RepositoryNodeConfigurationManager.getConfiguration(type);
IRepositoryViewObject viewObject = RepositoryResourceUtil.getCategoryViewObject(conf);
if (viewObject != null) {
ContainerItem item = (ContainerItem) viewObject.getProperty().getItem();
values.add(item.getLabel());
}
}
}
}