[seam-commits] Seam SVN: r8386 - in trunk/examples/wiki: src/etc/i18n and 30 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Thu Jun 19 10:57:47 EDT 2008


Author: christian.bauer at jboss.com
Date: 2008-06-19 10:57:46 -0400 (Thu, 19 Jun 2008)
New Revision: 8386

Added:
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/Validatable.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextEditor.java
   trunk/examples/wiki/view/includes/wikitext/
   trunk/examples/wiki/view/includes/wikitext/editor/
   trunk/examples/wiki/view/includes/wikitext/editor/editor.xhtml
   trunk/examples/wiki/view/includes/wikitext/editor/preview.xhtml
Removed:
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextPreview.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextValidator.java
   trunk/examples/wiki/view/includes/wikiTextEditor.xhtml
   trunk/examples/wiki/view/includes/wikiTextPreview.xhtml
Modified:
   trunk/examples/wiki/src/etc/META-INF/wiki.taglib.xml
   trunk/examples/wiki/src/etc/i18n/messages_en.properties
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/CommentHome.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHistory.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHome.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeHome.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UserHome.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/prefs/DocumentEditorPreferences.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/FeedEntryManager.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/WikiCommentFeedEntryManager.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/WikiDocumentFeedEntryManager.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/model/WikiDocument.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/metamodel/SearchSupport.java
   trunk/examples/wiki/src/main/org/jboss/seam/wiki/util/WikiUtil.java
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/basic/Basic.plugin.xml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/basic/i18n/messages_basic_en.properties
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/faqBrowser/i18n/messages_faqBrowser_en.properties
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/faqBrowser/templates/faqQuestionForm.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/ReplyHome.java
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/TopicHome.java
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/templates/replyForm.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/templates/topicForm.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyReply.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyReplyToList.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyTopicToList.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyReply.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyReplyToList.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyTopicToList.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyReply.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyReplyToList.xhtml
   trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyTopicToList.xhtml
   trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/BasicNodeOperations.java
   trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/DocumentHistoryTests.java
   trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/EditMacros.java
   trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/Linking.java
   trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/feeds/DocumentFeedTests.java
   trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/plugin/TopicHomeTests.java
   trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/preferences/InstancePreferencesTests.java
   trunk/examples/wiki/view/docDisplay_d.xhtml
   trunk/examples/wiki/view/docDisplay_m.xhtml
   trunk/examples/wiki/view/docEdit_d.xhtml
   trunk/examples/wiki/view/docHistory_d.xhtml
   trunk/examples/wiki/view/includes/commentForm.xhtml
   trunk/examples/wiki/view/includes/commentsDisplay.xhtml
   trunk/examples/wiki/view/themes/default/css/template.css
   trunk/examples/wiki/view/themes/default/js/lacewiki.js
   trunk/examples/wiki/view/themes/inrelationto/css/inrelationto.css
   trunk/examples/wiki/view/themes/inrelationto/js/lacewiki.js
   trunk/examples/wiki/view/themes/sfwkorg/css/sfwk.css
   trunk/examples/wiki/view/themes/sfwkorg/js/lacewiki.js
   trunk/examples/wiki/view/userHome_d.xhtml
Log:
Another complete rewrite of the wiki text editor, now supports plaintext

Modified: trunk/examples/wiki/src/etc/META-INF/wiki.taglib.xml
===================================================================
--- trunk/examples/wiki/src/etc/META-INF/wiki.taglib.xml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/etc/META-INF/wiki.taglib.xml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -133,10 +133,11 @@
         <function-signature>java.lang.String escapeAtSymbol(java.lang.String)</function-signature>
     </function>
 
+    <!-- There is a reason why this HTML is uppercase, I forgot... -->
     <function>
         <function-name>escapeHTML</function-name>
         <function-class>org.jboss.seam.wiki.util.WikiUtil</function-class>
-        <function-signature>java.lang.String escapeHtml(java.lang.String,boolean)</function-signature>
+        <function-signature>java.lang.String escapeHtml(java.lang.String,boolean,boolean)</function-signature>
     </function>
 
     <function>

Modified: trunk/examples/wiki/src/etc/i18n/messages_en.properties
===================================================================
--- trunk/examples/wiki/src/etc/i18n/messages_en.properties	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/etc/i18n/messages_en.properties	2008-06-19 14:57:46 UTC (rev 8386)
@@ -213,7 +213,10 @@
 
 # Wiki Text Editor
 lacewiki.label.wikiTextEditor.CharactersLeft=chars left
+lacewiki.label.wikiTextEditor.DisableContentMarkup=Let me type some plain text, not markup
+lacewiki.label.wikiTextEditor.EnableLivePreview=Enable live preview
 lacewiki.msg.wikiTextEditor.EditThisText=Click HELP for text formatting instructions. Then edit this text and check the preview.
+lacewiki.msg.wikiTextEditor.MarkupDisabled=Formatting disabled!
 lacewiki.msg.wikiTextEditor.FormatSelection=Format selected text...
 lacewiki.msg.wikiTextEditor.FormatInline=-------- Inline --------
 lacewiki.msg.wikiTextEditor.FormatMonospace=Monospace/Code
@@ -232,14 +235,9 @@
 lacewiki.msg.wikiTextEditor.FormatHeadline2=Headline 2
 lacewiki.msg.wikiTextEditor.FormatHeadline3=Headline 3
 lacewiki.msg.wikiTextEditor.FormatHeadline4=Headline 4
-lacewiki.button.wikiTextEditor.EnablePreview=Pre<u>v</u>iew On
-lacewiki.button.wikiTextEditor.EnablePreview.accesskey=V
-lacewiki.button.wikiTextEditor.DisablePreview=Pre<u>v</u>iew Off
-lacewiki.button.wikiTextEditor.DisablePreview.accesskey=V
-lacewiki.button.wikiTextEditor.Validate=<u>C</u>heck
-lacewiki.button.wikiTextEditor.Validate.accesskey=C
 lacewiki.msg.wikiTextValidator.InvalidWikiText=Invalid wiki text, please click HELP for formatting instructions.
 lacewiki.msg.wikiTextValidator.EmptyWikiText=Please enter wiki text, field can not be empty.
+lacewiki.msg.wikiTextValidator.MaxLengthExceeded=Too much content, please shorten the text.
 
 # Document Display
 

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/CommentHome.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/CommentHome.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/CommentHome.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -22,7 +22,7 @@
 import org.jboss.seam.wiki.core.action.prefs.CommentsPreferences;
 import org.jboss.seam.wiki.core.exception.InvalidWikiRequestException;
 import org.jboss.seam.wiki.core.ui.WikiRedirect;
-import org.jboss.seam.wiki.core.wikitext.editor.WikiTextValidator;
+import org.jboss.seam.wiki.core.wikitext.editor.WikiTextEditor;
 import org.jboss.seam.wiki.util.WikiUtil;
 
 import static org.jboss.seam.international.StatusMessage.Severity.INFO;
@@ -49,8 +49,9 @@
     /* -------------------------- Internal State ------------------------------ */
 
     @RequestParameter
-    private Long parentCommentId;
-    private boolean showForm = false;
+    protected Long parentCommentId;
+    protected boolean showForm = false;
+    protected WikiTextEditor textEditor = new WikiTextEditor("comment", 32767, true, true);
 
     /* -------------------------- Basic Overrides ------------------------------ */
 
@@ -60,6 +61,11 @@
     }
 
     @Override
+    protected String getEditorWorkspaceDescription(boolean create) {
+        return null;
+    }
+
+    @Override
     public Class<WikiComment> getEntityClass() {
         return WikiComment.class;
     }
@@ -112,6 +118,20 @@
     /* -------------------------- Custom CUD ------------------------------ */
 
     @Override
+    public boolean beforePersist() {
+
+        getInstance().setContent(
+            textEditor.getValueAndConvertLinks(getParentNode().getAreaNumber())
+        );
+
+        if (textEditor.isValuePlaintext()) {
+            getInstance().setUseWikiText(false);
+        }
+
+        return true;
+    }
+
+    @Override
     public String persist() {
         String outcome = super.persist();
         if (outcome != null) {
@@ -166,9 +186,19 @@
         return (CommentNodeRemover)Component.getInstance(CommentNodeRemover.class);
     }
 
-/* -------------------------- Messages ------------------------------ */
+    @Override
+    protected Validatable[] getUpdateValidations() {
+        return new Validatable[] { textEditor };
+    }
 
     @Override
+    protected Validatable[] getPersistValidations() {
+        return new Validatable[] { textEditor };
+    }
+
+    /* -------------------------- Messages ------------------------------ */
+
+    @Override
     protected void createdMessage() {
         StatusMessages.instance().addFromResourceBundleOrDefault(
                 INFO,
@@ -198,10 +228,6 @@
         );
     }
 
-    protected String getEditorWorkspaceDescription(boolean create) {
-        return null;
-    }
-
     /* -------------------------- Internal Methods ------------------------------ */
 
     protected void endConversation() {
@@ -245,33 +271,6 @@
         return quoted.toString();
     }
 
-    @Override
-    protected WikiTextValidator.ValidationCommand[] getPersistValidationCommands() {
-        return new WikiTextValidator.ValidationCommand[] {
-            new WikiTextValidator.ValidationCommand() {
-                public String getKey() {
-                    return "comment";
-                }
-
-                public String getWikiTextValue() {
-                    return getInstance().getContent();
-                }
-
-                public boolean getWikiTextRequired() {
-                    return true;
-                }
-            }
-        };
-    }
-
-    protected String getValidationRequiredWikiTextEditorId() {
-        return "comment";
-    }
-
-    protected String getValidationRequiredWikiText() {
-        return getInstance().getContent();
-    }
-
     /* -------------------------- Public Features ------------------------------ */
 
     public boolean isShowForm() {
@@ -286,11 +285,13 @@
     public void newComment() {
         initEditor(false);
         showForm = true;
+        textEditor.setValue(getInstance().getContent());
     }
 
     @Begin(flushMode = FlushModeType.MANUAL, join = true)
     public void replyTo() {
         prepareReply();
+        textEditor.setValue(getInstance().getContent());
         WikiRedirect.instance()
                 .setWikiDocument(documentHome.getInstance())
                 .setPropagateConversation(true)
@@ -301,6 +302,7 @@
     public void quote() {
         prepareReply();
         setQuotedContent((WikiComment)getParentNode());
+        textEditor.setValue(getInstance().getContent());
         WikiRedirect.instance()
                 .setWikiDocument(documentHome.getInstance())
                 .setPropagateConversation(true)
@@ -312,10 +314,11 @@
             throw new InvalidWikiRequestException("Missing parentCommentId request parameter");
 
         getLog().debug("reply to comment id: " + parentCommentId);
-        newComment();
+        initEditor(false);
+        showForm = true;
 
         setParentNodeId(parentCommentId);
-        getInstance(); // Init the parent
+        getInstance(); // Init the parent, has to happen here
         setReplySubject((WikiComment)getParentNode());
     }
 
@@ -366,4 +369,8 @@
         }
     }
 
+    public WikiTextEditor getTextEditor() {
+        return textEditor;
+    }
+
 }

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHistory.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHistory.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHistory.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -165,7 +165,7 @@
             if (delEnd != Diff.NONE) {
                 result.append("<div class=\"diffDeleted\">");
                 for (int lnum = delStart; lnum <= delEnd; ++lnum) {
-                    result.append( WikiUtil.escapeHtml(a[lnum], false) ).append("<br/>");
+                    result.append( WikiUtil.escapeHtml(a[lnum], false, false) ).append("<br/>");
                 }
                 result.append("</div>");
                 if (addEnd != Diff.NONE) {
@@ -175,7 +175,7 @@
             if (addEnd != Diff.NONE) {
                 result.append("<div class=\"diffAdded\">");
                 for (int lnum = addStart; lnum <= addEnd; ++lnum) {
-                    result.append( WikiUtil.escapeHtml(b[lnum], false) ).append("<br/>");
+                    result.append( WikiUtil.escapeHtml(b[lnum], false, false) ).append("<br/>");
                 }
                 result.append("</div>");
             }

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHome.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHome.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/DocumentHome.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -19,16 +19,14 @@
 import org.jboss.seam.wiki.core.action.prefs.WikiPreferences;
 import org.jboss.seam.wiki.core.feeds.FeedDAO;
 import org.jboss.seam.wiki.core.feeds.FeedEntryManager;
-import org.jboss.seam.wiki.core.wikitext.engine.WikiLinkResolver;
 import org.jboss.seam.wiki.core.wikitext.renderer.MacroWikiTextRenderer;
 import org.jboss.seam.wiki.core.model.*;
 import org.jboss.seam.wiki.core.exception.InvalidWikiRequestException;
 import org.jboss.seam.wiki.core.template.TemplateRegistry;
 import org.jboss.seam.wiki.core.template.WikiDocumentTemplate;
 import org.jboss.seam.wiki.core.template.WikiDocumentEditorDefaults;
-import org.jboss.seam.wiki.core.wikitext.editor.WikiTextValidator;
+import org.jboss.seam.wiki.core.wikitext.editor.WikiTextEditor;
 import org.jboss.seam.wiki.preferences.Preferences;
-import org.hibernate.validator.Length;
 
 import static org.jboss.seam.international.StatusMessage.Severity.INFO;
 
@@ -46,19 +44,20 @@
     private FeedDAO feedDAO;
     @In
     private TagEditor tagEditor;
+    @In("#{preferences.get('DocEditor')}")
+    private DocumentEditorPreferences docEditorPreferences;
 
     /* -------------------------- Internal State ------------------------------ */
 
-    private WikiDocument historicalCopy;
-    private Boolean minorRevision;
-    private String formContent;
-    private Set<WikiFile> linkTargets;
-    private boolean pushOnFeeds = false;
-    private boolean pushOnSiteFeed = false;
-    private boolean isOnSiteFeed = false;
-    private List<WikiFile> historicalFiles;
-    private Long numOfHistoricalFiles = 0l;
-    private String templateType;
+    protected WikiTextEditor textEditor = new WikiTextEditor("content");
+    protected WikiDocument historicalCopy;
+    protected Boolean minorRevision;
+    protected boolean pushOnFeeds = false;
+    protected boolean pushOnSiteFeed = false;
+    protected boolean isOnSiteFeed = false;
+    protected List<WikiFile> historicalFiles;
+    protected Long numOfHistoricalFiles = 0l;
+    protected String templateType;
 
     /* -------------------------- Basic Overrides ------------------------------ */
 
@@ -125,6 +124,8 @@
 
         doc.setEnableComments( Preferences.instance().get(CommentsPreferences.class).getEnableByDefault() );
 
+        syncInstanceToEditor(getParentNode().getAreaNumber(), doc);
+
         return doc;
     }
 
@@ -156,23 +157,36 @@
 
         isOnSiteFeed = feedDAO.isOnSiteFeed(doc);
 
+        syncInstanceToEditor(getParentNode().getAreaNumber(), doc);
+        copyHistoricalRevision(doc);
+
         return doc;
     }
 
