// ============================================================================
//
// 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.recycle;
import java.util.Collection;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
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.command.CommandManager;
import org.talend.mdm.repository.core.command.CommandStack;
import org.talend.mdm.repository.core.command.ICommand;
import org.talend.mdm.repository.core.command.deploy.AbstractDeployCommand;
import org.talend.mdm.repository.extension.RepositoryNodeConfigurationManager;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.models.FolderRepositoryObject;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
/**
* DOC hbhong class global comment. Detailled comment
*/
public class WaitToDeployDialog extends Dialog {
private static class ViewerLabelProvider extends LabelProvider {
public Image getImage(Object element) {
if (element instanceof IRepositoryViewObject) {
IRepositoryViewObject viewObj = (IRepositoryViewObject) element;
ERepositoryObjectType type = viewObj.getRepositoryObjectType();
IRepositoryNodeConfiguration configuration = RepositoryNodeConfigurationManager.getConfiguration(type);
if (configuration != null) {
IRepositoryNodeLabelProvider labelProvider = configuration.getLabelProvider();
return labelProvider.getImage(element);
}
}
return null;
}
public String getText(Object element) {
if (element instanceof IRepositoryViewObject) {
return ((IRepositoryViewObject) element).getLabel();
}
return super.getText(element);
}
}
private static class TreeContentProvider implements ITreeContentProvider {
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof Collection) {
return ((Collection) parentElement).toArray();
}
if (parentElement instanceof FolderRepositoryObject) {
return ((FolderRepositoryObject) parentElement).getChildren().toArray();
}
if (parentElement instanceof Object[]) {
return (Object[]) parentElement;
}
return new Object[0];
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
}
private final List<IRepositoryViewObject> viewObjs;
private TreeViewer treeViewer;
/**
* Create the dialog.
*
* @param parentShell
*/
public WaitToDeployDialog(Shell parentShell, List<IRepositoryViewObject> viewObjs) {
super(parentShell);
this.viewObjs = viewObjs;
}
public boolean needShowDialog() {
return needShowDialog(viewObjs);
}
private boolean needShowDialog(List<IRepositoryViewObject> objs) {
for (IRepositoryViewObject viewObj : objs) {
if (viewObj instanceof FolderRepositoryObject) {
boolean result = needShowDialog(((FolderRepositoryObject) viewObj).getChildren());
if (result)
return true;
} else {
boolean result = needShowObject(viewObj);
if (result)
return true;
}
}
return false;
}
private boolean needShowObject(IRepositoryViewObject viewObj) {
String id = viewObj.getId();
CommandStack commandStack = CommandManager.getInstance().findCommandStack(id);
if (commandStack != null) {
ICommand validCommand = commandStack.getValidDeployCommand();
if (validCommand instanceof AbstractDeployCommand) {
if (validCommand.getCommandType() == ICommand.CMD_DELETE) {
return RepositoryResourceUtil.getLastServerDef(viewObj) != null;
}
return true;
}
}
return false;
}
/**
* Create contents of the dialog.
*
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
Label lblNewLabel = new Label(container, SWT.WRAP);
lblNewLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
lblNewLabel.setText(Messages.WaitToDeployDialog_message);
treeViewer = new TreeViewer(container, SWT.BORDER);
Tree tree = treeViewer.getTree();
tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
treeViewer.setLabelProvider(new ViewerLabelProvider());
treeViewer.setContentProvider(new TreeContentProvider());
treeViewer.addFilter(new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IRepositoryViewObject) {
if (element instanceof FolderRepositoryObject) {
return needShowDialog(((FolderRepositoryObject) element).getChildren());
} else {
return needShowObject((IRepositoryViewObject) element);
}
}
return false;
}
});
treeViewer.setInput(viewObjs);
treeViewer.expandAll();
return container;
}
/**
* 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(450, 300);
}
}