/******************************************************************************* * 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; } }