+    @Override
+    protected String getEditorWorkspaceDescription(boolean create) {
+        if (create) {
+            return Messages.instance().get("lacewiki.label.docEdit.CreateDocument");
+        } else {
+            return Messages.instance().get("lacewiki.label.docEdit.EditDocument") + ":" + getInstance().getName();
+        }
+    }
+
     /* -------------------------- Custom CUD ------------------------------ */
 
     @Override
     protected boolean beforePersist() {
-        // Sync document content
-        syncFormContentToInstance(getParentNode());
-        syncLinks();
 
-        // Make a copy
-        historicalCopy = new WikiDocument();
-        historicalCopy.flatCopy(getInstance(), true);
+        syncEditorToInstance(getParentNode().getAreaNumber(), getInstance());
+        syncMacros(getInstance());
+        copyHistoricalRevision(getInstance());
 
         purgeFeedEntries();
         
+        // Plain text can only be set on persist(), never changed later with update()
+        if (textEditor.isValuePlaintext())
+            getInstance().addHeaderMacro(new WikiTextMacro(WikiDocument.MACRO_DISABLE_CONTENT_MARKUP));
+
         return true;
     }
 
@@ -200,9 +214,8 @@
     @Override
     protected boolean beforeUpdate() {
 
-        // Sync document content
-        syncFormContentToInstance(getParentNode());
-        syncLinks();
+        syncEditorToInstance(getParentNode().getAreaNumber(), getInstance());
+        syncMacros(getInstance());
 
         // Update feed entries
         if (isPushOnFeeds()) {
@@ -234,12 +247,11 @@
             historicalCopy.setLastModifiedBy(getCurrentUser());
             getWikiNodeDAO().persistHistoricalFile(historicalCopy);
             getInstance().incrementRevision();
-            // New historical copy in conversation
-            historicalCopy = new WikiDocument();
-            historicalCopy.flatCopy(getInstance(), true);
 
+            copyHistoricalRevision(getInstance());
+
             // Reset form
-            setMinorRevision( Preferences.instance().get(DocumentEditorPreferences.class).getMinorRevisionEnabled() );
+            setMinorRevision( docEditorPreferences.getMinorRevisionEnabled() );
         }
 
         return true;
@@ -254,32 +266,15 @@
     protected NodeRemover getNodeRemover() {
         return (DocumentNodeRemover)Component.getInstance(DocumentNodeRemover.class);
     }
-
     @Override
-    protected WikiTextValidator.ValidationCommand[] getPersistValidationCommands() {
-        return getValidationCommands();
-    }
 
-    protected WikiTextValidator.ValidationCommand[] getUpdateValidationCommands() {
-        return getValidationCommands();
+    protected Validatable[] getUpdateValidations() {
+        return new Validatable[] { textEditor };
     }
 
-    private WikiTextValidator.ValidationCommand[] getValidationCommands() {
-        return new WikiTextValidator.ValidationCommand[] {
-            new WikiTextValidator.ValidationCommand() {
-                public String getKey() {
-                    return "content";
-                }
-
-                public String getWikiTextValue() {
-                    return getFormContent();
-                }
-
-                public boolean getWikiTextRequired() {
-                    return true;
-                }
-            }
-        };
+    @Override
+    protected Validatable[] getPersistValidations() {
+        return new Validatable[] { textEditor };
     }
 
 
@@ -315,14 +310,6 @@
         );
     }
 
-    protected String getEditorWorkspaceDescription(boolean create) {
-        if (create) {
-            return Messages.instance().get("lacewiki.label.docEdit.CreateDocument");
-        } else {
-            return Messages.instance().get("lacewiki.label.docEdit.EditDocument") + ":" + getInstance().getName();
-        }
-    }
-
     /* -------------------------- Internal Methods ------------------------------ */
 
     protected void findHistoricalFiles(WikiDocument doc) {
@@ -347,47 +334,22 @@
         }
     }
 
