/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved. */ package org.pentaho.reporting.libraries.pixie.wmf.records; import java.util.HashMap; /** * Manages the available WmfCommands and allows a generic command instantiation. */ public class CommandFactory { private static CommandFactory commandFactory; public static synchronized CommandFactory getInstance() { if ( commandFactory == null ) { commandFactory = new CommandFactory(); } return commandFactory; } public CommandFactory() { } /** * A global collection of all known record types. */ private HashMap<Integer, MfCmd> recordTypes; /** * Registers all known command types to the standard factory. */ public synchronized void registerAllKnownTypes() { if ( recordTypes != null ) { return; } recordTypes = new HashMap<Integer, MfCmd>(); registerCommand( new MfCmdAnimatePalette() ); registerCommand( new MfCmdArc() ); registerCommand( new MfCmdDibBitBlt() ); registerCommand( new MfCmdChord() ); registerCommand( new MfCmdCreateBrush() ); registerCommand( new MfCmdCreateDibPatternBrush() ); registerCommand( new MfCmdCreateFont() ); registerCommand( new MfCmdCreatePen() ); registerCommand( new MfCmdCreatePalette() ); registerCommand( new MfCmdCreatePatternBrush() ); registerCommand( new MfCmdCreateRegion() ); registerCommand( new MfCmdDeleteObject() ); registerCommand( new MfCmdEllipse() ); registerCommand( new MfCmdEscape() ); registerCommand( new MfCmdExcludeClipRect() ); registerCommand( new MfCmdExtFloodFill() ); registerCommand( new MfCmdExtTextOut() ); registerCommand( new MfCmdFillRegion() ); registerCommand( new MfCmdFrameRegion() ); registerCommand( new MfCmdFloodFill() ); registerCommand( new MfCmdInvertRegion() ); registerCommand( new MfCmdIntersectClipRect() ); registerCommand( new MfCmdLineTo() ); registerCommand( new MfCmdMoveTo() ); registerCommand( new MfCmdOffsetClipRgn() ); registerCommand( new MfCmdOffsetViewportOrg() ); registerCommand( new MfCmdOffsetWindowOrg() ); registerCommand( new MfCmdBitBlt() ); registerCommand( new MfCmdStretchBlt() ); registerCommand( new MfCmdPatBlt() ); registerCommand( new MfCmdPaintRgn() ); registerCommand( new MfCmdPie() ); registerCommand( new MfCmdPolyPolygon() ); registerCommand( new MfCmdPolygon() ); registerCommand( new MfCmdPolyline() ); registerCommand( new MfCmdRealisePalette() ); registerCommand( new MfCmdRectangle() ); registerCommand( new MfCmdRestoreDc() ); registerCommand( new MfCmdResizePalette() ); registerCommand( new MfCmdRoundRect() ); registerCommand( new MfCmdSaveDc() ); registerCommand( new MfCmdScaleWindowExt() ); registerCommand( new MfCmdScaleViewportExt() ); registerCommand( new MfCmdSelectClipRegion() ); registerCommand( new MfCmdSelectObject() ); registerCommand( new MfCmdSelectPalette() ); registerCommand( new MfCmdSetBkMode() ); registerCommand( new MfCmdSetBkColor() ); registerCommand( new MfCmdSetDibitsToDevice() ); registerCommand( new MfCmdSetMapperFlags() ); registerCommand( new MfCmdSetMapMode() ); registerCommand( new MfCmdSetPaletteEntries() ); registerCommand( new MfCmdSetPolyFillMode() ); registerCommand( new MfCmdSetPixel() ); registerCommand( new MfCmdSetRop2() ); registerCommand( new MfCmdSetStretchBltMode() ); registerCommand( new MfCmdSetTextCharExtra() ); registerCommand( new MfCmdSetTextAlign() ); registerCommand( new MfCmdSetTextColor() ); registerCommand( new MfCmdSetTextJustification() ); registerCommand( new MfCmdSetViewPortExt() ); registerCommand( new MfCmdSetViewPortOrg() ); registerCommand( new MfCmdSetWindowExt() ); registerCommand( new MfCmdSetWindowOrg() ); registerCommand( new MfCmdDibStretchBlt() ); registerCommand( new MfCmdStretchDibits() ); registerCommand( new MfCmdTextOut() ); } private void registerCommand( final MfCmd command ) { MfCmd cmd = recordTypes.get( new Integer( command.getFunction() ) ); if ( cmd != null ) { throw new IllegalArgumentException( "Already registered command " + command + " -> was: " + cmd ); } recordTypes.put( command.getFunction(), command ); } public MfCmd getCommand( final int function ) { if ( recordTypes == null ) { registerAllKnownTypes(); } final MfCmd cmd = recordTypes.get( new Integer( function ) ); if ( cmd == null ) { final MfCmdUnknownCommand ucmd = new MfCmdUnknownCommand(); ucmd.setFunction( function ); return ucmd; } return cmd.getInstance(); } }