package NET.worlds.console; import NET.worlds.network.URL; import NET.worlds.scape.LoadedURLSelf; import NET.worlds.scape.Manifest; import NET.worlds.scape.Pilot; import NET.worlds.scape.Saver; import NET.worlds.scape.TeleportAction; import NET.worlds.scape.URLSelf; import NET.worlds.scape.World; import java.awt.Container; import java.awt.Event; import java.awt.Menu; import java.awt.MenuItem; import java.io.IOException; import java.util.Enumeration; public class Shaper implements MainCallback, DialogReceiver, LoadedURLSelf { MenuItem newItem; MenuItem openItem; MenuItem saveItem; MenuItem propItem; MenuItem consolePropItem; MenuItem pilotPropItem; MenuItem undoItem; MenuItem cutItem; MenuItem copyItem; MenuItem pasteItem; MenuItem sortAttributesItem; MenuItem snapToolItem; MenuItem newLibraryItem; MenuItem newLibraryEntryItem; MenuItem iconsVisibleLibraryItem; Menu worldsMenu; MenuItem shaperVisibleItem; private World newWorldTemplate; private boolean makeNew = true; private static URL newworld = URL.make("home:NewWorld.world"); private boolean quitFlag; private FileSaver fileSaver; private boolean worldListHasChanged = false; public Shaper() { Main.register(this); } public void activate(Console c, Container f, Console prev) { this.newItem = c.addMenuItem(Console.message("New"), "File", 78, false); this.openItem = c.addMenuItem(Console.message("Open"), "File", 79, false); this.saveItem = c.addMenuItem(Console.message("Save"), "File", 83, false); this.propItem = c.addMenuItem(Console.message("World-Prop"), "File"); this.consolePropItem = c.addMenuItem(Console.message("Console-Prop"), "File"); this.pilotPropItem = c.addMenuItem(Console.message("Pilot-Prop"), "File"); this.undoItem = c.addMenuItem(Console.message("Undo"), "Edit", 90, false); c.getMenu("Edit").addSeparator(); this.cutItem = c.addMenuItem(Console.message("Cut"), "Edit", 88, false); this.copyItem = c.addMenuItem(Console.message("Copy"), "Edit", 67, false); this.pasteItem = c.addMenuItem(Console.message("Paste"), "Edit", 86, false); this.sortAttributesItem = c.addMenuItem(Console.message("Sort-Attributes"), "Edit"); this.snapToolItem = c.addMenuItem(Console.message("Snap-Tool-Settings"), "Edit"); this.newLibraryItem = c.addMenuItem(Console.message("New-Library"), "Libraries"); this.newLibraryEntryItem = c.addMenuItem(Console.message("New-Library-Entry"), "Libraries"); this.iconsVisibleLibraryItem = c.addMenuItem(Console.message("Icons-On-Off"), "Libraries", 73, false); this.worldsMenu = c.getMenu("Worlds"); this.worldListChange(); this.shaperVisibleItem = c.addMenuItem(Console.message("Shaper-On-Off"), "Options"); } public void deactivate() { this.worldsMenu = null; } public boolean action(Event event, Object what) { GammaFrame f = Console.getFrame(); if (event.target == this.newItem) { this.makeNew = true; } else if (event.target == this.openItem) { new FileSysDialog( f, this, Console.message("Open-World"), 0, "World Save Files|*.world|World Class Files|*.class|World Files|*.class;*.world", "", true ); } else if (event.target == this.saveItem) { new FileSysDialog(f, this, Console.message("Save-World"), 1, "World Save Files|*.world|World Manifest (text) Files|*.mft", this.getSaveName(), true); } else if (event.target == this.propItem) { if (Pilot.getActiveRoom() != null) { f.getEditTile().viewProperties(Pilot.getActiveWorld()); } } else if (event.target == this.consolePropItem) { f.getEditTile().viewProperties(Console.getActive()); } else if (event.target == this.pilotPropItem) { f.getEditTile().viewProperties(Pilot.getActive()); } else if (event.target == this.sortAttributesItem) { new AttributeSortPanel(f); } else if (event.target == this.snapToolItem) { new SnapToolPanel(f); } else if (event.target == this.undoItem) { f.getEditTile().undo(); } else if (event.target == this.cutItem) { f.getEditTile().cut(); } else if (event.target == this.copyItem) { f.getEditTile().copy(); } else if (event.target == this.pasteItem) { f.getEditTile().paste(); } else if (event.target == this.newLibraryItem) { f.getLibrariesTile().addLibrary(); } else if (event.target == this.newLibraryEntryItem) { f.getLibrariesTile().addElement(); } else if (event.target == this.iconsVisibleLibraryItem) { f.getLibrariesTile().setIconsVisible(!f.getLibrariesTile().isIconsVisible()); } else if (event.target == this.shaperVisibleItem) { f.setShaperVisible(!f.isShaperVisible()); } else { int i = this.worldsMenu.getItemCount(); do { i--; } while (i >= 0 && this.worldsMenu.getItem(i) != event.target); if (i < 0) { return false; } String url = (String)what; if (url.endsWith(" (changed)")) { url = url.substring(0, url.length() - 10); } TeleportAction.teleport(url, null); } return true; } public String getSaveName() { return getSaveName(Pilot.getActive().getWorld()); } public static String getSaveName(World w) { URL url = w.getSourceURL(); String name = url.unalias(); int index = name.indexOf(58); return index != -1 && index != 1 ? url.getBase() : name.replace('/', '\\'); } @Override public void dialogDone(Object who, boolean confirmed) { if (confirmed) { FileSysDialog fileDialog = (FileSysDialog)who; String name = fileDialog.fileName(); if (fileDialog.getMode() == 0) { TeleportAction.teleport(name, null, true); } else { this.doSave(name); } } } @Override public void loadedURLSelf(URLSelf o, URL url, String err) { this.newWorldTemplate = (World)o; } @Override public void mainCallback() { if (this.quitFlag) { if (this.fileSaver == null) { this.fileSaver = new FileSaver(); } switch (this.fileSaver.getState()) { case 0: GammaFrameState.saveBorder(); Main.end(); case 1: default: break; case 2: this.quitFlag = false; this.fileSaver = null; } } if (this.newWorldTemplate != null) { this.newWorldTemplate.incRef(); } if (this.makeNew) { this.makeNew = false; if (this.newWorldTemplate == null) { World.load(newworld, this, true); } else { World w = (World)this.newWorldTemplate.clone(); w.setEdited(true); TeleportAction.teleport(w.getSourceURL().getAbsolute(), null); } } if (this.worldListHasChanged) { this.worldListHasChanged = false; this.rebuildWorldsMenu(); } } public void maybeQuit() { this.quitFlag = true; } public void worldListChange() { this.worldListHasChanged = true; } private void rebuildWorldsMenu() { if (this.worldsMenu != null) { while (this.worldsMenu.getItemCount() > 0) { this.worldsMenu.remove(0); } Enumeration e = World.getWorlds(); while (e.hasMoreElements()) { World w = e.nextElement(); URL url = w.getSourceURL(); String name; if (url == null) { name = w.getName(); } else { name = url.getAbsolute(); if (url.equals(newworld)) { continue; } } if (w.getEdited()) { name = name + " (changed)"; } this.worldsMenu.add(new MenuItem(name)); } } } public void doSave(String name) { doSave(name, Pilot.getActive().getWorld(), true); } public static boolean doSave(String name, World world, boolean allowManifest) { if (allowManifest && name.endsWith(".mft")) { try { Manifest mft = new Manifest(name); mft.saveProps(world); mft.done(); return true; } catch (IOException var4) { Console.println(Console.message("Error-manifest") + var4.toString()); } } else { if (name.toLowerCase().endsWith(".wor")) { name = name.substring(0, name.length() - 4); } if (!name.toLowerCase().endsWith(".world")) { name = name + ".world"; } try { Saver saver = new Saver(new URL(URL.getCurDir(), name)); saver.save(world); saver.done(); world.setEdited(false); return true; } catch (IOException var5) { Console.println(Console.message("Error-saving") + var5.toString()); } } return false; } }