/*******************************************************************************
* Copyright (c) 2006, emedia-solutions wolf 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:
* emedia-solutions wolf - initial API and implementation
* (inspired by Phillip Bairds ideas on the
* XSWT mailinglist)
******************************************************************************/
package com.swtworkbench.community.xswt.layoutbuilder;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.ScrolledPageBook;
import org.eclipse.ui.forms.widgets.Section;
import com.swtworkbench.community.xswt.XSWT;
import com.swtworkbench.community.xswt.XSWTException;
/**
* @author markusw
* @version 1.0
*
*/
public class FormToolkitLayoutBuilder extends SWTLayoutBuilder {
/**
* Toolkit to use for this
* {@link com.swtworkbench.community.xswt.layoutbuilder.ILayoutBuilder}
*/
private FormToolkit toolkit;
/**
* @param xswt
*/
public FormToolkitLayoutBuilder(XSWT xswt) {
super(xswt);
}
/**
* Constructor with a precreated
* {@link org.eclipse.ui.forms.widgets.FormToolkit}.
*
* @param xswt
* @param toolkit
*/
public FormToolkitLayoutBuilder(XSWT xswt, FormToolkit toolkit) {
this(xswt);
this.toolkit = toolkit;
}
private void createToolkit(Composite parent) {
this.toolkit = new FormToolkit(parent.getDisplay());
parent.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
disposeToolkit();
}
});
}
final void disposeToolkit() {
this.toolkit.dispose();
this.toolkit = null;
}
/**
* @return the toolkit
*/
public FormToolkit getToolkit() {
return this.toolkit;
}
/**
* @see com.swtworkbench.community.xswt.layoutbuilder.SWTLayoutBuilder#construct(java.lang.Class,
* java.lang.Object, int, java.lang.String, java.lang.Object)
*/
public Object construct(Class klass, Object parent, int style, String name,
Object contextElement) throws XSWTException {
if (parent instanceof Composite) {
Composite p = (Composite) parent;
if (this.toolkit == null) {
this.createToolkit(p);
}
if (Button.class.equals(klass)) {
return this.toolkit.createButton(p, name, style);
} else if (Composite.class.equals(klass)) {
return this.toolkit.createComposite(p, style);
} else if ("CompositeSeparator".equals(klass.getSimpleName())) { //$NON-NLS-1$
return this.toolkit.createCompositeSeparator(p);
} else if (ExpandableComposite.class.equals(klass)) {
return this.toolkit.createExpandableComposite(p, style);
} else if (Form.class.equals(klass)) {
Form form = this.toolkit.createForm(p);
this.toolkit.paintBordersFor(form.getBody());
return form;
} else if (FormText.class.equals(klass)) {
// FIXME: The trackFocus parameter should be configurable via xml
return this.toolkit.createFormText(p, true);
} else if (Hyperlink.class.equals(klass)) {
return this.toolkit.createHyperlink(p, name, style);
} else if (ImageHyperlink.class.equals(klass)) {
return this.toolkit.createImageHyperlink(p, style);
} else if (Label.class.equals(klass)) {
return this.toolkit.createLabel(p, name, style);
} else if (ScrolledForm.class.equals(klass)) {
ScrolledForm form = this.toolkit.createScrolledForm(p);
this.toolkit.paintBordersFor(form.getBody());
return form;
} else if (ScrolledPageBook.class.equals(klass)) {
return this.toolkit.createPageBook(p, style);
} else if (Section.class.equals(klass)) {
return this.toolkit.createSection(p, style);
} else if ("Separator".equals(klass.getSimpleName())) { //$NON-NLS-1$
return this.toolkit.createSeparator(p, style);
} else if (Table.class.equals(klass)) {
return this.toolkit.createTable(p, style);
} else if (Text.class.equals(klass)) {
return this.toolkit.createText(p, name, style);
} else if (Tree.class.equals(klass)) {
return this.toolkit.createTree(p, style);
}
}
// Fall back
Object constructed = super.construct(klass, parent, style, name,
contextElement);
if (constructed instanceof Control) {
Control constructedControl = (Control) constructed;
this.toolkit.adapt(constructedControl, false, false);
}
return constructed;
}
}