Bitmap images (development)

From FreeMind
Revision as of 09:10, 21 February 2008 by Danielpolansky (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

There is a requirement to let mind maps contain bitmap images. Word processors store their bitmap images in their files.

Overview

Solution Speed of opening maps Solution for applet known Note
Embed in XML using Base64 Higher No
Turn .mm into a zip archive Lower Yes

The storage of bitmap images

Solution 1: Direct storage in the XML

The images shall be stored in the XML of the mind map as binary data in a node, like

<node TYPE="image" BINARY="x4543edvc...45ert"/>

This proposal does not fix the XML representation; the above is only for illustration.

Upon creation of node view, temporary file shall be created, and HTML viewer of the JLabel shall point to that file.

Upon editing, external image editor shall be opened to edit the temporary file, like Gimp.

Evaluation

  • Pro: Mind map is still stored as one plain, unzipped XML file. Thus:
    • Fast saving.
    • Nice for storing in version control system like CVS or SVN.
    • Easy searching several maps using grep tool.
  • Pro: The existing JLabel of node view can be used with very little modification.
  • Con: The design for applet is missing.
  • Model application: XML stored by certain versions of Microsoft Word.

Solution 2: Storage in (zip) archive file

Generally I see two ways to insert images into the map. We can either embed them into the maps. If we did so, the JLabels could not show them, and there were a need in a new components to show them. I do not know any free available HTML capable components which could be used for such purpose. We could certainly use components for displaying only the images without text. But I see another way which does not has such difficulties.

JLabel can show images, if images are stored as temporary files. I have a working implementation of this. --Dan Polansky 01:06, 21 Feb 2008 (PST)

I have found that all graphical components we use can draw images directly from archive files created as java archives(jars). The magic word is

<html><img src = "jar:file:javaarchive.jar!/content/images/image.gif">

So if the map were saved in the jar formatted file (with any extension), all rendered images identified by HTML tag <img> could be written into the same jar file and the sources given in the HTML could be substituted by the new paths.

Evaluation

  • Pro: Solution works for both Application and Applet.
  • Pro: The existing JLabel of node view can be used with very little modification.
  • Pro: The mind map can be saved fast, because we can tune the compression strength.
  • Con: Poor for storing mind maps in version control system.
  • Model: Java resource jar file

Solution 3: Storing the images like ...

...

Requirements

  • The mind maps shall be fast to load and save.
  • The image function shall work in FreeMind applet.

Implementation

Implementation of solution 2

This brings me to the following proposal.

package freemind.main;

import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.net.URL;

import freemind.modes.MindMapNode;

/**
 * managing of the map contents.
 * 
 * @author Dimitry Polivaev
 *
 */
public interface FreeMindArchive {
	/**
	 * @param mmar - archive file or directory
	 * e.g. File("C:/MindMap.mmar") or File("C:/MindMap/")
        * Every loaded archive is copied into a temporary directory
	 */
	void load(File mmar) throws IOException;
	
    /**
     * save loaded archive
     */
	void save() throws IOException;
	/**
     * save loaded archive in a new file ( directory)
     * @param newFile
     */
	void saveAs(File newFile) throws IOException;
	/**
	 * 	  @return e.g. URL("jar:file:C:/MindMap.mmar!/content/")
	 */
	URL getBase();
	
	/**
	 *    returns URL for loading the map
	 * 	  @return e.g. URL("jar:file:C:/MindMap.mmar!/content/map.mm")
	 */
	URL getMindMapURL();
	
	/**
	 * @return a writer for saving of the mind map content in the archive
	 */
	Writer createMapWriter() throws IOException;
	
	/**
	 * creates new image URL in the temporary archive using random number generator
	 * @param img
	 * @return 
	 */
	URL addImage(Image img);
	
	/**
	 * Marks ULR internally as removed. It should not be saved when save or saveAs is called
	 * @param imageURL : URL returned by addImage
	 */
	void deleteImage(URL imageURL);

	/**
	 * Removes flag "deleted" set by call of deleteImage
	 * @param imageURL : URL returned by addImage
	 */
	void undeleteImage(URL imageURL);
}

/**
 * Observes changes in the map, adds and removes images as nodes are changed, inserted or removed.
 * Therefore image counters should be maintained and actualized.
 *  
 * @author Dimitry Polivaev
 *
 */
interface FreemindArchiveController{
	void setArchive(FreeMindArchive archive);
	FreeMindArchive getArchive();
	/**
	 * inserts all found images into the archive ,
	 * if the images paths do not point into the archive
	 * and marks them as deleted.
	 * 
	 * @param html
	 * @return html with changed image paths
	 */
	String addImagesFromHtml(String html);

	// Listener methods:
	void nodeContentChanged(MindMapNode node, String oldContent);
	void nodeRemoved(MindMapNode node);
	void nodeInserted(MindMapNode node);
}

Once it is implemented, the rest functionality can be added relatively easy.

Links

  • XML
  • Binary XML - despite the name, not directly related to the problem of storing binary data in XML.