/*******************************************************************************
* 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.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
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.ScrollBar;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
import org.jboss.tools.common.model.ui.widgets.ScrolledComposite;
public class ScrollableFormContainer extends DefaultFormContainer {
public static final int H_SCROLL_INCREMENT = 5;
public static final int V_SCROLL_INCREMENT = 64;
private IWidgetSettings settings;
private ScrolledComposite scrolledComposite;
private boolean verticalFit = false;
private boolean scrollable = true;
public ScrollableFormContainer() {
}
public ScrollableFormContainer(IForm form) {
super(form);
}
public void dispose() {
super.dispose();
if (scrolledComposite!=null && !scrolledComposite.isDisposed()) scrolledComposite.dispose();
scrolledComposite = null;
}
public Control createControl(Composite parent, IWidgetSettings settings) {
this.settings = settings;
scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 0;
layout.horizontalSpacing = 0;
scrolledComposite.setLayout(layout);
if (getLayoutData()!=null) scrolledComposite.setLayoutData(getLayoutData());
return scrolledComposite;
}
public Control getControl() {
return scrolledComposite;
}
public boolean isScrollable() {
return scrollable;
}
public void setScrollable(boolean b) {
scrollable = b;
}
public boolean isVerticalFit() {
return verticalFit;
}
public void setVerticalFit(boolean b) {
verticalFit = b;
}
/*
private void initializeScrollBars(ScrolledComposite scomp) {
ScrollBar hbar = scomp.getHorizontalBar();
if (hbar != null) {
hbar.setIncrement(H_SCROLL_INCREMENT);
}
ScrollBar vbar = scomp.getVerticalBar();
if (vbar != null) {
vbar.setIncrement(V_SCROLL_INCREMENT);
}
updatePageIncrement(scomp);
}
*/
public void update() {
super.update();
if (scrolledComposite instanceof ScrolledComposite) {
updateScrolledComposite();
} else if(scrolledComposite!=null) {
scrolledComposite.layout(true);
}
}
public void updateScrollBars() {
if (scrolledComposite instanceof ScrolledComposite) {
updateScrolledComposite();
}
}
public void updateScrolledComposite() {
ScrolledComposite sc = (ScrolledComposite)scrolledComposite;
getControl();
if ((scrolledComposite.getViewport()!=null)&&(!scrolledComposite.getViewport().isDisposed())) {
//Point newSize = formControl.computeSize(sc.getClientArea().width, sc.getClientArea().height);
Point oldSize = scrolledComposite.getViewport().getSize();
Point newSize = scrolledComposite.getViewport().computeSize(SWT.DEFAULT, SWT.DEFAULT);
if (oldSize!=null && oldSize.equals(newSize)) return;
if (newSize!=null && oldSize!=null && oldSize.x>=newSize.x && oldSize.y>=newSize.y) return;
scrolledComposite.getViewport().setSize(newSize);
//sc.setMinSize(newSize);
updatePageIncrement(sc);
}
}
public static void updatePageIncrement(ScrolledComposite scomp) {
ScrollBar vbar = scomp.getVerticalBar();
if (vbar != null) {
Rectangle clientArea = scomp.getClientArea();
int increment = clientArea.height - 5;
vbar.setPageIncrement(increment);
}
}
public boolean addForm(IForm form) {
if (scrolledComposite != null) {
Control control = form.getControl();
if (control == null) {
control = form.createControl(this.scrolledComposite.getViewport(), this.settings);
} else {
control.setParent(this.scrolledComposite.getViewport());
}
GridData gd;
gd = new GridData(GridData.FILL_BOTH);
control.setLayoutData(gd);
reflow();
}
form.setParent(this);
form.setEnabled(isEnabled());
return forms.add(form);
}
protected void reflow() {
this.scrolledComposite.getViewport().setRedraw(false);
this.scrolledComposite.getViewport().getParent().setRedraw(false);
this.scrolledComposite.getViewport().layout(true);
this.scrolledComposite.getViewport().getParent().layout(true);
this.scrolledComposite.getViewport().setRedraw(true);
this.scrolledComposite.getViewport().getParent().setRedraw(true);
}
/*
public boolean addForm(IForm form) {
boolean b = super.addForm(form);
update();
return b;
}
*/
}