--- /dev/null
+package org.argeo.app.ui.library;
+
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_BOOKMARK_FOLDER;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_CREATE_FOLDER;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_DELETE;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_DOWNLOAD_FOLDER;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_RENAME;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_SHARE_FOLDER;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_UPLOAD_FILE;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.argeo.app.ui.widgets.AbstractConnectContextMenu;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Control;
+
+/** Generic popup context menu to manage NIO Path in a Viewer. */
+public class DocumentsContextMenu extends AbstractConnectContextMenu {
+ // Local context
+ private final DocumentsFolderComposite browser;
+ private final DocumentsUiService uiService;
+// private final Repository repository;
+
+ private final static String[] DEFAULT_ACTIONS = { ACTION_ID_CREATE_FOLDER, ACTION_ID_BOOKMARK_FOLDER,
+ ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_RENAME,
+ ACTION_ID_DELETE };
+
+ private Path currFolderPath;
+
+ public DocumentsContextMenu(DocumentsFolderComposite browser,
+ DocumentsUiService documentsUiService) {
+ super(browser.getDisplay(), DEFAULT_ACTIONS);
+ this.browser = browser;
+ this.uiService = documentsUiService;
+// this.repository = repository;
+
+ createControl();
+ }
+
+ public void setCurrFolderPath(Path currFolderPath) {
+ this.currFolderPath = currFolderPath;
+ }
+
+ protected boolean aboutToShow(Control source, Point location, IStructuredSelection selection) {
+ boolean emptySel = true;
+ boolean multiSel = false;
+ boolean isFolder = true;
+ if (selection != null && !selection.isEmpty()) {
+ emptySel = false;
+ multiSel = selection.size() > 1;
+ if (!multiSel && selection.getFirstElement() instanceof Path) {
+ isFolder = Files.isDirectory((Path) selection.getFirstElement());
+ }
+ }
+ if (emptySel) {
+ setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_BOOKMARK_FOLDER);
+ setVisible(false, ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_RENAME, ACTION_ID_DELETE
+ );
+ } else if (multiSel) {
+ setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_DELETE,
+ ACTION_ID_BOOKMARK_FOLDER);
+ setVisible(false, ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_RENAME);
+ } else if (isFolder) {
+ setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_RENAME, ACTION_ID_DELETE,
+ ACTION_ID_BOOKMARK_FOLDER);
+ setVisible(false,
+ // to be implemented
+ ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER);
+ } else {
+ setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_RENAME,
+ ACTION_ID_DELETE);
+ setVisible(false, ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_BOOKMARK_FOLDER);
+ }
+ return true;
+ }
+
+ public void show(Control source, Point location, IStructuredSelection selection, Path currFolderPath) {
+ // TODO find a better way to retrieve the parent path (cannot be deduced
+ // from table content because it will fail on an empty folder)
+ this.currFolderPath = currFolderPath;
+ super.show(source, location, selection);
+
+ }
+
+ @Override
+ protected boolean performAction(String actionId) {
+ switch (actionId) {
+ case ACTION_ID_CREATE_FOLDER:
+ createFolder();
+ break;
+ case ACTION_ID_BOOKMARK_FOLDER:
+ bookmarkFolder();
+ break;
+ case ACTION_ID_RENAME:
+ renameItem();
+ break;
+ case ACTION_ID_DELETE:
+ deleteItems();
+ break;
+// case ACTION_ID_OPEN:
+// openFile();
+// break;
+ case ACTION_ID_UPLOAD_FILE:
+ uploadFiles();
+ break;
+ default:
+ throw new IllegalArgumentException("Unimplemented action " + actionId);
+ // case ACTION_ID_SHARE_FOLDER:
+ // return "Share Folder";
+ // case ACTION_ID_DOWNLOAD_FOLDER:
+ // return "Download as zip archive";
+ }
+ browser.setFocus();
+ return false;
+ }
+
+ @Override
+ protected String getLabel(String actionId) {
+ return uiService.getLabel(actionId);
+ }
+
+ private void openFile() {
+ IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
+ if (selection.isEmpty() || selection.size() > 1)
+ // Should never happen
+ return;
+ Path toOpenPath = ((Path) selection.getFirstElement());
+ uiService.openFile(toOpenPath);
+ }
+
+ private void deleteItems() {
+ IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
+ if (selection.isEmpty())
+ return;
+ else if (uiService.deleteItems(getParentShell(), selection))
+ browser.refresh();
+ }
+
+ private void renameItem() {
+ IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
+ if (selection.isEmpty() || selection.size() > 1)
+ // Should never happen
+ return;
+ Path toRenamePath = ((Path) selection.getFirstElement());
+ if (uiService.renameItem(getParentShell(), currFolderPath, toRenamePath))
+ browser.refresh();
+ }
+
+ private void createFolder() {
+ if (uiService.createFolder(getParentShell(), currFolderPath))
+ browser.refresh();
+ }
+
+ private void bookmarkFolder() {
+ Path toBookmarkPath = null;
+ IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
+ if (selection.isEmpty())
+ toBookmarkPath = currFolderPath;
+ else if (selection.size() > 1)
+ toBookmarkPath = currFolderPath;
+ else if (selection.size() == 1) {
+ Path currSelected = ((Path) selection.getFirstElement());
+ if (Files.isDirectory(currSelected))
+ toBookmarkPath = currSelected;
+ else
+ return;
+ }
+ //uiService.bookmarkFolder(toBookmarkPath, repository, null);
+ }
+
+ private void uploadFiles() {
+ if (uiService.uploadFiles(getParentShell(), currFolderPath))
+ browser.refresh();
+ }
+}