/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.forms;
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.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.events.IExpansionListener;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
public class ExpandableForm extends DefaultForm {
public static final int SELECTION = 1;
private Control client;
//private SectionChangeManager sectionManager;
private String description;
protected Label descriptionLabel;
private boolean descriptionPainted = true;
private boolean collapsable = true;
private boolean collapsed = false;
private Composite control;
private static final String COLLAPSED_ID = "collapsed"; //$NON-NLS-1$
protected Section section;
private Layout layout;
public ExpandableForm() {
}
public void dispose() {
super.dispose();
if (descriptionLabel!=null && descriptionLabel.isDisposed()) descriptionLabel.dispose();
descriptionLabel = null;
if (client!=null && !client.isDisposed()) client.dispose();
client = null;
if (control!=null && !control.isDisposed()) control.dispose();
control = null;
if(section != null) {
if(!section.isDisposed()) section.dispose();
section = null;
}
}
public Control getControl() {
return control;
}
public Control createControl(Composite parent, IWidgetSettings settings) {
FormToolkit toolkit = settings.getToolkit(parent.getDisplay());
if(toolkit == null) {
toolkit = new FormToolkit(parent.getDisplay());
}
// commented by vitali:
//section = toolkit.createSection(parent, ExpandableComposite.TWISTIE|ExpandableComposite.EXPANDED|ExpandableComposite.TITLE_BAR);
// ExpandableComposite.TITLE_BAR option results for the tree flicking in "Hibernate Configuration 3.0 XML Editor"
section = toolkit.createSection(parent, ExpandableComposite.TWISTIE|ExpandableComposite.EXPANDED|ExpandableComposite.SHORT_TITLE_BAR);
section.setText("" + getHeadingText()); //$NON-NLS-1$
section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | /*GridData.FILL_VERTICAL |*/ GridData.VERTICAL_ALIGN_BEGINNING));
toolkit.adapt(section);
section.setBackground(parent.getBackground());
Composite composite = section;
// settings.setupControl(composite);
composite.setLayout(new GridLayout(3, false)); // self layout!
composite.setLayoutData(getLayoutData());
composite.setData(this);
if (collapsable) {
section.addExpansionListener(new IExpansionListener() {
public void expansionStateChanged(ExpansionEvent e) {
collapsed = !section.isExpanded();
}
public void expansionStateChanging(ExpansionEvent e) {
}
});
}
if (descriptionPainted && description != null) {
descriptionLabel = new Label(composite, SWT.NONE | SWT.WRAP);
settings.setupControl(descriptionLabel);
}
client = createClientArea(composite, settings);
composite.setData(this);
control = composite;
if (this.isCollapsed()) {
section.setExpanded(false);
}
// section.setClient(composite);
section.setClient(client);
return control;
}
protected void reflow() {
if (control==null) return;
Composite parent = control.getParent();
Control parentParent = null;
if (parent!=null) parentParent = parent.getParent();
control.setRedraw(false);
if (parent!=null) control.getParent().setRedraw(false);
if (parentParent!=null) control.getParent().getParent().setRedraw(false);
control.layout(true);
if (parent!=null) control.getParent().layout(true);
if (parentParent!=null) control.getParent().getParent().layout(true);
control.setRedraw(true);
if (parent!=null) control.getParent().setRedraw(true);
if (parentParent!=null) control.getParent().getParent().setRedraw(true);
}
public Layout getLayout() {
return layout;
}
public void setLayout(Layout layout) {
this.layout = layout;
}
public boolean isCollapsable() {
return collapsable;
}
public void setCollapsable(boolean b) {
collapsable = b;
}
public boolean isCollapsed() {
return collapsed;
}
public void setCollapsed(boolean b) {
collapsed = b;
}
public void load(IMemento memento) {
String collapsed = memento.getString(COLLAPSED_ID);
if (collapsed!=null) setCollapsed(Boolean.valueOf(collapsed).booleanValue());
}
public void store(IMemento memento) {
memento.putString(COLLAPSED_ID, ""+isCollapsed()); //$NON-NLS-1$
}
}