/*******************************************************************************
* Copyright (c) 2002, 2010 Innoopract Informationssysteme GmbH.
* 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:
* Innoopract Informationssysteme GmbH - initial API and implementation
* EclipseSource - ongoing development
******************************************************************************/
package org.eclipse.swt.internal.widgets.displaykit;
import java.io.InputStream;
import org.eclipse.rwt.internal.lifecycle.HtmlResponseWriter;
import org.eclipse.rwt.internal.resources.ResourceManager;
import org.eclipse.rwt.internal.resources.ResourceRegistry;
import org.eclipse.rwt.internal.service.ContextProvider;
import org.eclipse.rwt.internal.service.IServiceStateInfo;
import org.eclipse.rwt.internal.util.HTML;
import org.eclipse.rwt.resources.*;
import org.eclipse.rwt.resources.IResourceManager.RegisterOptions;
// TODO [rh] Should javaScript namespaces include widget and/or custom?
// e.g. org/eclipse/swt/widgets/TabUtil.js
final class AdlibResourcesUtil {
private static final String CLIENT_LIBRARY_VARIANT
= "org.eclipse.rwt.clientLibraryVariant";
private static final String DEBUG_CLIENT_LIBRARY_VARIANT = "DEBUG";
private static final String ADLIB_JS = "AdLib.js";
private static final String QX_JS = "qx.js";
private static final String QX_DEBUG_JS = "qx-debug.js";
private static final String[] JAVASCRIPT_FILES = new String[]{
// TODO [rh] since qx 0.6.5 all constants seem to be 'inlined'
// these three files are here to keep DefaultAppearanceTheme.js
// happy that makes heavy use of constants
"qx/constant/Core.js",
"qx/constant/Layout.js",
"qx/constant/Style.js",
"org/eclipse/rwt/KeyEventHandlerPatch.js",
"org/eclipse/rwt/DomEventPatch.js",
// "org/eclipse/rwt/SVG.js",
// "org/eclipse/rwt/VML.js",
// "org/eclipse/rwt/VMLCanvas.js",
"org/eclipse/rwt/GraphicsUtil.js",
"org/eclipse/rwt/GraphicsMixin.js",
"org/eclipse/rwt/Animation.js",
"org/eclipse/rwt/AnimationRenderer.js",
"org/eclipse/rwt/FadeAnimationMixin.js",
"org/eclipse/rwt/RoundedBorder.js",
"org/eclipse/swt/Application.js",
"org/eclipse/swt/Request.js",
"org/eclipse/swt/WidgetManager.js",
"org/eclipse/swt/EventUtil.js",
"org/eclipse/rwt/KeyEventUtil.js",
"org/eclipse/rwt/AsyncKeyEventUtil.js",
// "org/eclipse/rwt/SyncKeyEventUtil.js",
// "org/eclipse/rwt/widgets/ToolTip.js",
"org/eclipse/swt/WidgetUtil.js",
// "org/eclipse/swt/widgets/Composite.js",
// "org/eclipse/swt/widgets/Sash.js",
// "org/eclipse/swt/TabUtil.js",
// "org/eclipse/swt/custom/CTabItem.js",
// "org/eclipse/swt/custom/CTabFolder.js",
// "org/eclipse/swt/widgets/CoolItem.js",
// "org/eclipse/swt/widgets/List.js",
"org/eclipse/swt/widgets/Shell.js",
// "org/eclipse/swt/widgets/Tree.js",
// "org/eclipse/swt/widgets/TreeItem.js",
// "org/eclipse/swt/TreeItemUtil.js",
// "org/eclipse/swt/widgets/TreeColumn.js",
// "org/eclipse/swt/custom/ScrolledComposite.js",
// "org/eclipse/swt/widgets/Separator.js",
// "org/eclipse/swt/LabelUtil.js",
// "org/eclipse/swt/widgets/Combo.js",
// "org/eclipse/swt/widgets/Group.js",
// "org/eclipse/swt/TextUtil.js",
// "org/eclipse/swt/widgets/Spinner.js",
// "org/eclipse/swt/widgets/Table.js",
// "org/eclipse/swt/widgets/TableColumn.js",
// "org/eclipse/swt/widgets/TableItem.js",
// "org/eclipse/swt/widgets/TableRow.js",
// "org/eclipse/swt/widgets/TableCellToolTip.js",
// "org/eclipse/rwt/widgets/ExternalBrowser.js",
// "org/eclipse/swt/browser/Browser.js",
// "org/eclipse/swt/widgets/ProgressBar.js",
// "org/eclipse/swt/FontSizeCalculation.js",
// "org/eclipse/swt/CLabelUtil.js",
// "org/eclipse/swt/widgets/Scale.js",
// "org/eclipse/swt/widgets/DateTimeDate.js",
// "org/eclipse/swt/widgets/DateTimeTime.js",
// "org/eclipse/swt/widgets/DateTimeCalendar.js",
// "org/eclipse/swt/widgets/Calendar.js",
// "org/eclipse/swt/widgets/ExpandBar.js",
// "org/eclipse/swt/widgets/ExpandItem.js",
// "org/eclipse/swt/widgets/Slider.js",
// "org/eclipse/rwt/RadioButtonUtil.js",
// "org/eclipse/swt/widgets/Link.js",
"org/eclipse/rwt/widgets/MultiCellWidget.js",
"org/eclipse/rwt/widgets/AbstractButton.js",
"org/eclipse/rwt/widgets/Button.js",
"org/eclipse/rwt/widgets/Menu.js",
"org/eclipse/rwt/widgets/MenuItem.js",
// "org/eclipse/rwt/widgets/ToolBar.js",
// "org/eclipse/rwt/widgets/ToolItem.js",
// "org/eclipse/rwt/widgets/ToolSeparator.js",
"org/eclipse/rwt/widgets/MenuBar.js",
"org/eclipse/swt/theme/AppearancesBase.js",
"org/eclipse/swt/theme/BordersBase.js",
"org/eclipse/swt/theme/ThemeStore.js",
"org/eclipse/swt/theme/ThemeValues.js",
"org/eclipse/rwt/FocusIndicator.js",
"org/eclipse/rwt/MenuManager.js",
// "org/eclipse/rwt/DNDSupport.js",
// "org/eclipse/rwt/TreeDNDFeedback.js",
// "org/eclipse/rwt/TableDNDFeedback.js",
// "org/eclipse/rwt/widgets/ControlDecorator.js",
// "org/eclipse/rwt/widgets/Text.js",
// "org/eclipse/swt/widgets/Canvas.js",
// "org/eclipse/swt/graphics/GC.js",
// protocol
"org/eclipse/rwt/protocol/Constants.js",
"org/eclipse/rwt/protocol/JSON2.js",
"org/eclipse/rwt/protocol/WidgetStatusHandlerRegistry.js",
"org/eclipse/rwt/protocol/ProtocolUtil.js",
"org/eclipse/rwt/protocol/ShellStatusHandler.js",
"org/eclipse/rwt/protocol/ButtonStatusHandler.js",
"org/eclipse/rwt/protocol/Processor.js",
"org/eclipse/rwt/protocol/MessageGenerator.js",
"org/eclipse/rwt/protocol/WidgetSynchronizer.js"
};
private static final String[] WIDGET_IMAGES = new String[]{
"resource/static/image/blank.gif",
"resource/static/image/dotted_white.gif",
"resource/widget/rap/ctabfolder/maximize.gif",
"resource/widget/rap/ctabfolder/minimize.gif",
"resource/widget/rap/ctabfolder/restore.gif",
"resource/widget/rap/ctabfolder/close.gif",
"resource/widget/rap/ctabfolder/close_hover.gif",
"resource/widget/rap/ctabfolder/chevron.gif",
"resource/widget/rap/cursors/alias.gif",
"resource/widget/rap/cursors/copy.gif",
"resource/widget/rap/cursors/move.gif",
"resource/widget/rap/cursors/nodrop.gif",
"resource/widget/rap/cursors/up_arrow.cur",
"resource/widget/rap/tree/cross.gif",
"resource/widget/rap/tree/cross_minus.gif",
"resource/widget/rap/tree/cross_plus.gif",
"resource/widget/rap/tree/end.gif",
"resource/widget/rap/tree/end_minus.gif",
"resource/widget/rap/tree/end_plus.gif",
"resource/widget/rap/tree/folder_open.gif",
"resource/widget/rap/tree/folder_closed.gif",
"resource/widget/rap/tree/line.gif",
"resource/widget/rap/tree/minus.gif",
"resource/widget/rap/tree/only_minus.gif",
"resource/widget/rap/tree/only_plus.gif",
"resource/widget/rap/tree/plus.gif",
"resource/widget/rap/tree/start_minus.gif",
"resource/widget/rap/tree/start_plus.gif",
"resource/widget/rap/scale/h_line.gif",
"resource/widget/rap/scale/v_line.gif",
"resource/widget/rap/scale/h_thumb.gif",
"resource/widget/rap/scale/v_thumb.gif",
"resource/widget/rap/scale/h_marker_big.gif",
"resource/widget/rap/scale/v_marker_big.gif",
"resource/widget/rap/scale/h_marker_small.gif",
"resource/widget/rap/scale/v_marker_small.gif",
};
private AdlibResourcesUtil() {
// prevent instance creation
}
public static void registerResources() {
ClassLoader loader = AdlibResourcesUtil.class.getClassLoader();
IResourceManager manager = ResourceManager.getInstance();
ClassLoader bufferedLoader = manager.getContextLoader();
manager.setContextLoader( loader );
try {
// TODO [rst] Needed by qx.js - can we get rid of it?
manager.register( "resource/static/html/blank.html",
HTML.CHARSET_NAME_ISO_8859_1 );
registerJavascriptFiles();
} finally {
manager.setContextLoader( bufferedLoader );
}
registerWidgetImages();
registerContributions();
}
private static void registerJavascriptFiles() {
if( isDebug() ) {
register( QX_DEBUG_JS, false );
} else {
register( QX_JS, false );
}
register( ADLIB_JS, false );
boolean compress = !isDebug();
for( int i = 0; i < JAVASCRIPT_FILES.length; i++ ) {
String resource = JAVASCRIPT_FILES[ i ];
register( resource, compress );
}
}
private static void registerWidgetImages() {
IResourceManager manager = ResourceManager.getInstance();
ClassLoader classLoader = AdlibResourcesUtil.class.getClassLoader();
for( int i = 0; i < WIDGET_IMAGES.length; i++ ) {
String resourcePath = WIDGET_IMAGES[ i ];
InputStream inputStream = classLoader.getResourceAsStream( resourcePath );
if( inputStream == null ) {
String mesg = "Resource not found: " + resourcePath;
throw new IllegalArgumentException( mesg );
}
manager.register( resourcePath, inputStream );
}
}
private static void registerContributions() {
IResourceManager manager = ResourceManager.getInstance();
ClassLoader contextLoader = manager.getContextLoader();
try {
IResource[] resources = ResourceRegistry.get();
for( int i = 0; i < resources.length; i++ ) {
if( !resources[ i ].isExternal() ) {
manager.setContextLoader( resources[ i ].getLoader() );
String charset = resources[ i ].getCharset();
RegisterOptions options = resources[ i ].getOptions();
String location = resources[ i ].getLocation();
if( charset == null && options == null ) {
manager.register( location );
} else if( options == null ) {
manager.register( location, charset );
} else {
manager.register( location, charset, options );
}
if( resources[ i ].isJSLibrary() ) {
IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
HtmlResponseWriter responseWriter = stateInfo.getResponseWriter();
responseWriter.useJSLibrary( location );
}
}
}
} finally {
manager.setContextLoader( contextLoader );
}
}
private static void register( final String libraryName,
final boolean compress )
{
IResourceManager manager = ResourceManager.getInstance();
RegisterOptions option = RegisterOptions.VERSION;
if( compress ) {
option = RegisterOptions.VERSION_AND_COMPRESS;
}
manager.register( libraryName, HTML.CHARSET_NAME_ISO_8859_1, option );
IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
HtmlResponseWriter responseWriter = stateInfo.getResponseWriter();
responseWriter.useJSLibrary( libraryName );
}
private static boolean isDebug() {
String libraryVariant = System.getProperty( CLIENT_LIBRARY_VARIANT );
boolean isDebug = DEBUG_CLIENT_LIBRARY_VARIANT.equals( libraryVariant );
return isDebug;
}
}