blob: 8017a8995eb7efc4125ec5469297cb5d4ca6684a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 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.forms.widgets;
import java.util.Hashtable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.internal.forms.widgets.WrappedPageBook;
/**
* ScrolledPageBook is a class that is capable of stacking several composites
* (pages), while showing one at a time. The content is scrolled if there is
* not enough space to fit it in the client area.
*
* @since 3.0
*/
public class ScrolledPageBook extends SharedScrolledComposite {
private WrappedPageBook pageBook;
private Hashtable pages;
private Composite emptyPage;
private Control currentPage;
/**
* Creates a new instance in the provided parent
*
* @param parent
*/
public ScrolledPageBook(Composite parent) {
this(parent, SWT.H_SCROLL | SWT.V_SCROLL);
}
/**
* Creates a new instance in the provided parent and with the provided
* style.
*
* @param parent
* the control parent
* @param style
* the style to use
*/
public ScrolledPageBook(Composite parent, int style) {
super(parent, style);
pageBook = new WrappedPageBook(this, SWT.NULL);
setContent(pageBook);
pages = new Hashtable();
setExpandHorizontal(true);
setExpandVertical(true);
this.addListener(SWT.Traverse, new Listener() {
public void handleEvent(Event e) {
switch (e.detail) {
case SWT.TRAVERSE_ESCAPE :
case SWT.TRAVERSE_RETURN :
case SWT.TRAVERSE_TAB_NEXT :
case SWT.TRAVERSE_TAB_PREVIOUS :
e.doit = true;
break;
}
}
});
}
/**
* Removes the default size of the composite, allowing the control to
* shrink to the trim.
*
* @param wHint
* the width hint
* @param hHint
* the height hint
* @param changed
* if <code>true</code>, do not use cached values
*/
public Point computeSize(int wHint, int hHint, boolean changed) {
Rectangle trim = computeTrim(0, 0, 10, 10);
return new Point(trim.width, trim.height);
}
/**
* Tests if the page under the provided key is currently in the book.
*
* @param key
* the page key
* @return <code>true</code> if page exists, <code>false</code>
* otherwise.
*/
public boolean hasPage(Object key) {
return pages.containsKey(key);
}
/**
* Creates a new page for the provided key. Use the returned composite to
* create children in it.
*
* @param key
* the page key
* @return the newly created page composite
*/
public Composite createPage(Object key) {
Composite page = createPage();
pages.put(key, page);
return page;
}
/**
* Returns the page book container.
*
* @return the page book container
*/
public Composite getContainer() {
return pageBook;
}
/**
* Registers a page under the privided key to be managed by the page book.
* The page must be a direct child of the page book container.
*
* @param key
* the page key
* @param page
* the page composite to register
* @see #createPage
* @see #getContainer
*/
public void registerPage(Object key, Control page) {
pages.put(key, page);
}
/**
* Removes the page under the provided key from the page book. Does nothing
* if page with that key does not exist.
*
* @param key
* the page key.
*/
public void removePage(Object key) {
removePage(key, true);
}
/**
* Removes the page under the provided key from the page book. Does nothing
* if page with that key does not exist.
*
* @param key
* the page key.
* @param showEmptyPage
* if <code>true</code>, shows the empty page
* after page removal.
*/
public void removePage(Object key, boolean showEmptyPage) {
Control page = (Control) pages.get(key);
if (page != null) {
pages.remove(key);
page.dispose();
if (showEmptyPage)
showEmptyPage();
}
}
/**
* Shows the page with the provided key and hides the page previously
* showing. Does nothing if the page with that key does not exist.
*
* @param key
* the page key
*/
public void showPage(Object key) {
Control page = (Control) pages.get(key);
if (page != null) {
pageBook.showPage(page);
if (currentPage != null && currentPage != page) {
// switching pages - force layout
if (page instanceof Composite)
((Composite) page).layout(false);
}
currentPage = page;
} else {
showEmptyPage();
}
reflow(true);
}
/**
* Shows a page with no children to be used if the desire is to not show
* any registered page.
*/
public void showEmptyPage() {
if (emptyPage == null) {
emptyPage = createPage();
emptyPage.setLayout(new GridLayout());
}
pageBook.showPage(emptyPage);
currentPage = emptyPage;
reflow(true);
}
/**
* Sets focus on the current page if shown.
*/
public boolean setFocus() {
if (currentPage != null)
return currentPage.setFocus();
return super.setFocus();
}
/**
* Returns the page currently showing.
*
* @return the current page
*/
public Control getCurrentPage() {
return currentPage;
}
private Composite createPage() {
Composite page = new LayoutComposite(pageBook, SWT.NULL);
page.setBackground(getBackground());
page.setForeground(getForeground());
page.setMenu(pageBook.getMenu());
return page;
}
}