Bitmap images (development): Difference between revisions
No edit summary |
|||
(10 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
There is a requirement to let mind maps contain bitmap images. Word processors store their bitmap images in their files. | There is a requirement to let mind maps contain bitmap images. Word processors store their bitmap images in their files. | ||
==Overview== | |||
{| {{Table style}} | |||
! 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== | ==The storage of bitmap images== | ||
Line 23: | Line 41: | ||
* '''Pro:''' The existing JLabel of node view can be used with very little modification. | * '''Pro:''' The existing JLabel of node view can be used with very little modification. | ||
* '''Con:''' The design for applet is missing. | * '''Con:''' The design for applet is missing. | ||
* '''Model:''' XML stored by certain versions of Microsoft Word. | * '''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. --[[User:Danielpolansky|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==== | ====Evaluation==== | ||
* '''Model:''' | * '''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 ...=== | ===Solution 3: Storing the images like ...=== | ||
Line 41: | Line 76: | ||
* The mind maps shall be fast to load and save. | * The mind maps shall be fast to load and save. | ||
* The image function shall work in FreeMind applet. | * 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== | ==Links== | ||
* [http://en.wikipedia.org/wiki/XML XML] | * [http://en.wikipedia.org/wiki/XML XML] | ||
* [http://en.wikipedia.org/wiki/Binary_XML Binary XML] - despite the name, not directly related to the problem of storing binary data in XML. | |||
[[Category:Development]] | [[Category:Development]] |
Latest revision as of 09:10, 21 February 2008
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.