*/\r
package org.argeo.slc.akb.ui.views;\r
\r
+import java.util.ArrayList;\r
import java.util.HashMap;\r
+import java.util.List;\r
import java.util.Map;\r
\r
import javax.jcr.Node;\r
+import javax.jcr.NodeIterator;\r
import javax.jcr.Repository;\r
import javax.jcr.RepositoryException;\r
import javax.jcr.Session;\r
+import javax.jcr.observation.Event;\r
+import javax.jcr.observation.EventListener;\r
+import javax.jcr.observation.ObservationManager;\r
\r
+import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;\r
import org.argeo.eclipse.ui.utils.CommandUtils;\r
+import org.argeo.jcr.JcrUtils;\r
import org.argeo.slc.akb.AkbException;\r
import org.argeo.slc.akb.AkbNames;\r
import org.argeo.slc.akb.AkbTypes;\r
import org.argeo.slc.akb.ui.AkbUiPlugin;\r
+import org.argeo.slc.akb.ui.commands.DeleteAkbNodes;\r
import org.argeo.slc.akb.ui.commands.OpenAkbNodeEditor;\r
import org.argeo.slc.akb.ui.providers.AkbTreeLabelProvider;\r
import org.argeo.slc.akb.ui.providers.TemplatesTreeContentProvider;\r
+import org.eclipse.jface.action.IContributionItem;\r
import org.eclipse.jface.action.IMenuListener;\r
import org.eclipse.jface.action.IMenuManager;\r
import org.eclipse.jface.action.MenuManager;\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
import org.eclipse.jface.viewers.DoubleClickEvent;\r
import org.eclipse.jface.viewers.IDoubleClickListener;\r
import org.eclipse.jface.viewers.IStructuredSelection;\r
import org.eclipse.swt.SWT;\r
import org.eclipse.swt.layout.GridData;\r
import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Display;\r
import org.eclipse.swt.widgets.Menu;\r
import org.eclipse.ui.IWorkbenchWindow;\r
+import org.eclipse.ui.menus.CommandContributionItem;\r
+import org.eclipse.ui.menus.CommandContributionItemParameter;\r
import org.eclipse.ui.part.ViewPart;\r
+import org.eclipse.ui.services.IServiceLocator;\r
\r
/** SLC generic JCR Result tree view. */\r
public class AkbTemplatesTreeView extends ViewPart {\r
// Usefull business objects\r
private Node templatesParentNode;\r
\r
+ // Observer\r
+ private EventListener allResultsObserver = null;\r
+ private final static String[] observedNodeTypesUnderAllResults = {\r
+ AkbTypes.AKB_ENV_TEMPLATE, AkbTypes.AKB_CONNECTOR_ALIAS,\r
+ AkbTypes.AKB_ITEM, AkbTypes.AKB_ITEM_FOLDER };\r
+\r
// private EventListener myResultsObserver = null;\r
// private EventListener allResultsObserver = null;\r
//\r
public void createPartControl(Composite parent) {\r
initialize();\r
\r
- createResultsTreeViewer(parent);\r
+ resultTreeViewer = createResultsTreeViewer(parent);\r
+ resultTreeViewer.setInput(initializeResultTree());\r
\r
// parent.setLayout(new FillLayout());\r
// // Main layout\r
// .getDecoratorManager().getLabelDecorator();\r
// viewer.setLabelProvider(new DecoratingLabelProvider(rtLblProvider,\r
// decorator));\r
- // viewer.addDoubleClickListener(new ViewDoubleClickListener());\r
-\r
- // Override default behaviour to insure that 2 distincts results that\r
- // have the same name will be correctly and distincly returned by\r
- // corresponding TreeViewer.getSelection() method.\r
- // viewer.setComparer(new ResultItemsComparer());\r
\r
getSite().setSelectionProvider(viewer);\r
\r
\r
getSite().registerContextMenu(menuManager, viewer);\r
\r
+ // Initialize observer\r
+ try {\r
+ ObservationManager observationManager = session.getWorkspace()\r
+ .getObservationManager();\r
+\r
+ allResultsObserver = new AllResultsObserver(viewer.getTree()\r
+ .getDisplay());\r
+\r
+ // observe tree changes under All results\r
+ observationManager.addEventListener(allResultsObserver,\r
+ Event.NODE_ADDED | Event.NODE_REMOVED,\r
+ templatesParentNode.getPath(), true, null,\r
+ observedNodeTypesUnderAllResults, false);\r
+ } catch (RepositoryException e) {\r
+ throw new AkbException("Cannot register listeners", e);\r
+ }\r
+\r
// add change listener to display TestResult information in the property\r
// viewer\r
// viewer.addSelectionChangedListener(new MySelectionChangedListener());\r
return viewer;\r
}\r
\r
+ class AllResultsObserver extends AsyncUiEventListener {\r
+\r
+ public AllResultsObserver(Display display) {\r
+ super(display);\r
+ }\r
+\r
+ @Override\r
+ protected Boolean willProcessInUiThread(List<Event> events)\r
+ throws RepositoryException {\r
+ // unfiltered for the time being\r
+ return true;\r
+ }\r
+\r
+ protected void onEventInUiThread(List<Event> events)\r
+ throws RepositoryException {\r
+ resultTreeViewer.setInput(initializeResultTree());\r
+ // if (lastSelectedSourceElementParent != null)\r
+ // refresh(lastSelectedSourceElementParent);\r
+ }\r
+ }\r
+\r
// Detailed property viewer\r
// protected TableViewer createPropertiesViewer(Composite parent) {\r
// }\r
public void setFocus() {\r
}\r
\r
- // private ResultParent[] initializeResultTree() {\r
- // try {\r
- // // Force initialization of the tree structure if needed\r
- // SlcJcrResultUtils.getSlcResultsParentNode(session);\r
- // SlcJcrResultUtils.getMyResultParentNode(session);\r
- // // Remove yesterday and last 7 days virtual folders\r
- // // ResultParent[] roots = new ResultParent[5];\r
- // ResultParent[] roots = new ResultParent[3];\r
- //\r
- // // My results\r
- // roots[0] = new ParentNodeFolder(null,\r
- // SlcJcrResultUtils.getMyResultParentNode(session),\r
- // SlcUiConstants.DEFAULT_MY_RESULTS_FOLDER_LABEL);\r
- //\r
- // // today\r
- // Calendar cal = Calendar.getInstance();\r
- // String relPath = JcrUtils.dateAsPath(cal);\r
- // List<String> datePathes = new ArrayList<String>();\r
- // datePathes.add(relPath);\r
- // roots[1] = new VirtualFolder(null,\r
- // ResultParentUtils.getResultsForDates(session, datePathes),\r
- // "Today");\r
- //\r
- // // // Yesterday\r
- // // cal = Calendar.getInstance();\r
- // // cal.add(Calendar.DAY_OF_YEAR, -1);\r
- // // relPath = JcrUtils.dateAsPath(cal);\r
- // // datePathes = new ArrayList<String>();\r
- // // datePathes.add(relPath);\r
- // // roots[2] = new VirtualFolder(null,\r
- // // ResultParentUtils.getResultsForDates(session, datePathes),\r
- // // "Yesterday");\r
- // // // Last 7 days\r
- // //\r
- // // cal = Calendar.getInstance();\r
- // // datePathes = new ArrayList<String>();\r
- // //\r
- // // for (int i = 0; i < 7; i++) {\r
- // // cal.add(Calendar.DAY_OF_YEAR, -i);\r
- // // relPath = JcrUtils.dateAsPath(cal);\r
- // // datePathes.add(relPath);\r
- // // }\r
- // // roots[3] = new VirtualFolder(null,\r
- // // ResultParentUtils.getResultsForDates(session, datePathes),\r
- // // "Last 7 days");\r
- //\r
- // // All results\r
- // Node otherResultsPar = session.getNode(SlcJcrResultUtils\r
- // .getSlcResultsBasePath(session));\r
- // // roots[4] = new ParentNodeFolder(null, otherResultsPar,\r
- // // "All results");\r
- // roots[2] = new ParentNodeFolder(null, otherResultsPar,\r
- // "All results");\r
- // return roots;\r
- // } catch (RepositoryException re) {\r
- // throw new ArgeoException(\r
- // "Unexpected error while initializing ResultTree.", re);\r
- // }\r
- // }\r
+ private Node[] initializeResultTree() {\r
+ try {\r
+\r
+ NodeIterator ni = templatesParentNode.getNodes();\r
+ List<Node> templates = new ArrayList<Node>();\r
+\r
+ while (ni.hasNext()) {\r
+ Node currNode = ni.nextNode();\r
+ if (currNode.isNodeType(AkbTypes.AKB_ENV_TEMPLATE))\r
+ templates.add(currNode);\r
+ }\r
+\r
+ Node[] templateArr = templates.toArray(new Node[templates.size()]);\r
+\r
+ return templateArr;\r
+ } catch (RepositoryException re) {\r
+ throw new AkbException("Error while initializing templates Tree.",\r
+ re);\r
+ }\r
+ }\r
\r
// Manage context menu\r
/**\r
IWorkbenchWindow window = AkbUiPlugin.getDefault().getWorkbench()\r
.getActiveWorkbenchWindow();\r
try {\r
- // IStructuredSelection selection = (IStructuredSelection)\r
- // resultTreeViewer\r
- // .getSelection();\r
- // boolean canAddSubfolder = false;\r
- // boolean canRenamefolder = false;\r
- // boolean isSingleResultNode = false;\r
- // boolean isUnderMyResult = false;\r
- // boolean validMultipleDelete = false;\r
- //\r
- // // Building conditions\r
- // if (selection.size() == 1) {\r
- // Object obj = selection.getFirstElement();\r
- // if (obj instanceof SingleResultNode)\r
- // isSingleResultNode = true;\r
- // else if (obj instanceof ParentNodeFolder) {\r
- // Node cNode = ((ParentNodeFolder) obj).getNode();\r
- // if (cNode.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) {\r
- // canAddSubfolder = true;\r
- // canRenamefolder = true;\r
- // isUnderMyResult = true;\r
- // } else if (cNode\r
- // .isNodeType(SlcTypes.SLC_MY_RESULT_ROOT_FOLDER)) {\r
- // canAddSubfolder = true;\r
- // }\r
- // }\r
- // } else {\r
- // @SuppressWarnings("rawtypes")\r
- // Iterator it = selection.iterator();\r
- // multicheck: while (it.hasNext()) {\r
- // validMultipleDelete = true;\r
- // Object obj = it.next();\r
- // if (obj instanceof SingleResultNode)\r
- // continue multicheck;\r
- // else if (obj instanceof ParentNodeFolder) {\r
- // Node cNode = ((ParentNodeFolder) obj).getNode();\r
- // if (cNode.isNodeType(SlcTypes.SLC_RESULT_FOLDER))\r
- // continue multicheck;\r
- // else {\r
- // validMultipleDelete = false;\r
- // break multicheck;\r
- // }\r
- // } else {\r
- // validMultipleDelete = false;\r
- // break multicheck;\r
- // }\r
- // }\r
- // }\r
\r
+ // Build conditions\r
+ Node selected = (Node) ((IStructuredSelection) resultTreeViewer\r
+ .getSelection()).getFirstElement();\r
+\r
+ boolean hasSelection = selected != null;\r
+ boolean isParentItemsFolder = hasSelection ? selected\r
+ .isNodeType(AkbTypes.AKB_ITEM_FOLDER) : false;\r
+ boolean isParentConnectorsFolder = hasSelection ? selected\r
+ .isNodeType(AkbTypes.AKB_CONNECTOR_FOLDER) : false;\r
+ boolean isDeletable = hasSelection ? !(selected.getParent()\r
+ .isNodeType(AkbTypes.AKB_ENV_TEMPLATE)) : false;\r
+\r
+ // Add Connector Alias\r
Map<String, String> params = new HashMap<String, String>();\r
+ if (hasSelection)\r
+ params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID,\r
+ selected.getIdentifier());\r
+ params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE,\r
+ AkbTypes.AKB_CONNECTOR_ALIAS);\r
+ refreshParameterizedCommand(menuManager, window,\r
+ "cmd.addConnector", OpenAkbNodeEditor.ID,\r
+ "Add connector Alias", null, isParentConnectorsFolder,\r
+ params);\r
+\r
+ // Add Item\r
+ params = new HashMap<String, String>();\r
+ if (hasSelection)\r
+ params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID,\r
+ selected.getIdentifier());\r
+ params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, AkbTypes.AKB_ITEM);\r
+ refreshParameterizedCommand(menuManager, window, "cmd.addItem",\r
+ OpenAkbNodeEditor.ID, "Add item", null,\r
+ isParentItemsFolder, params);\r
+\r
+ // Add Item Folder\r
+ params = new HashMap<String, String>();\r
+ if (hasSelection)\r
+ params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID,\r
+ selected.getIdentifier());\r
+ params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE,\r
+ AkbTypes.AKB_ITEM_FOLDER);\r
+ refreshParameterizedCommand(menuManager, window,\r
+ "cmd.addItemFolder", OpenAkbNodeEditor.ID,\r
+ "Add item folder", null, isParentItemsFolder, params);\r
+\r
+ // Delete Item\r
+ params = new HashMap<String, String>();\r
+ if (hasSelection)\r
+ params.put(DeleteAkbNodes.PARAM_NODE_JCR_ID,\r
+ selected.getIdentifier());\r
+ refreshParameterizedCommand(menuManager, window, "cmd.deleteItem",\r
+ DeleteAkbNodes.ID, "Delete selected item(s)", null,\r
+ isDeletable, params);\r
+\r
+ // create template\r
+ params = new HashMap<String, String>();\r
params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID,\r
templatesParentNode.getIdentifier());\r
params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE,\r
AkbTypes.AKB_ENV_TEMPLATE);\r
+ refreshParameterizedCommand(menuManager, window,\r
+ "cmd.createTemplate", OpenAkbNodeEditor.ID,\r
+ "Create new template...", null, true, params);\r
\r
- // Effective Refresh\r
- CommandUtils.refreshParametrizedCommand(menuManager, window,\r
- OpenAkbNodeEditor.ID, "Create new template...", null, true,\r
- params);\r
-\r
- //\r
- // CommandUtils.refreshCommand(menuManager, window, DeleteItems.ID,\r
- // DeleteItems.DEFAULT_LABEL, DeleteItems.DEFAULT_IMG_DESCRIPTOR,\r
- // isUnderMyResult || isSingleResultNode || validMultipleDelete);\r
- //\r
- // CommandUtils.refreshCommand(menuManager, window,\r
- // AddResultFolder.ID,\r
- // AddResultFolder.DEFAULT_LABEL,\r
- // ClientUiPlugin.getDefault().getWorkbench().getSharedImages()\r
- // .getImageDescriptor(ISharedImages.IMG_OBJ_ADD),\r
- // canAddSubfolder);\r
- //\r
- // CommandUtils.refreshCommand(menuManager, window,\r
- // RenameResultFolder.ID,\r
- // RenameResultFolder.DEFAULT_LABEL,\r
- // RenameResultFolder.DEFAULT_IMG_DESCRIPTOR, canRenamefolder);\r
- //\r
- // // Command removed for the time being.\r
- // CommandUtils.refreshCommand(menuManager, window,\r
- // RenameResultNode.ID,\r
- // RenameResultNode.DEFAULT_LABEL,\r
- // RenameResultNode.DEFAULT_IMG_DESCRIPTOR, false);\r
- //\r
- // // Test to be removed\r
- // // If you use this pattern, do not forget to call\r
- // // menuManager.setRemoveAllWhenShown(true);\r
- // // when creating the menuManager\r
- //\r
- // // menuManager.add(new Action("Test") {\r
- // // public void run() {\r
- // // log.debug("do something");\r
- // // }\r
- // // });\r
} catch (RepositoryException re) {\r
throw new AkbException("Error while refreshing context menu", re);\r
}\r
}\r
\r
+ /**\r
+ * Commodities the refresh of a single command with a map of parameters in a\r
+ * Menu.aboutToShow method to simplify further development\r
+ * \r
+ * @param menuManager\r
+ * @param locator\r
+ * @param cmdId\r
+ * @param label\r
+ * @param iconPath\r
+ * @param showCommand\r
+ */\r
+ private void refreshParameterizedCommand(IMenuManager menuManager,\r
+ IServiceLocator locator, String itemId, String cmdId, String label,\r
+ ImageDescriptor icon, boolean showCommand,\r
+ Map<String, String> params) {\r
+ IContributionItem ici = menuManager.find(itemId);\r
+ if (ici != null)\r
+ menuManager.remove(ici);\r
+ CommandContributionItemParameter contributionItemParameter = new CommandContributionItemParameter(\r
+ locator, itemId, cmdId, SWT.PUSH);\r
+\r
+ if (showCommand) {\r
+ // Set Params\r
+ contributionItemParameter.label = label;\r
+ contributionItemParameter.icon = icon;\r
+\r
+ if (params != null)\r
+ contributionItemParameter.parameters = params;\r
+\r
+ CommandContributionItem cci = new CommandContributionItem(\r
+ contributionItemParameter);\r
+ menuManager.add(cci);\r
+ }\r
+ }\r
+\r
/* INNER CLASSES */\r
class ViewDoubleClickListener implements IDoubleClickListener {\r
public void doubleClick(DoubleClickEvent evt) {\r
}\r
}\r
\r
- // class MyResultsObserver extends AsyncUiEventListener {\r
- //\r
- // public MyResultsObserver(Display display) {\r
- // super(display);\r
- // }\r
- //\r
- // @Override\r
- // protected Boolean willProcessInUiThread(List<Event> events)\r
- // throws RepositoryException {\r
- // // unfiltered for the time being\r
- // return true;\r
- // }\r
- //\r
- // protected void onEventInUiThread(List<Event> events)\r
- // throws RepositoryException {\r
- // List<Node> nodesToRefresh = new ArrayList<Node>();\r
- //\r
- // for (Event event : events) {\r
- // String parPath = JcrUtils.parentPath(event.getPath());\r
- // if (session.nodeExists(parPath)) {\r
- // Node node = session.getNode(parPath);\r
- // if (!nodesToRefresh.contains(node)) {\r
- // nodesToRefresh.add(node);\r
- // }\r
- // }\r
- // }\r
- //\r
- // // Update check nodes\r
- // for (Node node : nodesToRefresh)\r
- // jcrRefresh(node);\r
- // refresh(null);\r
- // }\r
- // }\r
-\r
- // class AllResultsObserver extends AsyncUiEventListener {\r
- //\r
- // public AllResultsObserver(Display display) {\r
- // super(display);\r
- // }\r
- //\r
- // @Override\r
- // protected Boolean willProcessInUiThread(List<Event> events)\r
- // throws RepositoryException {\r
- // // unfiltered for the time being\r
- // return true;\r
- // }\r
- //\r
- // protected void onEventInUiThread(List<Event> events)\r
- // throws RepositoryException {\r
- // refresh(null);\r
- // // if (lastSelectedSourceElementParent != null)\r
- // // refresh(lastSelectedSourceElementParent);\r
- // }\r
- // }\r
+ @Override\r
+ public void dispose() {\r
+ JcrUtils.logoutQuietly(session);\r
+ super.dispose();\r
+ }\r
\r
/* DEPENDENCY INJECTION */\r
public void setRepository(Repository repository) {\r