/* * GMGenMessageHandler.java * Copyright James Dempsey, 2012 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Created on 21/07/2012 3:25:32 PM * * $Id$ */ package pcgen.gui2.facade; import gmgen.plugin.InitHolder; import gmgen.plugin.InitHolderList; import gmgen.plugin.PcgCombatant; import gmgen.pluginmgr.messages.FileMenuSaveMessage; import java.io.File; import java.util.Iterator; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.facade.core.CharacterFacade; import pcgen.gui2.PCGenFrame; import pcgen.io.PCGFile; import pcgen.pluginmgr.PCGenMessage; import pcgen.pluginmgr.PCGenMessageHandler; import pcgen.pluginmgr.messages.FocusOrStateChangeOccurredMessage; import pcgen.pluginmgr.messages.PlayerCharacterWasLoadedMessage; import pcgen.pluginmgr.messages.RequestFileOpenedMessageForCurrentlyOpenedPCsMessage; import pcgen.pluginmgr.messages.RequestOpenPlayerCharacterMessage; import pcgen.pluginmgr.messages.RequestToSavePlayerCharacterMessage; import pcgen.pluginmgr.messages.TransmitInitiativeValuesBetweenComponentsMessage; import pcgen.system.CharacterManager; /** * The Class {@code GMGenMessageHandler} processes any requests * to the main PCGen program from the GMGen bus. * * <br> * * @author James Dempsey <jdempsey@users.sourceforge.net> */ public class GMGenMessageHandler implements PCGenMessageHandler { private final PCGenFrame delegate; private final PCGenMessageHandler messageHandler; /** * Create a new instance of GMGenMessageHandler * @param delegate The PCGenFrame instance containing the UI. */ public GMGenMessageHandler(PCGenFrame delegate, PCGenMessageHandler mh) { this.delegate = delegate; this.messageHandler = mh; } @Override public void handleMessage(PCGenMessage message) { if (message instanceof RequestOpenPlayerCharacterMessage) { handleOpenPCGRequestMessage((RequestOpenPlayerCharacterMessage) message); } else if (message instanceof FileMenuSaveMessage) { handleSaveMessage((FileMenuSaveMessage) message); } else if (message instanceof RequestFileOpenedMessageForCurrentlyOpenedPCsMessage) { handleFetchOpenPCGRequestMessage(); } else if (message instanceof RequestToSavePlayerCharacterMessage) { handleSavePcgMessage(message); } // This should only be used until GMGen can use PCGen to generate it's // Random encounter beasties. else if (message instanceof TransmitInitiativeValuesBetweenComponentsMessage) { handleInitHolderListSendMessage((TransmitInitiativeValuesBetweenComponentsMessage) message); } else if (message instanceof FocusOrStateChangeOccurredMessage) { handleStateChangedMessage(); } } private void handleSavePcgMessage(PCGenMessage message) { RequestToSavePlayerCharacterMessage smessage = (RequestToSavePlayerCharacterMessage) message; PlayerCharacter pc = smessage.getPc(); for (Iterator<CharacterFacade> iterator = CharacterManager.getCharacters().iterator(); iterator.hasNext();) { CharacterFacade facade = iterator.next(); if (facade.matchesCharacter(pc)) { CharacterManager.saveCharacter(facade); break; } } } private void handleSaveMessage(FileMenuSaveMessage message) { // final int currTab = baseTabbedPane.getSelectedIndex(); // if (this.isFocused() && currTab >= FIRST_CHAR_TAB) // { // // seize the focus to cause focus listeners to fire // pcgenMenuBar.saveItem.requestFocus(); // // final PlayerCharacter aPC = getCurrentPC(); // // if (aPC == null) // { // return; // } // // savePC(aPC, false); // message.veto(); // } } private void handleInitHolderListSendMessage( TransmitInitiativeValuesBetweenComponentsMessage message) { InitHolderList list = message.getInitHolderList(); for (int i = 0; i < list.size(); i++) { InitHolder iH = list.get(i); if (iH instanceof PcgCombatant) { //TODO: Resolve against the current PC list and add any new characters. PcgCombatant pcg = (PcgCombatant) iH; PlayerCharacter aPC = pcg.getPC(); Globals.getPCList().add(aPC); aPC.setDirty(true); // addPCTab(aPC); } } } private void handleOpenPCGRequestMessage(RequestOpenPlayerCharacterMessage message) { File pcFile = message.getFile(); if (PCGFile.isPCGenCharacterFile(pcFile)) { PlayerCharacter playerCharacter = CharacterManager.openPlayerCharacter(pcFile, delegate, delegate.getLoadedDataSetRef().get(), message.isBlockLoadedMessage()); message.setPlayerCharacter(playerCharacter); message.consume(); } else if (PCGFile.isPCGenPartyFile(pcFile)) { CharacterManager.openParty(pcFile, delegate, delegate .getLoadedDataSetRef().get()); } } private void handleFetchOpenPCGRequestMessage() { for (int i = 0; i < CharacterManager.getCharacters().getSize(); i++) { CharacterFacade facade = CharacterManager.getCharacters().getElementAt(i); if (facade instanceof CharacterFacadeImpl) { CharacterFacadeImpl cfi = (CharacterFacadeImpl) facade; messageHandler.handleMessage(new PlayerCharacterWasLoadedMessage(this, cfi.getTheCharacter())); } } } private void handleStateChangedMessage() { // Need to fully refresh the currently displayed character // if (this.isFocused() && characterPane != null) // { // PlayerCharacter aPC = // getPCForTabAt(baseTabbedPane.getSelectedIndex()); // Globals.setCurrentPC(aPC); // // What could possibly have changed on focus that would // // require a forceUpdate of all the panels? // // JSC -- 03/27/2004 // // // // The answer to this question is this: GMGen can update characters, for // // example updating the experience. This message is only ever really // // called when the user switches from gmgen to pcgen - and it needs to be // // called to ensure that all pcgen screens are updated based on any // // changes to the PlayerCharacter object. Without this, what the user // // sees on the screen is stale. // // DJ -- 05/23/2004 // characterPane // .setPaneForUpdate(characterPane.infoSpecialAbilities()); // characterPane.setPaneForUpdate(characterPane.infoSummary()); // characterPane.setPaneForUpdate(characterPane.infoRace()); // characterPane.setPaneForUpdate(characterPane.infoClasses()); // characterPane.setPaneForUpdate(characterPane.infoDomain()); // // characterPane.setPaneForUpdate(characterPane.infoFeats()); // characterPane.setPaneForUpdate(characterPane.infoAbilities()); // characterPane.setPaneForUpdate(characterPane.infoSkills()); // characterPane.setPaneForUpdate(characterPane.infoSpells()); // characterPane.setPaneForUpdate(characterPane.infoInventory()); // characterPane.setPaneForUpdate(characterPane.infoDesc()); // characterPane.refresh(); // forceUpdate_PlayerTabs(); // } } }