FreeMind 0.9.0βの「分割ノード」とは?

前に書いたFreeMindのマップ分割の記事で、FreeMind 0.9.0βのツールメニューにある分割ノードとは何ぞや?という話が少し出ていたました。先日書きましたようにFreeMind0.9.0β20のソースを入手しましたので、これが何をするものか、という調査にチャレンジしてみました。

といってもプログラムの構造がよくわからないので、Eclipseの力を借りてのごり押しです。FreeMindを英語表記にしてみると、該当メニューのラベルは「Split Node」なので、このあたりの単語でソースの全文検索をかけて関係のありそうな箇所を探します。

その結果、accessories.plugins.SplitNodeというクラスがこのメニューの処理をやっていそうです。具体的には、以下のメソッドが処理の中核になります。

private String[] splitNode(String text) {
	if(text.startsWith("<html>")){
		String[] parts = null;
		HTMLEditorKit kit = new HTMLEditorKit();
		HTMLDocument doc = new HTMLDocument();
		StringReader buf = new StringReader(text);
		try {
			kit.read(buf, doc, 0);
			Element parent = getParentElement(doc);
			if(parent == null){
				return null;
			}
			final int elementCount = parent.getElementCount();
			int notEmptyElementCount = 0;
			parts = new String[elementCount];
			for(int i = 0; i < elementCount; i++){
				Element current = parent.getElement(i);
				final int start = current.getStartOffset();
				final int end = current.getEndOffset();
				final String paragraphText = doc.getText(start, end - start).trim();
				if(paragraphText.length() > 0){
					StringWriter out = new StringWriter();
					new FixedHTMLWriter(out, doc, start, end - start).write();                
					final String string = out.toString();
					if(! string.equals("")){
						parts[i] = string;
						notEmptyElementCount ++;
					}
					else{
						parts[i] = null;
					}
				}
			}
			if(notEmptyElementCount <= 1){
				return null;
			}
		} catch (IOException e) {
			freemind.main.Resources.getInstance().logException(e);
		} catch (BadLocationException e) {
			freemind.main.Resources.getInstance().logException(e);
		}
		return parts;
	}
	return text.split("\n");
}

このメソッドの引数は分割対象のノードの内容の文字列です。中の処理を見ると、""で始まっていればhtmlとみなして要素毎に分割し、そうでなければ単純に行単位に分割しているようです。

という予想が立ちましたので、試しにhtmlのtableを埋め込んだノードと、複数行のテキストを入力したノードでこのメニューの動作を試してみたところ、以下のようになりました。

どうやら、予想通りの動きをしています。結局マップ分割とは関係なくて、ノードの内容をhtml構造あるいは行で分割するためのコマンドだったようです。