| /******************************************************************************* |
| * Copyright (c) 2008 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.equinox.internal.security.ui.storage.view; |
| |
| import org.eclipse.equinox.internal.security.ui.Activator; |
| import org.eclipse.equinox.internal.security.ui.nls.SecUIMessages; |
| import org.eclipse.equinox.internal.security.ui.storage.IStorageConst; |
| import org.eclipse.equinox.security.storage.ISecurePreferences; |
| import org.eclipse.equinox.security.storage.SecurePreferencesFactory; |
| import org.eclipse.jface.action.*; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.viewers.*; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.Tree; |
| |
| /** |
| * View of nodes available on the secure preferences tree. |
| */ |
| public class NodesView { |
| |
| /** |
| * For tree viewer to work, the input must not be the same as the root node |
| * or it will get short circuit. Also input can not be null - so have to pass |
| * some dummy value as an input. |
| */ |
| final private static String defaultPrefs = "default"; //$NON-NLS-1$ |
| |
| protected ISecurePreferencesSelection parentView; |
| protected TreeViewer nodeTreeViewer; |
| |
| protected ViewContentProvider contentProvider; |
| |
| protected Action addNodeAction; |
| protected Action removeNodeAction; |
| protected Action refreshNodesAction; |
| |
| class ViewContentProvider implements ITreeContentProvider { |
| |
| public void inputChanged(Viewer v, Object oldInput, Object newInput) { |
| if (nodeTreeViewer != null) { |
| nodeTreeViewer.setSelection(null); |
| nodeTreeViewer.refresh(); |
| } |
| } |
| |
| public void dispose() { |
| // nothing to do |
| } |
| |
| public Object[] getElements(Object parent) { |
| if (defaultPrefs.equals(parent)) |
| return new Object[] {SecurePreferencesFactory.getDefault()}; |
| return new Object[0]; |
| } |
| |
| public Object getParent(Object child) { |
| if (!(child instanceof ISecurePreferences)) |
| return null; |
| ISecurePreferences node = (ISecurePreferences) child; |
| ISecurePreferences parentNode = node.parent(); |
| if (parentNode == null) |
| return null; |
| return node.parent(); |
| } |
| |
| public Object[] getChildren(Object parent) { |
| if (!(parent instanceof ISecurePreferences)) |
| return new Object[0]; |
| ISecurePreferences node = (ISecurePreferences) parent; |
| String[] childrenNames = node.childrenNames(); |
| ISecurePreferences[] result = new ISecurePreferences[childrenNames.length]; |
| for (int i = 0; i < childrenNames.length; i++) |
| result[i] = node.node(childrenNames[i]); |
| return result; |
| } |
| |
| public boolean hasChildren(Object parent) { |
| if (!(parent instanceof ISecurePreferences)) |
| return false; |
| ISecurePreferences node = (ISecurePreferences) parent; |
| String[] childrenNames = node.childrenNames(); |
| return (childrenNames.length > 0); |
| } |
| } |
| |
| class ViewLabelProvider extends LabelProvider { |
| |
| public String getText(Object obj) { |
| if (!(obj instanceof ISecurePreferences)) |
| return obj.toString(); |
| ISecurePreferences node = (ISecurePreferences) obj; |
| if (node.parent() == null) |
| return '[' + SecUIMessages.rootNodeName + ']'; |
| return node.name(); |
| } |
| |
| public Image getImage(Object obj) { |
| return null; |
| } |
| } |
| |
| public NodesView(Tree nodeTree, final ISecurePreferencesSelection parentView) { |
| this.parentView = parentView; |
| |
| nodeTreeViewer = new TreeViewer(nodeTree); |
| contentProvider = new ViewContentProvider(); |
| nodeTreeViewer.setContentProvider(contentProvider); |
| nodeTreeViewer.setLabelProvider(new ViewLabelProvider()); |
| nodeTreeViewer.setInput(defaultPrefs); |
| |
| nodeTreeViewer.addSelectionChangedListener(event -> { |
| TreeSelection selection = (TreeSelection) event.getSelection(); |
| Object selected = selection.getFirstElement(); |
| if (selected instanceof ISecurePreferences) |
| parentView.setSelection((ISecurePreferences) selected); |
| else |
| parentView.setSelection(null); |
| }); |
| |
| if (Activator.getDefault().debugStorageContents()) { |
| makeActions(); |
| hookContextMenu(); |
| } |
| } |
| |
| private void hookContextMenu() { |
| MenuManager menuMgr = new MenuManager(SecUIMessages.nodesContextMenu); |
| |
| menuMgr.addMenuListener(manager -> { |
| boolean canRemove = false; |
| boolean canAdd = false; |
| TreeSelection selection = (TreeSelection) nodeTreeViewer.getSelection(); |
| Object selected = selection.getFirstElement(); |
| if (selected instanceof ISecurePreferences) { |
| ISecurePreferences node = (ISecurePreferences) selected; |
| boolean isRoot = (node.parent() == null); |
| boolean isInternal = node.absolutePath().startsWith(IStorageConst.PROVIDER_NODE); |
| canRemove = (!isRoot && !isInternal); |
| canAdd = !isInternal; |
| } |
| removeNodeAction.setEnabled(canRemove); |
| addNodeAction.setEnabled(canAdd); |
| }); |
| Menu menu = menuMgr.createContextMenu(nodeTreeViewer.getControl()); |
| nodeTreeViewer.getControl().setMenu(menu); |
| |
| // fill context menu |
| menuMgr.add(refreshNodesAction); |
| menuMgr.add(new Separator()); |
| menuMgr.add(addNodeAction); |
| menuMgr.add(removeNodeAction); |
| } |
| |
| private void makeActions() { |
| refreshNodesAction = new Action() { |
| public void run() { |
| nodeTreeViewer.refresh(); |
| } |
| }; |
| refreshNodesAction.setText(SecUIMessages.refreshNodesCommand); |
| refreshNodesAction.setToolTipText(SecUIMessages.refreshNodesCommandTip); |
| refreshNodesAction.setImageDescriptor(ImageDescriptor.createFromFile(NodesView.class, "/icons/storage/node_refresh.gif")); //$NON-NLS-1$ |
| |
| addNodeAction = new Action() { |
| public void run() { |
| TreeSelection selection = (TreeSelection) nodeTreeViewer.getSelection(); |
| Object selected = selection.getFirstElement(); |
| if (selected instanceof ISecurePreferences) { |
| ISecurePreferences node = (ISecurePreferences) selected; |
| |
| NewNodeDialog nodeDialog = new NewNodeDialog(nodeTreeViewer.getControl().getShell()); |
| if (nodeDialog.open() != Window.OK) |
| return; |
| String name = nodeDialog.getNodeName(); |
| ISecurePreferences child = node.node(name); |
| parentView.modified(); |
| |
| // expand and select new node |
| ISecurePreferences parentNode = child.parent(); |
| if (parentNode != null) |
| nodeTreeViewer.refresh(parentNode, false); |
| else |
| nodeTreeViewer.refresh(false); |
| nodeTreeViewer.expandToLevel(child, 0); |
| nodeTreeViewer.setSelection(new StructuredSelection(child), true); |
| } |
| |
| } |
| }; |
| addNodeAction.setText(SecUIMessages.addNodeCommand); |
| addNodeAction.setToolTipText(SecUIMessages.addNodeCommandTip); |
| addNodeAction.setImageDescriptor(ImageDescriptor.createFromFile(NodesView.class, "/icons/storage/node_new.gif")); //$NON-NLS-1$ |
| |
| removeNodeAction = new Action() { |
| public void run() { |
| TreeSelection selection = (TreeSelection) nodeTreeViewer.getSelection(); |
| Object selected = selection.getFirstElement(); |
| |
| if (selected instanceof ISecurePreferences) { |
| ISecurePreferences node = (ISecurePreferences) selected; |
| ISecurePreferences parentNode = node.parent(); |
| if (parentNode == null) |
| return; // can't remove root node |
| node.removeNode(); |
| parentView.modified(); |
| |
| // refresh parent node and select it |
| nodeTreeViewer.refresh(parentNode, false); |
| nodeTreeViewer.setSelection(new StructuredSelection(parentNode), true); |
| } |
| } |
| }; |
| removeNodeAction.setText(SecUIMessages.removeNodeCommand); |
| removeNodeAction.setToolTipText(SecUIMessages.removeNodeCommandTip); |
| removeNodeAction.setImageDescriptor(ImageDescriptor.createFromFile(NodesView.class, "/icons/storage/node_delete.gif")); //$NON-NLS-1$ |
| } |
| |
| public void setFocus() { |
| nodeTreeViewer.getControl().setFocus(); |
| } |
| |
| public void postDeleted() { |
| if (contentProvider == null) |
| return; |
| nodeTreeViewer.setSelection(StructuredSelection.EMPTY); |
| nodeTreeViewer.refresh(); |
| } |
| } |