X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=plugins%2Forg.argeo.slc.client.ui.dist%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Fviews%2FDistributionsView.java;h=2838863173137385986c2816d043bc8193b2fecc;hb=1d6a2ecc676aac7dde0491ea5047bebc2ce69e80;hp=6ac3d79ad783f5c90c4dea819217122746eb87a9;hpb=651d33e13bfa9a7b46464be412023ee747e612e8;p=gpl%2Fargeo-slc.git diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java index 6ac3d79ad..283886317 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2012 Mathieu Baudier + * Copyright (C) 2007-2012 Argeo GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,50 +20,75 @@ import java.util.Map; import javax.jcr.Repository; import javax.jcr.RepositoryException; -import javax.jcr.Session; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.eclipse.ui.AbstractTreeContentProvider; -import org.argeo.eclipse.ui.ErrorFeedback; import org.argeo.eclipse.ui.TreeParent; +import org.argeo.eclipse.ui.utils.CommandUtils; +import org.argeo.jcr.ArgeoNames; +import org.argeo.slc.SlcException; import org.argeo.slc.client.ui.dist.DistPlugin; import org.argeo.slc.client.ui.dist.commands.CopyWorkspace; import org.argeo.slc.client.ui.dist.commands.CreateWorkspace; import org.argeo.slc.client.ui.dist.commands.DeleteWorkspace; -import org.argeo.slc.client.ui.dist.commands.ManageWorkspaceAuth; +import org.argeo.slc.client.ui.dist.commands.DisplayRepoInformation; +import org.argeo.slc.client.ui.dist.commands.Fetch; +import org.argeo.slc.client.ui.dist.commands.MergeWorkspaces; import org.argeo.slc.client.ui.dist.commands.NormalizeDistribution; -import org.argeo.slc.client.ui.dist.editors.DistributionEditor; -import org.argeo.slc.client.ui.dist.editors.DistributionEditorInput; +import org.argeo.slc.client.ui.dist.commands.NormalizeWorkspace; +import org.argeo.slc.client.ui.dist.commands.OpenGenerateBinariesWizard; +import org.argeo.slc.client.ui.dist.commands.PublishWorkspace; +import org.argeo.slc.client.ui.dist.commands.RefreshDistributionsView; +import org.argeo.slc.client.ui.dist.commands.RegisterRepository; +import org.argeo.slc.client.ui.dist.commands.RunInOsgi; +import org.argeo.slc.client.ui.dist.commands.UnregisterRemoteRepo; +import org.argeo.slc.client.ui.dist.controllers.DistTreeComparator; +import org.argeo.slc.client.ui.dist.controllers.DistTreeComparer; +import org.argeo.slc.client.ui.dist.controllers.DistTreeContentProvider; +import org.argeo.slc.client.ui.dist.controllers.DistTreeDoubleClickListener; +import org.argeo.slc.client.ui.dist.controllers.DistTreeLabelProvider; +import org.argeo.slc.client.ui.dist.model.DistParentElem; +import org.argeo.slc.client.ui.dist.model.ModularDistBaseElem; +import org.argeo.slc.client.ui.dist.model.RepoElem; +import org.argeo.slc.client.ui.dist.model.WkspGroupElem; +import org.argeo.slc.client.ui.dist.model.WorkspaceElem; import org.argeo.slc.client.ui.dist.utils.CommandHelpers; import org.argeo.slc.jcr.SlcNames; +import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerComparator; +import org.eclipse.jface.viewers.ViewerDropAdapter; import org.eclipse.swt.SWT; +import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.DragSourceAdapter; +import org.eclipse.swt.dnd.DragSourceEvent; +import org.eclipse.swt.dnd.TextTransfer; +import org.eclipse.swt.dnd.Transfer; +import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; /** - * Browse and manipulate distributions (like merge, rename, etc.). Only support - * one single repository currently. + * Browse, manipulate and manage distributions across multiple repositories + * (like fetch, merge, publish, etc.). */ +public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames { + // private final static Log log = + // LogFactory.getLog(DistributionsView.class); -public class DistributionsView extends ViewPart implements SlcNames { - private final static Log log = LogFactory.getLog(DistributionsView.class); public final static String ID = DistPlugin.ID + ".distributionsView"; - private Repository repository; + /* DEPENDENCY INJECTION */ + private Repository nodeRepository; + private DistTreeContentProvider treeContentProvider; private TreeViewer viewer; @@ -74,21 +99,31 @@ public class DistributionsView extends ViewPart implements SlcNames { | SWT.FULL_SELECTION | SWT.BORDER); TreeViewerColumn col = new TreeViewerColumn(viewer, SWT.NONE); - col.getColumn().setWidth(200); - col.getColumn().setText("Workspace"); - col.setLabelProvider(new ColumnLabelProvider() { - @Override - public String getText(Object element) { - return element.toString(); - } - }); + col.getColumn().setWidth(400); + col.setLabelProvider(new DistTreeLabelProvider()); + + final Tree tree = viewer.getTree(); + tree.setHeaderVisible(false); + tree.setLinesVisible(false); + + // viewer.setContentProvider(new DistTreeContentProvider()); + viewer.setContentProvider(treeContentProvider); + viewer.addDoubleClickListener(new DistTreeDoubleClickListener(viewer)); + viewer.setComparer(new DistTreeComparer()); - final Tree table = viewer.getTree(); - table.setHeaderVisible(true); - table.setLinesVisible(true); + viewer.setComparator(new DistTreeComparator()); - viewer.setContentProvider(new DistributionsContentProvider()); - viewer.addDoubleClickListener(new DistributionsDCL()); + @SuppressWarnings("unused") + ViewerComparator vc = viewer.getComparator(); + + // Enable retrieving current tree selected items from outside the view + getSite().setSelectionProvider(viewer); + + // Drag and drop + Transfer[] tt = new Transfer[] { TextTransfer.getInstance() }; + int operations = DND.DROP_COPY | DND.DROP_MOVE; + viewer.addDragSupport(operations, tt, new ViewDragListener()); + viewer.addDropSupport(operations, tt, new ViewDropListener(viewer)); MenuManager menuManager = new MenuManager(); Menu menu = menuManager.createContextMenu(viewer.getTree()); @@ -100,8 +135,203 @@ public class DistributionsView extends ViewPart implements SlcNames { viewer.getTree().setMenu(menu); getSite().registerContextMenu(menuManager, viewer); - viewer.setInput(getSite()); + // Initialize + refresh(); + } + /** Programatically configure the context menu */ + protected void contextMenuAboutToShow(IMenuManager menuManager) { + IWorkbenchWindow window = DistPlugin.getDefault().getWorkbench() + .getActiveWorkbenchWindow(); + + try { + // Most of the implemented commands support only one selected + // element + boolean singleElement = ((IStructuredSelection) viewer + .getSelection()).size() == 1; + // Get Current selected item : + Object firstElement = ((IStructuredSelection) viewer.getSelection()) + .getFirstElement(); + + if (firstElement instanceof TreeParent + || firstElement instanceof DistParentElem) { + + String targetRepoPath = null, workspaceName = null, workspacePrefix = null; + // String targetRepoUri = null; + // Build conditions depending on element type + boolean isDistribElem = false, isModularDistBaseElem = false, isRepoElem = false, isDistribGroupElem = false; + boolean isLocal = false, isReadOnly = true; + + RepoElem re = null; + + if (firstElement instanceof WorkspaceElem) { + WorkspaceElem de = (WorkspaceElem) firstElement; + re = (RepoElem) de.getParent().getParent(); + isDistribElem = true; + isReadOnly = de.isReadOnly(); + workspaceName = de.getWorkspaceName(); + isLocal = de.inHome(); + } else if (firstElement instanceof RepoElem) { + re = (RepoElem) firstElement; + isRepoElem = true; + isLocal = re.inHome(); + isReadOnly = re.isReadOnly(); + } else if (firstElement instanceof ModularDistBaseElem) { + ModularDistBaseElem mdbe = (ModularDistBaseElem) firstElement; + re = (RepoElem) mdbe.getParent().getParent().getParent(); + isModularDistBaseElem = true; + isLocal = re.inHome(); + isReadOnly = re.isReadOnly(); + } else if (firstElement instanceof WkspGroupElem) { + WkspGroupElem wge = (WkspGroupElem) firstElement; + isReadOnly = wge.isReadOnly(); + isDistribGroupElem = true; + re = (RepoElem) wge.getParent(); + workspacePrefix = wge.getName(); + } + + // TODO add case for goups + + if (re != null) { + // targetRepoUri = re.getUri(); + targetRepoPath = re.getRepoNode().getPath(); + } + + // Display repo info + CommandUtils.refreshCommand(menuManager, window, + DisplayRepoInformation.ID, + DisplayRepoInformation.DEFAULT_LABEL, + DisplayRepoInformation.DEFAULT_ICON, isRepoElem + && singleElement); + + // create workspace + Map params = new HashMap(); + params.put(CreateWorkspace.PARAM_TARGET_REPO_PATH, + targetRepoPath); + params.put(CreateWorkspace.PARAM_WORKSPACE_PREFIX, + workspacePrefix); + CommandUtils.refreshParametrizedCommand(menuManager, window, + CreateWorkspace.ID, CreateWorkspace.DEFAULT_LABEL, + CreateWorkspace.DEFAULT_ICON, + (isRepoElem || isDistribGroupElem) && singleElement + && !isReadOnly, params); + + // Register a remote repository + CommandUtils.refreshCommand(menuManager, window, + RegisterRepository.ID, + RegisterRepository.DEFAULT_LABEL, + RegisterRepository.DEFAULT_ICON, isRepoElem + && singleElement); + + // Unregister a remote repository + params = new HashMap(); + params.put(UnregisterRemoteRepo.PARAM_REPO_PATH, targetRepoPath); + CommandUtils.refreshParametrizedCommand(menuManager, window, + UnregisterRemoteRepo.ID, + UnregisterRemoteRepo.DEFAULT_LABEL, + UnregisterRemoteRepo.DEFAULT_ICON, isRepoElem + && !isLocal && singleElement, params); + + // Fetch repository + params = new HashMap(); + params.put(Fetch.PARAM_TARGET_REPO_PATH, targetRepoPath); + CommandUtils.refreshParametrizedCommand(menuManager, window, + Fetch.ID, Fetch.DEFAULT_LABEL, Fetch.DEFAULT_ICON, + isRepoElem && isLocal && singleElement && !isReadOnly, + params); + + // Normalize workspace + params = new HashMap(); + params.put(NormalizeWorkspace.PARAM_TARGET_REPO_PATH, + targetRepoPath); + params.put(NormalizeWorkspace.PARAM_WORKSPACE_NAME, + workspaceName); + + CommandUtils.refreshParametrizedCommand(menuManager, window, + NormalizeWorkspace.ID, "Normalize...", + NormalizeWorkspace.DEFAULT_ICON, isDistribElem + && singleElement && !isReadOnly, params); + + // Copy workspace + params = new HashMap(); + params.put(CopyWorkspace.PARAM_TARGET_REPO_PATH, targetRepoPath); + params.put(CopyWorkspace.PARAM_SOURCE_WORKSPACE_NAME, + workspaceName); + CommandUtils.refreshParametrizedCommand(menuManager, window, + CopyWorkspace.ID, CopyWorkspace.DEFAULT_LABEL, + CopyWorkspace.DEFAULT_ICON, isDistribElem + && singleElement, params); + + // Clear Workspace + params = new HashMap(); + params.put(DeleteWorkspace.PARAM_TARGET_REPO_PATH, + targetRepoPath); + params.put(DeleteWorkspace.PARAM_WORKSPACE_NAME, workspaceName); + CommandUtils.refreshParametrizedCommand(menuManager, window, + DeleteWorkspace.ID, DeleteWorkspace.DEFAULT_LABEL, + DeleteWorkspace.DEFAULT_ICON, isDistribElem + && singleElement && !isReadOnly, params); + + // Advanced submenu + MenuManager submenu = new MenuManager("Advanced", DistPlugin.ID + + ".advancedSubmenu"); + IContributionItem ici = menuManager.find(DistPlugin.ID + + ".advancedSubmenu"); + if (ici != null) + menuManager.remove(ici); + + // Publish workspace + params = new HashMap(); + params.put(PublishWorkspace.PARAM_TARGET_REPO_PATH, + targetRepoPath); + params.put(PublishWorkspace.PARAM_WORKSPACE_NAME, workspaceName); + CommandUtils.refreshParametrizedCommand(submenu, window, + PublishWorkspace.ID, PublishWorkspace.DEFAULT_LABEL, + PublishWorkspace.DEFAULT_ICON, isDistribElem + && singleElement && !isReadOnly, params); + + // Normalize distribution (Legacy) + params = new HashMap(); + params.put(NormalizeDistribution.PARAM_TARGET_REPO_PATH, + targetRepoPath); + params.put(NormalizeDistribution.PARAM_WORKSPACE_NAME, + workspaceName); + CommandUtils.refreshParametrizedCommand(submenu, window, + NormalizeDistribution.ID, + NormalizeDistribution.DEFAULT_LABEL, + NormalizeDistribution.DEFAULT_ICON, isDistribElem + && singleElement && !isReadOnly, params); + + // Run in OSGi + params = new HashMap(); + params.put(RunInOsgi.PARAM_WORKSPACE_NAME, workspaceName); + CommandUtils.refreshParametrizedCommand(submenu, window, + RunInOsgi.ID, RunInOsgi.DEFAULT_LABEL, + RunInOsgi.DEFAULT_ICON, isDistribElem && singleElement + && isLocal, params);// Run in OSGi + + CommandUtils.refreshCommand(submenu, window, + OpenGenerateBinariesWizard.ID, + OpenGenerateBinariesWizard.DEFAULT_LABEL, + OpenGenerateBinariesWizard.DEFAULT_ICON, + isModularDistBaseElem && !isReadOnly); + + if (submenu.getSize() > 0) + menuManager.add(submenu); + + // // Manage workspace authorizations + // params = new HashMap(); + // params.put(ManageWorkspaceAuth.PARAM_WORKSPACE_NAME, wsName); + // CommandHelpers.refreshParameterizedCommand(menuManager, + // window, + // ManageWorkspaceAuth.ID, ManageWorkspaceAuth.DEFAULT_LABEL, + // ManageWorkspaceAuth.DEFAULT_ICON_PATH, isDistribElem + // && singleElement && !isReadOnly, params); + } + } catch (RepositoryException e) { + throw new SlcException("unexpected errror while " + + "building context menu", e); + } } @Override @@ -113,157 +343,91 @@ public class DistributionsView extends ViewPart implements SlcNames { * Force refresh of the whole view */ public void refresh() { - viewer.setContentProvider(new DistributionsContentProvider()); - } - - public void setRepository(Repository repository) { - this.repository = repository; + viewer.setInput(nodeRepository); + viewer.expandToLevel(2); } - /** Programatically configure the context menu */ - protected void contextMenuAboutToShow(IMenuManager menuManager) { - IWorkbenchWindow window = DistPlugin.getDefault().getWorkbench() - .getActiveWorkbenchWindow(); - // Get Current selected item : - Object firstElement = ((IStructuredSelection) viewer.getSelection()) - .getFirstElement(); - - if (firstElement instanceof TreeParent) { - TreeParent tp = (TreeParent) firstElement; - String wsName = tp.getName(); - - // Build conditions depending on element type (repo or distribution - // for the time being) - boolean isDistribElem = false; // , isRepoElem = false; - - // if (tp instanceof RepositoryElem){ - // isRepoElem = true; - // } else - if (tp instanceof DistributionElem) { - isDistribElem = true; + /** Listens to drag */ + class ViewDragListener extends DragSourceAdapter { + public void dragSetData(DragSourceEvent event) { + IStructuredSelection selection = (IStructuredSelection) viewer + .getSelection(); + if (selection.getFirstElement() instanceof WorkspaceElem) { + WorkspaceElem de = (WorkspaceElem) selection.getFirstElement(); + if (TextTransfer.getInstance().isSupportedType(event.dataType)) { + event.data = ((RepoElem) de.getParent().getParent()) + .getUri() + "/" + de.getWorkspaceName(); + } } - - // create workspace - CommandHelpers.refreshCommand(menuManager, window, - CreateWorkspace.ID, CreateWorkspace.DEFAULT_LABEL, - CreateWorkspace.DEFAULT_ICON_PATH, - tp instanceof RepositoryElem); - - // Normalize workspace - Map params = new HashMap(); - params.put(NormalizeDistribution.PARAM_WORKSPACE, wsName); - CommandHelpers.refreshParameterizedCommand(menuManager, window, - NormalizeDistribution.ID, - NormalizeDistribution.DEFAULT_LABEL, - NormalizeDistribution.DEFAULT_ICON_PATH, isDistribElem, - params); - - // Copy workspace - params = new HashMap(); - params.put(CopyWorkspace.PARAM_WORKSPACE_NAME, wsName); - CommandHelpers.refreshParameterizedCommand(menuManager, window, - CopyWorkspace.ID, CopyWorkspace.DEFAULT_LABEL, - CopyWorkspace.DEFAULT_ICON_PATH, isDistribElem, params); - - // Delete Workspace - params = new HashMap(); - params.put(DeleteWorkspace.PARAM_WORKSPACE_NAME, wsName); - CommandHelpers.refreshParameterizedCommand(menuManager, window, - DeleteWorkspace.ID, DeleteWorkspace.DEFAULT_LABEL, - DeleteWorkspace.DEFAULT_ICON_PATH, isDistribElem, params); - - // Manage workspace authorizations - params = new HashMap(); - params.put(ManageWorkspaceAuth.PARAM_WORKSPACE_NAME, wsName); - CommandHelpers.refreshParameterizedCommand(menuManager, window, - ManageWorkspaceAuth.ID, ManageWorkspaceAuth.DEFAULT_LABEL, - ManageWorkspaceAuth.DEFAULT_ICON_PATH, isDistribElem, - params); } } - private class DistributionsContentProvider extends - AbstractTreeContentProvider { + /** Listens to drop */ + class ViewDropListener extends ViewerDropAdapter { - public Object[] getElements(Object arg0) { - return new Object[] { new RepositoryElem("java", repository) }; + public ViewDropListener(Viewer viewer) { + super(viewer); } - } - - private static class RepositoryElem extends TreeParent { - // private final Repository repository; - private Session defaultSession; + @Override + public boolean performDrop(Object data) { + WorkspaceElem sourceWksp = (WorkspaceElem) getSelectedObject(); + RepoElem targetRepo = (RepoElem) getCurrentTarget(); + + Boolean ok = MessageDialog.openConfirm( + getSite().getShell(), + "Confirm distribution merge", + "Do you want to merge " + + sourceWksp.getWorkspaceName() + + " (from repo " + + ((RepoElem) sourceWksp.getParent().getParent()) + .getLabel() + ") to repo " + + targetRepo.getLabel() + "?"); + if (!ok) + return false; - public RepositoryElem(String name, Repository repository) { - super(name); - // this.repository = repository; try { - defaultSession = repository.login(); - String[] workspaceNames = defaultSession.getWorkspace() - .getAccessibleWorkspaceNames(); - for (String workspace : workspaceNames) - addChild(new DistributionElem(repository, workspace)); + Map params = new HashMap(); + params.put(MergeWorkspaces.PARAM_TARGET_REPO_PATH, targetRepo + .getRepoNode().getPath()); + params.put(MergeWorkspaces.PARAM_SOURCE_REPO_PATH, + ((RepoElem) sourceWksp.getParent().getParent()) + .getRepoNode().getPath()); + params.put(MergeWorkspaces.PARAM_SOURCE_WORKSPACE_NAME, + sourceWksp.getWorkspaceName()); + CommandHelpers.callCommand(RefreshDistributionsView.ID, params); + return true; } catch (RepositoryException e) { - ErrorFeedback.show("Cannot log to repository", e); + throw new SlcException("Cannot process drop from " + sourceWksp + + " to " + targetRepo, e); } } @Override - public synchronized void dispose() { - if (log.isTraceEnabled()) - log.trace("Disposing RepositoryElement"); - if (defaultSession != null) - defaultSession.logout(); - super.dispose(); - } - } - - private static class DistributionElem extends TreeParent { - private final String workspaceName; - private final Repository repository; - - public DistributionElem(Repository repository, String workspaceName) { - super(workspaceName); - this.workspaceName = workspaceName; - this.repository = repository; - } - - public String getWorkspaceName() { - return workspaceName; - } - - public Repository getRepository() { - return repository; + public boolean validateDrop(Object target, int operation, + TransferData transferType) { + if (target instanceof RepoElem) { + if (getSelectedObject() instanceof WorkspaceElem) { + // check if not same repository + String srcRepoUri = ((RepoElem) ((WorkspaceElem) getSelectedObject()) + .getParent().getParent()).getUri(); + String targetRepoUri = ((RepoElem) target).getUri(); + return !targetRepoUri.equals(srcRepoUri); + } + } + return false; } } - @Override - public void dispose() { - super.dispose(); + /* + * DEPENDENCY INJECTION + */ + public void setNodeRepository(Repository repository) { + this.nodeRepository = repository; } - private class DistributionsDCL implements IDoubleClickListener { - - public void doubleClick(DoubleClickEvent event) { - if (event.getSelection() == null || event.getSelection().isEmpty()) - return; - Object obj = ((IStructuredSelection) event.getSelection()) - .getFirstElement(); - if (obj instanceof DistributionElem) { - DistributionElem distributionElem = (DistributionElem) obj; - DistributionEditorInput dei = new DistributionEditorInput( - distributionElem.getRepository(), - distributionElem.getWorkspaceName()); - try { - DistPlugin.getDefault().getWorkbench() - .getActiveWorkbenchWindow().getActivePage() - .openEditor(dei, DistributionEditor.ID); - } catch (PartInitException e) { - ErrorFeedback.show("Cannot open editor for " - + distributionElem.getWorkspaceName(), e); - } - } - } + public void setTreeContentProvider( + DistTreeContentProvider treeContentProvider) { + this.treeContentProvider = treeContentProvider; } } \ No newline at end of file