// ============================================================================ // // Copyright (C) 2006-2012 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.designer.core.ui.editor.properties.controllers; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; 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.TableColumn; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.talend.commons.bridge.ReponsitoryContextBridge; import org.talend.core.GlobalServiceRegister; import org.talend.core.ITDQRepositoryService; import org.talend.designer.core.i18n.Messages; import org.talend.designer.core.ui.editor.cmd.PropertyChangeCommand; import org.talend.designer.core.ui.editor.nodes.Node; /** * DOC klliu class global comment. Detailled comment */ public class ImportRulesFromRepository implements SelectionListener { /** * DOC yyi ImportRulesFromRepository class global comment. Detailled comment */ private class PaserRuleSelectionDialog extends CheckedTreeSelectionDialog { private boolean isOverride; private TableViewer rulesTable; public PaserRuleSelectionDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) { super(parent, labelProvider, contentProvider); addFilter(new PaserRulesFilter()); setTitle(Messages.getString("ImportRulesFromRepository.dialog")); //$NON-NLS-1$ setMessage(Messages.getString("ImportRulesFromRepository.title")); //$NON-NLS-1$ isOverride = false; } private Composite createCheckerArea(Composite parent) { Composite checker = new Composite(parent, SWT.NONE); GridLayout innerLayout = new GridLayout(); innerLayout.numColumns = 1; checker.setLayout(innerLayout); checker.setFont(parent.getFont()); final Button check = new Button(checker, SWT.CHECK); check.setText(Messages.getString("ImportRulesFromRepository.override")); //$NON-NLS-1$ check.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { isOverride = check.getSelection(); } }); return checker; } @Override protected Control createDialogArea(Composite parent) { SashForm form = new SashForm(parent, SWT.SMOOTH | SWT.VERTICAL | SWT.FILL); GridData data = new GridData(SWT.FILL, SWT.FILL, true, true, 0, 0); form.setLayoutData(data); Composite composite = (Composite) super.createDialogArea(form); createSelectRulesTable(form); createCheckerArea(composite); form.setWeights(new int[] { 3, 1 }); return composite; } private void createSelectRulesTable(Composite parent) { Composite composite = new Composite(parent, SWT.None); GridLayout layout = new GridLayout(); layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); composite.setLayout(layout); rulesTable = new TableViewer(composite, SWT.BORDER); Table table = rulesTable.getTable(); TableColumn c1 = new TableColumn(table, SWT.NULL); c1.setText(RULE_NAME); TableColumn c2 = new TableColumn(table, SWT.NULL); c2.setText(RULE_TYPE); TableColumn c3 = new TableColumn(table, SWT.NULL); c3.setText(RULE_VALUE); table.setLinesVisible(true); table.setHeaderVisible(true); TableLayout tableLayout = new TableLayout(); for (int i = 0; i < 3; i++) tableLayout.addColumnData(new ColumnWeightData(1, 50, true)); table.setLayout(tableLayout); GridData data = new GridData(SWT.FILL, SWT.FILL, true, true, 0, 0); table.setLayoutData(data); rulesTable.setContentProvider(new ArrayContentProvider()); rulesTable.setLabelProvider(new RulesTableLabelProvider()); } public boolean isOverrideRules() { return isOverride; } @Override protected void updateOKStatus() { super.updateOKStatus(); computeResult(); rulesTable.setInput(getRulesFromFiles(getResult())); } } private class PaserRulesFilter extends ViewerFilter { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IFile) { IFile file = (IFile) element; if (!"rules".equals(file.getFileExtension())) { //$NON-NLS-1$ return false; } } return true; } } private class RuleSelectionValidator implements ISelectionStatusValidator { public IStatus validate(Object[] selection) { Status stat = new Status(IStatus.OK, getClass().getName(), ""); List<Map<String, String>> parsers = getRulesFromFiles(selection); for (Map<String, String> rule : parsers) { if (containsRule(rule)) { stat = new Status(IStatus.WARNING, getClass().getName(), Messages.getString("ImportRulesFromRepository.validator")); //$NON-NLS-1$ break; } } return stat; } } private class RulesTableLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { Image warn = null; Map<String, String> rule = (HashMap<String, String>) element; if (0 == columnIndex && containsRule(rule)) { warn = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK); } return warn; } public String getColumnText(Object element, int columnIndex) { Map<String, String> rule = (HashMap<String, String>) element; String result = null; switch (columnIndex) { case 0: // name result = rule.get(RULE_NAME); break; case 1: // type result = rule.get(RULE_TYPE); break; case 2: // value result = rule.get(RULE_VALUE); break; } return result; } } private GenerateGrammarController controller; private Node node; private List<Map<String, String>> params; private PaserRuleSelectionDialog rulesSelectionDialog; private ITDQRepositoryService tdqRepositoryService; private Object[] selectObjects; private static final String PARSER_PATH = "TDQ_Libraries/Rules/Parser"; private static final String RULE_NAME = "RULE_NAME"; private static final String RULE_TYPE = "RULE_TYPE"; private static final String RULE_VALUE = "RULE_VALUE"; private static final String RULE_TABLE = "RULE_TABLE"; /** * DOC klliu ImportRulesFromRepository constructor comment. * * @param generateGrammarController */ public ImportRulesFromRepository(GenerateGrammarController generateGrammarController) { this.controller = generateGrammarController; this.node = (Node) generateGrammarController.elem; } protected boolean containsRule(Map<String, String> rule) { return getRuleNames().contains(rule.get(RULE_NAME)); } private List<String> getRuleNames() { List<String> names = new ArrayList<String>(); for (Map<String, String> rule : params) { names.add(rule.get(RULE_NAME)); } return names; } protected PaserRuleSelectionDialog getRulesDialog() { if (null == rulesSelectionDialog) { rulesSelectionDialog = new PaserRuleSelectionDialog(null, WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(), new WorkbenchContentProvider()); rulesSelectionDialog.addFilter(new PaserRulesFilter()); rulesSelectionDialog.setValidator(new RuleSelectionValidator()); rulesSelectionDialog.setContainerMode(true); } return rulesSelectionDialog; } private IFolder getRulesFolder() { if (ReponsitoryContextBridge.getRootProject() != null) { return ReponsitoryContextBridge.getRootProject().getFolder(new Path(PARSER_PATH)); } return null; } private List<Map<String, String>> getRulesFromFiles(Object[] files) { return getTdqRepositoryService().getPaserRulesFromResources(files); } private ITDQRepositoryService getTdqRepositoryService() { if (null == tdqRepositoryService) { if (GlobalServiceRegister.getDefault().isServiceRegistered(ITDQRepositoryService.class)) { tdqRepositoryService = (ITDQRepositoryService) GlobalServiceRegister.getDefault().getService( ITDQRepositoryService.class); } } return tdqRepositoryService; } public void mergeRules(List<Map<String, String>> params, List<Map<String, String>> rules) { for (Iterator<Map<String, String>> iterator = rules.iterator(); iterator.hasNext();) { Map<String, String> rule = (Map<String, String>) iterator.next(); boolean replacedRule = false; for (Map<String, String> param : params) { if (rule.get(RULE_NAME).equals(param.get(RULE_NAME))) { param.putAll(rule); replacedRule = true; } } if (replacedRule) { iterator.remove(); } } } private Object[] selectRules(IFolder rulesFolder) { CheckedTreeSelectionDialog rsd = getRulesDialog(); rsd.setInput(rulesFolder); if (selectObjects != null) rsd.setInitialSelections(selectObjects); rsd.open(); selectObjects = rsd.getResult(); return selectObjects; } public void updateParameters(Object propValue) { PropertyChangeCommand cmd = new PropertyChangeCommand(node, RULE_TABLE, propValue); cmd.setUpdate(true); controller.executeCommand(cmd); } public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { this.params = (List<Map<String, String>>) node.getElementParameter(RULE_TABLE).getValue(); List<Map<String, String>> params = new ArrayList<Map<String, String>>(); params.addAll(this.params); if (getTdqRepositoryService() != null) { Object[] selectRules = selectRules(getRulesFolder()); if (selectRules != null) { List<Map<String, String>> rules = getRulesFromFiles(selectRules); if (getRulesDialog().isOverrideRules()) { mergeRules(params, rules); } params.addAll(rules); updateParameters(params); } } } }