blob: 5d1d2b39eaa75008a390e5a105a140764c3949ef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.intro.impl.swt;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledPageBook;
import org.eclipse.ui.internal.intro.impl.IIntroConstants;
import org.eclipse.ui.internal.intro.impl.Messages;
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.url.IntroURLParser;
import org.eclipse.ui.internal.intro.impl.util.DialogUtil;
import org.eclipse.ui.internal.intro.impl.util.Util;
import org.eclipse.ui.intro.config.IIntroContentProviderSite;
/**
* A Form that represents an Intro Page. It is swapped in the main page book in
* the FormIntroPartImplementation class. It has a page book for swapping in
* categories (content) of Intro Pages.
*/
public class PageForm implements IIntroConstants {
protected FormToolkit toolkit;
private ScrolledPageBook categoryPageBook;
protected IntroModelRoot model;
private Form parentForm;
protected Form pageForm;
// private SharedStyleManager sharedStyleManager;
// Id to this page. There is only a single instance of this page in the
// main page book.
public static String PAGE_FORM_ID = "pageFormId"; //$NON-NLS-1$
// site is cached to hand down to the PageWidgetFactory for creating the UI
// for content providers..
private IIntroContentProviderSite site;
protected HyperlinkAdapter hyperlinkAdapter = new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
String url = (String) e.getHref();
IntroURLParser parser = new IntroURLParser(url);
if (parser.hasIntroUrl()) {
// execute the action embedded in the IntroURL
parser.getIntroURL().execute();
return;
} else if (parser.hasProtocol()) {
Util.openBrowser(url);
return;
}
DialogUtil.displayInfoMessage(((Control) e.getSource()).getShell(),
Messages.HyperlinkAdapter_urlIs + " " + url); //$NON-NLS-1$
}
@Override
public void linkEntered(HyperlinkEvent e) {
}
@Override
public void linkExited(HyperlinkEvent e) {
}
};
/**
*
*/
public PageForm(FormToolkit toolkit, IntroModelRoot modelRoot,
Form parentForm) {
this.toolkit = toolkit;
this.model = modelRoot;
this.parentForm = parentForm;
}
/**
* Create a Form for holding pages without navigation.
*
* @param pageBook
*/
public void createPartControl(ScrolledPageBook mainPageBook,
SharedStyleManager sharedStyleManager) {
// Cash the shared style manager. We need to pass it around to category
// forms. So, do not null it!
// this.sharedStyleManager = sharedStyleManager;
// creating page in Main page book.
pageForm = toolkit.createForm(mainPageBook.getContainer());
mainPageBook.registerPage(getId(), pageForm);
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
pageForm.getBody().setLayout(layout);
// Util.highlight(pageForm.getBody(), SWT.COLOR_RED);
// Get form body. Form body is one column grid layout. Add page book
// and navigation UI to it.
categoryPageBook = toolkit.createPageBook(pageForm.getBody(),
SWT.H_SCROLL | SWT.V_SCROLL);
categoryPageBook.setLayoutData(new GridData(GridData.FILL_BOTH));
// pageForm.setText(rootPageStyleManager.getPageSubTitle());
}
protected String getId() {
return PAGE_FORM_ID;
}
/**
* This method is called when the current page changes. It creates the
* PageContentForm if necessary, and handles showing the page in the Page
* Book. It creates a model PageContentForm for the current page.
*
* @param pageID
*/
public void showPage(AbstractIntroPage page,
SharedStyleManager sharedStyleManager) {
if (!categoryPageBook.hasPage(page.getId())) {
// if we do not have a category form for this page create one.
PageContentForm categoryForm = new PageContentForm(toolkit, model,
page);
categoryForm.setContentProviderSite(site);
// load style manager only once, here.
PageStyleManager styleManager = new PageStyleManager(page,
sharedStyleManager.getProperties());
categoryForm.createPartControl(categoryPageBook, styleManager);
}
categoryPageBook.showPage(page.getId());
// Get cached page subtitle from control data.
Composite pageComposite = (Composite) categoryPageBook.getCurrentPage();
// update main Form title.
parentForm.setText(model.getCurrentPage().getTitle());
// update this page form's title, ie: Page subtitle, if it exists.
pageForm.setText((String) pageComposite.getData(PAGE_SUBTITLE));
// TODO need to transfer focus to the first link in
// the page somehow; we may need IIntroPage interface with
// a few methods like 'setFocus()' etc.
// DG
}
public void reflow() {
categoryPageBook.reflow(true);
}
public boolean hasPage(String pageId) {
return categoryPageBook.hasPage(pageId);
}
public void removePage(String pageId) {
categoryPageBook.removePage(pageId);
}
public void setContentProviderSite(IIntroContentProviderSite site) {
this.site = site;
}
}