]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/WkspCategoryBaseListPage.java
Fix distribution editor after further testing with maven produced releases
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / editors / WkspCategoryBaseListPage.java
index fa9f65f9689a16c6dad9c6e58597ddeedb47f0ed..751d26cdc17e733236377654f361c1b08540e911 100644 (file)
 package org.argeo.slc.client.ui.dist.editors;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.observation.Event;
 import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.qom.Constraint;
@@ -32,16 +35,19 @@ import javax.jcr.query.qom.QueryObjectModelFactory;
 import javax.jcr.query.qom.Selector;
 import javax.jcr.query.qom.StaticOperand;
 
-import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
 import org.argeo.eclipse.ui.utils.CommandUtils;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.slc.SlcException;
+import org.argeo.slc.client.ui.dist.DistConstants;
 import org.argeo.slc.client.ui.dist.DistImages;
 import org.argeo.slc.client.ui.dist.DistPlugin;
-import org.argeo.slc.client.ui.dist.commands.MarkAsRelevantCategory;
+import org.argeo.slc.client.ui.dist.commands.OpenGenerateBinariesWizard;
+import org.argeo.slc.client.ui.dist.commands.OpenModuleEditor;
 import org.argeo.slc.client.ui.dist.utils.NodeViewerComparator;
 import org.argeo.slc.jcr.SlcNames;
 import org.argeo.slc.jcr.SlcTypes;
+import org.argeo.slc.repo.RepoConstants;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
@@ -55,22 +61,20 @@ import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.forms.IManagedForm;
 import org.eclipse.ui.forms.editor.FormEditor;
 import org.eclipse.ui.forms.editor.FormPage;