-    private void syncLinks() {
-        if (linkTargets != null) getInstance().setOutgoingLinks(linkTargets);
+    public void syncEditorToInstance(Long areaNumber, WikiDocument doc) {
+        doc.setContent(textEditor.getValueAndConvertLinks(areaNumber));
+        if (textEditor.getLinkTargets() != null)
+            doc.setOutgoingLinks(textEditor.getLinkTargets());
     }
 
-    public void syncMacros(WikiDocument doc) {
-        if (doc.getHeader() != null) {
-            MacroWikiTextRenderer renderer = MacroWikiTextRenderer.renderMacros(doc.getHeader());
-            doc.setHeaderMacros(renderer.getMacros());
-        }
-        if (doc.getContent() != null) {
-            MacroWikiTextRenderer renderer = MacroWikiTextRenderer.renderMacros(doc.getContent());
-            doc.setContentMacros(renderer.getMacros());
-        }
-        if (doc.getFooter() != null) {
-            MacroWikiTextRenderer renderer = MacroWikiTextRenderer.renderMacros(doc.getFooter());
-            doc.setFooterMacros(renderer.getMacros());
-        }
+    public void syncInstanceToEditor(Long areaNumber, WikiDocument doc) {
+        textEditor.setValueAndConvertLinks(areaNumber, doc.getContent());
+        textEditor.setRows(docEditorPreferences.getRegularEditAreaRows().intValue());
     }
 
-    private void syncFormContentToInstance(WikiDirectory dir) {
-        if (formContent != null) {
-            getLog().debug("sync form content to instance");
-            WikiLinkResolver wikiLinkResolver = (WikiLinkResolver)Component.getInstance("wikiLinkResolver");
-            linkTargets = new HashSet<WikiFile>();
-            getInstance().setContent(
-                wikiLinkResolver.convertToWikiProtocol(linkTargets, dir.getAreaNumber(), formContent)
-            );
-            syncMacros(getInstance());
-        }
+    protected void copyHistoricalRevision(WikiDocument doc) {
+        historicalCopy = new WikiDocument();
+        historicalCopy.flatCopy(doc, true);
     }
 
-    private void syncInstanceToFormContent(WikiDirectory dir) {
-        getLog().debug("sync instance to form in area: " + dir.getAreaNumber());
-        WikiLinkResolver wikiLinkResolver = (WikiLinkResolver)Component.getInstance("wikiLinkResolver");
-        formContent = wikiLinkResolver.convertFromWikiProtocol(dir.getAreaNumber(), getInstance().getContent());
-        if (historicalCopy == null) {
-            getLog().debug("making a history copy of the document");
-            historicalCopy = new WikiDocument();
-            historicalCopy.flatCopy(getInstance(), true);
-        }
-    }
 
     protected String getFeedEntryManagerName() {
         return "wikiDocumentFeedEntryManager";
@@ -401,27 +363,27 @@
         feedDAO.purgeOldFeedEntries(oldestDate.getTime());
     }
 
-    /* -------------------------- Public Features ------------------------------ */
+/* -------------------------- Public Features ------------------------------ */
 
-    // TODO: We need to duplicate this here, otherwise it will only validated on persist(): http://jira.jboss.com/jira/browse/JBSEAM-2671
-    @Length(min = 0, max = 32767)
-    public String getFormContent() {
-        // Load the document content and resolve links
-        if (formContent == null) syncInstanceToFormContent(getParentNode());
-        return formContent;
-    }
-
-    public void setFormContent(String formContent) {
-        this.formContent = formContent;
-        if (formContent != null) {
-            syncFormContentToInstance(getParentNode());
+    public void syncMacros(WikiDocument doc) {
+        if (doc.getHeader() != null) {
+            MacroWikiTextRenderer renderer = MacroWikiTextRenderer.renderMacros(doc.getHeader());
+            doc.setHeaderMacros(renderer.getMacros());
         }
+        if (doc.getContent() != null) {
+            MacroWikiTextRenderer renderer = MacroWikiTextRenderer.renderMacros(doc.getContent());
+            doc.setContentMacros(renderer.getMacros());
+        }
+        if (doc.getFooter() != null) {
+            MacroWikiTextRenderer renderer = MacroWikiTextRenderer.renderMacros(doc.getFooter());
+            doc.setFooterMacros(renderer.getMacros());
+        }
     }
 
     public boolean isMinorRevision() {
         // Lazily initalize preferences
         if (minorRevision == null)
-            minorRevision = Preferences.instance().get(DocumentEditorPreferences.class).getMinorRevisionEnabled();
+            minorRevision = docEditorPreferences.getMinorRevisionEnabled();
         return minorRevision;
     }
     public void setMinorRevision(boolean minorRevision) { this.minorRevision = minorRevision; }
@@ -446,16 +408,6 @@
         this.pushOnSiteFeed = pushOnSiteFeed;
     }
 
-    public void setShowPluginPrefs(boolean showPluginPrefs) {
-        Contexts.getPageContext().set("showPluginPreferences", showPluginPrefs);
-    }
-
-    // TODO: Move this into WikiTextEditor.java
-    public boolean isShowPluginPrefs() {
-        Boolean showPluginPrefs = (Boolean)Contexts.getPageContext().get("showPluginPreferences");
-        return showPluginPrefs != null && showPluginPrefs;
-    }
-
     public boolean isHistoricalFilesPresent() {
         return numOfHistoricalFiles != null && numOfHistoricalFiles> 0;
     }
@@ -475,4 +427,8 @@
     public void setTemplateType(String templateType) {
         this.templateType = templateType;
     }
+
+    public WikiTextEditor getTextEditor() {
+        return textEditor;
+    }
 }

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeHome.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeHome.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/NodeHome.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -19,7 +19,6 @@
 import org.jboss.seam.wiki.core.model.*;
 import org.jboss.seam.wiki.core.action.prefs.WikiPreferences;
 import org.jboss.seam.wiki.core.exception.InvalidWikiRequestException;
-import org.jboss.seam.wiki.core.wikitext.editor.WikiTextValidator;
 import org.jboss.seam.wiki.util.WikiUtil;
 import org.jboss.seam.wiki.preferences.Preferences;
 import org.jboss.seam.international.StatusMessages;
@@ -52,15 +51,12 @@
     protected User currentUser;
     @In
     protected List<Role.AccessLevel> accessLevelsList;
-    @In
-    protected WikiTextValidator wikiTextValidator;
 
     public WikiNodeDAO getWikiNodeDAO() { return wikiNodeDAO; }
     public UserDAO getUserDAO() { return userDAO; }
     public WikiDirectory getWikiRoot() { return wikiRoot; }
     public User getCurrentUser() { return currentUser; }
     public List<Role.AccessLevel> getAccessLevelsList() { return accessLevelsList; }
-    public WikiTextValidator getWikiTextValidator() { return wikiTextValidator; }
 
     /* -------------------------- Request Wiring ------------------------------ */
 
@@ -221,7 +217,7 @@
     public String persist() {
         checkPersistPermissions();
 
-        if (!validateWikiTexts(getPersistValidationCommands())) return null;
+        if (!validateComponents(getPersistValidations())) return null;
 
         if (!preparePersist()) return null;
 
@@ -256,7 +252,7 @@
     public String update() {
         checkUpdatePermissions();
 
-        if (!validateWikiTexts(getUpdateValidationCommands())) return null;
+        if (!validateComponents(getUpdateValidations())) return null;
 
         if (!prepareUpdate()) return null;
 
@@ -418,22 +414,21 @@
         return Identity.instance().hasPermission("Node", "edit", node);
     }
 
-    protected boolean validateWikiTexts(WikiTextValidator.ValidationCommand[] validationCommands) {
-        if (validationCommands == null) return true;
-
+    protected boolean validateComponents(Validatable validatableComponents[]) {
+        if (validatableComponents == null) return true;
         boolean allValid = true;
-        for (WikiTextValidator.ValidationCommand validationCommand : validationCommands) {
-            getWikiTextValidator().validate(validationCommand);
-            allValid = getWikiTextValidator().isValid(validationCommand.getKey());
+        for (Validatable validatableComponent : validatableComponents) {
+            validatableComponent.validate();
+            allValid = validatableComponent.isValid();
         }
         return allValid;
     }
 
-    protected WikiTextValidator.ValidationCommand[] getUpdateValidationCommands() {
+    protected Validatable[] getUpdateValidations() {
         return null;
     }
 
-    protected WikiTextValidator.ValidationCommand[] getPersistValidationCommands() {
+    protected Validatable[] getPersistValidations() {
         return null;
     }
 

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UserHome.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UserHome.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/UserHome.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -28,7 +28,7 @@
 import org.jboss.seam.wiki.core.model.WikiUploadImage;
 import org.jboss.seam.wiki.core.upload.Uploader;
 import org.jboss.seam.wiki.core.exception.InvalidWikiRequestException;
-import org.jboss.seam.wiki.core.wikitext.editor.WikiTextValidator;
+import org.jboss.seam.wiki.core.wikitext.editor.WikiTextEditor;
 import org.jboss.seam.wiki.preferences.PreferenceVisibility;
 import org.jboss.seam.wiki.preferences.Preferences;
 import org.jboss.seam.wiki.preferences.PreferenceProvider;
@@ -73,6 +73,8 @@
     private org.jboss.seam.wiki.core.model.Role defaultRole;
     private Uploader uploader;
     private String requestedUsername;
+    private WikiTextEditor bioTextEditor;
+    private WikiTextEditor signatureTextEditor;
 
     public Uploader getUploader() {
         return uploader;
@@ -117,6 +119,13 @@
 
             if (defaultRole == null) defaultRole = (Role)Component.getInstance("newUserDefaultRole");
         }
+
+        if (bioTextEditor == null || signatureTextEditor == null) {
+            bioTextEditor        = new WikiTextEditor("bio", 1023, false, false, 5);
+            signatureTextEditor  = new WikiTextEditor("signature", 1023, false, false, 5);
+            syncInstanceToWikiTextEditors();
+        }
+
     }
 
     public void initEdit() {
@@ -170,6 +179,8 @@
             return null;
         }
 
+        syncWikiTextEditorsToInstance();
+
         // Assign default role
         getInstance().getRoles().add(defaultRole);
 
@@ -222,6 +233,8 @@
             return null;
         }
 
+        syncWikiTextEditorsToInstance();
+
         if (uploader.hasData()) {
             uploader.uploadNewInstance();
             if (WikiUploadImage.class.isAssignableFrom(uploader.getUpload().getClass())) {
@@ -348,14 +361,20 @@
         );
     }
 
-    protected boolean validateWikiTextEditors() {
-        WikiTextValidator wikiTextValidator =
-                (WikiTextValidator) Component.getInstance(WikiTextValidator.class);
+    protected void syncInstanceToWikiTextEditors() {
+        bioTextEditor.setValue(getInstance().getProfile().getBio());
+        signatureTextEditor.setValue(getInstance().getProfile().getSignature());
+    }
 
-        wikiTextValidator.validate("bio", getInstance().getProfile().getBio(), false);
-        wikiTextValidator.validate("signature", getInstance().getProfile().getSignature(), false);
+    protected void syncWikiTextEditorsToInstance() {
+        getInstance().getProfile().setBio(bioTextEditor.getValue());
+        getInstance().getProfile().setSignature(signatureTextEditor.getValue());
+    }
 
-        return wikiTextValidator.isValid("bio") && wikiTextValidator.isValid("signature");
+    protected boolean validateWikiTextEditors() {
+        bioTextEditor.validate();
+        signatureTextEditor.validate();
+        return bioTextEditor.isValid() && signatureTextEditor.isValid();
     }
 
 
@@ -489,6 +508,14 @@
         return userDAO.findRatingPoints(getInstance().getId());
     }
 
+    public WikiTextEditor getBioTextEditor() {
+        return bioTextEditor;
+    }
+
+    public WikiTextEditor getSignatureTextEditor() {
+        return signatureTextEditor;
+    }
+
     // ####################### PREFERENCES ##################################
 
     PreferenceEditor preferenceEditor;

Added: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/Validatable.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/Validatable.java	                        (rev 0)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/Validatable.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -0,0 +1,23 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.seam.wiki.core.action;
+
+/**
+ * Marks a component that has to be valid before a CUD operation can continue.
+ * <p>
+ * These components are validated during save or update operations, and they typically queue
+ * a status message for display on the UI. The validation method is decoupled from the validation
+ * result, this simplifies user interface design.
+ * </p>
+ *
+ * @author Christian Bauer
+ */
+public interface Validatable {
+
+    public void validate();
+    public boolean isValid();
+}

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/prefs/DocumentEditorPreferences.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/prefs/DocumentEditorPreferences.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/action/prefs/DocumentEditorPreferences.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -27,6 +27,7 @@
     @NotNull
     private Long regularEditAreaRows;
 
+    // TODO: This property is not used anymore - or it shouldn't be used...
     @PreferenceProperty(
         description = "#{messages['lacewiki.preferences.documentEditor.RegularEditAreaColumns']}",
         visibility = {PreferenceVisibility.SYSTEM, PreferenceVisibility.USER},

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/FeedEntryManager.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/FeedEntryManager.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/FeedEntryManager.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -22,6 +22,7 @@
 import org.jboss.seam.wiki.core.model.FeedEntry;
 import org.jboss.seam.wiki.core.model.WikiTextMacro;
 import org.jboss.seam.wiki.core.ui.WikiURLRenderer;
+import org.jboss.seam.wiki.util.WikiUtil;
 
 /**
  * @author Christian Bauer
@@ -78,5 +79,9 @@
         return parser.toString();
     }
 
+    protected String renderPlainText(String plainText) {
+        return WikiUtil.escapeHtml(plainText, true, true);
+    }
 
+
 }

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/WikiCommentFeedEntryManager.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/WikiCommentFeedEntryManager.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/WikiCommentFeedEntryManager.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -11,6 +11,7 @@
 import org.jboss.seam.international.Messages;
 import org.jboss.seam.wiki.core.model.WikiComment;
 import org.jboss.seam.wiki.core.model.WikiCommentFeedEntry;
+import org.jboss.seam.wiki.core.model.User;
 
 @Name("wikiCommentFeedEntryManager")
 public class WikiCommentFeedEntryManager extends FeedEntryManager<WikiComment, WikiCommentFeedEntry> {
@@ -22,7 +23,12 @@
 
         fe.setLink(wikiURLRenderer.renderURL(comment, true));
         fe.setTitle(getFeedEntryTitle(comment));
-        fe.setAuthor(comment.getCreatedBy().getFullname() != null ? comment.getCreatedBy().getFullname() : comment.getFromUserName());
+        fe.setAuthor(
+            comment.getCreatedBy().getFullname() != null
+            && !comment.getCreatedBy().getUsername().equals(User.GUEST_USERNAME)
+            && !comment.getCreatedBy().getUsername().equals(User.ADMIN_USERNAME)
+            ? comment.getCreatedBy().getFullname()
+            : comment.getFromUserName());
         fe.setUpdatedDate(fe.getPublishedDate());
 
         // Do NOT use text/html, the fabulous Sun "Rome" software will
@@ -56,7 +62,11 @@
         desc.append("'").append(comment.getParentDocument().getName()).append("'");
         desc.append("</a>.");
         desc.append("<hr/>");
-        desc.append(renderWikiText(comment.getAreaNumber(), comment.getContent()));
+        desc.append(
+            comment.isUseWikiText()
+                ? renderWikiText(comment.getAreaNumber(), comment.getContent())
+                : renderPlainText(comment.getContent())
+        );
         return desc.toString();
     }
 

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/WikiDocumentFeedEntryManager.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/WikiDocumentFeedEntryManager.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/feeds/WikiDocumentFeedEntryManager.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -27,7 +27,13 @@
         // Do NOT use text/html, the fabulous Sun "Rome" software will
         // render type="HTML" (uppercase!) which kills the Firefox feed renderer!
         fe.setDescriptionType("html");
-        fe.setDescriptionValue(renderWikiText(document.getAreaNumber(), document.getFeedDescription()));
+        String descriptionValue = "";
+        if (document.macroPresent(WikiDocument.MACRO_DISABLE_CONTENT_MARKUP)) {
+            descriptionValue = renderPlainText(document.getFeedDescription());
+        } else {
+            descriptionValue = renderWikiText(document.getAreaNumber(), document.getFeedDescription());
+        }
+        fe.setDescriptionValue(descriptionValue);
 
         fe.setDocument(document);
         return fe;

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/model/WikiDocument.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/model/WikiDocument.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/model/WikiDocument.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -17,6 +17,8 @@
 
 public class WikiDocument extends WikiFile<WikiDocument> implements Serializable {
 
+    public static final String MACRO_DISABLE_CONTENT_MARKUP = "disableContentMarkup";
+
     @Column(name = "NAME_AS_TITLE", nullable = false)
     private boolean nameAsTitle = true;
 

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/metamodel/SearchSupport.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/metamodel/SearchSupport.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/search/metamodel/SearchSupport.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -85,7 +85,7 @@
             String unescapedFragements =
                     highlighter.getBestFragments(tokenStream, indexedText, numOfFragments, getFragmentSeparator());
 
-            String escapedFragments = WikiUtil.escapeHtml(WikiUtil.removeMacros(unescapedFragements), false);
+            String escapedFragments = WikiUtil.escapeHtml(WikiUtil.removeMacros(unescapedFragements), false, false);
 
             // .. and then replace the internal placeholders with real tags after HTML has been escaped
             escapedFragments = escapedFragments.replaceAll(INTERNAL_BEGIN_HIT, getBeginHitTag());
@@ -101,10 +101,10 @@
                                 0,
                                 indexedText.length()>alternativeLength ? alternativeLength : indexedText.length()
                             )
-                        ), false
+                        ), false, false
                        );
             } else if (escapedFragments.length() == 0 && alternativeLength == 0){
-                return WikiUtil.escapeHtml(WikiUtil.removeMacros(indexedText), false);
+                return WikiUtil.escapeHtml(WikiUtil.removeMacros(indexedText), false, false);
             }
 
             return escapedFragments;

Added: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextEditor.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextEditor.java	                        (rev 0)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextEditor.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -0,0 +1,241 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.seam.wiki.core.wikitext.editor;
+
+import org.jboss.seam.log.Log;
+import org.jboss.seam.log.Logging;
+import org.jboss.seam.wiki.core.wikitext.engine.WikiLinkResolver;
+import org.jboss.seam.wiki.core.model.WikiFile;
+import org.jboss.seam.wiki.core.action.Validatable;
+import org.jboss.seam.Component;
+
+import javax.faces.validator.ValidatorException;
+import javax.faces.application.FacesMessage;
+import java.util.HashSet;
+import java.util.Set;
+import java.io.Serializable;
+
+/**
+ * A wiki (or plain) text editor.
+ *
+ * @author Christian Bauer
+ */
+public class WikiTextEditor implements Validatable, Serializable {
+
+    Log log = Logging.getLog(WikiTextEditor.class);
+
+    // Construction time
+    private String key;
+    private int valueMaxLength = 32767;
+    private boolean valueRequired = true;
+    private boolean allowPlaintext = false;
+    private int rows = 20;
+
+    // Editing
+    private String value;
+    private boolean valid = true;
+    private boolean valuePlaintext;
+    private boolean previewEnabled;
+    private String lastValidationError;
+    private Set<WikiFile> linkTargets;
+
+    public WikiTextEditor(String key) {
+        this.key = key;
+    }
+
+    public WikiTextEditor(String key, int valueMaxLength) {
+        this.key = key;
+        this.valueMaxLength = valueMaxLength;
+    }
+
+    public WikiTextEditor(String key, int valueMaxLength, boolean valueRequired) {
+        this.key = key;
+        this.valueMaxLength = valueMaxLength;
+        this.valueRequired = valueRequired;
+    }
+
+    public WikiTextEditor(String key, int valueMaxLength, boolean valueRequired, boolean allowPlaintext) {
+        this.key = key;
+        this.valueMaxLength = valueMaxLength;
+        this.valueRequired = valueRequired;
+        this.allowPlaintext = allowPlaintext;
+    }
+
+    public WikiTextEditor(String key, int valueMaxLength, boolean valueRequired, boolean allowPlaintext, int rows) {
+        this.key = key;
+        this.valueMaxLength = valueMaxLength;
+        this.valueRequired = valueRequired;
+        this.allowPlaintext = allowPlaintext;
+        this.rows = rows;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        // Stupid Internet Explorer textarea puts carriage returns inside the text, we don't want any of that
+        this.value = value != null ? value.replaceAll("\r", "") : value;
+    }
+
+    public int getValueMaxLength() {
+        return valueMaxLength;
+    }
+
+    public void setValueMaxLength(int valueMaxLength) {
+        this.valueMaxLength = valueMaxLength;
+    }
+
+    public boolean isValueRequired() {
+        return valueRequired;
+    }
+
+    public void setValueRequired(boolean valueRequired) {
+        this.valueRequired = valueRequired;
+    }
+
+    public boolean isAllowPlaintext() {
+        return allowPlaintext;
+    }
+
+    public void setAllowPlaintext(boolean allowPlaintext) {
+        this.allowPlaintext = allowPlaintext;
+    }
+
+    public int getRows() {
+        return rows;
+    }
+
+    public void setRows(int rows) {
+        this.rows = rows;
+    }
+
+    public boolean isValid() {
+        return valid;
+    }
+
+    public void setValid(boolean valid) {
+        this.valid = valid;
+    }
+
+    public boolean isValuePlaintext() {
+        return valuePlaintext;
+    }
+
+    public void setValuePlaintext(boolean valuePlaintext) {
+        this.valuePlaintext = valuePlaintext;
+    }
+
+    public boolean isPreviewEnabled() {
+        return previewEnabled;
+    }
+
+    public void setPreviewEnabled(boolean previewEnabled) {
+        this.previewEnabled = previewEnabled;
+    }
+
+    public String getLastValidationError() {
+        return lastValidationError;
+    }
+
+    public void setLastValidationError(String lastValidationError) {
+        this.lastValidationError = lastValidationError;
+    }
+
+    public Set<WikiFile> getLinkTargets() {
+        return linkTargets;
+    }
+
+    public void setValueAndConvertLinks(Long areaNumber, String value) {
+        log.debug("setting value and resolving wiki://links to clear text");
+        WikiLinkResolver wikiLinkResolver = (WikiLinkResolver) Component.getInstance("wikiLinkResolver");
+        setValue(wikiLinkResolver.convertFromWikiProtocol(areaNumber, value));
+    }
+
+    public String getValueAndConvertLinks(Long areaNumber) {
+        log.debug("setting value and resolving clear text to wiki://links");
+        WikiLinkResolver wikiLinkResolver = (WikiLinkResolver)Component.getInstance("wikiLinkResolver");
+        linkTargets = new HashSet<WikiFile>();
+        return wikiLinkResolver.convertToWikiProtocol(linkTargets, areaNumber, getValue());
+    }
+
+    public int getRemainingCharacters() {
+        return getValue() != null ? getValueMaxLength() - getValue().length() : getValueMaxLength();
+    }
+
+    public void switchPlaintext() {
+        // If the user wants to switch from plain text back to wiki text, do validation
+        if (!isValuePlaintext()) {
+            validate();
+            // Allow only if valid wiki text markup
+            setValuePlaintext(!isValid());
+        } else {
+            // If the user wants plain text, then we can discard any validation errors
+            setValid(true);
+            lastValidationError = null;
+        }
+    }
+
+    public void validate() {
+        log.debug("validating value of text editor: " + key);
+        setValid(false);
+        if (valueRequired && (value == null || value.length() == 0)) {
+            log.debug("validation failed for required but null or empty wiki text with key: " + key);
+            lastValidationError = "lacewiki.msg.wikiTextValidator.EmptyWikiText"; // TODO: make static
+            return;
+        }
+        if (value != null && value.length() > getValueMaxLength()) {
+            log.debug("validation failed for too long wiki text with key: " + key);
+            lastValidationError = "lacewiki.msg.wikiTextValidator.MaxLengthExceeded"; // TODO: make static
+            return;
+        }
+        try {
+            lastValidationError = null;
+            if (!isValuePlaintext()) {
+                WikiFormattedTextValidator validator = new WikiFormattedTextValidator();
+                validator.validate(null, null, value);
+            }
+            setValid(true);
+        } catch (ValidatorException e) {
+            log.debug("exception during validation: " + e.getFacesMessage().getSummary());
+            lastValidationError = convertFacesMessage(e.getFacesMessage());
+        }
+        log.debug("completed validation of text editor value for key: " + key);
+    }
+    
+    // TODO: These are supposed to be message bundle keys, not the literal ANTLR parser messages, see WikiFormattedTextValidator
+    protected String convertFacesMessage(FacesMessage fm) {
+        // Convert the FacesMessage to a StatusMessage (which of course is then converted back to JSF...)
+        StringBuilder msg = new StringBuilder();
+        msg.append(fm.getSummary());
+
+        // Append the detail only if the summary doesn't end with it already
+        if (!fm.getSummary().endsWith(fm.getDetail())) {
+            msg.append(" (").append(fm.getDetail()).append(")");
+        }
+        return msg.toString();
+    }
+
+    /* TODO: Old stuff
+    public void setShowPluginPrefs(boolean showPluginPrefs) {
+        Contexts.getPageContext().set("showPluginPreferences", showPluginPrefs);
+    }
+
+    public boolean isShowPluginPrefs() {
+        Boolean showPluginPrefs = (Boolean)Contexts.getPageContext().get("showPluginPreferences");
+        return showPluginPrefs != null && showPluginPrefs;
+    }
+    */
+}

Deleted: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextPreview.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextPreview.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextPreview.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -1,53 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.seam.wiki.core.wikitext.editor;
-
-import org.jboss.seam.annotations.*;
-import org.jboss.seam.ScopeType;
-import org.jboss.seam.log.Log;
-
-import java.util.Map;
-import java.util.HashMap;
-import java.io.Serializable;
-
-/**
- * Holds conversation-scoped state of wiki text preview feature.
- *
- * @author Christian Bauer
- */
- at Name("wikiTextPreview")
- at Scope(ScopeType.CONVERSATION)
- at AutoCreate
-public class WikiTextPreview implements Serializable {
-
-    @Logger
-    Log log;
-
-    @In
-    WikiTextValidator wikiTextValidator;
-
-    private Map<String, Boolean> previewEnabled = new HashMap<String, Boolean>();
-
-    public void enablePreview(String key) {
-        previewEnabled.put(key, true);
-    }
-
-    public void enablePreview(String key, String value, boolean valueRequired) {
-        // Only enable preview if text passes validation
-        wikiTextValidator.validate(key, value, valueRequired);
-        if (wikiTextValidator.isValid(key)) previewEnabled.put(key, true);
-    }
-
-    public void disablePreview(String key) {
-        previewEnabled.remove(key);
-    }
-
-    public Boolean isPreviewEnabled(String key) {
-        return previewEnabled.get(key);
-    }
-
-}

Deleted: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextValidator.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextValidator.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/wikitext/editor/WikiTextValidator.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -1,123 +0,0 @@
-package org.jboss.seam.wiki.core.wikitext.editor;
-
-import org.jboss.seam.annotations.Name;
-import org.jboss.seam.annotations.Scope;
-import org.jboss.seam.annotations.Logger;
-import org.jboss.seam.annotations.AutoCreate;
-import org.jboss.seam.ScopeType;
-import org.jboss.seam.log.Log;
-
-import java.io.Serializable;
-import java.util.Map;
-import java.util.HashMap;
-
-import javax.faces.validator.ValidatorException;
-import javax.faces.application.FacesMessage;
-
-/**
- * Wraps the <tt>WikiFormattedTextValidator</tt> into a conversation-scoped action
- * that queues the right messages and holds the status of various text editors
- * for easy error checking by the user interface.
- *
- * @see WikiFormattedTextValidator
- *
- * @author Christian Bauer
- */
- at Name("wikiTextValidator")
- at Scope(ScopeType.CONVERSATION)
- at AutoCreate
-public class WikiTextValidator implements Serializable {
-
-    @Logger
-    Log log;
-
-    private Map<String, String> validationFailures = new HashMap<String, String>();
-
-    /**
-     * Validates the wiki text value and stores the validation state in this component.
-     *
-     * @param key
-     *      The key under which the validation status is stored and can be later retrieved with <tt>isValid()</tt>
-     * @param value
-     *      The wiki text
-     * @param valueRequired
-     *      Checks before validation if a value is present and required.
-     */
-    public void validate(String key, String value, boolean valueRequired) {
-        log.debug("validating value of text editor: " + key);
-        if (valueRequired && (value == null || value.length() == 0)) {
-            log.debug("validation failed for required but null or empty wiki text with key: " + key);
-            validationFailures.put(key, "lacewiki.msg.wikiTextValidator.EmptyWikiText");
-            return;
-        }
-        WikiFormattedTextValidator validator = new WikiFormattedTextValidator();
-        try {
-            validationFailures.remove(key);
-            validator.validate(null, null, value);
-        } catch (ValidatorException e) {
-            log.debug("exception during validation: " + e.getFacesMessage().getSummary());
-            validationFailures.put(key, convertFacesMessage(e.getFacesMessage()));
-        }
-        log.debug("completed validation of text editor value for key: " + key);
-    }
-
-    /**
-     * Makes it easier to call the validation routine programmatically.
-     *
-     * @param validationCommand
-     *      A command that bundles the validation values and options.
-     */
-    public void validate(ValidationCommand validationCommand) {
-        validate(
-            validationCommand.getKey(),
-            validationCommand.getWikiTextValue(),
-            validationCommand.getWikiTextRequired()
-        );
-    }
-
-    /**
-     * Validation status of wiki text with the given key.
-     * <p>
-     * <b>Attention: Returns <tt>true</tt> if the given key can not be found!</b>
-     * </p>
-     *
-     * @param key
-     *      The key under which the validation status has been stored, i.e. from an earlier <tt>validate()</tt> call
-     * @return
-     *      True if no status for <tt>key</tt> can be found or if previous validation failed for <tt>key</tt>
-     */
-    public boolean isValid(String key) {
-        return !validationFailures.containsKey(key);
-    }
-
-    /**
-     * Return the last validation failure message key for the given wiki text key.
-     *
-     * @param key
-     *      The key under which the validation status has been stored, i.e. from an earlier <tt>validate()</tt> call
-     * @return
-     *      The validation failure message bundle key or null if no error is known.
-     */
-    public String getValidationFailureMessageBundleKey(String key) {
-        return validationFailures.get(key);
-    }
-
-    // TODO: These are supposed to be message bundle keys, not the literal ANTLR parser messages, see WikiFormattedTextValidator
-    protected String convertFacesMessage(FacesMessage fm) {
-        // Convert the FacesMessage to a StatusMessage (which of course is then converted back to JSF...)
-        StringBuilder msg = new StringBuilder();
-        msg.append(fm.getSummary());
-
-        // Append the detail only if the summary doesn't end with it already
-        if (!fm.getSummary().endsWith(fm.getDetail())) {
-            msg.append(" (").append(fm.getDetail()).append(")");
-        }
-        return msg.toString();
-    }
-
-    public interface ValidationCommand {
-        public String getKey();
-        public String getWikiTextValue();
-        public boolean getWikiTextRequired();
-    }
-}

Modified: trunk/examples/wiki/src/main/org/jboss/seam/wiki/util/WikiUtil.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/util/WikiUtil.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/util/WikiUtil.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -30,6 +30,7 @@
 import java.util.Date;
 import java.util.List;
 import java.util.regex.Pattern;
+import java.util.regex.Matcher;
 
 /**
  * Adds stuff to and for JSF that should be there but isn't. Also stuff that is exposed
@@ -174,7 +175,7 @@
         return string.replaceAll("@", Preferences.instance().get(WikiPreferences.class).getAtSymbolReplacement());
     }
 
-    public static String escapeHtml(String string, boolean convertNewlines) {
+    public static String escapeHtml(String string, boolean convertNewlines, boolean convertSpaces) {
         if (string == null) return null;
         StringBuilder sb = new StringBuilder();
         String htmlEntity;
@@ -194,10 +195,26 @@
                 sb.append(c);
             }
         }
+        String result = sb.toString();
+        if (convertSpaces) {
+            // Converts the _beginning_ of line whitespaces into non-breaking spaces
+            Matcher matcher = Pattern.compile("(\\n+)(\\s*)(.*)").matcher(result);
+            StringBuffer temp = new StringBuffer();
+            while(matcher.find()) {
+                String group = matcher.group(2);
+                StringBuilder spaces = new StringBuilder();
+                for (int i = 0; i < group.length(); i++) {
+                    spaces.append("&#160;");
+                }
+                matcher.appendReplacement(temp, "$1"+spaces.toString()+"$3");
+            }
+            matcher.appendTail(temp);
+            result = temp.toString();
+        }
         if (convertNewlines) {
-            return sb.toString().replaceAll("\n", "<br/>");
+            result = result.replaceAll("\n", "<br/>");
         }
-        return sb.toString();
+        return result;
     }
 
     public static String removeHtml(String original) {

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/basic/Basic.plugin.xml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/basic/Basic.plugin.xml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/basic/Basic.plugin.xml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -65,6 +65,14 @@
         <applicable-to header="true"/>
     </macro>
 
+    <macro key="disableContentMarkup" name="disableContentMarkup">
+        <skins>
+            <skin name="d"/>
+            <skin name="m"/>
+        </skins>
+        <applicable-to header="true"/>
+    </macro>
+
     <macro key="dirMenu" name="dirMenu">
         <skins>
             <skin name="d"/>

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/basic/i18n/messages_basic_en.properties
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/basic/i18n/messages_basic_en.properties	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/basic/i18n/messages_basic_en.properties	2008-06-19 14:57:46 UTC (rev 8386)
@@ -22,6 +22,9 @@
 basic.disableContentMacros.label=Disable Content Macros
 basic.disableContentMacros.description=Disable execution of macros in document content area
 
+basic.disableContentMarkup.label=Disable Content Markup
+basic.disableContentMarkup.description=Disable wiki markup in content text
+
 basic.dirMenu.label=Directory Menu
 basic.dirMenu.description=Shows a list of subdirectories of the current directory
 basic.dirMenu.preferences.description=Plugin: Directory Menu

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/faqBrowser/i18n/messages_faqBrowser_en.properties
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/faqBrowser/i18n/messages_faqBrowser_en.properties	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/faqBrowser/i18n/messages_faqBrowser_en.properties	2008-06-19 14:57:46 UTC (rev 8386)
@@ -11,7 +11,7 @@
 fb.faqBrowser.button.NewQuestion=New <u>Q</u>uestion
 fb.faqBrowser.button.NewQuestion.accesskey=Q
 
-fb.faqBrowser.label.NewFaqQuestion=New question in category
+fb.faqBrowser.label.NewFaqQuestion=New question and answer in category
 fb.faqBrowser.label.NewQuestionTitle=Your question?
 fb.faqBrowser.label.QuestionTitle=Question
 fb.faqBrowser.label.QuestionText=Text

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/faqBrowser/templates/faqQuestionForm.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/faqBrowser/templates/faqQuestionForm.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/faqBrowser/templates/faqQuestionForm.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -27,26 +27,16 @@
                     <h:inputText id="faqQuestionName" tabindex="1" size="60" maxlength="255" required="true" value="#{faqQuestionHome.instance.name}"/>
                 </s:decorate>
 
-                <ui:include src="/includes/wikiTextEditor.xhtml">
-                    <ui:param name="textEditorId" value="faqQuestion"/>
+                <ui:include src="/includes/wikitext/editor/editor.xhtml">
+                    <ui:param name="textEditor" value="#{faqQuestionHome.textEditor}"/>
                     <ui:param name="namingContainer" value="faqBrowserPlugin\\\\:faqQuestionForm"/>
-                    <ui:param name="label" value="#{messages['fb.faqBrowser.label.QuestionText']}"/>
-                    <ui:param name="valueBinding" value="#{faqQuestionHome.formContent}"/>
-                    <ui:param name="valueMaxLength" value="32767"/>
-                    <ui:param name="valueRequired" value="true"/>
-                    <ui:param name="textEditorColumns" value="60"/>
-                    <ui:param name="textEditorRows" value="20"/>
                 </ui:include>
+                <ui:include src="/includes/wikitext/editor/preview.xhtml">
+                    <ui:param name="textEditor" value="#{faqQuestionHome.textEditor}"/>
+                    <ui:param name="baseDocument" value="#{faqQuestionHome.instance}"/>
+                    <ui:param name="baseDirectory" value="#{currentDirectory}"/>
+                </ui:include>
 
-                <s:div styleClass="marginLeft">
-                    <ui:include src="/includes/wikiTextPreview.xhtml">
-                        <ui:param name="textEditorId" value="faqQuestion"/>
-                        <ui:param name="valueBinding" value="#{faqQuestionHome.instance.content}"/>
-                        <ui:param name="baseDocument" value="#{faqQuestionHome.instance}"/>
-                        <ui:param name="baseDirectory" value="#{currentDirectory}"/>
-                    </ui:include>
-                </s:div>
-
             </s:div>
 
             <div class="formControls">

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/ReplyHome.java
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/ReplyHome.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/ReplyHome.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -7,7 +7,6 @@
 import org.jboss.seam.international.StatusMessages;
 import org.jboss.seam.security.Identity;
 import org.jboss.seam.wiki.core.action.CommentHome;
-import org.jboss.seam.wiki.core.wikitext.editor.WikiTextValidator;
 import org.jboss.seam.wiki.core.model.WikiComment;
 import org.jboss.seam.wiki.core.model.WikiNode;
 import org.jboss.seam.wiki.core.ui.WikiRedirect;
@@ -27,6 +26,8 @@
     public void create() {
         super.create();
         markTopicRead();
+
+        textEditor.setKey("reply");
     }
 
     @In(create = true)
@@ -62,6 +63,8 @@
 
         getInstance().setSubject(REPLY_PREFIX + getParentNode().getName());
 
+        textEditor.setValue(getInstance().getContent());
+
         WikiRedirect.instance()
                 .setWikiDocument(documentHome.getInstance())
                 .setPropagateConversation(true)
@@ -83,6 +86,8 @@
             documentHome.getInstance().getCreatedBy().getFullname()
         ));
 
+        textEditor.setValue(getInstance().getContent());
+
         WikiRedirect.instance()
                 .setWikiDocument(documentHome.getInstance())
                 .setPropagateConversation(true)
@@ -101,25 +106,6 @@
         return "forumReplyFeedEntryManager";
     }
 
-    @Override
-    protected WikiTextValidator.ValidationCommand[] getPersistValidationCommands() {
-        return new WikiTextValidator.ValidationCommand[] {
-            new WikiTextValidator.ValidationCommand() {
-                public String getKey() {
-                    return "reply";
-                }
-
-                public String getWikiTextValue() {
-                    return getInstance().getContent();
-                }
-
-                public boolean getWikiTextRequired() {
-                    return true;
-                }
-            }
-        };
-    }
-
     /* -------------------------- Messages ------------------------------ */
 
     protected void createdMessage() {

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/TopicHome.java
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/TopicHome.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/TopicHome.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -8,15 +8,18 @@
 import org.jboss.seam.faces.Renderer;
 import org.jboss.seam.international.StatusMessages;
 import org.jboss.seam.wiki.core.action.DocumentHome;
-import org.jboss.seam.wiki.core.wikitext.editor.WikiTextValidator;
 import org.jboss.seam.wiki.core.model.WikiDirectory;
 import org.jboss.seam.wiki.core.model.WikiDocument;
 import org.jboss.seam.wiki.core.model.WikiTextMacro;
+import org.jboss.seam.wiki.core.model.WikiFile;
 import org.jboss.seam.wiki.core.ui.WikiRedirect;
 import org.jboss.seam.wiki.core.plugin.PluginRegistry;
+import org.jboss.seam.wiki.core.wikitext.editor.WikiTextEditor;
 import org.jboss.seam.wiki.preferences.Preferences;
 
 import static org.jboss.seam.international.StatusMessage.Severity.INFO;
+import org.hibernate.validator.InvalidStateException;
+import org.hibernate.validator.InvalidValue;
 
 @Name("topicHome")
 @Scope(ScopeType.CONVERSATION)
@@ -54,6 +57,9 @@
 
         Boolean preferencesNotifyReplies = Preferences.instance().get(ForumPreferences.class).getNotifyMeOfReplies();
         notifyReplies = preferencesNotifyReplies != null && preferencesNotifyReplies;
+
+        textEditor.setKey("topic");
+        textEditor.setAllowPlaintext(true);// Topics can be plain text, regular documents can't
     }
 
     @Override
@@ -97,7 +103,8 @@
 
             endConversation();
 
-            // TODO: We should redirect here to the posted topic with WikiRedirect, see cancel()
+            // Redirect to topic (so the created message is actually never displayed, but that's ok)
+            WikiRedirect.instance().setWikiDocument(getInstance()).execute();
         }
         return null; // Prevent navigation
     }
@@ -116,33 +123,6 @@
         return null; // Prevent navigation
     }
 
-    @Override
-    protected WikiTextValidator.ValidationCommand[] getPersistValidationCommands() {
-        return getValidationCommands();
-    }
-
-    protected WikiTextValidator.ValidationCommand[] getUpdateValidationCommands() {
-        return getValidationCommands();
-    }
-
-    private WikiTextValidator.ValidationCommand[] getValidationCommands() {
-        return new WikiTextValidator.ValidationCommand[] {
-            new WikiTextValidator.ValidationCommand() {
-                public String getKey() {
-                    return "topic";
-                }
-
-                public String getWikiTextValue() {
-                    return getInstance().getContent();
-                }
-
-                public boolean getWikiTextRequired() {
-                    return true;
-                }
-            }
-        };
-    }
-
     /* -------------------------- Messages ------------------------------ */
 
     protected void createdMessage() {

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/templates/replyForm.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/templates/replyForm.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/templates/replyForm.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -73,26 +73,16 @@
                         </h:inputText>
                     </s:decorate>
 
-                    <a:region>
-                        <ui:include src="/includes/wikiTextEditor.xhtml">
-                            <ui:param name="textEditorId" value="reply"/>
-                            <ui:param name="namingContainer" value="forumRepliesPlugin\\\\:replyForm"/>
-                            <ui:param name="label" value="#{messages['forum.label.replyForm.Message']}"/>
-                            <ui:param name="valueBinding" value="#{replyHome.instance.content}"/>
-                            <ui:param name="valueMaxLength" value="32767"/>
-                            <ui:param name="valueRequired" value="true"/>
-                            <ui:param name="textEditorColumns" value="#{replyHome.instance.ownedByRegularUser ? '65' : '55'}"/>
-                            <ui:param name="textEditorRows" value="20"/>
-                        </ui:include>
+                    <ui:include src="/includes/wikitext/editor/editor.xhtml">
+                        <ui:param name="textEditor" value="#{replyHome.textEditor}"/>
+                        <ui:param name="namingContainer" value="forumRepliesPlugin\\\\:replyForm"/>
+                    </ui:include>
+                    <ui:include src="/includes/wikitext/editor/preview.xhtml">
+                        <ui:param name="textEditor" value="#{replyHome.textEditor}"/>
+                        <ui:param name="baseDocument" value="#{currentDocument}"/>
+                        <ui:param name="baseDirectory" value="#{currentDocument.parent}"/>
+                    </ui:include>
 
-                        <ui:include src="/includes/wikiTextPreview.xhtml">
-                            <ui:param name="textEditorId" value="reply"/>
-                            <ui:param name="valueBinding" value="#{replyHome.instance.content}"/>
-                            <ui:param name="baseDocument" value="#{currentDocument}"/>
-                            <ui:param name="baseDirectory" value="#{currentDocument.parent}"/>
-                        </ui:include>
-                    </a:region>
-
                     <s:decorate id="verifyCaptchaEntry" template="/includes/captchaEntry.xhtml">
                         <ui:param name="rendered" value="#{!identity.loggedIn}"/>
                     </s:decorate>

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/templates/topicForm.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/templates/topicForm.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/templates/topicForm.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -20,35 +20,17 @@
             </div>
 
             <a:region>
-                <s:div styleClass="formFields formBorder">
+                <s:div styleClass="formFields wideLabels formBorder">
 
                     <s:decorate id="nameDecorate" template="/includes/formFieldDecorate.xhtml">
                         <ui:define name="label">#{messages['forum.label.Subject']}</ui:define>
                         <h:inputText id="topicName" tabindex="1" size="60" maxlength="255" required="true" value="#{topicHome.instance.name}"/>
                     </s:decorate>
 
-                    <a:region>
-                        <ui:include src="/includes/wikiTextEditor.xhtml">
-                            <ui:param name="textEditorId" value="topic"/>
-                            <ui:param name="namingContainer" value="forumTopicsPlugin\\\\:topicForm"/>
-                            <ui:param name="label" value="#{messages['forum.label.Message']}"/>
-                            <ui:param name="valueBinding" value="#{topicHome.formContent}"/>
-                            <ui:param name="valueMaxLength" value="32767"/>
-                            <ui:param name="valueRequired" value="true"/>
-                            <ui:param name="textEditorColumns" value="60"/>
-                            <ui:param name="textEditorRows" value="20"/>
-                        </ui:include>
+                    <ui:include src="/includes/tagEditor.xhtml">
+                        <ui:param name="editor" value="#{topicHome.tagEditor}"/>
+                    </ui:include>
 
-                        <s:div styleClass="marginLeft">
-                            <ui:include src="/includes/wikiTextPreview.xhtml">
-                                <ui:param name="textEditorId" value="topic"/>
-                                <ui:param name="valueBinding" value="#{topicHome.instance.content}"/>
-                                <ui:param name="baseDocument" value="#{topicHome.instance}"/>
-                                <ui:param name="baseDirectory" value="#{currentDirectory}"/>
-                            </ui:include>
-                        </s:div>
-                    </a:region>
-
                     <s:fragment rendered="#{s:hasPermission('User', 'isAdmin', currentUser)}">
                         <s:div styleClass="entry">
                             <div class="label">
@@ -77,9 +59,15 @@
                         </div>
                     </s:div>
 
-                    <ui:include src="/includes/tagEditor.xhtml">
-                        <ui:param name="editor" value="#{topicHome.tagEditor}"/>
+                    <ui:include src="/includes/wikitext/editor/editor.xhtml">
+                        <ui:param name="textEditor" value="#{topicHome.textEditor}"/>
+                        <ui:param name="namingContainer" value="forumTopicsPlugin\\\\:topicForm"/>
                     </ui:include>
+                    <ui:include src="/includes/wikitext/editor/preview.xhtml">
+                        <ui:param name="textEditor" value="#{topicHome.textEditor}"/>
+                        <ui:param name="baseDocument" value="#{topicHome.instance}"/>
+                        <ui:param name="baseDirectory" value="#{currentDirectory}"/>
+                    </ui:include>
 
                     <s:decorate id="verifyCaptchaEntry" template="/includes/captchaEntry.xhtml">
                         <ui:param name="rendered" value="#{!identity.loggedIn}"/>

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyReply.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyReply.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyReply.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -2,10 +2,11 @@
             xmlns:m="http://jboss.com/products/seam/mail"
             xmlns:h="http://java.sun.com/jsf/html"
             xmlns:f="http://java.sun.com/jsf/core"
+            xmlns:c="http://java.sun.com/jstl/core"
             xmlns:wiki="http://jboss.com/products/seam/wiki">
     <m:header name="X-Sent-From" value="JBoss Seam" />
     <m:header name="Precedence" value="list"/>
-    <m:from name="Seam Wiki" address="do-not-reply at jboss.com" />
+    <m:from name="LaceWiki" address="do-not-reply at jboss.com" />
     <m:to name="#{currentDocument.createdBy.fullname}">#{currentDocument.createdBy.email}</m:to>
     <m:subject>[LaceWiki Forums] #{replyHome.instance.subject}</m:subject>
     <m:body>
@@ -21,14 +22,21 @@
 
             <hr/>
 
-            <wiki:formattedText value="#{replyHome.instance.content}"
-                                linkStyleClass="regularLink"
-                                brokenLinkStyleClass="brokenLink"
-                                attachmentLinkStyleClass="regularLink"
-                                thumbnailLinkStyleClass="regularLink"
-                                linkBaseFile="#{currentDocument}"
-                                currentAreaNumber="#{currentDocument.areaNumber}"
-                                enableMacroRendering="false"/>
+            <c:if test="#{replyHome.instance.useWikiText}">
+                <wiki:formattedText value="#{replyHome.instance.content}"
+                                    linkStyleClass="regularLink"
+                                    brokenLinkStyleClass="brokenLink"
+                                    attachmentLinkStyleClass="regularLink"
+                                    thumbnailLinkStyleClass="regularLink"
+                                    linkBaseFile="#{currentDocument}"
+                                    currentAreaNumber="#{currentDocument.areaNumber}"
+                                    enableMacroRendering="false"/>
+            </c:if>
+            <c:if test="#{not replyHome.instance.useWikiText}">
+                <div style="font-family: Andale Mono, Courier New, monospace;">
+                    <h:outputText escape="false" value="#{wiki:escapeHTML(replyHome.instance.content, true, true)}"/>
+                </div>
+            </c:if>
 
             <hr/>
             <a href="#{wikiURLRenderer.renderURL(replyHome.instance, true)}">Click here</a> to reply...

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyReplyToList.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyReplyToList.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyReplyToList.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -3,6 +3,7 @@
             xmlns:h="http://java.sun.com/jsf/html"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:wiki="http://jboss.com/products/seam/wiki"
+            xmlns:c="http://java.sun.com/jstl/core"
             messageId="#{wiki:calculateMessageId(replyHome.instance.id, replyHome.instance.name)}">
 
     <m:header name="In-Reply-To" value="#{wiki:calculateMessageId(currentDocument.id, currentDocument.name)}"/>
@@ -28,14 +29,21 @@
 
             <hr/>
 
-            <wiki:formattedText value="#{replyHome.instance.content}"
-                                linkStyleClass="regularLink"
-                                brokenLinkStyleClass="brokenLink"
-                                attachmentLinkStyleClass="regularLink"
-                                thumbnailLinkStyleClass="regularLink"
-                                linkBaseFile="#{currentDocument}"
-                                currentAreaNumber="#{currentDocument.areaNumber}"
-                                enableMacroRendering="false"/>
+            <c:if test="#{replyHome.instance.useWikiText}">
+                <wiki:formattedText value="#{replyHome.instance.content}"
+                                    linkStyleClass="regularLink"
+                                    brokenLinkStyleClass="brokenLink"
+                                    attachmentLinkStyleClass="regularLink"
+                                    thumbnailLinkStyleClass="regularLink"
+                                    linkBaseFile="#{currentDocument}"
+                                    currentAreaNumber="#{currentDocument.areaNumber}"
+                                    enableMacroRendering="false"/>
+            </c:if>
+            <c:if test="#{not replyHome.instance.useWikiText}">
+                <div style="font-family: Andale Mono, Courier New, monospace;">
+                    <h:outputText escape="false" value="#{wiki:escapeHTML(replyHome.instance.content, true, true)}"/>
+                </div>
+            </c:if>
 
             <hr/>
             <a href="#{wikiURLRenderer.renderURL(replyHome.instance, true)}">Click here</a> to reply...

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyTopicToList.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyTopicToList.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/default/mailtemplates/forumNotifyTopicToList.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -3,6 +3,7 @@
             xmlns:h="http://java.sun.com/jsf/html"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:wiki="http://jboss.com/products/seam/wiki"
+            xmlns:c="http://java.sun.com/jstl/core"
             messageId="#{wiki:calculateMessageId(topicHome.instance.id, topicHome.instance.name)}">
 
     <m:header name="X-Sent-From" value="JBoss Seam" />
@@ -11,7 +12,7 @@
     <m:header name="From" value="#{topicHome.instance.createdBy.fullname} &lt;do-not-reply at jboss.com>"/>
     <m:to name="LaceWiki Forums List">#{preferences.get('Forum').notificationMailingList}</m:to>
 
-    <m:subject>[SeamFramework.org Forums] #{topicHome.instance.name}</m:subject>
+    <m:subject>[LaceWiki Forums] #{topicHome.instance.name}</m:subject>
 
     <m:body>
         <html>
@@ -23,14 +24,21 @@
 
             <hr/>
 
-            <wiki:formattedText value="#{topicHome.instance.content}"
-                                linkStyleClass="regularLink"
-                                brokenLinkStyleClass="brokenLink"
-                                attachmentLinkStyleClass="regularLink"
-                                thumbnailLinkStyleClass="regularLink"
-                                linkBaseFile="#{currentDocument}"
-                                currentAreaNumber="#{currentDocument.areaNumber}"
-                                enableMacroRendering="false"/>
+            <c:if test="#{not topicHome.instance.macroPresent('disableContentMarkup')}">
+                <wiki:formattedText value="#{topicHome.instance.content}"
+                                    linkStyleClass="regularLink"
+                                    brokenLinkStyleClass="brokenLink"
+                                    attachmentLinkStyleClass="regularLink"
+                                    thumbnailLinkStyleClass="regularLink"
+                                    linkBaseFile="#{currentDocument}"
+                                    currentAreaNumber="#{currentDocument.areaNumber}"
+                                    enableMacroRendering="false"/>
+            </c:if>
+            <c:if test="#{topicHome.instance.macroPresent('disableContentMarkup')}">
+                <div style="font-family: Andale Mono, Courier New, monospace;">
+                    <h:outputText escape="false" value="#{wiki:escapeHTML(topicHome.instance.content, true, true)}"/>
+                </div>
+            </c:if>
 
             <hr/>
             <a href="#{wikiURLRenderer.renderURL(topicHome.instance, true)}">Click here</a> to reply...

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyReply.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyReply.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyReply.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -2,6 +2,7 @@
             xmlns:m="http://jboss.com/products/seam/mail"
             xmlns:h="http://java.sun.com/jsf/html"
             xmlns:f="http://java.sun.com/jsf/core"
+            xmlns:c="http://java.sun.com/jstl/core"
             xmlns:wiki="http://jboss.com/products/seam/wiki">
     <m:header name="X-Sent-From" value="JBoss Seam" />
     <m:header name="Precedence" value="list"/>
@@ -21,14 +22,21 @@
 
             <hr/>
 
-            <wiki:formattedText value="#{replyHome.instance.content}"
-                                linkStyleClass="regularLink"
-                                brokenLinkStyleClass="brokenLink"
-                                attachmentLinkStyleClass="regularLink"
-                                thumbnailLinkStyleClass="regularLink"
-                                linkBaseFile="#{currentDocument}"
-                                currentAreaNumber="#{currentDocument.areaNumber}"
-                                enableMacroRendering="false"/>
+            <c:if test="#{replyHome.instance.useWikiText}">
+                <wiki:formattedText value="#{replyHome.instance.content}"
+                                    linkStyleClass="regularLink"
+                                    brokenLinkStyleClass="brokenLink"
+                                    attachmentLinkStyleClass="regularLink"
+                                    thumbnailLinkStyleClass="regularLink"
+                                    linkBaseFile="#{currentDocument}"
+                                    currentAreaNumber="#{currentDocument.areaNumber}"
+                                    enableMacroRendering="false"/>
+            </c:if>
+            <c:if test="#{not replyHome.instance.useWikiText}">
+                <div style="font-family: Andale Mono, Courier New, monospace;">
+                    <h:outputText escape="false" value="#{wiki:escapeHTML(replyHome.instance.content, true, true)}"/>
+                </div>
+            </c:if>
 
             <hr/>
             <a href="#{wikiURLRenderer.renderURL(replyHome.instance, true)}">Click here</a> to reply...

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyReplyToList.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyReplyToList.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyReplyToList.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -3,6 +3,7 @@
             xmlns:h="http://java.sun.com/jsf/html"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:wiki="http://jboss.com/products/seam/wiki"
+            xmlns:c="http://java.sun.com/jstl/core"
             messageId="#{wiki:calculateMessageId(replyHome.instance.id, replyHome.instance.name)}">
 
     <m:header name="In-Reply-To" value="#{wiki:calculateMessageId(currentDocument.id, currentDocument.name)}"/>
@@ -28,14 +29,21 @@
 
             <hr/>
 
-            <wiki:formattedText value="#{replyHome.instance.content}"
-                                linkStyleClass="regularLink"
-                                brokenLinkStyleClass="brokenLink"
-                                attachmentLinkStyleClass="regularLink"
-                                thumbnailLinkStyleClass="regularLink"
-                                linkBaseFile="#{currentDocument}"
-                                currentAreaNumber="#{currentDocument.areaNumber}"
-                                enableMacroRendering="false"/>
+            <c:if test="#{replyHome.instance.useWikiText}">
+                <wiki:formattedText value="#{replyHome.instance.content}"
+                                    linkStyleClass="regularLink"
+                                    brokenLinkStyleClass="brokenLink"
+                                    attachmentLinkStyleClass="regularLink"
+                                    thumbnailLinkStyleClass="regularLink"
+                                    linkBaseFile="#{currentDocument}"
+                                    currentAreaNumber="#{currentDocument.areaNumber}"
+                                    enableMacroRendering="false"/>
+            </c:if>
+            <c:if test="#{not replyHome.instance.useWikiText}">
+                <div style="font-family: Andale Mono, Courier New, monospace;">
+                    <h:outputText escape="false" value="#{wiki:escapeHTML(replyHome.instance.content, true, true)}"/>
+                </div>
+            </c:if>
 
             <hr/>
             <a href="#{wikiURLRenderer.renderURL(replyHome.instance, true)}">Click here</a> to reply...

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyTopicToList.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyTopicToList.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/inrelationto/mailtemplates/forumNotifyTopicToList.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -3,6 +3,7 @@
             xmlns:h="http://java.sun.com/jsf/html"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:wiki="http://jboss.com/products/seam/wiki"
+            xmlns:c="http://java.sun.com/jstl/core"
             messageId="#{wiki:calculateMessageId(topicHome.instance.id, topicHome.instance.name)}">
 
     <m:header name="X-Sent-From" value="JBoss Seam" />
@@ -23,14 +24,21 @@
 
             <hr/>
 
-            <wiki:formattedText value="#{topicHome.instance.content}"
-                                linkStyleClass="regularLink"
-                                brokenLinkStyleClass="brokenLink"
-                                attachmentLinkStyleClass="regularLink"
-                                thumbnailLinkStyleClass="regularLink"
-                                linkBaseFile="#{currentDocument}"
-                                currentAreaNumber="#{currentDocument.areaNumber}"
-                                enableMacroRendering="false"/>
+            <c:if test="#{not topicHome.instance.macroPresent('disableContentMarkup')}">
+                <wiki:formattedText value="#{topicHome.instance.content}"
+                                    linkStyleClass="regularLink"
+                                    brokenLinkStyleClass="brokenLink"
+                                    attachmentLinkStyleClass="regularLink"
+                                    thumbnailLinkStyleClass="regularLink"
+                                    linkBaseFile="#{currentDocument}"
+                                    currentAreaNumber="#{currentDocument.areaNumber}"
+                                    enableMacroRendering="false"/>
+            </c:if>
+            <c:if test="#{topicHome.instance.macroPresent('disableContentMarkup')}">
+                <div style="font-family: Andale Mono, Courier New, monospace;">
+                    <h:outputText escape="false" value="#{wiki:escapeHTML(topicHome.instance.content, true, true)}"/>
+                </div>
+            </c:if>
 
             <hr/>
             <a href="#{wikiURLRenderer.renderURL(topicHome.instance, true)}">Click here</a> to reply...

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyReply.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyReply.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyReply.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -2,6 +2,7 @@
             xmlns:m="http://jboss.com/products/seam/mail"
             xmlns:h="http://java.sun.com/jsf/html"
             xmlns:f="http://java.sun.com/jsf/core"
+            xmlns:c="http://java.sun.com/jstl/core"
             xmlns:wiki="http://jboss.com/products/seam/wiki">
     <m:header name="X-Sent-From" value="SeamFramework.org" />
     <m:header name="Precedence" value="list"/>
@@ -21,14 +22,21 @@
 
             <hr/>
 
-            <wiki:formattedText value="#{replyHome.instance.content}"
-                                linkStyleClass="regularLink"
-                                brokenLinkStyleClass="brokenLink"
-                                attachmentLinkStyleClass="regularLink"
-                                thumbnailLinkStyleClass="regularLink"
-                                linkBaseFile="#{currentDocument}"
-                                currentAreaNumber="#{currentDocument.areaNumber}"
-                                enableMacroRendering="false"/>
+            <c:if test="#{replyHome.instance.useWikiText}">
+                <wiki:formattedText value="#{replyHome.instance.content}"
+                                    linkStyleClass="regularLink"
+                                    brokenLinkStyleClass="brokenLink"
+                                    attachmentLinkStyleClass="regularLink"
+                                    thumbnailLinkStyleClass="regularLink"
+                                    linkBaseFile="#{currentDocument}"
+                                    currentAreaNumber="#{currentDocument.areaNumber}"
+                                    enableMacroRendering="false"/>
+            </c:if>
+            <c:if test="#{not replyHome.instance.useWikiText}">
+                <div style="font-family: Andale Mono, Courier New, monospace;">
+                    <h:outputText escape="false" value="#{wiki:escapeHTML(replyHome.instance.content, true, true)}"/>
+                </div>
+            </c:if>
 
             <hr/>
             <a href="#{wikiURLRenderer.renderURL(replyHome.instance, true)}">Click here</a> to reply...

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyReplyToList.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyReplyToList.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyReplyToList.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -3,6 +3,7 @@
             xmlns:h="http://java.sun.com/jsf/html"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:wiki="http://jboss.com/products/seam/wiki"
+            xmlns:c="http://java.sun.com/jstl/core"
             messageId="#{wiki:calculateMessageId(replyHome.instance.id, replyHome.instance.name)}">
 
     <m:header name="In-Reply-To" value="#{wiki:calculateMessageId(currentDocument.id, currentDocument.name)}"/>
@@ -27,14 +28,21 @@
 
             <hr/>
 
-            <wiki:formattedText value="#{replyHome.instance.content}"
-                                linkStyleClass="regularLink"
-                                brokenLinkStyleClass="brokenLink"
-                                attachmentLinkStyleClass="regularLink"
-                                thumbnailLinkStyleClass="regularLink"
-                                linkBaseFile="#{currentDocument}"
-                                currentAreaNumber="#{currentDocument.areaNumber}"
-                                enableMacroRendering="false"/>
+            <c:if test="#{replyHome.instance.useWikiText}">
+                <wiki:formattedText value="#{replyHome.instance.content}"
+                                    linkStyleClass="regularLink"
+                                    brokenLinkStyleClass="brokenLink"
+                                    attachmentLinkStyleClass="regularLink"
+                                    thumbnailLinkStyleClass="regularLink"
+                                    linkBaseFile="#{currentDocument}"
+                                    currentAreaNumber="#{currentDocument.areaNumber}"
+                                    enableMacroRendering="false"/>
+            </c:if>
+            <c:if test="#{not replyHome.instance.useWikiText}">
+                <div style="font-family: Andale Mono, Courier New, monospace;">
+                    <h:outputText escape="false" value="#{wiki:escapeHTML(replyHome.instance.content, true, true)}"/>
+                </div>
+            </c:if>
 
             <hr/>
             <a href="#{wikiURLRenderer.renderURL(replyHome.instance, true)}">Click here</a> to reply...

Modified: trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyTopicToList.xhtml
===================================================================
--- trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyTopicToList.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/plugin/org/jboss/seam/wiki/plugin/forum/themes/sfwkorg/mailtemplates/forumNotifyTopicToList.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -3,6 +3,7 @@
             xmlns:h="http://java.sun.com/jsf/html"
             xmlns:f="http://java.sun.com/jsf/core"
             xmlns:wiki="http://jboss.com/products/seam/wiki"
+            xmlns:c="http://java.sun.com/jstl/core"
             messageId="#{wiki:calculateMessageId(topicHome.instance.id, topicHome.instance.name)}">
 
     <m:header name="X-Sent-From" value="SeamFramework.org" />
@@ -23,14 +24,21 @@
 
             <hr/>
 
-            <wiki:formattedText value="#{topicHome.instance.content}"
-                                linkStyleClass="regularLink"
-                                brokenLinkStyleClass="brokenLink"
-                                attachmentLinkStyleClass="regularLink"
-                                thumbnailLinkStyleClass="regularLink"
-                                linkBaseFile="#{currentDocument}"
-                                currentAreaNumber="#{currentDocument.areaNumber}"
-                                enableMacroRendering="false"/>
+            <c:if test="#{not topicHome.instance.macroPresent('disableContentMarkup')}">
+                <wiki:formattedText value="#{topicHome.instance.content}"
+                                    linkStyleClass="regularLink"
+                                    brokenLinkStyleClass="brokenLink"
+                                    attachmentLinkStyleClass="regularLink"
+                                    thumbnailLinkStyleClass="regularLink"
+                                    linkBaseFile="#{currentDocument}"
+                                    currentAreaNumber="#{currentDocument.areaNumber}"
+                                    enableMacroRendering="false"/>
+            </c:if>
+            <c:if test="#{topicHome.instance.macroPresent('disableContentMarkup')}">
+                <div style="font-family: Andale Mono, Courier New, monospace;">
+                    <h:outputText escape="false" value="#{wiki:escapeHTML(topicHome.instance.content, true, true)}"/>
+                </div>
+            </c:if>
 
             <hr/>
             <a href="#{wikiURLRenderer.renderURL(topicHome.instance, true)}">Click here</a> to reply...

Modified: trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/BasicNodeOperations.java
===================================================================
--- trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/BasicNodeOperations.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/BasicNodeOperations.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -110,7 +110,7 @@
 
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 docHome.getInstance().setName("Test Name");
-                docHome.setFormContent("Test Content");
+                docHome.getTextEditor().setValue("Test Content");
 
                 assert invokeMethod("#{documentHome.persist}").equals("persisted");
 
@@ -150,11 +150,17 @@
                 setParameter("cid", conversationId);
             }
 
-            protected void processValidations() throws Exception {
+            protected void invokeApplication() throws Exception {
+
+                DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
+                docHome.getInstance().setName("Test Name");
+
                 StringBuilder builder = new StringBuilder();
                 for (int i = 0; i <= 40000; i++) builder.append("a");
-                validateValue("#{documentHome.formContent}", builder.toString());
-                assert isValidationFailure();
+
+                docHome.getTextEditor().setValue(builder.toString());
+                docHome.getTextEditor().validate();
+                assert !docHome.getTextEditor().isValid();
             }
 
         }.run();

Modified: trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/DocumentHistoryTests.java
===================================================================
--- trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/DocumentHistoryTests.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/DocumentHistoryTests.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -85,7 +85,7 @@
             protected void invokeApplication() throws Exception {
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 docHome.getInstance().setName("Test Name");
-                docHome.setFormContent("Test Content");
+                docHome.getTextEditor().setValue("Test Content");
 
                 assert invokeMethod("#{documentHome.persist}").equals("persisted");
 
@@ -129,8 +129,9 @@
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 assert docHome.getInstance().getId().equals(6l); // Init!
 
-                docHome.getFormContent(); // Initialize historical revision
-                docHome.setFormContent("New text");
+                docHome.syncInstanceToEditor(docHome.getParentNode().getId(), docHome.getInstance());
+                docHome.getTextEditor().setValue("New text");
+                docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance());
                 docHome.setMinorRevision(false);
 
                 assert invokeMethod("#{documentHome.update}").equals("updated");

Modified: trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/EditMacros.java
===================================================================
--- trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/EditMacros.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/EditMacros.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -84,8 +84,11 @@
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 assert docHome.getInstance().getId().equals(6l); // Init!
 
-                docHome.setFormContent("[<=contentMacro[param=value]]");
+                docHome.getTextEditor().setValue("[<=contentMacro[param=value]]");
 
+                docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance());
+                docHome.syncMacros(docHome.getInstance());
+
                 assert docHome.getInstance().getHeaderMacros().size() == 2;
                 assert docHome.getInstance().getContentMacros().size() == 1;
                 assert docHome.getInstance().getFooterMacros().size() == 2;

Modified: trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/Linking.java
===================================================================
--- trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/Linking.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/editing/Linking.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -55,37 +55,37 @@
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 assert docHome.getInstance().getId().equals(6l); // Init!
 
-                docHome.setFormContent("[=>http://foo.bar]");
+                docHome.getTextEditor().setValue("[=>http://foo.bar]");
+                docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance());
                 assert docHome.getInstance().getContent().equals("[=>http://foo.bar]");
-                assert docHome.getFormContent().equals("[=>http://foo.bar]");
 
-                docHome.setFormContent("[=>https://foo.bar]");
+                docHome.getTextEditor().setValue("[=>https://foo.bar]");
+                docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance());
                 assert docHome.getInstance().getContent().equals("[=>https://foo.bar]");
-                assert docHome.getFormContent().equals("[=>https://foo.bar]");
 
-                docHome.setFormContent("[=>ftp://foo.bar]");
+                docHome.getTextEditor().setValue("[=>ftp://foo.bar]");
+                docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance());
                 assert docHome.getInstance().getContent().equals("[=>ftp://foo.bar]");
