/* * Copyright (c) 2010, grossmann * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the jo-widgets.org nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL jo-widgets.org BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ package org.jowidgets.impl.toolkit; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jowidgets.api.animation.IAnimationRunnerBuilder; import org.jowidgets.api.animation.IWaitAnimationProcessor; import org.jowidgets.api.clipboard.IClipboard; import org.jowidgets.api.clipboard.ITransferableBuilder; import org.jowidgets.api.command.IActionBuilderFactory; import org.jowidgets.api.command.IDefaultActionFactory; import org.jowidgets.api.convert.IConverterProvider; import org.jowidgets.api.convert.ISliderConverterFactory; import org.jowidgets.api.event.IDelayedEventRunnerBuilder; import org.jowidgets.api.image.IImageFactory; import org.jowidgets.api.image.Icons; import org.jowidgets.api.image.IconsSmall; import org.jowidgets.api.layout.ILayoutConstraintsToolkit; import org.jowidgets.api.layout.ILayoutFactoryProvider; import org.jowidgets.api.mask.ITextMaskBuilder; import org.jowidgets.api.model.IModelFactoryProvider; import org.jowidgets.api.threads.IUiThreadAccess; import org.jowidgets.api.toolkit.ILoginPane; import org.jowidgets.api.toolkit.IMessagePane; import org.jowidgets.api.toolkit.IQuestionPane; import org.jowidgets.api.toolkit.ISupportedWidgets; import org.jowidgets.api.toolkit.IToolkit; import org.jowidgets.api.toolkit.IWidgetWrapperFactory; import org.jowidgets.api.toolkit.ToolkitInterceptor; import org.jowidgets.api.utils.IWidgetUtils; import org.jowidgets.api.widgets.IComponent; import org.jowidgets.api.widgets.IFrame; import org.jowidgets.api.widgets.IWindow; import org.jowidgets.api.widgets.blueprint.factory.IBluePrintFactory; import org.jowidgets.api.widgets.blueprint.factory.IBluePrintProxyFactory; import org.jowidgets.api.widgets.content.IInputContentCreatorFactory; import org.jowidgets.api.widgets.descriptor.IFrameDescriptor; import org.jowidgets.common.application.IApplicationLifecycle; import org.jowidgets.common.application.IApplicationRunner; import org.jowidgets.common.image.IImageRegistry; import org.jowidgets.common.types.Position; import org.jowidgets.common.widgets.factory.IGenericWidgetFactory; import org.jowidgets.impl.application.ApplicationRunner; import org.jowidgets.impl.base.blueprint.factory.BluePrintProxyFactoryImpl; import org.jowidgets.impl.clipboard.ClipbaordImpl; import org.jowidgets.impl.clipboard.TransferableBuilderImpl; import org.jowidgets.impl.command.ActionBuilderFactory; import org.jowidgets.impl.command.DefaultActionFactoryImpl; import org.jowidgets.impl.content.InputContentCreatorFactory; import org.jowidgets.impl.convert.DefaultConverterProvider; import org.jowidgets.impl.convert.slider.SliderConverterFactoryImpl; import org.jowidgets.impl.image.DefaultIconsRegisterService; import org.jowidgets.impl.image.DefaultImageFactoryImpl; import org.jowidgets.impl.layout.LayoutConstraintsToolkitImpl; import org.jowidgets.impl.layout.LayoutFactoryProvider; import org.jowidgets.impl.mask.TextMaskBuilderImpl; import org.jowidgets.impl.model.ModelFactoryProvider; import org.jowidgets.impl.threads.UiThreadAccess; import org.jowidgets.impl.utils.WidgetUtils; import org.jowidgets.impl.widgets.composed.blueprint.BluePrintFactory; import org.jowidgets.impl.widgets.composed.blueprint.convenience.registry.ComposedSetupConvenienceRegistry; import org.jowidgets.impl.widgets.composed.blueprint.defaults.registry.ComposedDefaultsInitializerRegistry; import org.jowidgets.impl.widgets.composed.factory.GenericWidgetFactory; import org.jowidgets.spi.IWidgetsServiceProvider; import org.jowidgets.spi.image.IImageHandleFactorySpi; import org.jowidgets.tools.controller.WindowAdapter; import org.jowidgets.util.Assert; import org.jowidgets.util.ITypedKey; public class DefaultToolkit implements IToolkit { private final Map<ITypedKey<? extends Object>, Object> values; private final IWidgetsServiceProvider widgetsServiceProvider; private final IGenericWidgetFactory genericWidgetFactory; private final IImageFactory imageFactory; private final ILayoutFactoryProvider layoutFactoryProvider; private final ILayoutConstraintsToolkit layoutConstraintsToolkit; private final IWidgetWrapperFactory widgetWrapperFactory; private final BluePrintFactory bluePrintFactory; private final IBluePrintProxyFactory bluePrintProxyFactory; private ISupportedWidgets supportedWidgets; private final IActionBuilderFactory actionBuilderFactory; private final IDefaultActionFactory defaultActionFactory; private final ISliderConverterFactory sliderConverterFactory; private final IModelFactoryProvider modelFactoryProvider; private final IConverterProvider converterProvider; private final IInputContentCreatorFactory inputContentCreatorFactory; private final WindowProvider windowProvider; private final IMessagePane messagePane; private final IQuestionPane questionPane; private final ILoginPane loginPane; private final IWidgetUtils widgetUtils; private final boolean spiMigLayoutSupport; private IWaitAnimationProcessor waitAnimationProcessor; private IUiThreadAccess uiThreadAccess; private IClipboard clipboard; private IApplicationRunner applicationRunner; public DefaultToolkit(final IWidgetsServiceProvider toolkitSpi) { this(toolkitSpi, true); } /** * Creates a new default toolkit * * @param toolkitSpi The IWidgetsServiceProvider (SPI) to use * @param doToolkitInterception If true, the injected toolkit interceptors (IToolkitIterceptor) * will be invoked for the created toolkit */ public DefaultToolkit(final IWidgetsServiceProvider toolkitSpi, final boolean doToolkitInterception) { Assert.paramNotNull(toolkitSpi, "toolkitSpi"); this.values = new HashMap<ITypedKey<? extends Object>, Object>(); this.widgetsServiceProvider = toolkitSpi; this.genericWidgetFactory = new GenericWidgetFactory(toolkitSpi); this.imageFactory = new DefaultImageFactoryImpl(toolkitSpi.getImageFactory(), toolkitSpi.getImageRegistry()); this.widgetWrapperFactory = new DefaultWidgetWrapperFactory(genericWidgetFactory, toolkitSpi.getWidgetFactory()); this.layoutFactoryProvider = new LayoutFactoryProvider(); this.layoutConstraintsToolkit = new LayoutConstraintsToolkitImpl(); this.bluePrintProxyFactory = new BluePrintProxyFactoryImpl( new ComposedSetupConvenienceRegistry(), new ComposedDefaultsInitializerRegistry()); this.bluePrintFactory = new BluePrintFactory(bluePrintProxyFactory); this.actionBuilderFactory = new ActionBuilderFactory(); this.defaultActionFactory = new DefaultActionFactoryImpl(); this.sliderConverterFactory = SliderConverterFactoryImpl.getInstance(); this.modelFactoryProvider = new ModelFactoryProvider(); this.converterProvider = new DefaultConverterProvider(); this.inputContentCreatorFactory = new InputContentCreatorFactory(); this.windowProvider = new WindowProvider(genericWidgetFactory, toolkitSpi); this.messagePane = new MessagePaneImpl(genericWidgetFactory, bluePrintFactory, windowProvider); this.questionPane = new QuestionPaneImpl(genericWidgetFactory, bluePrintFactory, windowProvider); this.loginPane = new LoginPaneImpl(genericWidgetFactory, bluePrintFactory, windowProvider); this.widgetUtils = new WidgetUtils(); this.spiMigLayoutSupport = toolkitSpi.getWidgetFactory().hasMigLayoutSupport(); final IImageRegistry imageRegistry = toolkitSpi.getImageRegistry(); final IImageHandleFactorySpi imageHandleFactory = toolkitSpi.getImageHandleFactory(); final DefaultIconsRegisterService registerService = new DefaultIconsRegisterService(imageRegistry); registerService.registerImages(); imageRegistry.registerImageConstant(Icons.INFO, imageHandleFactory.infoIcon()); imageRegistry.registerImageConstant(Icons.QUESTION, imageHandleFactory.questionIcon()); imageRegistry.registerImageConstant(Icons.WARNING, imageHandleFactory.warningIcon()); imageRegistry.registerImageConstant(Icons.ERROR, imageHandleFactory.errorIcon()); imageRegistry.registerImageConstant(IconsSmall.INFO, imageHandleFactory.createImageHandle(Icons.INFO, 16, 16)); imageRegistry.registerImageConstant(IconsSmall.QUESTION, imageHandleFactory.createImageHandle(Icons.QUESTION, 16, 16)); imageRegistry.registerImageConstant(IconsSmall.WARNING, imageHandleFactory.createImageHandle(Icons.WARNING, 16, 16)); imageRegistry.registerImageConstant(IconsSmall.ERROR, imageHandleFactory.createImageHandle(Icons.ERROR, 16, 16)); if (doToolkitInterception) { ToolkitInterceptor.onToolkitCreate(this); } } @Override public <VALUE_TYPE> void setValue(final ITypedKey<VALUE_TYPE> key, final VALUE_TYPE value) { Assert.paramNotNull(key, "key"); values.put(key, value); } @SuppressWarnings("unchecked") @Override public <VALUE_TYPE> VALUE_TYPE getValue(final ITypedKey<VALUE_TYPE> key) { return (VALUE_TYPE) values.get(key); } @Override public boolean hasSpiMigLayoutSupport() { return spiMigLayoutSupport; } @Override public IImageRegistry getImageRegistry() { return widgetsServiceProvider.getImageRegistry(); } @Override public IImageFactory getImageFactory() { return imageFactory; } @Override public IGenericWidgetFactory getWidgetFactory() { return genericWidgetFactory; } @Override public IWidgetWrapperFactory getWidgetWrapperFactory() { return widgetWrapperFactory; } @Override public ILayoutFactoryProvider getLayoutFactoryProvider() { return layoutFactoryProvider; } @Override public ILayoutConstraintsToolkit getLayoutConstraintsToolkit() { return layoutConstraintsToolkit; } @Override public IBluePrintFactory getBluePrintFactory() { return bluePrintFactory; } @Override public IBluePrintProxyFactory getBluePrintProxyFactory() { return bluePrintProxyFactory; } @Override public ISupportedWidgets getSupportedWidgets() { if (supportedWidgets == null) { supportedWidgets = new SupportedWidgets(widgetsServiceProvider.getOptionalWidgetFactory()); } return supportedWidgets; } @Override public IActionBuilderFactory getActionBuilderFactory() { return actionBuilderFactory; } @Override public IDefaultActionFactory getDefaultActionFactory() { return defaultActionFactory; } @Override public ISliderConverterFactory getSliderConverterFactory() { return sliderConverterFactory; } @Override public IModelFactoryProvider getModelFactoryProvider() { return modelFactoryProvider; } @Override public IInputContentCreatorFactory getInputContentCreatorFactory() { return inputContentCreatorFactory; } @Override public IConverterProvider getConverterProvider() { return converterProvider; } @Override public IWaitAnimationProcessor getWaitAnimationProcessor() { if (waitAnimationProcessor == null) { waitAnimationProcessor = new DefaultWaitAnimationProcessor(); } return waitAnimationProcessor; } @Override public IAnimationRunnerBuilder getAnimationRunnerBuilder() { return new AnimationRunnerBuilderImpl(); } @Override public IDelayedEventRunnerBuilder getDelayedEventRunnerBuilder() { return new DelayedEventRunnerBuilderImpl(); } @Override public IClipboard getClipboard() { //ensure invocation in ui thread getUiThreadAccess(); if (clipboard == null) { clipboard = new ClipbaordImpl(widgetsServiceProvider.getClipboard()); } return clipboard; } @Override public ITransferableBuilder createTransferableBuilder() { return new TransferableBuilderImpl(); } @Override public synchronized IUiThreadAccess getUiThreadAccess() { if (uiThreadAccess == null) { uiThreadAccess = new UiThreadAccess(widgetsServiceProvider); } if (!uiThreadAccess.isUiThread()) { throw new IllegalStateException("The ui thread access must be get in the ui thread"); } return uiThreadAccess; } @Override public synchronized IApplicationRunner getApplicationRunner() { if (applicationRunner == null) { applicationRunner = new ApplicationRunner(widgetsServiceProvider.createApplicationRunner()); } return applicationRunner; } @Override public IWindow getActiveWindow() { return windowProvider.getActiveWindow(); } @Override public List<IWindow> getAllWindows() { return windowProvider.getAllWindows(); } @Override public IMessagePane getMessagePane() { return messagePane; } @Override public IQuestionPane getQuestionPane() { return questionPane; } @Override public IWidgetUtils getWidgetUtils() { return widgetUtils; } @Override public ITextMaskBuilder createTextMaskBuilder() { return new TextMaskBuilderImpl(); } @Override public ILoginPane getLoginPane() { return loginPane; } @Override public IFrame createRootFrame(final IFrameDescriptor setup) { return genericWidgetFactory.create(setup); } @Override public IFrame createRootFrame(final IFrameDescriptor descriptor, final IApplicationLifecycle lifecycle) { final IFrame result = genericWidgetFactory.create(descriptor); result.addWindowListener(new WindowAdapter() { @Override public void windowClosed() { if (!result.isDisposed()) { result.dispose(); } lifecycle.finish(); } }); return result; } @Override public Position toScreen(final Position localPosition, final IComponent component) { return widgetsServiceProvider.toScreen(localPosition, component); } @Override public Position toLocal(final Position screenPosition, final IComponent component) { return widgetsServiceProvider.toLocal(screenPosition, component); } }