/******************************************************************************* * Copyright (c) 2003-2005, 2013 Till Zoppke. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Till Zoppke - initial API and implementation ******************************************************************************/ /* * Created on 26.03.2004 */ package eniac.skin; import javax.swing.JOptionPane; import org.xml.sax.Attributes; import eniac.data.control.ControlerFactory; import eniac.io.XMLUtil; import eniac.log.Log; import eniac.log.LogWords; import eniac.util.StringConverter; import eniac.window.EFrame; /** * @author zoppke */ public class CreatorFactory { // array containing creators private Creator[] _creators; // class keys of creators private String[] _keys; // base folder for creating images String _imageBase; // lod name. Subfolder for creating images String _lodName; // flag indicating whether there are any images missing. boolean _missingImages; // actionatorFactory where we get actionators from ControlerFactory _actionatorFactory; // ================================ lifecycle // =============================== public CreatorFactory(String imageBase) { // set image base _imageBase = imageBase; // create actionator factory _actionatorFactory = new ControlerFactory(); // collect Creators in an array _creators = new Creator[]{new Color(), new Image(), new IntArray(), new Integer(), new Rectangle(), new Polygon(), new Actionator(), new Boolean()}; // init keys _keys = new String[_creators.length]; for (int i = 0; i < _keys.length; ++i) { String s = _creators[i].getClass().getName(); _keys[i] = s.substring(s.lastIndexOf('$') + 1); } } // =============================== methods // ================================== public Creator get(String cls) { for (int i = 0; i < _creators.length; ++i) { if (_keys[i].equals(cls)) { return _creators[i]; } } return null; } public boolean hasMissingImages() { return _missingImages; } public void setLodName(String lodName) { _lodName = lodName; } // ========================= inner class ColorCreator // ======================= private class Color extends Creator { public Color() { // empty constructor } public void endElement(String name) { _object = StringConverter.toColor(_cdata); _cdata = null; } /* * (non-Javadoc) * * @see eniac.skin.Creator#startElement(java.lang.String, * org.xml.sax.Attributes) */ public void startElement(String name, Attributes attrs) { // TODO Auto-generated method stub } } private class IntArray extends Creator { public IntArray() { // empty constructor } public void endElement(String name) { _object = StringConverter.toIntArray(_cdata); _cdata = null; } /* * (non-Javadoc) * * @see eniac.skin.Creator#startElement(java.lang.String, * org.xml.sax.Attributes) */ public void startElement(String name, Attributes attrs) { // TODO Auto-generated method stub } } private class Image extends Creator { public Image() { // empty constructor } public void endElement(String name) { // load image. String path = _imageBase + _lodName + "/" + _cdata; //$NON-NLS-1$ _object = EFrame.getInstance().getResourceAsImage(path); if (_object == null) { // If image cannot be loaded, try to load without subfolder path = _imageBase + _cdata; _object = EFrame.getInstance().getResourceAsImage(path); if (_object == null) { // cannot find at all. Load default image. Log.log(LogWords.IMAGE_NOT_FOUND, JOptionPane.ERROR_MESSAGE, _cdata); _object = Skin.DEFAULT_IMAGE; _missingImages = true; } } _cdata = null; } /* * (non-Javadoc) * * @see eniac.skin.Creator#startElement(java.lang.String, * org.xml.sax.Attributes) */ public void startElement(String name, Attributes attrs) { // TODO Auto-generated method stub } } private class Rectangle extends Creator { public Rectangle() { // empty constructor } public void endElement(String name) { _object = StringConverter.toRectangle(_cdata); _cdata = null; } /* * (non-Javadoc) * * @see eniac.skin.Creator#startElement(java.lang.String, * org.xml.sax.Attributes) */ public void startElement(String name, Attributes attrs) { // TODO Auto-generated method stub } } private class Integer extends Creator { public Integer() { // empty constructor } public void endElement(String name) { _object = new java.lang.Integer(StringConverter.toInt(_cdata)); _cdata = null; } /* * (non-Javadoc) * * @see eniac.skin.Creator#startElement(java.lang.String, * org.xml.sax.Attributes) */ public void startElement(String name, Attributes attrs) { // TODO Auto-generated method stub } } private class Polygon extends Creator { public Polygon() { // empty constructor } private java.awt.Polygon _p = null; public void startElement(String name, Attributes attrs) { if (name.equals(Skin.Tag.POINT.name().toLowerCase())) { if (_p == null) { _p = new java.awt.Polygon(); } int x = XMLUtil.parseInt(attrs, Skin.Attribute.X); int y = XMLUtil.parseInt(attrs, Skin.Attribute.Y); _p.addPoint(x, y); } } public void endElement(String name) { _object = _p; _p = null; } } private class Actionator extends Creator { public Actionator() { // empty constructor } public void endElement(String name) { _object = _actionatorFactory.get(_cdata); _cdata = null; } /* * (non-Javadoc) * * @see eniac.skin.Creator#startElement(java.lang.String, * org.xml.sax.Attributes) */ public void startElement(String name, Attributes attrs) { // TODO Auto-generated method stub } } private class Boolean extends Creator { public Boolean() { // empty constructor } public void endElement(String name) { _object = new java.lang.Boolean(_cdata); _cdata = null; } /* * (non-Javadoc) * * @see eniac.skin.Creator#startElement(java.lang.String, * org.xml.sax.Attributes) */ public void startElement(String name, Attributes attrs) { // TODO Auto-generated method stub } } }