core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/extension/AbstractDiscoveryPortalPageLayer.java
changeset 1734 bf670d38123a
child 1793 b3fa776e81bd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/extension/AbstractDiscoveryPortalPageLayer.java	Mon Aug 02 08:44:45 2010 -0500
@@ -0,0 +1,324 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.carbide.internal.discovery.ui.extension;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.equinox.internal.p2.discovery.Catalog;
+import org.eclipse.equinox.internal.p2.discovery.DiscoveryCore;
+import org.eclipse.equinox.internal.p2.discovery.compatibility.BundleDiscoveryStrategy;
+import org.eclipse.equinox.internal.p2.discovery.compatibility.RemoteBundleDiscoveryStrategy;
+import org.eclipse.equinox.internal.p2.discovery.model.CatalogItem;
+import org.eclipse.equinox.internal.p2.ui.discovery.DiscoveryUi;
+import org.eclipse.equinox.internal.p2.ui.discovery.wizards.CatalogConfiguration;
+import org.eclipse.equinox.internal.p2.ui.discovery.wizards.CatalogViewer;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.eclipse.equinox.p2.operations.ProvisioningSession;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
+import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
+import org.eclipse.equinox.p2.ui.ProvisioningUI;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+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.Shell;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+import com.nokia.carbide.discovery.ui.Activator;
+import com.nokia.carbide.discovery.ui.Messages;
+import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils;
+
+@SuppressWarnings("restriction")
+public abstract class AbstractDiscoveryPortalPageLayer implements IPortalPageLayer {
+
+	private class RunnableContextDialog extends ProgressMonitorDialog {
+		private final String title;
+
+		private RunnableContextDialog(Shell parent, String title) {
+			super(parent);
+			this.title = title;
+		}
+
+		@Override
+		protected void configureShell(Shell shell) {
+			super.configureShell(shell);
+			shell.setText(title);
+		}
+		
+	}
+
+	protected class ActionBar implements IActionBar {
+		private IAction[] actions;
+
+		public ActionBar(IEditorPart part) {
+			actions = makeActions(part);
+		}
+		
+		@Override
+		public String getTitle() {
+			return Messages.AbstractDiscoveryPortalPageLayer_Title;
+		}
+
+		@Override
+		public IAction[] getActions() {
+			return actions;
+		}
+
+		@Override
+		public String[] getHighlightedActionIds() {
+			return new String[] {INSTALL_ACTION_ID};
+		}
+	}
+	
+	protected static final String INSTALL_ACTION_ID = 
+		AbstractDiscoveryPortalPageLayer.class.getName() + ".install"; //$NON-NLS-1$
+	protected static final String UNCHECK_ALL_ACTION_ID = 
+		AbstractDiscoveryPortalPageLayer.class.getName() + ".uncheckAll"; //$NON-NLS-1$
+	protected static final String CHECK_ALL_ACTION_ID = 
+		AbstractDiscoveryPortalPageLayer.class.getName() + ".checkAll"; //$NON-NLS-1$
+	protected static final String ADV_INSTALL_ACTION_ID = 
+		AbstractDiscoveryPortalPageLayer.class.getName() + ".advancedInstall"; //$NON-NLS-1$
+	protected static final String REFRESH_ACTION_ID = 
+		AbstractDiscoveryPortalPageLayer.class.getName() + ".refresh"; //$NON-NLS-1$
+
+	private CatalogViewer viewer;
+	private List<ISelectionChangedListener> selectionListeners;
+	private IActionUIUpdater updater;
+
+	@Override
+	public Control createControl(Composite parent, IEditorPart part) {
+		Composite c = new Composite(parent, SWT.NONE);
+		GridLayoutFactory.swtDefaults().applyTo(c);
+		viewer = new CatalogViewer(getCatalog(), part.getEditorSite(), 
+				new RunnableContextDialog(part.getEditorSite().getShell(), 
+						Messages.AbstractDiscoveryPortalPageLayer_GatheringExtensionsDesc), 
+				getConfiguration());
+		viewer.createControl(c);
+		GridDataFactory.fillDefaults().grab(true, true).applyTo(viewer.getControl());
+		
+		return c;
+	}
+
+	@Override
+	public void init() {
+		if (!WorkbenchUtils.isJUnitRunning()) { // do not initialize the catalog if JUnit is running
+			Display.getDefault().asyncExec(new Runnable() {
+				@Override
+				public void run() {
+					for (ISelectionChangedListener listener : selectionListeners) {
+						viewer.addSelectionChangedListener(listener);
+					}
+					viewer.updateCatalog();
+				}
+			});
+		}
+	}
+
+	@Override
+	public IActionBar[] createCommandBars(IEditorPart part, IActionUIUpdater updater) {
+		this.updater = updater;
+		return new IActionBar[] { new ActionBar(part) };
+	}
+
+	protected CatalogConfiguration getConfiguration() {
+		CatalogConfiguration configuration = new CatalogConfiguration();
+		configuration.setShowTagFilter(false);
+		return configuration;
+	}
+
+	protected Catalog getCatalog() {
+		Catalog catalog = new Catalog();
+		catalog.setEnvironment(DiscoveryCore.createEnvironment());
+		catalog.setVerifyUpdateSiteAvailability(false);
+		
+		// look for remote descriptor
+		RemoteBundleDiscoveryStrategy remoteDiscoveryStrategy = new RemoteBundleDiscoveryStrategy();
+		String url = getDirectoryURL();
+		if (url != null) {
+			remoteDiscoveryStrategy.setDirectoryUrl(url);
+			catalog.getDiscoveryStrategies().add(remoteDiscoveryStrategy);
+		}
+		else // look for descriptors from installed bundles
+			catalog.getDiscoveryStrategies().add(new BundleDiscoveryStrategy());
+	
+		return catalog;
+	}
+
+	protected String getDirectoryURL() {
+		return Activator.getFromServerProperties(getClass().getName());
+	}
+
+	protected IAction[] makeActions(final IEditorPart part) {
+		selectionListeners = new ArrayList<ISelectionChangedListener>();
+		List<IAction> actions = new ArrayList<IAction>();
+		IAction action;
+		
+		// install
+		action = new BaseSelectionListenerAction(Messages.AbstractDiscoveryPortalPageLayer_InstallActionLabel) {
+			public void run() {
+				DiscoveryUi.install(viewer.getCheckedItems(), 
+						new RunnableContextDialog(part.getEditorSite().getShell(), 
+								Messages.AbstractDiscoveryPortalPageLayer_GatheringInstallInfoDesc));
+			};
+			
+			protected boolean updateSelection(IStructuredSelection selection) {
+				scheduleUpdateAllActionUIs();
+				return !selection.isEmpty();
+			};
+		};
+		action.setToolTipText(Messages.AbstractDiscoveryPortalPageLayer_InstallActionTooltip);
+		action.setId(INSTALL_ACTION_ID);
+		selectionListeners.add((ISelectionChangedListener) action);
+		actions.add(action);
+		
+		// refresh
+		action = new Action(Messages.AbstractDiscoveryPortalPageLayer_RefreshActionLabel) {
+			public void run() {
+				viewer.setSelection(StructuredSelection.EMPTY);
+				viewer.updateCatalog();
+				viewer.refresh();
+			}
+		};
+		action.setId(REFRESH_ACTION_ID);
+		actions.add(action);
+		
+		// check all
+		action = new BaseSelectionListenerAction(Messages.AbstractDiscoveryPortalPageLayer_CheckAllActionLabel) {
+			public void run() {
+				viewer.setSelection(StructuredSelection.EMPTY);
+				viewer.setSelection(getAllItemsSelection());
+				viewer.refresh();
+			}
+	
+			private IStructuredSelection getAllItemsSelection() {
+				List<CatalogItem> catalogItems = new ArrayList<CatalogItem>();
+				for (CatalogItem catalogItem : viewer.getCatalog().getItems()) {
+					if (!catalogItem.isInstalled())
+						catalogItems.add(catalogItem);
+				}	
+				return new StructuredSelection(catalogItems);
+			}
+	
+			protected boolean updateSelection(IStructuredSelection selection) {
+				scheduleUpdateAllActionUIs();
+				return !getAllItemsSelection().equals(selection);
+			}
+		};
+		action.setId(CHECK_ALL_ACTION_ID);
+		selectionListeners.add((ISelectionChangedListener) action);
+		actions.add(action);
+		
+		// uncheck all
+		action = new BaseSelectionListenerAction(Messages.AbstractDiscoveryPortalPageLayer_UncheckAllActionLabel) {
+			public void run() {
+				viewer.setSelection(StructuredSelection.EMPTY);
+				viewer.refresh();
+			};
+			
+			protected boolean updateSelection(IStructuredSelection selection) {
+				scheduleUpdateAllActionUIs();
+				return !selection.isEmpty();
+			};
+		};
+		action.setId(UNCHECK_ALL_ACTION_ID);
+		selectionListeners.add((ISelectionChangedListener) action);
+		actions.add(action);
+		
+		// advanced install
+		action = new Action(Messages.AbstractDiscoveryPortalPageLayer_AdvancedInstallActionLabel) {
+			public void run() {
+				showInstallWizard();
+			}
+		};
+		action.setId(ADV_INSTALL_ACTION_ID);
+		actions.add(action);
+		
+		ISelectionChangedListener selectionListener = new ISelectionChangedListener() {
+			@Override
+			public void selectionChanged(SelectionChangedEvent event) {
+				IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+				IActionBars bars = part.getEditorSite().getActionBars();
+				bars.getStatusLineManager().setMessage(
+						selection.isEmpty() ? null : MessageFormat.format(
+								Messages.AbstractDiscoveryPortalPageLayer_CheckedItemsStatusMessage, selection.size()));
+			}
+		};
+		selectionListeners.add(selectionListener);
+		
+		return (IAction[]) actions.toArray(new IAction[actions.size()]);
+	}
+
+	@Override
+	public void dispose() {
+		for (ISelectionChangedListener listener : selectionListeners) {
+			viewer.removeSelectionChangedListener(listener);
+		}
+	}
+
+	protected void showInstallWizard() {
+		ProvisioningUI defaultUI = ProvisioningUI.getDefaultUI();
+		ProvisioningSession session = defaultUI.getSession();
+		IProvisioningAgent agent = session.getProvisioningAgent();
+		IMetadataRepositoryManager metadataManager = (IMetadataRepositoryManager) agent.getService(IMetadataRepositoryManager.SERVICE_NAME);
+		IArtifactRepositoryManager artifactManager = (IArtifactRepositoryManager) agent.getService(IArtifactRepositoryManager.SERVICE_NAME);
+		for (URI uri : getCatalogURIs()) {
+			metadataManager.addRepository(uri);
+			artifactManager.addRepository(uri);
+		}
+		defaultUI.openInstallWizard(null, null, null);
+	}
+
+	protected Collection<URI> getCatalogURIs() {
+		Set<URI> uris = new HashSet<URI>();
+		for (CatalogItem catalogItem : viewer.getCatalog().getItems()) {
+			try {
+				uris.add(new URI(catalogItem.getSiteUrl()));
+			} catch (URISyntaxException e) {
+				// ignore bad URIs
+			}
+		}
+		return uris;
+	}
+
+	protected void scheduleUpdateAllActionUIs() {
+		Display.getDefault().asyncExec(new Runnable() {
+			@Override
+			public void run() {
+				updater.updateAll();
+			}
+		});
+	}
+
+}
\ No newline at end of file