/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * muCommander 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.ui.main.toolbar; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Vector; import javax.xml.parsers.SAXParserFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import com.mucommander.RuntimeConstants; import com.mucommander.commons.file.AbstractFile; import com.mucommander.io.backup.BackupInputStream; import com.mucommander.ui.action.ActionManager; /** * This class parses the XML file describing the toolbar's buttons and associated actions. * * @author Maxence Bernard, Arik Hadas */ public class ToolBarReader extends ToolBarIO { private static final Logger LOGGER = LoggerFactory.getLogger(ToolBarReader.class); /** Temporarily used for XML parsing */ private List<String> actionIdsV; /** * Starts parsing the XML description file. */ ToolBarReader(AbstractFile descriptionFile) throws Exception { InputStream in; in = null; try {SAXParserFactory.newInstance().newSAXParser().parse(in = new BackupInputStream(descriptionFile), this);} finally { if(in != null) { try {in.close();} catch(IOException e) {} } } } public String[] getActionsRead() { int nbActions = actionIdsV.size(); String[] actionIds = new String[nbActions]; actionIdsV.toArray(actionIds); return actionIds; } //////////////////////////// // ContentHandler methods // //////////////////////////// @Override public void startDocument() { actionIdsV = new Vector<String>(); } @Override public void endDocument() {} @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals(BUTTON_ELEMENT)) { // Resolve action id String actionIdAttribute = attributes.getValue(ACTION_ID_ATTRIBUTE); if (actionIdAttribute != null) { if (ActionManager.isActionExist(actionIdAttribute)) actionIdsV.add(actionIdAttribute); else LOGGER.warn("Error in "+DEFAULT_TOOLBAR_FILE_NAME+": action id \"" + actionIdAttribute + "\" not found"); } else { // Resolve action class String actionClassAttribute = attributes.getValue(ACTION_ATTRIBUTE); String actionId = ActionManager.extrapolateId(actionClassAttribute); if (ActionManager.isActionExist(actionId)) actionIdsV.add(actionId); else LOGGER.warn("Error in "+DEFAULT_TOOLBAR_FILE_NAME+": action id for class " + actionClassAttribute + " was not found"); } } else if(qName.equals(SEPARATOR_ELEMENT)) { actionIdsV.add(null); } else if (qName.equals(ROOT_ELEMENT)) { // Note: early 0.8 beta3 nightly builds did not have version attribute, so the attribute may be null String fileVersion = attributes.getValue(VERSION_ATTRIBUTE); // if the file's version is not up-to-date, update the file to the current version at quitting. if (!RuntimeConstants.VERSION.equals(fileVersion)) setModified(); } } }