package org.gudy.azureus2.ui.swt; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; public class TwistieSection extends Composite implements ITwistieConstants { private TwistieContentPanel content = null; private TwistieLabel label = null; /** * Create a TwistieSection with the given style bit. * <p>Style bit can be one or more of:</p> * <ul> * <li> TwistieLabel.NONE</li> -- The default; does not show description and separator, and is collapsed * <li> TwistieLabel.SHOW_DESCRIPTION</li> -- Show the description below the separator (or title if separator s not shown) * <li> TwistieLabel.SHOW_SEPARATOR</li> -- Show a separator below the title * <li> TwistieLabel.SHOW_EXPANDED</li> -- Show a separator below the title * </ul> */ public TwistieSection(Composite parent, int style) { super(parent, SWT.NONE); GridLayout gLayout = new GridLayout(); gLayout.marginHeight = 0; gLayout.marginWidth = 0; gLayout.verticalSpacing = 0; setLayout(gLayout); label = new TwistieLabel(this, style); label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); content = new TwistieContentPanel(this, SWT.NONE); final GridData gDataExpanded = new GridData(SWT.FILL, SWT.FILL, true, true); final GridData gDataCollapsed = new GridData(SWT.FILL, SWT.FILL, true, false); gDataCollapsed.heightHint = 0; content._setLayoutData((true == label.isCollapsed()) ? gDataCollapsed : gDataExpanded); label.addTwistieListener(new ITwistieListener() { public void isCollapsed(boolean value) { content._setLayoutData((true == value) ? gDataCollapsed : gDataExpanded); layout(true, true); } }); } /** * Returns the main body of the section. Callers can add custom controls onto the returned * <code>Composite</code> * @return */ public Composite getContent() { return content; } public void setBackground(Color color) { if (null != label && false == label.isDisposed()) { label.setBackground(color); } if (null != content && false == content.isDisposed()) { content.setBackground(color); } super.setBackground(color); } public void setForeground(Color color) { if (null != label && false == label.isDisposed()) { label.setForeground(color); } if (null != content && false == content.isDisposed()) { content.setForeground(color); } super.setForeground(color); } public void setEnabled(boolean enabled) { if (null != label && false == label.isDisposed()) { label.setEnabled(enabled); } super.setEnabled(enabled); } /** * Delegating to the <code>TwistieLabel</code> * @param listener */ public void addTwistieListener(ITwistieListener listener) { if (null != label && false == label.isDisposed()) { label.addTwistieListener(listener); } } /** * Delegating to the <code>TwistieLabel</code> * @param listener */ public void removeTwistieListener(ITwistieListener listener) { if (null != label && false == label.isDisposed()) { label.removeTwistieListener(listener); } } /** * Delegating to the <code>TwistieLabel</code> * @param string */ public void setDescription(String string) { if (null != label && false == label.isDisposed()) { label.setDescription(string); } } /** * Delegating to the <code>TwistieLabel</code> * @param string */ public void setTitle(String string) { if (null != label && false == label.isDisposed()) { label.setTitle(string); } } /** * Delegating to the <code>TwistieLabel</code> * @param string */ public void setToolTipText(String string) { if (null != label && false == label.isDisposed()) { label.setToolTipText(string); } } /** * Delegating to the <code>TwistieLabel</code> * @param color */ public void setTwistieForeground(Color color) { if (null != label && false == label.isDisposed()) { label.setTwistieForeground(color); } } /** * A simple extension of <code>Composite</code> that disallow modifying its layout data * @author knguyen * */ private class TwistieContentPanel extends Composite { public TwistieContentPanel(Composite parent, int style) { super(parent, style); } private void _setLayoutData(GridData gData) { super.setLayoutData(gData); } public void setLayoutData(Object layoutData) { throw new IllegalArgumentException( "This is a managed class therefore overriding its LayoutData is an illegal operation"); } } }