| /******************************************************************************* |
| * Copyright (c) 2004, 2006 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| |
| package org.eclipse.ui.internal.intro.impl.model.url; |
| |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.internal.intro.impl.IntroPlugin; |
| import org.eclipse.ui.internal.intro.impl.model.AbstractIntroElement; |
| import org.eclipse.ui.internal.intro.impl.model.AbstractIntroPage; |
| import org.eclipse.ui.internal.intro.impl.model.IntroModelRoot; |
| import org.eclipse.ui.internal.intro.impl.model.IntroPartPresentation; |
| import org.eclipse.ui.internal.intro.impl.presentations.BrowserIntroPartImplementation; |
| import org.eclipse.ui.internal.intro.impl.util.Log; |
| |
| public class ShowHelpURLHandler { |
| private IntroURL introURL = null; |
| |
| ShowHelpURLHandler(IntroURL url) { |
| this.introURL = url; |
| } |
| |
| |
| |
| public boolean showHelpTopic(String href, String embed, String embedTarget) { |
| if (href == null) |
| return false; |
| |
| boolean isEmbedded = (embed != null && embed |
| .equals(IntroURL.VALUE_TRUE)) ? true : false; |
| if (isEmbedded == false) |
| // still false, check the embedTarget. If embedTarget is set, then |
| // we |
| // have embedded by default. |
| isEmbedded = (embedTarget != null) ? true : false; |
| |
| IntroPartPresentation presentation = IntroPlugin.getDefault() |
| .getIntroModelRoot().getPresentation(); |
| String presentationStyle = presentation.getImplementationKind(); |
| |
| if (isEmbedded |
| && presentationStyle |
| .equals(IntroPartPresentation.BROWSER_IMPL_KIND)) { |
| |
| // Embedded is true and we have HTML presentation, show href |
| // embedded, either in full page, or in div. |
| BrowserIntroPartImplementation impl = (BrowserIntroPartImplementation) presentation |
| .getIntroPartImplementation(); |
| // INTRO: maybe add support for navigation |
| href = PlatformUI.getWorkbench().getHelpSystem() |
| .resolve(href, true).toExternalForm(); |
| |
| if (embedTarget == null) |
| return impl.getBrowser().setUrl(href); |
| |
| // embedded in Div case. |
| IntroModelRoot model = IntroPlugin.getDefault().getIntroModelRoot(); |
| return handleEmbedURLInDiv(href, embedTarget, model |
| .getCurrentPage()); |
| } |
| |
| // show href in Help window. SWT presentation is handled here. |
| // WorkbenchHelp takes care of error handling. |
| PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(href); |
| return true; |
| } |
| |
| |
| /* |
| * Handles the embedded url case. Clone page and insert an IFrame in the |
| * target embed div. Note that only one div per page can be specified as an |
| * embed div. This is because we need to mangle the name for the cloned |
| * page, and the mangled name id pageId_embedTarget. |
| */ |
| private boolean handleEmbedURLInDiv(String href, String embedTarget, |
| AbstractIntroPage currentPage) { |
| |
| // re-use a runtime generated page, if found. Create the mangled id for |
| // the page and check if page exists first. If not, create one. |
| IntroModelRoot model = (IntroModelRoot) currentPage.getParentPage() |
| .getParent(); |
| String currentPageId = null; |
| if (currentPage.isIFramePage()) |
| currentPageId = currentPage.getUnmangledId(); |
| else |
| currentPageId = currentPage.getId(); |
| String mangledPageId = currentPageId + "_" + "WITH_IFRAME"; //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| // get current standby state. |
| boolean standby = IntroPlugin.isIntroStandby(); |
| String standbyAsString = standby ? IntroURL.VALUE_TRUE : "false"; //$NON-NLS-1$ |
| |
| AbstractIntroPage pageWithIFrame = (AbstractIntroPage) model.findChild( |
| mangledPageId, AbstractIntroElement.ABSTRACT_PAGE); |
| if (pageWithIFrame != null) { |
| pageWithIFrame.setIFrameURL(href); |
| return introURL.showPage(mangledPageId, standbyAsString); |
| } |
| |
| // Page never generated, clone and create. |
| AbstractIntroPage clonedPage = null; |
| try { |
| clonedPage = (AbstractIntroPage) currentPage.clone(); |
| } catch (CloneNotSupportedException ex) { |
| // should never be here. |
| Log.error("Failed to clone Intro page: " + currentPage.getId(), ex); //$NON-NLS-1$ |
| return false; |
| } |
| |
| // embed url as IFrame in target div. We need to find target div in |
| // cloned page not in the original page. |
| boolean canInjectFrame = clonedPage.injectIFrame(href, embedTarget); |
| if (!canInjectFrame) |
| // Called method handles error. |
| return false; |
| |
| clonedPage.setId(mangledPageId); |
| model.addChild(clonedPage); |
| return introURL.showPage(clonedPage.getId(), standbyAsString); |
| } |
| |
| } |