initial import
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/.classpath b/org.eclipse.emf.emfstore.client.ui.esbrowser/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/.project b/org.eclipse.emf.emfstore.client.ui.esbrowser/.project
new file mode 100644
index 0000000..738f0b9
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.emf.emfstore.client.ui.esbrowser</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.emf.emfstore.client.ui.esbrowser/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..af0f20f
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/META-INF/MANIFEST.MF b/org.eclipse.emf.emfstore.client.ui.esbrowser/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8dcdd0d
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: EMFStore Repository Browser
+Bundle-SymbolicName: org.eclipse.emf.emfstore.client.ui.esbrowser
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.emf.emfstore.client.ui.esbrowser.Activator
+Bundle-Vendor: Eclipse Modeling Project
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.emf.edit.ui;bundle-version="2.9.0",
+ org.eclipse.emf.emfstore.client.ui;bundle-version="1.1.0",
+ org.eclipse.emf.emfstore.client;bundle-version="1.1.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/build.properties b/org.eclipse.emf.emfstore.client.ui.esbrowser/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/Activator.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/Activator.java
new file mode 100644
index 0000000..00949fe
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/Activator.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser;
+
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle.
+ */
+public class Activator extends AbstractUIPlugin {
+
+ /**
+ * The plug-in ID.
+ */
+ public static final String PLUGIN_ID = "org.eclipse.emf.emfstore.client.ui";
+
+ // The shared instance
+ private static Activator plugin;
+
+ private static ComposedAdapterFactory adapterFactory;
+
+ /**
+ * The constructor.
+ */
+ public Activator() {
+ }
+
+ // BEGIN SUPRESS CATCH EXCEPTION
+ /**
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext )
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ getAdapterFactory().dispose();
+ }
+
+ // END SUPRESS CATCH EXCEPTION
+
+ /**
+ * Returns the shared instance.
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Returns an image descriptor for the image file at the given plug-in relative path.
+ *
+ * @param path the path
+ * @return the image descriptor
+ */
+ public static ImageDescriptor getImageDescriptor(String path) {
+ return imageDescriptorFromPlugin(PLUGIN_ID, path);
+ }
+
+ /**
+ * Returns a composed adapter factory.
+ *
+ * @return a composed adapter factory
+ */
+ public static ComposedAdapterFactory getAdapterFactory() {
+ return adapterFactory;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserContentProvider.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserContentProvider.java
new file mode 100644
index 0000000..b709822
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserContentProvider.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.provider;
+
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.Activator;
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.emf.emfstore.internal.client.model.Workspace;
+
+/**
+ * Content provider for the EMFStore Browser View.
+ *
+ * @author emueller
+ * @author ovonwesend
+ */
+public class ESBrowserContentProvider extends AdapterFactoryContentProvider {
+
+ /**
+ * Default constructor.
+ */
+ public ESBrowserContentProvider() {
+ super(Activator.getAdapterFactory());
+ }
+
+ @Override
+ public Object[] getElements(Object object) {
+ if (object instanceof Workspace) {
+ return ((Workspace) object).getServerInfos().toArray();
+ }
+
+ return super.getElements(object);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Object[] getChildren(Object object) {
+ Object value = object;
+ Object[] children;
+
+ if (value instanceof Workspace) {
+ children = ((Workspace) value).getServerInfos().toArray();
+ } else if (value instanceof ServerInfo) {
+ ServerInfo serverInfo = (ServerInfo) value;
+ return serverInfo.getProjectInfos().toArray();
+ } else {
+ children = super.getChildren(object);
+ }
+
+ return children;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean hasChildren(Object parent) {
+ if (parent instanceof ServerInfo) {
+ return true;
+ }
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelDecorator.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelDecorator.java
new file mode 100644
index 0000000..83e3aef
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelDecorator.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.provider;
+
+import org.eclipse.emf.emfstore.client.ESUsersession;
+import org.eclipse.emf.emfstore.client.observer.ESLoginObserver;
+import org.eclipse.emf.emfstore.client.observer.ESLogoutObserver;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.Activator;
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.LabelProviderChangedEvent;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @see ILightweightLabelDecorator
+ */
+public class ESBrowserLabelDecorator extends LabelProvider implements ILightweightLabelDecorator, ESLoginObserver,
+ ESLogoutObserver {
+
+ /**
+ * {@inheritDoc} Decorates the label of a {@link ServerInfo} object
+ * according to its login state.
+ */
+ public void decorate(Object element, IDecoration decoration) {
+
+ if (element instanceof ServerInfo) {
+ ServerInfo server = (ServerInfo) element;
+
+ if (server.getLastUsersession() != null && server.getLastUsersession().isLoggedIn()) {
+ decoration.addOverlay(Activator.getImageDescriptor("icons/bullet_green.png"), IDecoration.BOTTOM_RIGHT);
+ } else {
+ decoration
+ .addOverlay(Activator.getImageDescriptor("icons/bullet_delete.png"), IDecoration.BOTTOM_RIGHT);
+ }
+ }
+ }
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.jface.viewers.BaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ @Override
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
+ */
+ @Override
+ public void dispose() {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.jface.viewers.BaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+ */
+ @Override
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.emfstore.client.observer.ESLoginObserver#loginCompleted(org.eclipse.emf.emfstore.internal.client.model.Usersession)
+ */
+ public void loginCompleted(ESUsersession session) {
+ update(session);
+ }
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.emfstore.client.observer.ESLogoutObserver#logoutCompleted(org.eclipse.emf.emfstore.internal.client.model.Usersession)
+ */
+ public void logoutCompleted(ESUsersession session) {
+ update(session);
+ }
+
+ private void update(final ESUsersession usersession) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ fireLabelProviderChanged(new LabelProviderChangedEvent(ESBrowserLabelDecorator.this, usersession
+ .getServer()));
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelProvider.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelProvider.java
new file mode 100644
index 0000000..00a7d68
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelProvider.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.provider;
+
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.Activator;
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.emf.emfstore.internal.server.model.ProjectInfo;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Label provider for the EMFStore Browser View.
+ *
+ * @author emueller
+ * @author ovonwesend
+ */
+public class ESBrowserLabelProvider extends AdapterFactoryLabelProvider {
+
+ /**
+ * Default constructor.
+ */
+ public ESBrowserLabelProvider() {
+ super(Activator.getAdapterFactory());
+ }
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object obj) {
+ Object element = obj;
+ if (element instanceof ServerInfo) {
+ ServerInfo serverInfo = (ServerInfo) element;
+ StringBuilder builder = new StringBuilder();
+ builder.append(serverInfo.getUrl());
+ builder.append(" [");
+ builder.append(serverInfo.getName());
+ builder.append("]");
+ return builder.toString();
+ } else if (element instanceof ProjectInfo) {
+ ProjectInfo projectInfo = (ProjectInfo) element;
+ return projectInfo.getName();
+ }
+
+ return super.getText(obj);
+ }
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getImage(java.lang.Object)
+ */
+ @Override
+ public Image getImage(Object obj) {
+
+ Object element = obj;
+ if (element instanceof ServerInfo) {
+ return Activator.getImageDescriptor("icons/ServerInfo.gif").createImage();
+ } else if (element instanceof ProjectInfo) {
+ return Activator.getImageDescriptor("icons/prj_obj.gif").createImage();
+ }
+
+ return super.getImage(obj);
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserViewerSorter.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserViewerSorter.java
new file mode 100644
index 0000000..a8e4ca0
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserViewerSorter.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.provider;
+
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.emf.emfstore.internal.server.model.ProjectInfo;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * Sort alphabetically the repository browser viewer.
+ *
+ * @author shterev
+ */
+public class ESBrowserViewerSorter extends ViewerSorter {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int compare(Viewer viewer, Object o1, Object o2) {
+
+ if (o1 instanceof ServerInfo && o2 instanceof ServerInfo) {
+ return ((ServerInfo) o1).getName().toLowerCase().compareTo(((ServerInfo) o2).getName().toLowerCase());
+ } else if (o1 instanceof ProjectInfo && o2 instanceof ProjectInfo) {
+ return ((ProjectInfo) o1).getName().toLowerCase().compareTo(((ProjectInfo) o2).getName().toLowerCase());
+ }
+
+ return super.compare(viewer, o1, o2);
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateAliasDialog.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateAliasDialog.java
new file mode 100644
index 0000000..46ba30e
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateAliasDialog.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * The CertificateAliasDialog allows the user to choose a designation for the
+ * certificate being imported.
+ *
+ * @author pfeifferc
+ */
+@Deprecated
+public class CertificateAliasDialog extends Dialog {
+
+ /**
+ * The message to display, or <code>null</code> if none.
+ */
+ private String message;
+
+ /**
+ * The input value; the empty string by default.
+ */
+ private String value = "";//$NON-NLS-1$
+
+ /**
+ * Input text widget.
+ */
+ private Text text;
+
+ private String dialogTitle;
+
+ /**
+ * Creates an input dialog with OK and Cancel buttons. Note that the dialog
+ * will have no visual representation (no widgets) until it is told to open.
+ * <p>
+ * Note that the <code>open</code> method blocks for input dialogs.
+ * </p>
+ *
+ * @param parentShell
+ * the parent shell, or <code>null</code> to create a top-level
+ * shell
+ * @param dialogTitle
+ * the dialog title, or <code>null</code> if none
+ * @param dialogMessage
+ * the dialog message, or <code>null</code> if none
+ * @param initialValue
+ * the initial input value, or <code>null</code> if none
+ * (equivalent to the empty string)
+ */
+ public CertificateAliasDialog(Shell parentShell, String dialogTitle, String dialogMessage, String initialValue) {
+ super(parentShell);
+ this.dialogTitle = dialogTitle;
+ configureShell(parentShell);
+ message = dialogMessage;
+ if (initialValue == null) {
+ value = "";//$NON-NLS-1$
+ } else {
+ value = initialValue;
+ }
+ }
+
+ /**
+ * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ * @param parent
+ * Parent Composite
+ * @return the composite
+ */
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ // create composite
+ Composite composite = (Composite) super.createDialogArea(parent);
+ // create message
+ if (message != null) {
+ Label label = new Label(composite, SWT.WRAP);
+ label.setText(message);
+ GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL
+ | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
+ data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
+ label.setLayoutData(data);
+ label.setFont(parent.getFont());
+ }
+ text = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ text.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+ applyDialogFont(composite);
+ return composite;
+ }
+
+ /**
+ * Returns the text area.
+ *
+ * @return the text area
+ */
+ protected Text getText() {
+ return text;
+ }
+
+ /**
+ * Returns the string typed into this input dialog.
+ *
+ * @return the input string
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * Configure the shell.
+ *
+ * @param shell
+ * shell
+ * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+ */
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(dialogTitle);
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateSelectionDialog.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateSelectionDialog.java
new file mode 100644
index 0000000..b37b08f
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateSelectionDialog.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import java.security.cert.X509Certificate;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.emfstore.client.exceptions.ESCertificateException;
+import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.KeyStoreManager;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+
+/**
+ * The modified ElementListSelectionDialog. Includes further functionality to
+ * import certificates from files instead of choosing from the list.
+ *
+ * @author pfeifferc
+ */
+public class CertificateSelectionDialog extends ElementListSelectionDialog {
+
+ private TableItem selectedTableItem;
+ private String alias = "";
+
+ /**
+ * The constructor.
+ *
+ * @param parent
+ * Parent
+ * @param renderer
+ * Renderer
+ */
+ public CertificateSelectionDialog(Shell parent, ILabelProvider renderer) {
+ super(parent, renderer);
+ setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.MIN | SWT.MAX);
+ }
+
+ /**
+ * Overridden method to allow adding further elements onto the dialog
+ * composite.
+ *
+ * @see org.eclipse.ui.dialogs.ElementListSelectionDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ * @return Control
+ * @param parent
+ * Parent
+ */
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ // standard layout used by dialogue area
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+ layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+
+ // two column layout composite
+ Composite grid = new Composite(parent, SWT.NONE);
+ GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).applyTo(grid);
+
+ // left column composite
+ Composite left = new Composite(grid, SWT.NONE);
+ GridLayoutFactory.fillDefaults().applyTo(left);
+
+ // right column composite
+ Composite right = new Composite(grid, SWT.NONE);
+ GridLayoutFactory.createFrom(layout).margins(layout.marginWidth, 35).applyTo(right);
+ GridDataFactory.fillDefaults().grab(true, true).hint(300, 200).applyTo(right);
+ applyDialogFont(right);
+
+ // right column: certificate details
+ new Label(right, SWT.NONE).setText("Certificate Alias: ");
+ final Text certAlias = new Text(right, SWT.NONE);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(certAlias);
+ certAlias.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ certAlias.setEditable(false);
+ new Label(right, SWT.NONE).setText("Certificate Details: ");
+ final Text certDetails = new Text(right, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+ GridDataFactory.fillDefaults().grab(true, false).hint(300, 230).applyTo(certDetails);
+ certDetails.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ certDetails.setEditable(false);
+
+ // left column: dialogue area composite (displays certificates and
+ // filter)
+ Composite dialogArea = new Composite(left, SWT.NONE);
+ GridLayoutFactory.fillDefaults().applyTo(dialogArea);
+ Control control = super.createDialogArea(dialogArea);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(control);
+
+ // left column: import button, composite used to ensure correct
+ // alignment
+ Composite certButtonsComposite = new Composite(grid, SWT.NONE);
+ GridLayoutFactory.createFrom(layout).numColumns(3).equalWidth(true).margins(layout.marginWidth, 0)
+ .applyTo(certButtonsComposite);
+ applyDialogFont(certButtonsComposite);
+ Button browse = new Button(certButtonsComposite, SWT.NONE);
+ browse.setText("Import...");
+ browse.addSelectionListener(new CertificateSelectionListener());
+
+ // Delete certificate
+ Button delete = new Button(certButtonsComposite, SWT.NONE);
+ delete.setText("Delete");
+ delete.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // nothing to do
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ if (selectedTableItem != null && !selectedTableItem.getText().equals("")) {
+ String alias = selectedTableItem.getText();
+ try {
+ KeyStoreManager.getInstance().deleteCertificate(alias);
+ setListElements(KeyStoreManager.getInstance().getCertificates().toArray());
+ } catch (ESCertificateException e1) {
+ setErrorMessage(e1.getMessage());
+ }
+ }
+ }
+ });
+ fFilteredList.addSelectionListener(new SelectionListenerImplementation(certDetails, certAlias));
+ return control;
+ }
+
+ /**
+ * Returns the alias of the certificate.
+ *
+ * @return the certificate alias
+ */
+ public String getCertificateAlias() {
+ return alias;
+ }
+
+ /**
+ * Opens up an information {@link MessageDialog} with the given <code>errorMessage</code>.
+ *
+ * @param errorMessage
+ * the error message
+ */
+ // TODO: rename method
+ public void setErrorMessage(String errorMessage) {
+ MessageDialog.openInformation(Display.getDefault().getActiveShell(), "Attention", errorMessage);
+ }
+
+ /**
+ * Certificate Selection Listener.
+ *
+ * @author koegel
+ *
+ */
+ private final class SelectionListenerImplementation implements SelectionListener {
+ private final Text certDetails;
+ private final Text certAlias;
+
+ private SelectionListenerImplementation(Text certDetails, Text certAlias) {
+ this.certDetails = certDetails;
+ this.certAlias = certAlias;
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // nothing to do
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ if (((Table) e.getSource()).getItems().length > 0) {
+ selectedTableItem = ((Table) e.getSource()).getItems()[((Table) e.getSource()).getSelectionIndex()];
+ alias = selectedTableItem.getText();
+ try {
+ X509Certificate selectedCertificate = (X509Certificate) KeyStoreManager.getInstance()
+ .getCertificate(alias);
+ String[] details = selectedCertificate.toString().split("\n");
+ String tmp = "";
+ for (int i = 2; i < 14; i++) {
+ tmp += (i == 7 || i == 8) ? "" : details[i].trim() + "\n";
+ }
+ certAlias.setText(alias);
+ certDetails.setText(tmp);
+ } catch (ESCertificateException e1) {
+ setErrorMessage(e1.getMessage());
+ }
+ }
+ }
+ }
+
+ /**
+ * Choose certificate from file system and name it.
+ *
+ * @author pfeifferc
+ */
+ class CertificateSelectionListener implements SelectionListener {
+ /**
+ * Add a certificate specified by the user.
+ *
+ * @param e
+ * selection event
+ */
+ public void widgetSelected(SelectionEvent e) {
+ FileDialog fileDialog = new FileDialog(Display.getCurrent().getActiveShell());
+ fileDialog.open();
+ if (!fileDialog.getFileName().equals("")) {
+ String location = fileDialog.getFilterPath() + System.getProperty("file.separator")
+ + fileDialog.getFileName();
+
+ InputDialog inputDialog = new InputDialog(Display.getCurrent().getActiveShell(),
+ "Select certificate designation",
+ "Please choose a designation for the previously selected certificate: ", "", null);
+
+ inputDialog.setBlockOnOpen(true);
+ if (inputDialog.open() != Window.OK) {
+ return;
+ }
+
+ String alias = inputDialog.getValue();
+ if (alias.equals("")) {
+ alias = "unnamed:" + EcoreUtil.generateUUID();
+ }
+ try {
+ KeyStoreManager.getInstance().addCertificate(alias, location);
+ } catch (final ESCertificateException e1) {
+ setErrorMessage("Invalid certificate!");
+ }
+ try {
+ setListElements(KeyStoreManager.getInstance().getCertificates().toArray());
+ } catch (ESCertificateException e1) {
+ setErrorMessage(e1.getMessage());
+ }
+ }
+ }
+
+ /**
+ * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+ * @param e
+ * selection event
+ */
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // nothing to do
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CreateProjectDialog.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CreateProjectDialog.java
new file mode 100644
index 0000000..a5ce0b7
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CreateProjectDialog.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.layout.LayoutConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Create project dialog.
+ *
+ * @author shterev
+ */
+// TODO: remove description
+public class CreateProjectDialog extends TitleAreaDialog {
+
+ private Text txtProjectName;
+ private Text txtProjectDesc;
+
+ private String name;
+ private String description;
+
+ /**
+ * Default constructor.
+ *
+ * @param parent
+ * the parent shell
+ */
+ public CreateProjectDialog(Shell parent) {
+ super(parent);
+ name = "";
+ description = "";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite contents = new Composite(parent, SWT.NONE);
+ contents.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ setTitle("Create new project");
+ setMessage("Enter the name and the description of the project");
+
+ Label name = new Label(contents, SWT.NULL);
+ name.setText("Name:");
+ txtProjectName = new Text(contents, SWT.SINGLE | SWT.BORDER);
+ txtProjectName.setSize(150, 20);
+
+ Label desc = new Label(contents, SWT.NULL);
+ desc.setText("Description:");
+ txtProjectDesc = new Text(contents, SWT.MULTI | SWT.BORDER);
+ txtProjectDesc.setSize(150, 60);
+
+ Point defaultMargins = LayoutConstants.getMargins();
+ GridLayoutFactory.fillDefaults().numColumns(2).margins(defaultMargins.x, defaultMargins.y)
+ .generateLayout(contents);
+
+ return contents;
+ }
+
+ @Override
+ protected void okPressed() {
+ name = txtProjectName.getText();
+ description = txtProjectName.getText();
+ super.okPressed();
+ }
+
+ /**
+ * Returns the description of the project as entered by the user.
+ *
+ * @return the description of the project that is going to be created
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Returns the name of the project as entered by the user.
+ *
+ * @return the name of the project that is going to be created
+ */
+ public String getName() {
+ return name;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/ESBrowserView.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/ESBrowserView.java
new file mode 100644
index 0000000..e7a1f04
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/ESBrowserView.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.emfstore.client.ESUsersession;
+import org.eclipse.emf.emfstore.client.observer.ESLoginObserver;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.provider.ESBrowserContentProvider;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.provider.ESBrowserLabelProvider;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.provider.ESBrowserViewerSorter;
+import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
+import org.eclipse.emf.emfstore.internal.client.model.ModelPackage;
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.emf.emfstore.internal.client.model.Workspace;
+import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESWorkspaceImpl;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IDecoratorManager;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.services.IEvaluationService;
+
+/**
+ * View containing the remote repositories.
+ *
+ * @author shterev
+ */
+public class ESBrowserView extends ViewPart implements ESLoginObserver {
+
+ /**
+ * Listener for changes in the workspace.
+ *
+ * @author koegel
+ */
+ private final class WorkspaceAdapter extends AdapterImpl {
+ @Override
+ public void notifyChanged(Notification msg) {
+ if (msg.getNewValue() instanceof ServerInfo) {
+ final ServerInfo serverInfo = (ServerInfo) msg.getNewValue();
+ AdapterImpl serverInfoAdapter = new ServerInfoAdapter(serverInfo);
+ serverInfo.eAdapters().add(serverInfoAdapter);
+ serverInfoAdapterMap.put(serverInfo, serverInfoAdapter);
+ viewer.refresh();
+ } else if (msg.getOldValue() instanceof ServerInfo) {
+ ServerInfo serverInfo = (ServerInfo) msg.getOldValue();
+ serverInfo.eAdapters().remove(serverInfoAdapterMap.get(serverInfo));
+ viewer.refresh();
+ }
+ super.notifyChanged(msg);
+ }
+ }
+
+ /**
+ * Listener for changes in the server infos.
+ *
+ * @author koegel
+ */
+ private final class ServerInfoAdapter extends AdapterImpl {
+ private final ServerInfo serverInfo;
+
+ private ServerInfoAdapter(ServerInfo serverInfo) {
+ this.serverInfo = serverInfo;
+ }
+
+ @Override
+ public void notifyChanged(final Notification msg) {
+ if (msg.getFeature() != null
+ && msg.getFeature().equals(ModelPackage.eINSTANCE.getServerInfo_ProjectInfos())) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (msg.getEventType() == Notification.REMOVE_MANY || msg.getEventType() == Notification.REMOVE) {
+ viewer.collapseToLevel(serverInfo, 0);
+ }
+ viewer.refresh(serverInfo, true);
+ // re-evaluate property tester
+ IEvaluationService service = (IEvaluationService) getSite()
+ .getService(IEvaluationService.class);
+ service.requestEvaluation("org.eclipse.emf.emfstore.client.ui.commands.ServerInfoIsLoggedIn");
+ }
+ });
+ }
+ }
+ }
+
+ private TreeViewer viewer;
+
+ private ESBrowserContentProvider contentProvider;
+ private MenuManager menuMgr;
+ private AdapterImpl workspaceAdapter;
+
+ private Map<ServerInfo, AdapterImpl> serverInfoAdapterMap = new LinkedHashMap<ServerInfo, AdapterImpl>();
+
+ /**
+ * The constructor.
+ */
+ public ESBrowserView() {
+ // TODO OTS
+ ESWorkspaceImpl workspace = ESWorkspaceProviderImpl.getInstance().getWorkspace();
+ Workspace currentWorkspace = workspace.toInternalAPI();
+ ESWorkspaceProviderImpl.getObserverBus().register(this);
+ for (final ServerInfo serverInfo : currentWorkspace.getServerInfos()) {
+ AdapterImpl serverInfoAdapter = new ServerInfoAdapter(serverInfo);
+ serverInfo.eAdapters().add(serverInfoAdapter);
+ serverInfoAdapterMap.put(serverInfo, serverInfoAdapter);
+ }
+ workspaceAdapter = new WorkspaceAdapter();
+ currentWorkspace.eAdapters().add(workspaceAdapter);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
+
+ contentProvider = new ESBrowserContentProvider();
+ viewer.setContentProvider(contentProvider);
+ IDecoratorManager decoratorManager = PlatformUI.getWorkbench().getDecoratorManager();
+ viewer.setLabelProvider(new DecoratingLabelProvider(new ESBrowserLabelProvider(), decoratorManager
+ .getLabelDecorator()));
+ viewer.setSorter(new ESBrowserViewerSorter());
+ viewer.setInput(ESWorkspaceProviderImpl.getInstance().getWorkspace());
+ // viewer.addTreeListener(new ITreeViewerListener() {
+ //
+ // /**
+ // * {@inheritDoc}
+ // */
+ // public void treeExpanded(TreeExpansionEvent event) {
+ // if (event.getElement() instanceof ServerInfo) {
+ //
+ // ServerInfo value = (ServerInfo) event.getElement();
+ // // new UIServerLoginController(PlatformUI.getWorkbench().getDisplay().getActiveShell(), value)
+ // // .openLoginDialog();
+ //
+ // // TODO: refresh is always performed
+ // if (!event.getTreeViewer().isBusy()) {
+ // event.getTreeViewer().refresh(value, true);
+ // }
+ // }
+ // }
+ //
+ // public void treeCollapsed(TreeExpansionEvent event) {
+ // }
+ // });
+
+ PlatformUI.getWorkbench().getHelpSystem()
+ .setHelp(viewer.getControl(), "org.eclipse.emf.emfstore.client.ui.views.RepositoryView");
+
+ menuMgr = new MenuManager();
+ menuMgr.add(new Separator("additions"));
+ Control control = viewer.getControl();
+ Menu menu = menuMgr.createContextMenu(control);
+ control.setMenu(menu);
+ getSite().registerContextMenu(menuMgr, viewer);
+
+ getSite().setSelectionProvider(viewer);
+ hookDoubleClickAction();
+
+ }
+
+ private void hookDoubleClickAction() {
+ viewer.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ Object firstElement = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
+ viewer.refresh(firstElement);
+ viewer.expandToLevel(firstElement, 1);
+ }
+ });
+ }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ @Override
+ public void setFocus() {
+ viewer.getControl().setFocus();
+ }
+
+ /**
+ * @return the {@link TreeViewer} for this view.
+ */
+ public TreeViewer getViewer() {
+ return viewer;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void loginCompleted(final ESUsersession session) {
+ getSite().getShell().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ viewer.refresh(session.getServer(), true);
+ }
+ });
+ }
+
+ /**
+ *
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+ */
+ @Override
+ public void dispose() {
+ super.dispose();
+ // TODO OTS
+ ESWorkspaceImpl workspace = ESWorkspaceProviderImpl.getInstance().getWorkspace();
+ Workspace currentWorkspace = workspace.toInternalAPI();
+ currentWorkspace.eAdapters().remove(workspaceAdapter);
+ ESWorkspaceProviderImpl.getObserverBus().unregister(this);
+ for (ServerInfo s : currentWorkspace.getServerInfos()) {
+ s.eAdapters().remove(serverInfoAdapterMap.get(s));
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizard.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizard.java
new file mode 100644
index 0000000..0ce6c62
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizard.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import org.eclipse.emf.emfstore.client.ESServer;
+import org.eclipse.emf.emfstore.client.ESWorkspaceProvider;
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Wizard for adding a new repository.
+ *
+ * @author shterev
+ */
+public class NewRepositoryWizard extends Wizard implements INewWizard {
+
+ private ESServer server;
+
+ private NewRepositoryWizardPageOne mainPage;
+
+ /**
+ * Default constructor.
+ */
+ public NewRepositoryWizard() {
+ super();
+ }
+
+ /**
+ * Adds all pages in the wizard.
+ */
+ @Override
+ public void addPages() {
+ mainPage = new NewRepositoryWizardPageOne();
+ setWindowTitle("Server Details");
+ addPage(mainPage);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean canFinish() {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean performFinish() {
+ if (this.getContainer().getCurrentPage().canFlipToNextPage()) {
+ ESWorkspaceProvider.INSTANCE.getWorkspace().addServer(server);
+ dispose();
+ } else {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error",
+ "Field(s) were left blank!");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Getter for the server.
+ *
+ * @return the server
+ */
+ public ESServer getServer() {
+ if (server == null) {
+ // TODO: review or reuse client util
+ server = ESServer.FACTORY.createServer("localhost", 8080, "Generated certificate");
+ }
+ return server;
+ }
+
+ /**
+ * Sets the ServerInfo.
+ *
+ * @param serverInfo
+ * {@link ServerInfo}
+ */
+ public void setServerInfo(ESServer server) {
+ this.server = server;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // nothing to do
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizardPageOne.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizardPageOne.java
new file mode 100644
index 0000000..9e2a110
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizardPageOne.java
@@ -0,0 +1,264 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import java.util.ArrayList;
+import java.util.concurrent.Callable;
+
+import org.eclipse.emf.emfstore.client.ESServer;
+import org.eclipse.emf.emfstore.client.exceptions.ESCertificateException;
+import org.eclipse.emf.emfstore.client.util.RunESCommand;
+import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.KeyStoreManager;
+import org.eclipse.emf.emfstore.internal.client.model.util.WorkspaceUtil;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * The main page of the wizard.
+ *
+ * @author shterev
+ */
+public class NewRepositoryWizardPageOne extends WizardPage {
+
+ private static final int DEFAULT_PORT = 8080;
+ private Text name;
+ private Text url;
+ private Spinner port;
+ private Combo cert;
+
+ /**
+ * Default constructor.
+ */
+ public NewRepositoryWizardPageOne() {
+ super("Main");
+ setTitle("Server Details");
+ setDescription("Select the details for the new repository");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void createControl(Composite parent) {
+ NewRepositoryWizard wizard = (NewRepositoryWizard) getWizard();
+ ESServer server = wizard.getServer();
+
+ GridData gd;
+ Composite composite = new Composite(parent, SWT.NONE);
+
+ GridLayout gl = new GridLayout();
+ int ncol = 3;
+ gl.numColumns = ncol;
+ composite.setLayout(gl);
+
+ // Server Name
+ new Label(composite, SWT.NONE).setText("Name:");
+ name = new Text(composite, SWT.BORDER);
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = ncol - 1;
+ name.setLayoutData(gd);
+
+ // Server URL
+ new Label(composite, SWT.NONE).setText("URL:");
+ url = new Text(composite, SWT.BORDER);
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = ncol - 1;
+ url.setLayoutData(gd);
+
+ // Server Port
+ new Label(composite, SWT.NONE).setText("Port:");
+ port = new Spinner(composite, SWT.BORDER);
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = ncol - 1;
+ port.setLayoutData(gd);
+ port.setValues(DEFAULT_PORT, 1, 999999, 0, 1, 10);
+ setControl(composite);
+
+ // Certificate
+ new Label(composite, SWT.NONE).setText("Certificate:");
+ cert = new Combo(composite, SWT.BORDER);
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = ncol - 2;
+ cert.setLayoutData(gd);
+ cert.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ initCombo();
+
+ // Choose Certificate, Opens Dialogue
+ Button button = new Button(composite, SWT.NONE);
+ button.setText("Edit");
+ button.addSelectionListener(new SelectionDialogListener());
+
+ gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+ gd.horizontalSpan = 1;
+ button.setLayoutData(gd);
+
+ if (server.getURL() != null) {
+ name.setText(server.getName());
+ url.setText(server.getURL());
+ port.setSelection(server.getPort());
+ if (server.getCertificateAlias() == null) {
+ return;
+ }
+
+ try {
+ if (KeyStoreManager.getInstance().contains(server.getCertificateAlias())) {
+ for (int i = 0; i < cert.getItemCount(); i++) {
+ if (cert.getItem(i).equals(server.getCertificateAlias())) {
+ cert.select(i);
+ break;
+ }
+ }
+ } else {
+ cert.setText("");
+ }
+ } catch (ESCertificateException e1) {
+ cert.setText("");
+ }
+ }
+ }
+
+ private void initCombo() {
+ try {
+ ArrayList<String> certificates = KeyStoreManager.getInstance().getCertificates();
+ String[] aliases = new String[certificates.size()];
+ for (int i = 0; i < certificates.size(); i++) {
+ aliases[i] = certificates.get(i);
+ }
+ cert.setItems(aliases);
+
+ NewRepositoryWizard wizard = (NewRepositoryWizard) getWizard();
+ ESServer server = wizard.getServer();
+ String selectedCertificate = server.getCertificateAlias();
+ cert.select(certificates.indexOf(selectedCertificate));
+ } catch (ESCertificateException e) {
+ WorkspaceUtil.logException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * @return if the input on the current page is valid.
+ */
+ @Override
+ public boolean canFlipToNextPage() {
+ if (getErrorMessage() != null) {
+ return false;
+ }
+ if (isTextNonEmpty(name.getText()) && isTextNonEmpty(url.getText()) && isComboNotEmpty()) {
+ saveDataToModel();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Saves the uses choices from this page to the model. Called on exit of the
+ * page
+ */
+ private void saveDataToModel() {
+ RunESCommand.run(new Callable<Void>() {
+ public Void call() throws Exception {
+ NewRepositoryWizard wizard = (NewRepositoryWizard) getWizard();
+ ESServer serverInfo = wizard.getServer();
+ serverInfo.setName(name.getText());
+ serverInfo.setURL(url.getText());
+ serverInfo.setPort(port.getSelection());
+ serverInfo.setCertificateAlias(cert.getText());
+ return null;
+ }
+ });
+ }
+
+ /**
+ * Returns true if Text is not empty, i.e. not null/only space characters.
+ *
+ * @param t
+ * @return boolean
+ */
+ private static boolean isTextNonEmpty(String s) {
+ if ((s != null) && (s.trim().length() > 0)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isComboNotEmpty() {
+ String s = cert.getItem(cert.getSelectionIndex());
+ return isTextNonEmpty(s);
+ }
+
+ /**
+ * Listener for the selection dialog.
+ *
+ * @author pfeifferc
+ */
+ class SelectionDialogListener implements SelectionListener {
+
+ /**
+ * @param e
+ * selection event
+ * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // nothing to do
+ }
+
+ /**
+ * @param e
+ * selection event
+ * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ public void widgetSelected(SelectionEvent e) {
+ CertificateSelectionDialog csd = new CertificateSelectionDialog(Display.getCurrent().getActiveShell(),
+ new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ if (element instanceof String) {
+ return element.toString();
+ } else {
+ return "";
+ }
+ }
+ });
+ ArrayList<String> certificates;
+ try {
+ certificates = KeyStoreManager.getInstance().getCertificates();
+ csd.setElements(certificates.toArray());
+ } catch (ESCertificateException e1) {
+ csd.setErrorMessage(e1.getMessage());
+ }
+ csd.setBlockOnOpen(true);
+ csd.setTitle("Certificate Selection Dialog");
+ csd.open();
+ if (csd.getReturnCode() == Window.OK) {
+ initCombo();
+ for (int i = 0; i < cert.getItemCount(); i++) {
+ String item = cert.getItem(i);
+ if (item.equals(csd.getCertificateAlias())) {
+ cert.select(i);
+ break;
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file