@@ -93,10 +97,14 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames {
        private NodeViewerComparator comparator;
        private TableViewer viewer;
        private FormToolkit tk;
-       private Composite header;
        private Text filterTxt;
        private final static String FILTER_HELP_MSG = "Enter filter criterion separated by a space";
 
+       // Observes changes
+       // private final static String[] observedTypes = { SlcTypes.SLC_GROUP_BASE
+       // };
+       // private CategoryObserver categoriesObserver;
+
        public WkspCategoryBaseListPage(FormEditor formEditor, String title,
                        Session session) {
                super(formEditor, PAGE_ID, title);
@@ -108,29 +116,40 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames {
                ScrolledForm form = managedForm.getForm();
                tk = managedForm.getToolkit();
 
-               form.setText("Category base definition");
-               form.setMessage("Define relevant group base objects",
+               form.setText("Define Relevant Categories");
+               form.setMessage("Choose in the below list "
+                               + "the categories that can be used as base for "
+                               + "modular distributions maintained via the current workspace",
                                IMessageProvider.NONE);
 
                // Main Layout
                GridLayout layout = new GridLayout(1, false);
                Composite body = form.getBody();
                body.setLayout(layout);
-               // Add the filter section
-               createFilterPart(body);
-               // Add the table
-               createTableViewer(body);
-
-               // Add a listener to enable custom resize process
-               form.addControlListener(new ControlListener() {
-                       // form.addListener(SWT.RESIZE, new Listener() does not work
-                       public void controlResized(ControlEvent e) {
-                               refreshLayout();
-                       }
 
-                       public void controlMoved(ControlEvent e) {
-                       }
-               });
+               // filter section
+               Composite header = tk.createComposite(body);
+               header.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               createFilterPart(header);
+
+               // the table
+               Composite tableCmp = tk.createComposite(body);
+               tableCmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               createTableViewer(tableCmp);
+
+               // categoriesObserver = new CategoryObserver(viewer.getTable()
+               // .getDisplay());
+               // try {
+               // ObservationManager observationManager = session.getWorkspace()
+               // .getObservationManager();
+               // // FIXME Will not be notified if empty result is deleted
+               // observationManager.addEventListener(categoriesObserver,
+               // Event.PROPERTY_CHANGED, "/", true, null, observedTypes,
+               // false);
+               // } catch (RepositoryException e) {
+               // throw new SlcException("Cannot register listeners", e);
+               // }
+
                refresh();
        }
 
@@ -192,39 +211,29 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames {
        }
 
        private void createFilterPart(Composite parent) {
-               header = tk.createComposite(parent);
                GridLayout layout = new GridLayout(2, false);
                layout.marginWidth = layout.marginHeight = layout.verticalSpacing = 0;
                layout.horizontalSpacing = 5;
-               header.setLayout(layout);
-               GridData gd = new GridData(SWT.FILL, SWT.FILL, false, false);
-               header.setLayoutData(gd);
+               parent.setLayout(layout);
 
                // Text Area to filter
-               filterTxt = tk.createText(header, "", SWT.BORDER | SWT.SINGLE
+               filterTxt = tk.createText(parent, "", SWT.BORDER | SWT.SINGLE
                                | SWT.SEARCH | SWT.CANCEL);
                filterTxt.setMessage(FILTER_HELP_MSG);
-               gd = new GridData(SWT.FILL, SWT.FILL, false, false);
-               gd.grabExcessHorizontalSpace = true;
-               filterTxt.setLayoutData(gd);
+               filterTxt.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
                filterTxt.addModifyListener(new ModifyListener() {
                        public void modifyText(ModifyEvent event) {
                                refresh();
                        }
                });
 
-               Button resetBtn = tk.createButton(header, null, SWT.PUSH);
+               Button resetBtn = tk.createButton(parent, null, SWT.PUSH);
                resetBtn.setImage(DistImages.IMG_REPO_READONLY);
-               resetBtn.addSelectionListener(new SelectionListener() {
-
+               resetBtn.addSelectionListener(new SelectionAdapter() {
                        public void widgetSelected(SelectionEvent e) {
                                resetFilter();
                        }
-
-                       public void widgetDefaultSelected(SelectionEvent e) {
-                       }
                });
-
        }
 
        private void resetFilter() {
@@ -233,12 +242,13 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames {
        }
 
        private void createTableViewer(Composite parent) {
+               parent.setLayout(new FillLayout());
                // helpers to enable sorting by column
                List<String> propertiesList = new ArrayList<String>();
                List<Integer> propertyTypesList = new ArrayList<Integer>();
 
                // Define the TableViewer
-               viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
+               viewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL
                                | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
 
                TableViewerColumn col;
@@ -267,20 +277,21 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames {
                        }
                });
                col.getColumn().addSelectionListener(getSelectionAdapter(0));
-               propertiesList.add(SLC_NAME);
+               propertiesList.add(SLC_GROUP_BASE_ID);
                propertyTypesList.add(PropertyType.STRING);
 
                // Version
                col = new TableViewerColumn(viewer, SWT.NONE);
                col.getColumn().setWidth(80);
-               col.getColumn().setText("Is category");
+               col.getColumn().setText("Has binaries");
                col.setLabelProvider(new ColumnLabelProvider() {
                        @Override
                        public String getText(Object element) {
                                try {
-                                       return ((Node) element)
-                                                       .isNodeType(SlcTypes.SLC_RELEVANT_CATEGORY) ? "Yes"
-                                                       : "-";
+                                       Node currNode = (Node) element;
+
+                                       return currNode.hasNode(RepoConstants.BINARIES_ARTIFACT_ID) ? "Yes"
+                                                       : "No";
                                } catch (RepositoryException e) {
                                        throw new SlcException("unable to check type of node "
                                                        + element, e);
@@ -331,18 +342,48 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames {
                // Mark as category base
                Object firstElement = ((IStructuredSelection) viewer.getSelection())
                                .getFirstElement();
-               boolean showMark = false;
+               Node currSelected = (Node) firstElement;
+
+               DistWkspEditorInput input = (DistWkspEditorInput) getEditorInput();
+
+               Map<String, String> params = new HashMap<String, String>();
+               params.put(OpenGenerateBinariesWizard.PARAM_REPO_NODE_PATH,
+                               input.getRepoNodePath());
                try {
-                       showMark = !((Node) firstElement)
-                                       .isNodeType(SlcTypes.SLC_RELEVANT_CATEGORY);
+                       params.put(OpenGenerateBinariesWizard.PARAM_MODULE_PATH,
+                                       currSelected.getPath());
                } catch (RepositoryException e) {
-                       throw new SlcException("unable to check type of node "
-                                       + firstElement, e);
+                       throw new SlcException("Unable to get path for " + currSelected, e);
                }
-               CommandUtils.refreshCommand(menuManager, window,
-                               MarkAsRelevantCategory.ID,
-                               MarkAsRelevantCategory.DEFAULT_LABEL,
-                               MarkAsRelevantCategory.DEFAULT_ICON, showMark);
+               params.put(OpenGenerateBinariesWizard.PARAM_WORKSPACE_NAME,
+                               input.getWorkspaceName());
+
+               CommandUtils.refreshParametrizedCommand(menuManager, window,
+                               OpenGenerateBinariesWizard.ID,
+                               OpenGenerateBinariesWizard.DEFAULT_LABEL,
+                               OpenGenerateBinariesWizard.DEFAULT_ICON, true, params);
+
+               // boolean isRelevant = false;
+               // try {
+               // isRelevant = currSelected.isNodeType(SlcTypes.SLC_CATEGORY);
+               // boolean canEdit = currSelected.canAddMixin(SlcTypes.SLC_CATEGORY);
+               //
+               // } catch (RepositoryException e) {
+               // throw new SlcException("unable to check type of node "
+               // + firstElement, e);
+               // }
+               // // Add
+               // if (isRelevant) {// Remove
+               // CommandUtils.refreshCommand(menuManager, window,
+               // MarkAsRelevantCategory.ID,
+               // MarkAsRelevantCategory.DEFAULT_REMOVE_LABEL,
+               // MarkAsRelevantCategory.DEFAULT_REMOVE_ICON, true);
+               // } else {
+               // CommandUtils.refreshCommand(menuManager, window,
+               // MarkAsRelevantCategory.ID,
+               // MarkAsRelevantCategory.DEFAULT_LABEL,
+               // MarkAsRelevantCategory.DEFAULT_ICON, true);
+               // }
        }
 
        private SelectionAdapter getSelectionAdapter(final int index) {
@@ -391,54 +432,62 @@ public class WkspCategoryBaseListPage extends FormPage implements SlcNames {
                public void doubleClick(DoubleClickEvent event) {
                        Object obj = ((IStructuredSelection) event.getSelection())
                                        .getFirstElement();
-                       try {
-                               if (obj instanceof Node) {
-                                       Node node = (Node) obj;
-                                       if (node.isNodeType(SlcTypes.SLC_BUNDLE_ARTIFACT)) {
-                                               GenericBundleEditorInput gaei = new GenericBundleEditorInput(
-                                                               node);
-                                               DistPlugin.getDefault().getWorkbench()
-                                                               .getActiveWorkbenchWindow().getActivePage()
-                                                               .openEditor(gaei, GenericBundleEditor.ID);
+                       if (obj instanceof Node) {
+                               Node node = (Node) obj;
+                               try {
+                                       if (node.isNodeType(SlcTypes.SLC_ARTIFACT)) {
+                                               DistWkspEditorInput dwip = (DistWkspEditorInput) getEditorInput();
+                                               Map<String, String> params = new HashMap<String, String>();
+                                               params.put(OpenModuleEditor.PARAM_REPO_NODE_PATH,
+                                                               dwip.getRepoNodePath());
+                                               params.put(OpenModuleEditor.PARAM_REPO_URI,
+                                                               dwip.getUri());
+                                               params.put(OpenModuleEditor.PARAM_WORKSPACE_NAME,
+                                                               dwip.getWorkspaceName());
+                                               String path = node.getPath();
+                                               params.put(OpenModuleEditor.PARAM_MODULE_PATH, path);
+                                               CommandUtils.callCommand(OpenModuleEditor.ID, params);
                                        }
+                               } catch (RepositoryException re) {
+                                       throw new SlcException("Cannot get path for node " + node
+                                                       + " while setting parameters for "
+                                                       + "command OpenModuleEditor", re);
                                }
-                       } catch (RepositoryException re) {
-                               throw new ArgeoException(
-                                               "Repository error while getting node info", re);
-                       } catch (PartInitException pie) {
-                               throw new ArgeoException(
-                                               "Unexepected exception while opening artifact editor",
-                                               pie);
+
                        }
                }
        }
 
-       /**
-        * UI Trick to put scroll bar on the table rather than on the scrollform
-        */
-       private void refreshLayout() {
-               // Compute desired table size
-               int maxH = getManagedForm().getForm().getSize().y;
-               int maxW = getManagedForm().getForm().getParent().getSize().x;
-               maxH = maxH - header.getSize().y;
-               final Table table = viewer.getTable();
-               GridData gd = new GridData(SWT.LEFT, SWT.TOP, true, true);
+       class CategoryObserver extends AsyncUiEventListener {
 
-               // when table height is less than 200 px, we let the scroll bar on the
-               // scrollForm
-               // FIXME substract some spare space. There is room here for optimization
-               gd.heightHint = Math.max(maxH - 35, 200);
-               gd.widthHint = Math.max(maxW - 35, 200);
+               public CategoryObserver(Display display) {
+                       super(display);
+               }
 
-               table.setLayoutData(gd);
-               getManagedForm().reflow(true);
+               @Override
+               protected Boolean willProcessInUiThread(List<Event> events)
+                               throws RepositoryException {
+                       for (Event event : events) {
+                               String path = event.getPath();
+                               if (JcrUtils.lastPathElement(path).equals(
+                                               DistConstants.JCR_MIXIN_TYPES))
+                                       return true;
+                       }
+                       return false;
+               }
+
+               protected void onEventInUiThread(List<Event> events)
+                               throws RepositoryException {
+                       if (getLog().isTraceEnabled())
+                               getLog().trace("Refresh table");
+                       viewer.refresh();
+               }
        }
 
        @Override
        public void setActive(boolean active) {
                super.setActive(active);
                if (active) {
-                       refreshLayout();
                }
        }
 }
\ No newline at end of file