/**
*
*/
package org.javabuilders.swt;
import java.beans.PropertyChangeSupport;
import java.lang.reflect.Method;
import net.miginfocom.swt.MigLayout;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressIndicator;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.custom.CBanner;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.custom.TableCursor;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.CoolBar;
import org.eclipse.swt.widgets.CoolItem;
import org.eclipse.swt.widgets.DateTime;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.ExpandBar;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Sash;
import org.eclipse.swt.widgets.Scale;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Slider;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tracker;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.javabuilders.BuildResult;
import org.javabuilders.Builder;
import org.javabuilders.BuilderConfig;
import org.javabuilders.ICustomCommand;
import org.javabuilders.handler.binding.BuilderBindings;
import org.javabuilders.layout.DefaultResize;
import org.javabuilders.swt.handler.DefaultValidationMessageHandler;
import org.javabuilders.swt.handler.binding.JFaceDatabindingHandler;
import org.javabuilders.swt.handler.event.ButtonSelectionListenerHandler;
import org.javabuilders.swt.handler.event.MenuItemSelectionListenerHandler;
import org.javabuilders.swt.handler.event.background.SWTBackgroundProcessingHandler;
import org.javabuilders.swt.handler.property.SashBoundsHandler;
import org.javabuilders.swt.handler.type.CTabFolderFinishProcessor;
import org.javabuilders.swt.handler.type.DialogHandler;
import org.javabuilders.swt.handler.type.FontAsValueHandler;
import org.javabuilders.swt.handler.type.ImageAsValueHandler;
import org.javabuilders.swt.handler.type.MenuItemTypeHandler;
import org.javabuilders.swt.handler.type.ScrolledCompositeFinishProcessor;
import org.javabuilders.swt.handler.type.ShellHandler;
import org.javabuilders.swt.handler.type.WidgetTypeHandler;
import org.javabuilders.swt.handler.type.layout.FillLayoutHandler;
import org.javabuilders.swt.handler.type.layout.MigSWTLayoutHandler;
import org.javabuilders.swt.handler.type.layout.StackLayoutHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* SWT builder config
* @author Jacek Furmankiewicz
*/
public class SwtJavaBuilderConfig extends BuilderConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(SwtJavaBuilderConfig.class);
/**
* Constructor
* @throws NoSuchMethodException
* @throws SecurityException
*/
public SwtJavaBuilderConfig() {
super(SWTBackgroundProcessingHandler.getInstance(),
DefaultValidationMessageHandler.getInstance(),
new ConfirmCommand());
//use JFace Databinding for binding support
forType(BuilderBindings.class).typeHandler(JFaceDatabindingHandler.getInstance());
addType(
Button.class,
Browser.class,
Canvas.class,
CBanner.class,
CCombo.class,
CLabel.class,
Combo.class,
Composite.class,
CoolBar.class,
CoolItem.class,
CTabFolder.class,
CTabItem.class,
DateTime.class,
Dialog.class,
ExpandBar.class,
Group.class,
Label.class,
Link.class,
List.class,
Menu.class,
MenuItem.class,
ProgressBar.class,
ProgressIndicator.class,
Sash.class,
SashForm.class,
Scale.class,
ScrollBar.class,
ScrolledComposite.class,
Shell.class,
Slider.class,
Spinner.class,
StyledText.class,
TabFolder.class,
TabItem.class,
Table.class,
TableColumn.class,
TableItem.class,
TableCursor.class,
Text.class,
ToolBar.class,
ToolItem.class,
Tracker.class,
Tray.class,
TrayItem.class,
Tree.class,
TreeItem.class,
ViewForm.class
);
addType(
MigLayout.class,
FillLayout.class,
FormLayout.class,
GridLayout.class,
RowLayout.class,
StackLayout.class
);
//define type-specific metadata
forType(Browser.class).defaultResize(DefaultResize.BOTH);
forType(Button.class).propertyHandler(ButtonSelectionListenerHandler.getInstance());
forType(Canvas.class).defaultResize(DefaultResize.BOTH);
forType(CCombo.class).defaultResize(DefaultResize.X_AXIS);
forType(Composite.class).delay(Layout.class).defaultResize(DefaultResize.BOTH)
.children(Widget.class, 0, Integer.MAX_VALUE)
.children(Layout.class, 0, 1);
forType(Combo.class).defaultResize(DefaultResize.X_AXIS);
forType(CTabFolder.class)
.finishProcessor(new CTabFolderFinishProcessor());
forType(CTabItem.class)
.typeAsMethod(Control.class, "setControl")
.childrenOverride(true).children(Control.class,0,1);
forType(Dialog.class).typeHandler(DialogHandler.getInstance());
forType(ExpandBar.class).defaultResize(DefaultResize.BOTH);
forType(FillLayout.class).typeHandler(FillLayoutHandler.getInstance());
forType(Font.class).valueHandler(new FontAsValueHandler());
forType(Group.class).defaultResize(DefaultResize.BOTH);
forType(Image.class).valueHandler(ImageAsValueHandler.getInstance());
forType(List.class).defaultResize(DefaultResize.BOTH);
forType(Menu.class)
.children(MenuItem.class, 0, Integer.MAX_VALUE);
forType(MenuItem.class)
.typeHandler(MenuItemTypeHandler.getInstance())
.propertyHandler(MenuItemSelectionListenerHandler.getInstance())
.children(MenuItem.class, 0, Integer.MAX_VALUE);
forType(MigLayout.class).typeHandler(MigSWTLayoutHandler.getInstance());
forType(ProgressBar.class).defaultResize(DefaultResize.X_AXIS);
forType(Sash.class).propertyHandler(SashBoundsHandler.getInstance());
forType(Scale.class).defaultResize(DefaultResize.X_AXIS);
forType(ScrolledComposite.class).defaultResize(DefaultResize.BOTH).finishProcessor(new ScrolledCompositeFinishProcessor());
forType(Slider.class).defaultResize(DefaultResize.X_AXIS);
forType(Shell.class).typeHandler(ShellHandler.getInstance());
forType(StackLayout.class).typeHandler(StackLayoutHandler.getInstance());
forType(Spinner.class).defaultResize(DefaultResize.X_AXIS);
forType(StyledText.class).defaultResize(DefaultResize.BOTH);
forType(Table.class).defaultResize(DefaultResize.BOTH);
forType(TabItem.class).typeAsMethod(Control.class, "setControl").localize("text","toolTipText")
.children(Composite.class, 0, Integer.MAX_VALUE);
forType(Text.class).defaultResize(DefaultResize.BOTH);
forType(Tree.class).defaultResize(DefaultResize.BOTH);
forType(Widget.class).ignore(SwtJavaBuilder.STYLE).typeHandler(WidgetTypeHandler.getInstance());
//work around weird issue
Method method;
try {
method = Shell.class.getMethod("setMenuBar", Menu.class);
forType(Shell.class).typeAsMethod(Menu.class, method);
} catch (Exception e) {
LOGGER.error(e.getMessage(),e);
}
}
/* (non-Javadoc)
* @see org.javabuilders.BuilderConfig#createPropertyChangeSupport(java.lang.Object)
*/
@Override
public PropertyChangeSupport createPropertyChangeSupport(Object source) {
return new org.javabuilders.swt.worker.SWTPropertyChangeSupport(source, Display.getDefault());
}
/**
* SWT implementation of $confirm
*/
private static class ConfirmCommand implements ICustomCommand<Boolean> {
public Boolean process(BuildResult result, Object source) {
return MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
Builder.getResourceBundle().getString("title.confirmation"),
Builder.getResourceBundle().getString("question.areYouSure"));
}
}
}