/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.flex.swf.tags; import java.util.Set; import org.apache.flex.swf.TagType; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; /** * Represents a <code>SymbolClass</code> tag in a SWF file. * <p> * The SymbolClass tag creates associations between symbols in the SWF file and * ActionScript 3.0 classes. It is the ActionScript 3.0 equivalent of the * ExportAssets tag. If the character ID is zero, the class is associated with * the main time-line of the SWF. This is how the root class of a SWF is * designated. Classes listed in the SymbolClass tag are available for creation * by other SWF files (see StartSound2, DefineEditText (HasFontClass), and * PlaceObject3 (PlaceFlagHasClassName and PlaceFlagHasImage). For example, ten * SWF files that are all part of the same web site can share an embedded custom * font if one file embeds and exports the font class. */ public final class SymbolClassTag extends Tag implements IManagedTag { /** * Constructor. */ public SymbolClassTag() { super(TagType.SymbolClass); exports = HashBiMap.create(); } // Associate name with symbols. private final BiMap<String, ICharacterTag> exports; @Override public String description() { final StringBuilder buffer = new StringBuilder(); buffer.append(String.format("total=%d; ", size())); for (final String name : exports.keySet()) { final ICharacterTag tag = exports.get(name); buffer.append(String.format("(%s:%s#%d) ", name, tag.getTagType(), tag.getCharacterID())); } return buffer.toString(); } /** * Get all the symbol names. * * @return symbol names */ public Set<String> getSymbolNames() { return exports.keySet(); } /** * Find a symbol by name. * * @param name symbol name * @return character tag */ public ICharacterTag getSymbol(String name) { return exports.get(name); } /** * Register a symbol with the given name. * <ul> * <li>If a symbol is registered multiple time with different name, the last * name wins.</li> * <li>If a name is used to register multiple symbols, the last symbol gets * the name, and the previous symbols will not be exported.</li> * </ul> * * @param characterTag character tag * @param name symbol name */ public void addSymbol(ICharacterTag characterTag, String name) { assert characterTag != null; assert name != null; assert !"".equals(name); removeSymbol(characterTag); exports.forcePut(name, characterTag); } /** * Get symbol name. * * @param characterTag character tag * @return the name used to export the character tag. */ public final String getSymbolName(ICharacterTag characterTag) { return exports.inverse().get(characterTag); } /** * Remove a symbol. * * @param characterTag tags to remove */ public void removeSymbol(ICharacterTag characterTag) { exports.inverse().remove(characterTag); } /** * Remove a symbol. * * @param name name of the tag to remove */ public void removeSymbol(String name) { exports.remove(name); } /** * Get the total number of exported tags. * * @return count of exported tags */ public int size() { return exports.size(); } }