core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/editor/PortalEditor.java
changeset 1609 085da1889c59
child 1615 d5f384bf1e88
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/editor/PortalEditor.java	Tue Jul 13 15:27:30 2010 -0500
@@ -0,0 +1,287 @@
+/*
+* 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.editor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.graphics.Resource;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IPersistableElement;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.EditorPart;
+
+import com.nokia.carbide.discovery.ui.Activator;
+import com.nokia.carbide.internal.discovery.ui.extension.IPortalPage;
+import com.nokia.carbide.internal.discovery.ui.extension.IPortalPage.IActionBar;
+import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils;
+
+public class PortalEditor extends EditorPart {
+
+	private static final String ID = "com.nokia.carbide.discovery.ui.portalEditor"; //$NON-NLS-1$
+	private static final String CONTEXT_ID = ID + ".context"; //$NON-NLS-1$
+	private static IEditorInput input;
+	private List<IPortalPage> uninitializedPages;
+	private Composite backgroundParent;
+	private Image oldBGImg;
+	private List<Resource> resources;
+	private StackComposite stackComposite;
+	
+	private Map<IPortalPage, Control> pageToControlMap;
+	private NavigationBar navigationBar;
+
+	public PortalEditor() {
+		resources = new ArrayList<Resource>();
+		getPortalPages();
+		pageToControlMap = new HashMap<IPortalPage, Control>();
+	}
+	
+	private void getPortalPages() {
+		uninitializedPages = new ArrayList<IPortalPage>();
+		IConfigurationElement[] elements = 
+			Platform.getExtensionRegistry().getConfigurationElementsFor(Activator.PLUGIN_ID + ".portalPage");
+		for (IConfigurationElement element : elements) {
+			try {
+				uninitializedPages.add((IPortalPage) element.createExecutableExtension("class")); //$NON-NLS-1$
+			} 
+			catch (CoreException e) {
+				Activator.logError("Could not load portal page", e);
+			}
+		}
+	}
+
+	@Override
+	public void doSave(IProgressMonitor monitor) {
+	}
+
+	@Override
+	public void doSaveAs() {
+	}
+
+	@Override
+	public boolean isDirty() {
+		return false;
+	}
+
+	@Override
+	public boolean isSaveAsAllowed() {
+		return false;
+	}
+
+	@Override
+	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+		setSite(site);
+		setInput(input);
+	}
+
+	@Override
+	public void createPartControl(final Composite parent) {
+		Composite body = createBody(parent);
+		navigationBar.initUI();
+
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(body, CONTEXT_ID);
+	}
+
+	private Composite createBody(final Composite parent) {
+		// create background
+		backgroundParent = new Composite(parent, SWT.NONE);
+		applyBG(backgroundParent);
+		backgroundParent.setLayout(GridLayoutFactory.fillDefaults().create());
+		// create top naviation bar
+		navigationBar = createNavigationBar(backgroundParent);
+		// create stack composite
+		createStackComposite(backgroundParent, navigationBar);
+		return backgroundParent;
+	}
+
+	private void createStackComposite(Composite parent, NavigationBar bar) {
+		stackComposite = new StackComposite(parent, backgroundParent);
+		for (IPortalPage page : uninitializedPages) {
+			Control control = createPage(page);
+			pageToControlMap.put(page, control);
+		}
+		stackComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
+	}
+
+	private Control createPage(IPortalPage page) {
+		Composite pageComposite = new SharedBackgroundComposite(stackComposite, backgroundParent);
+		pageComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).spacing(20, 0)
+				.extendedMargins(20, 20, 20, 0).create());
+		ActionUIUpdater updater = new ActionUIUpdater();
+		IActionBar[] commandBars = page.createCommandBars(this, updater);
+		if (commandBars.length > 0) {
+			Composite taskComposite = new SharedBackgroundComposite(pageComposite, backgroundParent);
+			taskComposite.setLayout(GridLayoutFactory.fillDefaults().create());
+			taskComposite.setLayoutData(GridDataFactory.fillDefaults().grab(false, true).create());
+			for (IActionBar actionBar : commandBars) {
+				Control control = createTaskBarControl(taskComposite, actionBar, updater);
+				control.setLayoutData(GridDataFactory.fillDefaults().indent(0, 0).create());
+			}
+		}
+		Composite pageControl = new RoundedCornerComposite(pageComposite, backgroundParent, 
+				null, pageComposite.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
+		pageControl.setLayout(GridLayoutFactory.fillDefaults().margins(2, 2).create());
+		pageControl.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
+		Control control = page.createControl(pageControl, this);
+		control.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
+		return pageComposite;
+	}
+
+	private Control createTaskBarControl(Composite clientArea, IActionBar actionBar, ActionUIUpdater updater) {
+		TaskBar taskBar = new TaskBar(clientArea, this, actionBar);
+		updater.setTaskBar(taskBar);
+		return taskBar;
+	}
+
+	private NavigationBar createNavigationBar(Composite parent) {
+		NavigationBar bar = new NavigationBar(this, parent);
+		for (IPortalPage page : uninitializedPages) {
+			bar.addNavButton(bar, page);
+		}
+		
+		return bar;
+	}
+	
+	void showPage(IPortalPage page) {
+		if (uninitializedPages.contains(page)) {
+			uninitializedPages.remove(page);
+			page.init();
+		}
+		stackComposite.showControl(pageToControlMap.get(page));
+	}
+
+	private void applyBG(final Composite composite) {
+		composite.addListener(SWT.Resize, new Listener() {
+			@Override
+			public void handleEvent(Event event) {
+				Rectangle rect = composite.getClientArea();
+				Image newImage = new Image(composite.getDisplay(), rect.width, rect.height);
+				GC gc = new GC(newImage);
+				gc.setForeground(composite.getDisplay().getSystemColor(SWT.COLOR_BLACK));
+				gc.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_GRAY));
+				gc.fillGradientRectangle(0, 0, rect.width, rect.height, true);
+				gc.dispose();
+				composite.setBackgroundImage(newImage);
+
+				if (oldBGImg != null)
+					oldBGImg.dispose();
+				oldBGImg = newImage;
+			}
+		});
+	}
+
+	@Override
+	public void setFocus() {
+	}
+	
+	public static void openPortal() {
+		try {
+			WorkbenchUtils.openEditor(getInput(), ID);
+		} catch (PartInitException e) {
+			Activator.logError("Could not open portal", e);
+		}
+	}
+
+	private static IEditorInput getInput() {
+		if (input == null) {
+			input = new IEditorInput() {
+				@SuppressWarnings("rawtypes")
+				@Override
+				public Object getAdapter(Class adapter) {
+					return null;
+				}
+				
+				@Override
+				public String getToolTipText() {
+					return getName();
+				}
+				
+				@Override
+				public IPersistableElement getPersistable() {
+					return null;
+				}
+				
+				@Override
+				public String getName() {
+					return "Carbide.c++ Portal";
+				}
+				
+				@Override
+				public ImageDescriptor getImageDescriptor() {
+					return null;
+				}
+				
+				@Override
+				public boolean exists() {
+					return false;
+				}
+			};
+		}
+			
+		return input;
+	}
+	
+	Image createImage(ImageDescriptor desc) {
+//		Image image = new Image(Display.getCurrent(), desc.getImageData().scaledTo(16, 16));
+		Image image = desc.createImage();
+		resources.add(image);
+		return image;
+	}
+	
+	Font createFont(String name, int height, int style) {
+		Font font = new Font(Display.getCurrent(), name, height, style);
+		
+		resources.add(font);
+		return font;
+	}
+	
+	@Override
+	public void dispose() {
+		super.dispose();
+		for (Resource resource : resources) {
+			resource.dispose();
+		}
+		if (oldBGImg != null)
+			oldBGImg.dispose();
+	}
+
+	public Composite getBackgroundParent() {
+		return backgroundParent;
+	}
+
+}