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
\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
IWorkbenchWindow window = AkbUiPlugin.getDefault().getWorkbench()\r
.getActiveWorkbenchWindow();\r
try {\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
-\r
- // Effective Refresh\r
- CommandUtils.refreshParametrizedCommand(menuManager, window,\r
- OpenAkbNodeEditor.ID, "Create new template...", null, true,\r
- params);\r
+ refreshParameterizedCommand(menuManager, window,\r
+ "cmd.createTemplate", OpenAkbNodeEditor.ID,\r
+ "Create new template...", null, true, params);\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