| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.motorolamobility.studio.android.certmanager.views; |
| |
| import java.util.Collections; |
| import java.util.List; |
| |
| import org.eclipse.jface.action.IMenuListener; |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.action.MenuManager; |
| import org.eclipse.jface.action.Separator; |
| import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.TreeViewerColumn; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.Tree; |
| import org.eclipse.swt.widgets.TreeColumn; |
| import org.eclipse.ui.IWorkbenchActionConstants; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.part.ViewPart; |
| |
| import com.motorola.studio.android.common.log.StudioLogger; |
| import com.motorolamobility.studio.android.certmanager.event.IKeyStoreModelListener; |
| import com.motorolamobility.studio.android.certmanager.event.KeyStoreModelEvent; |
| import com.motorolamobility.studio.android.certmanager.event.KeyStoreModelEventManager; |
| import com.motorolamobility.studio.android.certmanager.exception.KeyStoreManagerException; |
| import com.motorolamobility.studio.android.certmanager.i18n.CertificateManagerNLS; |
| import com.motorolamobility.studio.android.certmanager.ui.model.ITreeNode; |
| import com.motorolamobility.studio.android.certmanager.ui.model.KeyStoreRootNode; |
| import com.motorolamobility.studio.android.certmanager.ui.model.SigningAndKeysModelManager; |
| import com.motorolamobility.studio.android.certmanager.ui.tree.ExpiresInColumnLabelProvider; |
| import com.motorolamobility.studio.android.certmanager.ui.tree.KeystoreManagerTreeContentProvider; |
| import com.motorolamobility.studio.android.certmanager.ui.tree.LastBackupDateColumnLabelProvider; |
| import com.motorolamobility.studio.android.certmanager.ui.tree.NameAliasColumnLabelProvider; |
| import com.motorolamobility.studio.android.certmanager.ui.tree.PathColumnLabelProvider; |
| import com.motorolamobility.studio.android.certmanager.ui.tree.TypeColumnLabelProvider; |
| |
| /** |
| * View to manage certificates under MOTODEV Studio for Android |
| */ |
| public class KeystoreManagerView extends ViewPart implements IKeyStoreModelListener |
| { |
| /** |
| * The ID of the view as specified by the extension. |
| */ |
| public static final String ID = "com.motorola.studio.android.packaging.ui.signingview"; //$NON-NLS-1$ |
| |
| private TreeViewer viewer; |
| |
| /** |
| * This is a callback that will allow us |
| * to create the viewer and initialize it. |
| */ |
| @Override |
| public void createPartControl(Composite parent) |
| { |
| viewer = |
| new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER |
| | SWT.FULL_SELECTION | SWT.VIRTUAL | SWT.MULTI); //Virtual is required due to ILazyTreeContentProvider |
| viewer.setUseHashlookup(true); |
| viewer.setAutoExpandLevel(0); |
| |
| viewer.setContentProvider(new KeystoreManagerTreeContentProvider(viewer)); |
| viewer.setInput(getInitalInput()); |
| viewer.expandToLevel(getInitalInput(), 1); |
| ColumnViewerToolTipSupport.enableFor(viewer); |
| |
| getSite().setSelectionProvider(viewer); |
| |
| Tree tree = viewer.getTree(); |
| tree.setLinesVisible(true); |
| tree.setHeaderVisible(true); |
| tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); |
| { |
| TreeViewerColumn treeViewerColumn = new TreeViewerColumn(viewer, SWT.NONE); |
| treeViewerColumn.setLabelProvider(new NameAliasColumnLabelProvider()); |
| TreeColumn trclmnNewColumn = treeViewerColumn.getColumn(); |
| trclmnNewColumn.setWidth(250); |
| trclmnNewColumn |
| .setText(CertificateManagerNLS.CertificateManagerView_NameAlias_ColumnName); |
| |
| tree.setSortColumn(treeViewerColumn.getColumn()); |
| tree.setSortDirection(SWT.DOWN); |
| } |
| { |
| TreeViewerColumn treeViewerColumn = new TreeViewerColumn(viewer, SWT.NONE); |
| treeViewerColumn.setLabelProvider(new TypeColumnLabelProvider()); |
| TreeColumn trclmnNewColumn = treeViewerColumn.getColumn(); |
| trclmnNewColumn.setWidth(75); |
| trclmnNewColumn.setText(CertificateManagerNLS.CertificateManagerView_Type_ColumnName); |
| } |
| { |
| TreeViewerColumn treeViewerColumn = new TreeViewerColumn(viewer, SWT.NONE); |
| treeViewerColumn.setLabelProvider(new ExpiresInColumnLabelProvider()); |
| TreeColumn trclmnExpiresIn = treeViewerColumn.getColumn(); |
| trclmnExpiresIn.setWidth(100); |
| trclmnExpiresIn |
| .setText(CertificateManagerNLS.CertificateManagerView_ExpiresIn_ColumnName); |
| } |
| { |
| TreeViewerColumn treeViewerColumn = new TreeViewerColumn(viewer, SWT.NONE); |
| treeViewerColumn.setLabelProvider(new LastBackupDateColumnLabelProvider()); |
| TreeColumn trclmnLastBackupDate = treeViewerColumn.getColumn(); |
| trclmnLastBackupDate.setWidth(125); |
| trclmnLastBackupDate |
| .setText(CertificateManagerNLS.CertificateManagerView_LastBackupDate_ColumnName); |
| } |
| { |
| TreeViewerColumn treeViewerColumn = new TreeViewerColumn(viewer, SWT.LEFT); |
| treeViewerColumn.setLabelProvider(new PathColumnLabelProvider()); |
| TreeColumn trclmnPath = treeViewerColumn.getColumn(); |
| trclmnPath.setWidth(500); |
| trclmnPath.setText(CertificateManagerNLS.CertificateManagerView_Path_ColumnName); |
| } |
| |
| // Create the help context id for the viewer's control |
| PlatformUI |
| .getWorkbench() |
| .getHelpSystem() |
| .setHelp(viewer.getControl(), |
| "com.motorolamobility.studio.android.certmanager.viewer"); //$NON-NLS-1$ |
| |
| hookContextMenu(); |
| |
| getSite().setSelectionProvider(viewer); |
| |
| //register listener for model changes |
| KeyStoreModelEventManager.getInstance().addListener(this); |
| } |
| |
| private void hookContextMenu() |
| { |
| MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ |
| menuMgr.setRemoveAllWhenShown(true); |
| menuMgr.addMenuListener(new IMenuListener() |
| { |
| @Override |
| public void menuAboutToShow(IMenuManager manager) |
| { |
| fillContextMenu(manager); |
| } |
| }); |
| Menu menu = menuMgr.createContextMenu(viewer.getControl()); |
| viewer.getControl().setMenu(menu); |
| getSite().registerContextMenu(menuMgr, viewer); |
| } |
| |
| private void fillContextMenu(IMenuManager manager) |
| { |
| // Other plug-ins can contribute there actions here |
| // manager.add(openClose); |
| manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); |
| } |
| |
| /** |
| * Loads the keystores from preference and <user_home>\motodevstudio\tools\motodev.keystore |
| * @return root node (invisible) that contains as children the keystores. |
| */ |
| private Object getInitalInput() |
| { |
| return SigningAndKeysModelManager.getInstance().getKeyStoresRootNode(); |
| } |
| |
| /** |
| * Passing the focus request to the viewer's control. |
| */ |
| @Override |
| public void setFocus() |
| { |
| viewer.getControl().setFocus(); |
| } |
| |
| public TreeViewer getTreeViewer() |
| { |
| return viewer; |
| } |
| |
| /** |
| * Closing the view |
| */ |
| @Override |
| public void dispose() |
| { |
| super.dispose(); |
| //remove listener for model changes |
| KeyStoreModelEventManager.getInstance().removeListener(this); |
| } |
| |
| /* (non-Javadoc) |
| * @see com.motorolamobility.studio.android.certmanager.event.IKeyStoreModelListener#handleNodeAdditionEvent(com.motorolamobility.studio.android.certmanager.event.KeyStoreModelEvent) |
| */ |
| @Override |
| public void handleNodeAdditionEvent(final KeyStoreModelEvent keyStoreModeEvent) |
| { |
| Display display = Display.getDefault(); |
| if (!display.isDisposed()) |
| { |
| display.syncExec(new Runnable() |
| { |
| @Override |
| public void run() |
| { |
| ITreeNode treeNodeItem = keyStoreModeEvent.getTreeNodeItem(); |
| ITreeNode parentNode = treeNodeItem.getParent(); |
| |
| /* (parentNode instanceof KeyStoreRootNode) is a workaround to add nodes to the root node |
| * since getTreeViewer().getExpandedState(parentNode) always return false when the parentNode |
| * is the root node (KeyStoreRootNode in this case) |
| */ |
| if (getTreeViewer().getExpandedState(parentNode) |
| || (parentNode instanceof KeyStoreRootNode)) |
| { |
| getTreeViewer().add(parentNode, treeNodeItem); |
| } |
| else |
| { |
| List<ITreeNode> children; |
| try |
| { |
| children = parentNode.getChildren(); |
| } |
| catch (KeyStoreManagerException e) |
| { |
| children = Collections.emptyList(); |
| } |
| |
| if (children.size() > 0) |
| { |
| getTreeViewer().setChildCount(parentNode, children.size()); |
| } |
| } |
| } |
| }); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see com.motorolamobility.studio.android.certmanager.event.IKeyStoreModelListener#handleNodeRemovalEvent(com.motorolamobility.studio.android.certmanager.event.KeyStoreModelEvent) |
| */ |
| @Override |
| public void handleNodeRemovalEvent(final KeyStoreModelEvent keyStoreModeEvent) |
| { |
| Display display = Display.getDefault(); |
| if (!display.isDisposed()) |
| { |
| display.syncExec(new Runnable() |
| { |
| @Override |
| public void run() |
| { |
| if (!getTreeViewer().getTree().isDisposed()) |
| { |
| getTreeViewer().remove(keyStoreModeEvent.getTreeNodeItem()); |
| } |
| } |
| }); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see com.motorolamobility.studio.android.certmanager.event.IKeyStoreModelListener#handleNodeUpdateEvent(com.motorolamobility.studio.android.certmanager.event.KeyStoreModelEvent) |
| */ |
| @Override |
| public void handleNodeUpdateEvent(final KeyStoreModelEvent keyStoreModeEvent) |
| { |
| Display display = Display.getDefault(); |
| if (!display.isDisposed()) |
| { |
| display.asyncExec(new Runnable() |
| { |
| @Override |
| public void run() |
| { |
| ITreeNode treeNode = keyStoreModeEvent.getTreeNodeItem(); |
| getTreeViewer().update(treeNode, null); |
| } |
| }); |
| } |
| } |
| |
| @Override |
| public void handleNodeCollapseEvent(final KeyStoreModelEvent keyStoreModelEvent) |
| { |
| Display display = Display.getDefault(); |
| if (!display.isDisposed()) |
| { |
| display.asyncExec(new Runnable() |
| { |
| @Override |
| public void run() |
| { |
| ITreeNode treeNode = keyStoreModelEvent.getTreeNodeItem(); |
| //Ugly workaround to avoid JFace treeViewer to enter in a infinite loop asking for children all the time. |
| getTreeViewer().remove(treeNode); |
| getTreeViewer().add(treeNode.getParent(), treeNode); |
| } |
| }); |
| } |
| } |
| |
| @Override |
| public void handleNodeRefreshEvent(final KeyStoreModelEvent keyStoreModelEvent) |
| { |
| Display display = Display.getDefault(); |
| if (!display.isDisposed()) |
| { |
| display.asyncExec(new Runnable() |
| { |
| @Override |
| public void run() |
| { |
| ITreeNode treeNode = keyStoreModelEvent.getTreeNodeItem(); |
| if (treeNode != null) |
| { |
| try |
| { |
| getTreeViewer().remove(treeNode, treeNode.getChildren().toArray()); |
| } |
| catch (KeyStoreManagerException e) |
| { |
| StudioLogger.error("Error while accessing keystore manager. " |
| + e.getMessage()); |
| } |
| |
| getTreeViewer().refresh(treeNode, true); |
| } |
| } |
| }); |
| } |
| } |
| |
| @Override |
| public void handleNodeClearEvent(final KeyStoreModelEvent keyStoreModelEvent) |
| { |
| Display display = Display.getDefault(); |
| if (!display.isDisposed()) |
| { |
| display.syncExec(new Runnable() |
| { |
| @Override |
| public void run() |
| { |
| ITreeNode treeNode = keyStoreModelEvent.getTreeNodeItem(); |
| if (treeNode != null) |
| { |
| try |
| { |
| getTreeViewer().remove(treeNode, treeNode.getChildren().toArray()); |
| getTreeViewer().setChildCount(treeNode, 0); |
| } |
| catch (KeyStoreManagerException e) |
| { |
| StudioLogger.error("Error while accessing keystore manager. " |
| + e.getMessage()); |
| } |
| } |
| } |
| }); |
| } |
| } |
| } |