/* * * 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.LinkedHashMap; import java.util.Map; import java.util.Set; import org.apache.flex.swf.TagType; /** * Represents a <code>ExportAssets</code> tag in a SWF file. * <p> * The ExportAssets tag makes portions of a SWF file available for import by * other SWF files. Each exported character is identified by a string. Any type * of character can be exported. * <p> * If the value of the character in ExportAssets was previously exported with a * different identifier, Flash Player associates the tag with the latter * identifier. That is, if Flash Player has already read a given value for Tag1 * and the same Tag1 value is read later in the SWF file, the second Name1 value * is used. * <p> * The map between character tag and name is implemented in a BiMap fashion. A * character can only be exported with one name; and a name can only be used to * export one character tag. * <p> * <b>Note:</b> ExportAssets tag is only used in ActionScript 1 and 2 only. In * ActionScript3, ExportAssets is ignored. SymbolClass is used instead. */ public class ExportAssetsTag extends Tag implements IManagedTag, ICharacterReferrer { /** * Constructor. */ public ExportAssetsTag() { super(TagType.ExportAssets); exports = new LinkedHashMap<String, ICharacterTag>(); } // Associate name with symbols. private final Map<String, ICharacterTag> exports; /** * Get all the symbol names. * * @return symbol names */ public Set<String> getCharacterNames() { return exports.keySet(); } /** * Get a character tag by its assigned name. * * @param name symbol name * @return character tag */ public ICharacterTag getCharacterTagByName(String name) { return exports.get(name); } /** * Export character tag with the given name. * <ul> * <li>If a character is exported multiple time with different name, the * last name wins.</li> * <li>If a name is used to export multiple character tags, the last * character tag gets the name, and the previous tags will not be exported.</li> * </ul> * * @param characterTag character tag * @param name symbol name */ public void addExport(ICharacterTag characterTag, String name) { assert characterTag != null; removeExport(characterTag); exports.put(name, characterTag); } /** * Find name by character tag. * * @param characterTag character tag * @return the name used to export the character tag. */ private final String findNameByCharacterTag(ICharacterTag characterTag) { String name = null; for (final String key : exports.keySet()) { if (exports.get(key) == characterTag) { name = key; break; } } return name; } /** * Remove a character tag from the exported tags by reference. * * @param characterTag tags to remove */ public void removeExport(ICharacterTag characterTag) { final String name = findNameByCharacterTag(characterTag); if (name != null) { exports.remove(name); } } /** * Remove a character tag from the exported tags by name. * * @param name name of the tag to remove */ public void removeExport(String name) { exports.remove(name); } /** * Get the total number of exported tags. * * @return count of exported tags */ public int size() { return exports.size(); } @Override public String description() { final StringBuilder buffer = new StringBuilder(); 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 referred character tags. * * @return an iterator of referred character tags */ @Override public Iterable<ICharacterTag> getReferences() { return exports.values(); } }