| /******************************************************************************* |
| * Copyright (c) 2006 Sybase, Inc. 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: |
| * Sybase, Inc. - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.jsf.common.ui.internal.guiutils; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.custom.ScrolledComposite; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.ui.forms.events.ExpansionAdapter; |
| import org.eclipse.ui.forms.events.ExpansionEvent; |
| import org.eclipse.ui.forms.widgets.ExpandableComposite; |
| import org.eclipse.ui.forms.widgets.FormToolkit; |
| import org.eclipse.ui.forms.widgets.Section; |
| |
| /** |
| * Creates a class to be used to build a control for a collapseable area inside |
| * a scrollable composite. This will take care of scrollbar resize. |
| * |
| * Example use: |
| * |
| * CollapsableSection cs = new CollapsableSection(toolkit, scomp, "General", |
| * true) { public void setCollapsableContent(Composite composite) { // place |
| * your content on this composite.... } }); cs.createControl(composite, |
| * horizontalSpan); |
| * |
| * @author mengbo |
| * |
| */ |
| public abstract class CollapsableSection { |
| // internal fields needed for doing the section and computing the scrollbar |
| // on a collapse. |
| private FormToolkit _toolkit; |
| |
| private Section _section; |
| |
| private ScrolledComposite _scomp; |
| |
| private String _title; |
| |
| private int _expansionStyle; |
| |
| /** |
| * Creates a class to be used to build the control for a collapseable area. |
| * |
| * @param toolkit |
| * |
| * @param scomp |
| * the scrollable composite used inside the container. This is |
| * used to force resizing of the bars on dinking the control. |
| * @param title |
| * the string to place next to the collapsable icon. |
| * @param bCollapsed |
| * should this area start collapsed? |
| */ |
| public CollapsableSection(FormToolkit toolkit, ScrolledComposite scomp, |
| String title, boolean bCollapsed) { |
| _toolkit = toolkit; |
| _scomp = scomp; |
| _title = title; |
| _expansionStyle = ExpandableComposite.TWISTIE |
| | ExpandableComposite.FOCUS_TITLE; |
| if (bCollapsed) { |
| _expansionStyle |= ExpandableComposite.COMPACT; |
| } else { |
| _expansionStyle |= ExpandableComposite.EXPANDED; |
| } |
| } |
| |
| /** |
| * Build the GUI parts of the Collapsable area into the given composite. |
| * NOTE: you must set the layout on this composite before adding swt |
| * widgets. |
| * |
| * @param composite |
| */ |
| abstract public void setCollapsableContent(Composite composite); |
| |
| /** |
| * A convient way to build the widget into a control and place it on the |
| * page. NOTE: this method will build the Section and call |
| * setCollapsableContent with a composite to fill in the inner area. |
| * |
| * @param parent |
| * @param horizontalSpan |
| * how many columns should this control span. |
| * @return Control that was added to the composite. |
| */ |
| public Control createControl(Composite parent, int horizontalSpan) { |
| _section = _toolkit.createSection(parent, _expansionStyle); |
| _section.clientVerticalSpacing = 5; // space between the dink and the |
| // controls in when opened. |
| // _section.marginHeight = 5; // indents the entire section. |
| // _section.marginWidth = 5; // indents the entire section. |
| _section.setText(_title); |
| _toolkit.createCompositeSeparator(_section); |
| _section.addExpansionListener(new ExpansionAdapter() { |
| public void expansionStateChanged(ExpansionEvent event) { |
| SWTUtils.computeScrollArea(_scomp, (Composite) _scomp |
| .getContent()); |
| } |
| }); |
| |
| Composite content = new Composite(_section, SWT.NULL); |
| setCollapsableContent(content); |
| |
| _section.setClient(content); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = horizontalSpan; |
| _section.setLayoutData(gd); |
| |
| return _section; |
| } |
| |
| /** |
| * Programmatically changes expanded state. |
| * |
| * @param expanded |
| * the new expanded state |
| */ |
| public void setExpanded(boolean expanded) { |
| if (_section != null) { |
| _section.setExpanded(expanded); |
| |
| // NOTE: internal calling of expanding doesn't fire |
| // the event to resize. We do it here. |
| SWTUtils.computeScrollArea(_scomp, (Composite) _scomp.getContent()); |
| } |
| } |
| |
| /** |
| * Return the internal Section control for more advanced things. |
| * |
| * @return Section |
| */ |
| public Section getSection() { |
| return _section; |
| } |
| } |