core/com.nokia.carbide.discovery.ui/src/com/nokia/carbide/internal/discovery/ui/extension/AbstractBrowserPortalPageLayer.java
changeset 1721 18638adda547
parent 1705 71a151b1b515
child 1734 bf670d38123a
--- /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/AbstractBrowserPortalPageLayer.java	Thu Jul 29 13:28:20 2010 -0500
@@ -0,0 +1,284 @@
+/*
+* 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.MalformedURLException;
+import java.net.URL;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTError;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.LocationAdapter;
+import org.eclipse.swt.browser.LocationEvent;
+import org.eclipse.swt.browser.OpenWindowListener;
+import org.eclipse.swt.browser.ProgressAdapter;
+import org.eclipse.swt.browser.ProgressEvent;
+import org.eclipse.swt.browser.WindowEvent;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorPart;
+
+import com.nokia.carbide.discovery.ui.Activator;
+import com.nokia.carbide.discovery.ui.Messages;
+import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils;
+
+public abstract class AbstractBrowserPortalPageLayer implements IPortalPageLayer {
+
+	protected class BrowserAction extends Action {
+		
+		public BrowserAction(String text) {
+			super(text);
+		}
+
+		@Override
+		public boolean isEnabled() {
+			return browser != null && !actionBar.isLoading();
+		}
+	}
+	
+	protected class NavigationActionBar implements IActionBar {
+		private Set<IAction> actions;
+		private IActionUIUpdater updater;
+		private boolean loading;
+
+		private NavigationActionBar(IActionUIUpdater updater) {
+			this.updater = updater;
+			actions = makeActions();
+		}
+
+		public void hookBrowser() {
+			browser.addLocationListener(new LocationAdapter() {
+				@Override
+				public void changed(LocationEvent event) {
+					NavigationActionBar.this.updater.updateAll();
+				}
+			});
+			browser.addProgressListener(new ProgressAdapter() {
+				@Override
+				public void changed(ProgressEvent event) {
+	                if (event.total == 0)
+	                    return;
+	                setLoading(event.current != event.total);
+					NavigationActionBar.this.updater.updateAll();
+				}
+				@Override
+				public void completed(ProgressEvent event) {
+					setLoading(false);
+					NavigationActionBar.this.updater.updateAll();
+				}
+			});
+			browser.addOpenWindowListener(new OpenWindowListener() {
+				@Override
+				public void open(WindowEvent event) {
+					event.browser = browser;
+				}
+			});
+		}
+
+		@Override
+		public String getTitle() {
+			return Messages.AbstractBrowserPortalPage_NavigationTitle;
+		}
+
+		@Override
+		public IAction[] getActions() {
+			return (IAction[]) actions.toArray(new IAction[actions.size()]);
+		}
+
+		public void update() {
+			updater.updateAll();
+		}
+
+		private void setLoading(boolean loading) {
+			browser.setCursor(loading ? browser.getDisplay().getSystemCursor(SWT.CURSOR_WAIT) : null);
+			this.loading = loading;
+		}
+
+		@Override
+		public String[] getHighlightedActionIds() {
+			return null;
+		}
+
+		public boolean isLoading() {
+			return loading;
+		}
+	}
+
+	protected Browser browser;
+	protected NavigationActionBar actionBar;
+
+	@Override
+	public Control createControl(Composite parent, IEditorPart part) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		composite.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
+		composite.setLayout(new FillLayout());
+		try {
+			browser = new Browser(composite, SWT.MOZILLA);
+		} catch (SWTError e) {
+			e.printStackTrace();
+		}
+		
+		return composite;
+	}
+
+	protected URL getURL() {
+		try {
+			return new URL(Activator.getFromServerProperties(getClass().getName()));
+		} catch (MalformedURLException e) {
+			Activator.logError(Messages.AbstractBrowserPortalPageLayer_BadURLError, e);
+		}
+		
+		return null;
+	}
+
+	@Override
+	public void init() {
+		if (browser != null) {
+			URL url = getURL();
+			if (url != null) {
+				browser.setUrl(url.toString());
+			}
+			actionBar.hookBrowser();
+		}
+		actionBar.update();
+	}
+	
+	@Override
+	public IActionBar[] createCommandBars(IEditorPart part, IActionUIUpdater updater) {
+		actionBar = new NavigationActionBar(updater);
+		return new IActionBar[] {
+			actionBar
+		};
+	}
+
+	@Override
+	public void dispose() {
+	}
+	
+	protected Set<IAction> makeActions() {
+		Set<IAction> actions = new LinkedHashSet<IAction>();
+		IAction a = new BrowserAction(Messages.AbstractBrowserPortalPage_BackLabel) {
+			@Override
+			public void run() {
+				if (browser != null) {
+					browser.back();
+				}
+			}
+			
+			@Override
+			public boolean isEnabled() {
+				return super.isEnabled() && browser.isBackEnabled();
+			}
+		};
+		actions.add(a);
+		
+		a = new BrowserAction(Messages.AbstractBrowserPortalPageLayer_ForwardLabel) {
+			@Override
+			public void run() {
+				if (browser != null) {
+					browser.forward();
+				}
+			}
+			
+			@Override
+			public boolean isEnabled() {
+				return super.isEnabled() && browser.isForwardEnabled();
+			}
+		};
+		actions.add(a);
+		
+		a = new BrowserAction(Messages.AbstractBrowserPortalPage_RefreshLabel) {
+			@Override
+			public void run() {
+				if (browser != null) {
+					browser.refresh();
+					actionBar.update();
+				}
+			}
+		};
+		actions.add(a);
+
+		a = new Action(Messages.AbstractBrowserPortalPage_StopLabel) {
+			@Override
+			public void run() {
+				if (browser != null) {
+					browser.stop();
+					actionBar.update();
+				}
+			}
+
+			@Override
+			public boolean isEnabled() {
+				return browser != null && actionBar.isLoading();
+			}
+		};
+		actions.add(a);
+		
+		a = new BrowserAction(Messages.AbstractBrowserPortalPageLayer_ShowInBrowserLabel) {
+			public void run() {
+				WorkbenchUtils.showWebPageInExternalBrowser(browser.getUrl());
+			};
+			
+			public boolean isEnabled() {
+				return super.isEnabled() && browserHasURL();
+			};
+		};
+		actions.add(a);
+		
+		a = new Action(Messages.AbstractBrowserPortalPageLayer_OpenLocationLabel) {
+			public void run() {
+				InputDialog dlg = new InputDialog(browser.getShell(), 
+						Messages.AbstractBrowserPortalPageLayer_OpenLocationTitle, Messages.AbstractBrowserPortalPageLayer_URLLabel, null, new IInputValidator() {
+					@Override
+					public String isValid(String newText) {
+						try {
+							new URL(newText);
+						} catch (MalformedURLException e) {
+							return Messages.AbstractBrowserPortalPageLayer_InvalidURLError;
+						}
+						return null;
+					}
+				});
+				int result = dlg.open();
+				if (result == Dialog.OK) {
+					browser.setUrl(dlg.getValue());
+					actionBar.update();
+				}
+			};
+			
+			public boolean isEnabled() {
+				return browser != null;
+			};
+		};
+		actions.add(a);
+		
+		return actions;
+	}
+
+	protected boolean browserHasURL() {
+		String url = browser.getUrl();
+		return url.matches("^.*://.*"); //$NON-NLS-1$
+	}
+}