diff options
Diffstat (limited to 'src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/views/KeystoreManagerView.java')
-rw-r--r-- | src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/views/KeystoreManagerView.java | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/views/KeystoreManagerView.java b/src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/views/KeystoreManagerView.java new file mode 100644 index 0000000..2cd4988 --- /dev/null +++ b/src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/views/KeystoreManagerView.java @@ -0,0 +1,378 @@ +/* + * 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()); + } + } + } + }); + } + } +}
\ No newline at end of file |