Package org.freeplane.features.url.mindmapmode

Source Code of org.freeplane.features.url.mindmapmode.ExportBranchAction

/*
*  Freeplane - mind map editor
*  Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
*  This file is modified by Dimitry Polivaev in 2008.
*
*  This program 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 2 of the License, or
*  (at your option) any later version.
*
*  This program 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 org.freeplane.features.url.mindmapmode;

import java.awt.event.ActionEvent;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.util.Collection;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import org.apache.commons.lang.StringUtils;
import org.freeplane.core.extension.IExtension;
import org.freeplane.core.ui.AFreeplaneAction;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.undo.IActor;
import org.freeplane.core.util.Compat;
import org.freeplane.core.util.FileUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.link.LinkController;
import org.freeplane.features.link.mindmapmode.MLinkController;
import org.freeplane.features.map.MapModel;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.map.mindmapmode.MMapController;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
import org.freeplane.features.mode.PersistentNodeHook;
import org.freeplane.features.mode.mindmapmode.MModeController;
import org.freeplane.features.styles.LogicalStyleKeys;
import org.freeplane.features.text.TextController;
import org.freeplane.features.text.mindmapmode.MTextController;
import org.freeplane.features.url.UrlManager;

class ExportBranchAction extends AFreeplaneAction {
  /**
   *
   */
  private static final long serialVersionUID = 1L;

  public ExportBranchAction() {
    super("ExportBranchAction");
  }

  public void actionPerformed(final ActionEvent e) {
    final NodeModel existingNode = Controller.getCurrentModeController().getMapController().getSelectedNode();
    final Controller controller = Controller.getCurrentController();
    final MapModel parentMap = controller.getMap();
    if (parentMap == null || existingNode == null || existingNode.isRoot()) {
      controller.getViewController().err("Could not export branch.");
      return;
    }
    if (parentMap.getFile() == null) {
      controller.getViewController().out("You must save the current map first!");
      ((MModeController) Controller.getCurrentModeController()).save();
    }
    JFileChooser chooser;
    final File file = parentMap.getFile();
    if (file == null) {
      return;
    }
    chooser = new JFileChooser(file.getParentFile());
    chooser.setSelectedFile(new File(createFileName(TextController.getController().getShortText(existingNode))));
    if (((MFileManager) UrlManager.getController()).getFileFilter() != null) {
      chooser.addChoosableFileFilter(((MFileManager) UrlManager.getController())
          .getFileFilter());
    }
    final int returnVal = chooser.showSaveDialog(controller.getViewController().getContentPane());
    if (returnVal == JFileChooser.APPROVE_OPTION) {
      File chosenFile = chooser.getSelectedFile();
      final String ext = FileUtils.getExtension(chosenFile.getName());
      if (!ext.equals(org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION_WITHOUT_DOT)) {
        chosenFile = new File(chosenFile.getParent(), chosenFile.getName()
                + org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION);
      }
      try {
        Compat.fileToUrl(chosenFile);
      }
      catch (final MalformedURLException ex) {
        UITools.errorMessage(TextUtils.getText("invalid_url"));
        return;
      }
      if (chosenFile.exists()) {
        final int overwriteMap = JOptionPane.showConfirmDialog(controller.getMapViewManager().getMapViewComponent(),
            TextUtils.getText("map_already_exists"), "Freeplane", JOptionPane.YES_NO_OPTION);
        if (overwriteMap != JOptionPane.YES_OPTION) {
          return;
        }
      }
      /*
       * Now make a copy from the node, remove the node from the map and
       * create a new Map with the node as root, store the new Map, add
       * the copy of the node to the parent, and set a link from the copy
       * to the new Map.
       */
      final NodeModel parent = existingNode.getParentNode();
      final File oldFile = parentMap.getFile();
 
      final URI newUri = LinkController.toLinkTypeDependantURI(oldFile, chosenFile);
      final URI oldUri = LinkController.toLinkTypeDependantURI(chosenFile, file);
      ((MLinkController) LinkController.getController()).setLink(existingNode,
          oldUri, LinkController.LINK_ABSOLUTE);
      final int nodePosition = parent.getChildPosition(existingNode);
      final ModeController modeController = Controller.getCurrentModeController();
      modeController.undoableResolveParentExtensions(LogicalStyleKeys.NODE_STYLE, existingNode);
      final MMapController mMapController = (MMapController) modeController.getMapController();
      mMapController.deleteNode(existingNode);
      {
        final IActor actor = new IActor() {
          private final boolean wasFolded = existingNode.isFolded();

          public void undo() {
            PersistentNodeHook.removeMapExtensions(existingNode);
            existingNode.setMap(parentMap);
            existingNode.setFolded(wasFolded);
          }

          public String getDescription() {
            return "ExportBranchAction";
          }

          public void act() {
            existingNode.setParent(null);
            existingNode.setFolded(false);
            mMapController.newModel(existingNode);
          }
        };
        Controller.getCurrentModeController().execute(actor, parentMap);
      }
      final MapModel map = existingNode.getMap();
      IExtension[] oldExtensions = map.getRootNode().getSharedExtensions().values().toArray(new IExtension[]{});
      for(final IExtension extension : oldExtensions){
        final Class<? extends IExtension> clazz = extension.getClass();
        if(PersistentNodeHook.isMapExtension(clazz)){
          existingNode.removeExtension(clazz);
        }
      }
      final Collection<IExtension> newExtensions = parentMap.getRootNode().getSharedExtensions().values();
      for(final IExtension extension : newExtensions){
        final Class<? extends IExtension> clazz = extension.getClass();
        if(PersistentNodeHook.isMapExtension(clazz)){
          existingNode.addExtension(extension);
        }
      }
      ((MFileManager) UrlManager.getController()).save(map, chosenFile);
      final NodeModel newNode = mMapController.addNewNode(parent, nodePosition, existingNode.isLeft());
      ((MTextController) TextController.getController()).setNodeText(newNode, existingNode.getText());
      modeController.undoableCopyExtensions(LogicalStyleKeys.NODE_STYLE, existingNode, newNode);
      map.getFile();
      ((MLinkController) LinkController.getController()).setLink(newNode, newUri, LinkController.LINK_ABSOLUTE);
      map.destroy();
    }
  }

  private String createFileName(final String shortText) {
    final StringBuilder builder = new StringBuilder(50);
    final String[] words = shortText.split("\\s");
    for (final String word : words) {
      if ("...".equals(word)) {
        continue;
      }
      builder.append(StringUtils.capitalize(word));
    }
    return builder.toString();
  }
}
TOP

Related Classes of org.freeplane.features.url.mindmapmode.ExportBranchAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.