blob: 5eb1d310c16858b2b3d9cd316223be5bb42ee283 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}