-                assert docHome.getFormContent().equals("[=>ftp://foo.bar]");
 
-                docHome.setFormContent("[=>mailto:foo at bar.tld]");
+                docHome.getTextEditor().setValue("[=>mailto:foo at bar.tld]");
+                docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance());
                 assert docHome.getInstance().getContent().equals("[=>mailto:foo at bar.tld]");
-                assert docHome.getFormContent().equals("[=>mailto:foo at bar.tld]");
 
-                docHome.setFormContent("[Foo Bar=>http://foo.bar]");
+                docHome.getTextEditor().setValue("[Foo Bar=>http://foo.bar]");
+                docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance());
                 assert docHome.getInstance().getContent().equals("[Foo Bar=>http://foo.bar]");
-                assert docHome.getFormContent().equals("[Foo Bar=>http://foo.bar]");
 
-                docHome.setFormContent("[Foo Bar=>https://foo.bar]");
+                docHome.getTextEditor().setValue("[Foo Bar=>https://foo.bar]");
+                docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance());
                 assert docHome.getInstance().getContent().equals("[Foo Bar=>https://foo.bar]");
-                assert docHome.getFormContent().equals("[Foo Bar=>https://foo.bar]");
 
-                docHome.setFormContent("[Foo Bar=>ftp://foo.bar]");
+                docHome.getTextEditor().setValue("[Foo Bar=>ftp://foo.bar]");
+                docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance());
                 assert docHome.getInstance().getContent().equals("[Foo Bar=>ftp://foo.bar]");
