// ============================================================================ // // 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.widgets; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; 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.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; 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.service.RepositoryQueryService; import org.talend.mdm.repository.i18n.Messages; import org.talend.mdm.repository.model.mdmproperties.MDMServerObjectItem; import org.talend.mdm.repository.model.mdmserverobject.MDMServerObject; import org.talend.mdm.repository.model.mdmserverobject.WSResourceE; import org.talend.mdm.repository.utils.RepositoryResourceUtil; import com.amalto.workbench.models.TreeObject; import com.amalto.workbench.models.TreeParent; import com.amalto.workbench.utils.Util; import com.amalto.workbench.widgets.FilteredCheckboxTree; /** * DOC hbhong class global comment. <BR> * this class is a replacement for RepositoryCheckTreeViewer in MDM server view,not named RepositoryCheckTreeViewerR * ,because to avoid confuse it works for repository */ public abstract class AbstractNodeCheckTreeViewer { protected static Log log = LogFactory.getLog(AbstractNodeCheckTreeViewer.class); private SelectionListener bunListener; protected List<TreeObject> checkItems = new ArrayList<TreeObject>(); protected String defaultTagText; protected FilteredCheckboxTree filteredCheckboxTree; protected boolean isTagEditable; Label itemLabel = null; protected Button moveButton; Collection<TreeObject> optimizedCheckNodes = new ArrayList<TreeObject>(); protected SashForm sash; protected IStructuredSelection selection; protected TreeParent serverRoot; protected TreeViewer viewer; public AbstractNodeCheckTreeViewer(IStructuredSelection selection) { this.selection = selection; Object firstElement = selection.getFirstElement(); if (firstElement != null && firstElement instanceof TreeObject) { serverRoot = ((TreeObject) firstElement).getServerRoot(); } checkItems = selection.toList(); } public AbstractNodeCheckTreeViewer(IStructuredSelection selection, String defaultTagText, boolean isTagEditable) { this.selection = selection; Object firstElement = selection.getFirstElement(); if (firstElement != null && firstElement instanceof TreeObject) { serverRoot = ((TreeObject) firstElement).getServerRoot(); } checkItems = selection.toList(); this.defaultTagText = defaultTagText; this.isTagEditable = isTagEditable; } public AbstractNodeCheckTreeViewer(TreeParent serverRoot) { this.serverRoot = serverRoot; } public void addButtonSelectionListener(SelectionListener listener) { this.bunListener = listener; } public void addCheckStateListener(ICheckStateListener listener) { filteredCheckboxTree.getViewer().addCheckStateListener(listener); } /** * * @param workArea */ public Composite createItemList(Composite workArea) { Group itemComposite = new Group(workArea, 0); GridLayoutFactory.swtDefaults().numColumns(2).applyTo(itemComposite); GridDataFactory.swtDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).hint(400, 300).applyTo(itemComposite); itemLabel = new Label(itemComposite, SWT.NONE); itemLabel.setText(Messages.AbstractXXViewer_SelectItem); GridDataFactory.swtDefaults().span(2, 1).applyTo(itemLabel); createTreeViewer(itemComposite); createSelectionButton(itemComposite); // force loading all nodes setCreatedViewer(); createOtherControl(itemComposite); refresh(); return itemComposite; } protected void createOtherControl(Composite itemComposite) { } /** * DOC hcw Comment method "createSelectionButton". * * @param itemComposite */ protected Composite createSelectionButton(Composite itemComposite) { Composite buttonComposite = new Composite(itemComposite, SWT.NONE); GridLayoutFactory.swtDefaults().margins(0, 25).applyTo(buttonComposite); GridDataFactory.swtDefaults().align(SWT.FILL, SWT.BEGINNING).applyTo(buttonComposite); buttonComposite.setLayout(new GridLayout(1, false)); Button hide = new Button(buttonComposite, SWT.PUSH); hide.setVisible(false); Button selectAll = new Button(buttonComposite, SWT.PUSH); selectAll.setText(Messages.AbstractXXViewer_SelectAll); selectAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { ((CheckboxTreeViewer) viewer).setAllChecked(true); updateCountStatus(); } }); Button deselectAll = new Button(buttonComposite, SWT.PUSH); deselectAll.setText(Messages.AbstractXXViewer_DeselectAll); deselectAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { ((CheckboxTreeViewer) viewer).setAllChecked(false); updateCountStatus(); } }); if (bunListener != null) { selectAll.addSelectionListener(bunListener); deselectAll.addSelectionListener(bunListener); } // setButtonLayoutData(deselectAll); Button expandBtn = new Button(buttonComposite, SWT.PUSH); expandBtn.setText("Expand All"); //$NON-NLS-1$ expandBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { viewer.expandAll(); } }); // setButtonLayoutData(expandBtn); Button collapseBtn = new Button(buttonComposite, SWT.PUSH); collapseBtn.setText("Collapse All"); //$NON-NLS-1$ collapseBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { viewer.collapseAll(); } }); // setButtonLayoutData(collapseBtn); return buttonComposite; } protected abstract void createTreeViewer(Composite itemComposite); public void updateCountStatus() { // do nothing } protected void expandParent(TreeViewer viewer, TreeObject node) { TreeParent parent = node.getParent(); if (parent != null) { expandParent(viewer, parent); viewer.setExpandedState(parent, true); } } protected abstract void filterCheckedObjects(Object[] selected, List<Object> ret); protected boolean filterRepositoryNode(TreeObject node, boolean isOverWrite) { if (node == null) { return false; } // remove the filter for resource to provide the function to import and export resources. if (node.getType() == TreeObject.SUBSCRIPTION_ENGINE || node.getType() == TreeObject.SERVICE_CONFIGURATION || !Util.IsEnterPrise() && node.getType() == TreeObject.WORKFLOW || !Util.IsEnterPrise() && node.getType() == TreeObject.WORKFLOW_PROCESS || node.getType() == TreeObject.JOB || node.getType() == TreeObject.JOB_REGISTRY) { return false; } if (!Util.IsEnterPrise()) { if (node.getType() == TreeObject.ROLE) { return false; } } if (!isOverWrite) { if (isExist(node)) { return false; } } return true; } private boolean isExist(TreeObject treeObj) { if (treeObj instanceof TreeParent) { return false; } int type = treeObj.getType(); ERepositoryObjectType rType = RepositoryQueryService.getRepositoryObjectType(type); if (rType == null) { return false; } List<IRepositoryViewObject> children = RepositoryResourceUtil.findAllViewObjectsWithDeleted(rType); if (children == null) { return false; } String treeObjName = treeObj.getName(); if (type == TreeObject.PICTURES_RESOURCE) { int index = treeObjName.indexOf("-"); //$NON-NLS-1$ if (index > 0) { treeObjName = treeObjName.substring(index + 1); } } for (IRepositoryViewObject viewObject : children) { Item item = viewObject.getProperty().getItem(); if (item instanceof MDMServerObjectItem) { MDMServerObject serverObj = ((MDMServerObjectItem) item).getMDMServerObject(); String name = serverObj.getName(); if (type == TreeObject.WORKFLOW_PROCESS) { name = name + "_" + viewObject.getVersion(); //$NON-NLS-1$ } if (type == TreeObject.PICTURES_RESOURCE) { name = name + "_" + viewObject.getVersion() + "." + ((WSResourceE) serverObj).getFileExtension(); //$NON-NLS-1$ //$NON-NLS-2$ } if (serverObj != null && treeObjName.equals(name)) { return true; } } } return false; } public IRepositoryViewObject getViewObjectByType(IRepositoryViewObject[] theInput, ERepositoryObjectType type) { if (theInput == null || type == null) { return null; } for (IRepositoryViewObject viewObj : theInput) { if (viewObj.getRepositoryObjectType().equals(type)) { return viewObj; } } return null; } public Object[] getCheckNodes() { Object[] selected = null; List<Object> ret = new LinkedList<Object>(); if (viewer != null && viewer instanceof CheckboxTreeViewer) { selected = ((CheckboxTreeViewer) viewer).getCheckedElements(); } filterCheckedObjects(selected, ret); return ret.toArray(); } public TreeViewer getViewer() { return viewer; } public void refresh() { // empty } public void removeCheckStateListener(ICheckStateListener listener) { filteredCheckboxTree.getViewer().removeCheckStateListener(listener); } public void setCheckItems(List<TreeObject> list) { checkItems = list; refresh(); } protected void setCreatedViewer() { viewer = filteredCheckboxTree.getViewer(); } public void setItemText(String text) { itemLabel.setText(text); } public void setServerRoot(TreeParent serverRoot) { this.serverRoot = serverRoot; } public void setViewer(TreeViewer viewer) { this.viewer = viewer; } }