/*******************************************************************************
* Copyright (c) 2002, 2015 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
* Frank Appel - replaced singletons and static fields (Bug 337787)
* EclipseSource - ongoing development
******************************************************************************/
package org.eclipse.swt.internal.graphics;
import org.eclipse.rap.rwt.internal.util.ClassUtil;
import org.eclipse.rap.rwt.internal.util.SharedInstanceBuffer;
import org.eclipse.rap.rwt.internal.util.SharedInstanceBuffer.InstanceCreator;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
public class ResourceFactory {
private final SharedInstanceBuffer<Integer, Color> colors;
private final SharedInstanceBuffer<FontData, Font> fonts;
private final SharedInstanceBuffer<Integer, Cursor> cursors;
private InstanceCreator<Integer, Color> colorCreator;
private InstanceCreator<Integer, Cursor> cursorCreator;
private InstanceCreator<FontData, Font> fontCreator;
public ResourceFactory() {
colors = new SharedInstanceBuffer<>();
fonts = new SharedInstanceBuffer<>();
cursors = new SharedInstanceBuffer<>();
colorCreator = new InstanceCreator<Integer, Color>() {
@Override
public Color createInstance( Integer value ) {
return createColorInstance( value.intValue() );
}
};
cursorCreator = new InstanceCreator<Integer, Cursor>() {
@Override
public Cursor createInstance( Integer style ) {
return createCursorInstance( style.intValue() );
}
};
fontCreator = new InstanceCreator<FontData, Font>() {
@Override
public Font createInstance( FontData fontData ) {
return createFontInstance( fontData );
}
};
}
public Color getColor( int red, int green, int blue ) {
return getColor( red, green, blue, 255 );
}
public Color getColor( int red, int green, int blue, int alpha ) {
int colorNr = ColorUtil.computeColorNr( red, green, blue, alpha );
return colors.get( Integer.valueOf( colorNr ), colorCreator );
}
public Font getFont( FontData fontData ) {
return fonts.get( fontData, fontCreator );
}
public Cursor getCursor( int style ) {
return cursors.get( Integer.valueOf( style ), cursorCreator );
}
private static Color createColorInstance( int colorNr ) {
Class<?>[] paramTypes = new Class[] { int.class };
Object[] paramValues = new Object[] { Integer.valueOf( colorNr ) };
return ClassUtil.newInstance( Color.class, paramTypes, paramValues );
}
private static Font createFontInstance( FontData fontData ) {
Class<?>[] paramTypes = new Class[] { FontData.class };
Object[] paramValues = new Object[] { fontData };
return ClassUtil.newInstance( Font.class, paramTypes, paramValues );
}
private static Cursor createCursorInstance( int style ) {
Class<?>[] paramTypes = new Class[] { int.class };
Object[] paramValues = new Object[] { Integer.valueOf( style ) };
return ClassUtil.newInstance( Cursor.class, paramTypes, paramValues );
}
}