-                assert docHome.getFormContent().equals("[Foo Bar=>ftp://foo.bar]");
 
-                docHome.setFormContent("[Foo Bar=>mailto:foo at bar.tld]");
+                docHome.getTextEditor().setValue("[Foo Bar=>mailto:foo at bar.tld]");
+                docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance());
                 assert docHome.getInstance().getContent().equals("[Foo Bar=>mailto:foo at bar.tld]");
-                assert docHome.getFormContent().equals("[Foo Bar=>mailto:foo at bar.tld]");
 
             }
 
@@ -114,7 +114,7 @@
                 WikiLinkResolver resolver = (WikiLinkResolver)getInstance("wikiLinkResolver");
                 Map<String, WikiLink> links = new HashMap<String, WikiLink>();
 
-                docHome.setFormContent("[=>hhh://1234]");
+                docHome.getTextEditor().setValue("[=>hhh://1234]");
                 resolver.resolveLinkText(3l, links, "hhh://1234");
                 assert links.size()==1;
                 assert links.get("hhh://1234").getUrl().equals("http://opensource.atlassian.com/projects/hibernate/browse/HHH-1234");
@@ -235,7 +235,7 @@
                 assert docHome.getInstance().getId().equals(6l); // Init!
 
                 assert docHome.getInstance().getOutgoingLinks().size() == 0;
