summaryrefslogtreecommitdiff
path: root/src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/views/KeystoreManagerView.java
diff options
context:
space:
mode:
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.java378
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