blob: 5d873c8ba39b9a18b90f160fbdcdd35604d1f54d [file] [log] [blame]
/*******************************************************************************
* 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();
}
}