-                docHome.setFormContent("[=>Two] and [=>Three] and [=>BBB|Test Image]");
+                docHome.getTextEditor().setValue("[=>Two] and [=>Three] and [=>BBB|Test Image]");
 
                 assert invokeMethod("#{documentHome.update}").equals("updated");
 

Modified: trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/feeds/DocumentFeedTests.java
===================================================================
--- trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/feeds/DocumentFeedTests.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/feeds/DocumentFeedTests.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -46,7 +46,7 @@
 
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 docHome.getInstance().setName("Test Name");
-                docHome.setFormContent("Test Content");
+                docHome.getTextEditor().setValue("Test Content");
 
                 docHome.setPushOnFeeds(true);
                 docHome.setPushOnSiteFeed(true);
@@ -85,7 +85,7 @@
 
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 docHome.getInstance().setName("Test Name");
-                docHome.setFormContent("Test Content");
+                docHome.getTextEditor().setValue("Test Content");
 
                 docHome.setPushOnFeeds(true);
                 docHome.setPushOnSiteFeed(true);
@@ -123,7 +123,7 @@
 
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 docHome.getInstance().setName("Test Name");
-                docHome.setFormContent("Test Content");
+                docHome.getTextEditor().setValue("Test Content");
 
                 docHome.setPushOnFeeds(true);
 
@@ -162,7 +162,7 @@
 
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 docHome.getInstance().setName("Test Name");
-                docHome.setFormContent("Test Content");
+                docHome.getTextEditor().setValue("Test Content");
 
                 docHome.setPushOnFeeds(true);
 
@@ -200,7 +200,7 @@
 
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 docHome.getInstance().setName("Test Name");
-                docHome.setFormContent("Test Content");
+                docHome.getTextEditor().setValue("Test Content");
 
                 docHome.setPushOnFeeds(true);
                 docHome.setPushOnSiteFeed(true);
@@ -240,7 +240,7 @@
 
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 docHome.getInstance().setName("Test Name");
-                docHome.setFormContent("Test Content");
+                docHome.getTextEditor().setValue("Test Content");
 
                 docHome.setPushOnFeeds(true);
                 docHome.setPushOnSiteFeed(true);

Modified: trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/plugin/TopicHomeTests.java
===================================================================
--- trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/plugin/TopicHomeTests.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/plugin/TopicHomeTests.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -64,7 +64,7 @@
                 TopicHome home = (TopicHome)getInstance(TopicHome.class);
 
                 home.getInstance().setName("New Topic");
-                home.setFormContent("This is a new topic.");
+                home.getTextEditor().setValue("This is a new topic.");
 
                 assert invokeMethod("#{topicHome.persist}") == null;
             }
@@ -131,7 +131,7 @@
                 TopicHome home = (TopicHome)getInstance(TopicHome.class);
 
                 home.getInstance().setName("New Topic");
-                home.setFormContent("This is a new topic.");
+                home.getTextEditor().setValue("This is a new topic.");
                 home.setSticky(true);
 
                 assert invokeMethod("#{topicHome.persist}") == null;
@@ -197,7 +197,7 @@
                 TopicHome home = (TopicHome)getInstance(TopicHome.class);
 
                 home.getInstance().setName("New Topic");
-                home.setFormContent("This is a new topic.");
+                home.getTextEditor().setValue("This is a new topic.");
                 home.getInstance().setEnableComments(false);
 
                 assert invokeMethod("#{topicHome.persist}") == null;

Modified: trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/preferences/InstancePreferencesTests.java
==================================