[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
===================================================================
--- trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/preferences/InstancePreferencesTests.java	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/src/test/org/jboss/seam/wiki/test/preferences/InstancePreferencesTests.java	2008-06-19 14:57:46 UTC (rev 8386)
@@ -86,7 +86,7 @@
                 DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class);
                 assert docHome.getInstance().getId().equals(6l); // Init!
 
-                docHome.setFormContent("[<=lastModifiedDocuments[documentTitleLength=66]]");
+                docHome.getTextEditor().setValue("[<=lastModifiedDocuments[documentTitleLength=66]]");
 
                 assert invokeMethod("#{documentHome.update}").equals("updated");
             }

Modified: trunk/examples/wiki/view/docDisplay_d.xhtml
===================================================================
--- trunk/examples/wiki/view/docDisplay_d.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/docDisplay_d.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -116,15 +116,23 @@
                     </h1>
                 </s:div>
 
-                <wiki:formattedText value="#{documentHome.instance.content}"
-                                    linkStyleClass="regularLink"
-                                    brokenLinkStyleClass="brokenLink"
-                                    attachmentLinkStyleClass="regularLink"
-                                    thumbnailLinkStyleClass="regularLink"
-                                    linkBaseFile="#{documentHome.instance}"
-                                    currentAreaNumber="#{documentHome.instance.areaNumber}"
-                                    enableMacroRendering="#{not documentHome.instance.macroPresent('disableContentMacros')}"/>
+                <c:if test="#{not documentHome.instance.macroPresent('disableContentMarkup')}">
+                    <wiki:formattedText value="#{documentHome.instance.content}"
+                                        linkStyleClass="regularLink"
+                                        brokenLinkStyleClass="brokenLink"
+                                        attachmentLinkStyleClass="regularLink"
+                                        thumbnailLinkStyleClass="regularLink"
+                                        linkBaseFile="#{documentHome.instance}"
+                                        currentAreaNumber="#{documentHome.instance.areaNumber}"
+                                        enableMacroRendering="#{not documentHome.instance.macroPresent('disableContentMacros')}"/>
+                </c:if>
 
+                <c:if test="#{documentHome.instance.macroPresent('disableContentMarkup')}">
+                    <s:div styleClass="plaintext">
+                        <h:outputText escape="false" value="#{wiki:escapeHTML(documentHome.instance.content, true, true)}"/>
+                    </s:div>
+                </c:if>
+
                 <wiki:formattedText value="#{documentHome.instance.footer}"
                                     linkStyleClass="regularLink"
                                     brokenLinkStyleClass="brokenLink"

Modified: trunk/examples/wiki/view/docDisplay_m.xhtml
===================================================================
--- trunk/examples/wiki/view/docDisplay_m.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/docDisplay_m.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -122,15 +122,23 @@
                 </h:outputLink>
             </s:div>
 
-            <wiki:formattedText value="#{wiki:disableFloats(documentHome.instance.content)}"
-                                linkStyleClass="regularLink"
-                                brokenLinkStyleClass="brokenLink"
-                                attachmentLinkStyleClass="regularLink"
-                                thumbnailLinkStyleClass="regularLink"
-                                linkBaseFile="#{documentHome.instance}"
-                                currentAreaNumber="#{documentHome.instance.areaNumber}"
-                                enableMacroRendering="#{not documentHome.instance.macroPresent('disableContentMacros')}"/>
+            <c:if test="#{not documentHome.instance.macroPresent('disableContentMarkup')}">
+                <wiki:formattedText value="#{wiki:disableFloats(documentHome.instance.content)}"
+                                    linkStyleClass="regularLink"
+                                    brokenLinkStyleClass="brokenLink"
+                                    attachmentLinkStyleClass="regularLink"
+                                    thumbnailLinkStyleClass="regularLink"
+                                    linkBaseFile="#{documentHome.instance}"
+                                    currentAreaNumber="#{documentHome.instance.areaNumber}"
+                                    enableMacroRendering="#{not documentHome.instance.macroPresent('disableContentMacros')}"/>
+            </c:if>
 
+            <c:if test="#{documentHome.instance.macroPresent('disableContentMarkup')}">
+                <s:div styleClass="plaintext">
+                    <h:outputText escape="false" value="#{wiki:escapeHTML(documentHome.instance.content, true, true)}"/>
+                </s:div>
+            </c:if>
+
             <wiki:formattedText value="#{documentHome.instance.footer}"
                                 linkStyleClass="regularLink"
                                 brokenLinkStyleClass="brokenLink"
@@ -263,11 +271,13 @@
                                                     currentAreaNumber="#{currentDocument.areaNumber}"
                                                     enableMacroRendering="false"/>
                             </s:div>
-                            <s:div rendered="#{not c.useWikiText and currentDocument.name != c.subject}" style="margin-top:15px;">
-                                <h:outputText value="#{wiki:escapeHTML(c.content, true)}" escape="false"/>
+                            <s:div style="margin-top:15px;font-family: Andale Mono, Courier New, monospace;"
+                                   rendered="#{not c.useWikiText and currentDocument.name != c.subject}">
+                                <h:outputText value="#{wiki:escapeHTML(c.content, true, true)}" escape="false"/>
                             </s:div>
-                            <s:div rendered="#{not c.useWikiText and currentDocument.name == c.subject}">
-                                <h:outputText value="#{wiki:escapeHTML(c.content, true)}" escape="false"/>
+                            <s:div style="font-family: Andale Mono, Courier New, monospace;"
+                                   rendered="#{not c.useWikiText and currentDocument.name == c.subject}">
+                                <h:outputText value="#{wiki:escapeHTML(c.content, true, true)}" escape="false"/>
                             </s:div>
 
                             <s:div styleClass="smallFont"

Modified: trunk/examples/wiki/view/docEdit_d.xhtml
===================================================================
--- trunk/examples/wiki/view/docEdit_d.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/docEdit_d.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -172,45 +172,12 @@
                                 </s:fragment>
                             </s:fragment>
 
-                            <ui:include src="includes/wikiTextEditor.xhtml">
-                                <ui:param name="textEditorId" value="content"/>
-                                <ui:param name="valueBinding" value="#{documentHome.formContent}"/>
+                            <ui:include src="includes/wikitext/editor/editor.xhtml">
+                                <ui:param name="textEditor" value="#{documentHome.textEditor}"/>
                                 <ui:param name="tabId" value="docContentTab"/>
                                 <ui:param name="namingContainer" value="docEditForm"/>
-                                <ui:param name="label" value="#{messages['lacewiki.label.docEdit.Content']}"/>
-                                <ui:param name="textEditorColumns" value="#{preferences.get('DocEditor').regularEditAreaColumns}"/>
-                                <ui:param name="textEditorRows" value="#{preferences.get('DocEditor').regularEditAreaRows}"/>
-                                <ui:param name="valueMaxLength" value="32767"/>
-                                <ui:param name="valueRequired" value="true"/>
                             </ui:include>
-<!--
-                            <s:div styleClass="entry" id="previewSwitchDiv">
-                                <h:message for="previewSwitch"/>
-                                <div class="label">&#160;</div>
-                                <div class="input">
-                                    <h:selectBooleanCheckbox styleClass="ajaxSupport" value="#{wikiTextPreview.isPreviewEnabled('content')}" tabindex="1" id="previewSwitch">
-                                        <a:support action="#{documentHome.wikiTextValidator.validate('content', documentHome.formContent, true)}"
-                                                   status="globalStatus"
-                                                   event="onchange"
-                                                   oncomplete="onAjaxRequestComplete()"
-                                                   reRender="contentPreview, docEditForm:contentTextEditor, pluginSwitch"/>
-                                    </h:selectBooleanCheckbox>
-                                    <h:outputText value="#{messages['lacewiki.label.docEdit.EnablePreview']}"/>
-                                </div>
-                            </s:div>
 
-                            <s:div id="pluginSwitch">
-                                <s:div styleClass="entry" rendered="false">
-                                    <div class="label">&#160;</div>
-                                    <div class="input">
-                                        <h:selectBooleanCheckbox styleClass="ajaxSupport" value="#{documentHome.showPluginPrefs}" tabindex="1">
-                                            <a:support status="globalStatus" event="onchange" reRender="contentPreview" oncomplete="onAjaxRequestComplete()"/>
-                                        </h:selectBooleanCheckbox>
-                                        <h:outputText value="#{messages['lacewiki.label.docEdit.ShowPluginSettings']}"/>
-                                    </div>
-                                </s:div>
-                            </s:div>
--->
                         </div>
                     </a:region>
 
@@ -362,7 +329,7 @@
     <br/>
 
     <s:div id="contentPreview">
-        <c:if test="#{wikiTextPreview.isPreviewEnabled('content') and wikiTextValidator.isValid('content')}">
+        <c:if test="#{documentHome.textEditor.previewEnabled and documentHome.textEditor.valid}">
             <s:div id="documentDisplayContainer"
                    styleClass="box">
                 <s:fragment rendered="#{documentHome.instance.macroPresent('clearBackground')}">
@@ -380,7 +347,7 @@
                         </h1>
                     </s:div>
 
-                    <wiki:formattedText value="#{documentHome.instance.content}"
+                    <wiki:formattedText value="#{documentHome.textEditor.value}"
                                         linkStyleClass="regularLink"
                                         brokenLinkStyleClass="brokenLink"
                                         attachmentLinkStyleClass="regularLink"
@@ -392,11 +359,11 @@
                 </s:div>
             </s:div>
 
-            <s:div rendered="#{wikiTextPreview.isPreviewEnabled('content')}">
+            <s:div rendered="#{documentHome.textEditor.previewEnabled and documentHome.textEditor.valid}">
                 <ui:include src="includes/attachmentDisplay.xhtml"/>
             </s:div>
         </c:if>
-        <c:if test="#{wikiTextPreview.isPreviewEnabled('content') and not wikiTextValidator.isValid('content')}">
+        <c:if test="#{documentHome.textEditor.previewEnabled and not documentHome.textEditor.valid}">
             <h:outputText value="#{messages['lacewiki.msg.wikiTextValidator.InvalidWikiText']}"/>
         </c:if>
     </s:div>

Modified: trunk/examples/wiki/view/docHistory_d.xhtml
===================================================================
--- trunk/examples/wiki/view/docHistory_d.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/docHistory_d.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -163,6 +163,7 @@
             <hr/>
         </s:div>
         <s:div id="documentDisplay" styleClass="documentDisplay">
+            <!-- TODO: Ugh, we don't know if this is plaintext or not -->
             <wiki:formattedText value="#{documentHistory.displayedHistoricalFile.content}"
                                 linkStyleClass="regularLink"
                                 brokenLinkStyleClass="brokenLink"

Modified: trunk/examples/wiki/view/includes/commentForm.xhtml
===================================================================
--- trunk/examples/wiki/view/includes/commentForm.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/includes/commentForm.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -82,26 +82,16 @@
                 </s:decorate>
                 </a:region>
 
-                <a:region>
-                    <ui:include src="wikiTextEditor.xhtml">
-                        <ui:param name="textEditorId" value="comment"/>
-                        <ui:param name="valueBinding" value="#{commentHome.instance.content}"/>
-                        <ui:param name="namingContainer" value="commentForm"/>
-                        <ui:param name="label" value="#{messages['lacewiki.label.commentForm.Comment']}"/>
-                        <ui:param name="textEditorColumns" value="#{commentHome.instance.ownedByRegularUser ? '60' : '48'}"/>
-                        <ui:param name="textEditorRows" value="10"/>
-                        <ui:param name="valueMaxLength" value="32767"/>
-                        <ui:param name="valueRequired" value="true"/>
-                    </ui:include>
+                <ui:include src="wikitext/editor/editor.xhtml">
+                    <ui:param name="textEditor" value="#{commentHome.textEditor}"/>
+                    <ui:param name="namingContainer" value="commentForm"/>
+                </ui:include>
+                <ui:include src="wikitext/editor/preview.xhtml">
+                    <ui:param name="textEditor" value="#{commentHome.textEditor}"/>
+                    <ui:param name="baseDocument" value="#{currentDocument}"/>
+                    <ui:param name="baseDirectory" value="#{currentDocument.parent}"/>
+                </ui:include>
 
-                    <ui:include src="wikiTextPreview.xhtml">
-                        <ui:param name="textEditorId" value="comment"/>
-                        <ui:param name="valueBinding" value="#{commentHome.instance.content}"/>
-                        <ui:param name="baseDocument" value="#{currentDocument}"/>
-                        <ui:param name="baseDirectory" value="#{currentDocument.parent}"/>
-                    </ui:include>
-                </a:region>
-
                 <s:decorate id="verifyCaptchaEntry" template="captchaEntry.xhtml">
                     <ui:param name="rendered" value="#{!identity.loggedIn}"/>
                 </s:decorate>

Modified: trunk/examples/wiki/view/includes/commentsDisplay.xhtml
===================================================================
--- trunk/examples/wiki/view/includes/commentsDisplay.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/includes/commentsDisplay.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -122,11 +122,11 @@
                                             enableMacroRendering="false"/>
                     </s:cache>
                 </s:div>
-                <s:div styleClass="commentText" rendered="#{not c.useWikiText and currentDocument.name != c.subject}" style="margin-top:15px;">
-                    <h:outputText value="#{wiki:escapeHTML(c.content, true)}" escape="false"/>
+                <s:div styleClass="commentText plaintext" rendered="#{not c.useWikiText and currentDocument.name != c.subject}" style="margin-top:15px;">
+                    <h:outputText value="#{wiki:escapeHTML(c.content, true, true)}" escape="false"/>
                 </s:div>
-                <s:div styleClass="commentText" rendered="#{not c.useWikiText and currentDocument.name == c.subject}">
-                    <h:outputText value="#{wiki:escapeHTML(c.content, true)}" escape="false"/>
+                <s:div styleClass="commentText plaintext" rendered="#{not c.useWikiText and currentDocument.name == c.subject}">
+                    <h:outputText value="#{wiki:escapeHTML(c.content, true, true)}" escape="false"/>
                 </s:div>
 
                 <s:div styleClass="commentSignature"

Deleted: trunk/examples/wiki/view/includes/wikiTextEditor.xhtml
===================================================================
--- trunk/examples/wiki/view/includes/wikiTextEditor.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/includes/wikiTextEditor.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -1,207 +0,0 @@
-<s:fragment
-        xmlns:s="http://jboss.com/products/seam/taglib"
-        xmlns:ui="http://java.sun.com/jsf/facelets"
-        xmlns:f="http://java.sun.com/jsf/core"
-        xmlns:h="http://java.sun.com/jsf/html"
-        xmlns:a="https://ajax4jsf.dev.java.net/ajax"
-        xmlns:wiki="http://jboss.com/products/seam/wiki">
-
-<!-- TODO: Most of this Javascript could be made generic and not rendered for each and every
-     text editor on the page (luckily we usually have just one)... -->
-
-<s:div styleClass="entry" id="#{textEditorId}TextEditor">
-
-    <script type="text/javascript">
-    if(jQuery.browser.mozilla){
-        jQuery(function() {
-            jQuery("##{namingContainer}\\:#{textEditorId}TextAreaDiv").Resizable({
-                minHeight: 50,
-                minWidth: 250,
-                handlers: {
-                    se: '##{namingContainer}\\:#{textEditorId}TextEditResizeHandle'
-                },
-                onResize: function(size) {
-                    jQuery("##{namingContainer}\\:#{textEditorId}TextArea").css({ height: size.height-15 + "px" });
-                    jQuery("##{namingContainer}\\:#{textEditorId}TextArea").css({ width: size.width-10 + "px" });
-                }
-            });
-            jQuery("##{namingContainer}\\:#{textEditorId}TextEditResizeHandle").show();
-        })
-    };
-    </script>
-
-    <s:div id="#{textEditorId}MessageLabel"
-            styleClass="#{not wikiTextValidator.isValid(textEditorId) ? 'label errorEntry' : 'label'}">
-
-        <s:div>
-            <h:outputText value="#{label}:"/>
-            <s:fragment rendered="#{wikiTextPreview.isPreviewEnabled(textEditorId)}">
-                <br/>
-                <h:outputText style="white-space:nowrap;"
-                              value="(#{valueMaxLength - valueBinding.length()} #{messages['lacewiki.label.wikiTextEditor.CharactersLeft']})"/>
-            </s:fragment>
-        </s:div>
-
-        <s:div styleClass="errorMessage" rendered="#{not wikiTextValidator.isValid(textEditorId)}">
-            <h:panelGrid columns="2" cellpadding="0" cellspacing="0" border="0">
-                <h:graphicImage value="#{imagePath}/attention.gif"
-                                width="18" height="18"
-                                styleClass="attentionImage"/>
-                <s:span styleClass="attentionMessage"><span id="#{textEditorId}MessageText"><h:outputText value="#{messages[wikiTextValidator.getValidationFailureMessageBundleKey(textEditorId)]}"/></span></s:span>
-            </h:panelGrid>
-        </s:div>
-
-        <s:fragment rendered="#{not empty tabId}">
-            <s:span rendered="#{not wikiTextValidator.isValid(textEditorId)}">
-                <script type="text/javascript">jQuery(function() {
-                    formTabRaiseError("#{tabId}", "#{textEditorId}TextArea", '#{label}:&#160;' + jQuery("##{textEditorId}MessageText").html());
-                });</script>
-            </s:span>
-            <s:span rendered="#{wikiTextValidator.isValid(textEditorId)}">
-                <script type="text/javascript">jQuery(function() {
-                    formTabClearError("#{tabId}", "#{textEditorId}TextArea");
-                });</script>
-            </s:span>
-        </s:fragment>
-
-    </s:div>
-
-    <div class="input">
-
-        <h:panelGrid columns="1" cellpadding="0" cellspacing="0" border="0">
-
-            <h:panelGrid id="#{textEditorId}Controls" columns="4" cellpadding="0" cellspacing="0" border="0">
-
-                <s:fragment>
-                    <select id="#{textEditorId}Formatter"
-                            onchange="formatText(
-                                        jQuery('##{namingContainer}\\:#{textEditorId}TextArea')[0],
-                                        jQuery('##{textEditorId}Formatter')[0].options[jQuery('##{textEditorId}Formatter')[0].selectedIndex].value
-                                      );
-                                      #{textEditorId}RefreshPreview();
-                                      jQuery('##{textEditorId}Formatter')[0].options[0].selected = true;">
-                        <option value="">#{messages['lacewiki.msg.wikiTextEditor.FormatSelection']}</option>
-                        <option value="">#{messages['lacewiki.msg.wikiTextEditor.FormatInline']}</option>
-                        <option value="|{i}|">#{messages['lacewiki.msg.wikiTextEditor.FormatMonospace']}</option>
-                        <option value="*{i}*">#{messages['lacewiki.msg.wikiTextEditor.FormatEmphasis']}</option>
-                        <option value="_{i}_">#{messages['lacewiki.msg.wikiTextEditor.FormatUnderline']}</option>
-                        <option value="~{i}~">#{messages['lacewiki.msg.wikiTextEditor.FormatStrikeout']}</option>
-                        <option value="^{i}^">#{messages['lacewiki.msg.wikiTextEditor.FormatSuperscript']}</option>
-                        <option value="&quot;{i}&quot;">#{messages['lacewiki.msg.wikiTextEditor.FormatQuote']}</option>
-                        <option value="[My Link=>{i}]">#{messages['lacewiki.msg.wikiTextEditor.FormatLink']}</option>
-                        <option value="">#{messages['lacewiki.msg.wikiTextEditor.FormatBlock']}</option>
-                        <option value="`{b}`">#{messages['lacewiki.msg.wikiTextEditor.FormatCodeBlock']}</option>
-                        <option value="&quot;{b}&quot;">#{messages['lacewiki.msg.wikiTextEditor.FormatQuoteBlock']}</option>
-                        <option value="= {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatUnorderedList']}</option>
-                        <option value="# {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatOrderedList']}</option>
-                        <option value="+ {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatHeadline1']}</option>
-                        <option value="++ {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatHeadline2']}</option>
-                        <option value="+++ {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatHeadline3']}</option>
-                        <option value="++++ {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatHeadline4']}</option>
-                    </select>
-
-                    <a:jsFunction name="#{textEditorId}RefreshPreview" status="globalStatus"
-                                  action="#{wikiTextValidator.validate(textEditorId, valueBinding, valueRequired)}"
-                                  reRender="#{textEditorId}MessageLabel, #{textEditorId}Preview"/>
-                </s:fragment>
-
-                <ui:decorate template="helpPopupButton.xhtml">
-                    <ui:param name="label"        value="#{messages['lacewiki.button.help.Help']}"/>
-                    <ui:param name="width"        value="450"/>
-                    <ui:param name="height"       value="350"/>
-                    <ui:param name="offsetId"     value="#{namingContainer}\\\\:#{textEditorId}TextAreaDiv"/>
-                    <ui:param name="helpDocument" value="Wiki Text Markup"/>
-                 </ui:decorate>
-
-                <s:fragment>
-
-                    <s:fragment rendered="#{not wikiTextPreview.isPreviewEnabled(textEditorId)}">
-                        <h:outputLink value="javascript://no-op"
-                                      tabindex="1" styleClass="buttonNonpersistent noWrapWhitespace"
-                                      accesskey="#{messages['lacewiki.button.wikiTextEditor.Validate.accesskey']}"
-                                      onclick="rememberCursorPosition('##{namingContainer}\\\\:#{textEditorId}TextArea'); #{textEditorId}Validate(); return false;">
-                            <h:outputText styleClass="buttonLabel" escape="false" value="#{messages['lacewiki.button.wikiTextEditor.Validate']}"/>
-                        </h:outputLink>
-
-                        <a:jsFunction name="#{textEditorId}Validate"
-                                      action="#{wikiTextValidator.validate(textEditorId, valueBinding, valueRequired)}"
-                                      reRender="#{textEditorId}MessageLabel, #{textEditorId}Preview"
-                                      status="globalStatus"
-                                      ignoreDupResponses="true"
-                                      eventsQueue="ajaxEventQueue"
-                                      oncomplete="onAjaxRequestComplete();
-                                                  setRememberedCursorPosition('##{namingContainer}\\\\:#{textEditorId}TextArea');"/>
-                   </s:fragment>
-
-                </s:fragment>
-
-                <s:fragment>
-
-                    <s:fragment rendered="#{not wikiTextPreview.isPreviewEnabled(textEditorId)}">
-                        <h:outputLink value="javascript://no-op"
-                                      tabindex="1" styleClass="buttonNonpersistent noWrapWhitespace"
-                                      accesskey="#{messages['lacewiki.button.wikiTextEditor.EnablePreview.accesskey']}"
-                                      onclick="rememberCursorPosition('##{namingContainer}\\\\:#{textEditorId}TextArea'); #{textEditorId}EnablePreview(); return false;">
-                            <h:outputText styleClass="buttonLabel" escape="false" value="#{messages['lacewiki.button.wikiTextEditor.EnablePreview']}"/>
-                        </h:outputLink>
-
-                        <a:jsFunction name="#{textEditorId}EnablePreview"
-                                      action="#{wikiTextPreview.enablePreview(textEditorId, valueBinding, valueRequired)}"
-                                      status="globalStatus"
-                                      eventsQueue="ajaxEventQueue"
-                                      reRender="#{textEditorId}TextEditor, #{textEditorId}Preview"
-                                      oncomplete="onAjaxRequestComplete();setRememberedCursorPosition('##{namingContainer}\\\\:#{textEditorId}TextArea');"/>
-
-                    </s:fragment>
-
-                    <s:fragment rendered="#{wikiTextPreview.isPreviewEnabled(textEditorId)}">
-                        <h:outputLink value="javascript://no-op"
-                                      tabindex="1" styleClass="buttonNonpersistent noWrapWhitespace"
-                                      accesskey="#{messages['lacewiki.button.wikiTextEditor.DisablePreview.accesskey']}"
-                                      onclick="rememberCursorPosition('##{namingContainer}\\\\:#{textEditorId}TextArea'); #{textEditorId}DisablePreview(); return false;">
-                            <h:outputText styleClass="buttonLabel" escape="false" value="#{messages['lacewiki.button.wikiTextEditor.DisablePreview']}"/>
-                        </h:outputLink>
-
-                        <a:jsFunction name="#{textEditorId}DisablePreview"
-                                      action="#{wikiTextPreview.disablePreview(textEditorId)}"
-                                      status="globalStatus"
-                                      eventsQueue="ajaxEventQueue"
-                                      reRender="#{textEditorId}TextEditor, #{textEditorId}Preview"
-                                      oncomplete="onAjaxRequestComplete();setRememberedCursorPosition('##{namingContainer}\\\\:#{textEditorId}TextArea');"/>
-
-                    </s:fragment>
-
-                </s:fragment>
-
-            </h:panelGrid>
-
-            <s:div id="#{textEditorId}TextAreaDiv" styleClass="textEditResizable">
-
-                <h:inputTextarea id="#{textEditorId}TextArea"
-                                 styleClass="ajaxSupport"
-                                 tabindex="1"
-                                 cols="#{empty textEditorColumns ? '58' : textEditorColumns}"
-                                 rows="#{textEditorRows}"
-                                 value="#{valueBinding}">
-                    <a:support event="onkeyup"
-                               action="#{wikiTextValidator.validate(textEditorId, valueBinding, valueRequired)}"
-                               reRender="#{textEditorId}MessageLabel, #{textEditorId}Preview"
-                               status="globalStatus"
-                               ignoreDupResponses="true"
-                               requestDelay="3000"
-                               ajaxSingle="true"
-                               eventsQueue="ajaxEventQueue"
-                               oncomplete="onAjaxRequestComplete()"
-                               rendered="#{wikiTextPreview.isPreviewEnabled(textEditorId)}"/>
-                </h:inputTextarea>
-
-                <s:div id="#{textEditorId}TextEditResizeHandle" styleClass="textEditResizeHandle" style="display:none;float:right;"/>
-            </s:div>
-
-        </h:panelGrid>
-
-    </div>
-</s:div>
-
-</s:fragment>
-

Deleted: trunk/examples/wiki/view/includes/wikiTextPreview.xhtml
===================================================================
--- trunk/examples/wiki/view/includes/wikiTextPreview.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/includes/wikiTextPreview.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -1,29 +0,0 @@
-<s:fragment
-        xmlns:s="http://jboss.com/products/seam/taglib"
-        xmlns:ui="http://java.sun.com/jsf/facelets"
-        xmlns:f="http://java.sun.com/jsf/core"
-        xmlns:h="http://java.sun.com/jsf/html"
-        xmlns:a="https://ajax4jsf.dev.java.net/ajax"
-        xmlns:wiki="http://jboss.com/products/seam/wiki">
-
-<s:div id="#{textEditorId}Preview">
-    <s:div styleClass="textPreview"
-           rendered="#{not empty valueBinding
-                       and wikiTextPreview.isPreviewEnabled(textEditorId)
-                       and wikiTextValidator.isValid(textEditorId)}">
-        <wiki:formattedText value="#{valueBinding}"
-                            linkStyleClass="regularLink"
-                            brokenLinkStyleClass="brokenLink"
-                            attachmentLinkStyleClass="regularLink"
-                            thumbnailLinkStyleClass="regularLink"
-                            linkBaseFile="#{baseDocument}"
-                            currentAreaNumber="#{baseDirectory.areaNumber}"
-                            enableMacroRendering="false"/>
-    </s:div>
-    <s:div styleClass="textPreview"
-           rendered="#{wikiTextPreview.isPreviewEnabled(textEditorId) and not wikiTextValidator.isValid(textEditorId)}">
-        <h:outputText value="#{messages['lacewiki.msg.wikiTextValidator.InvalidWikiText']}"/>
-    </s:div>
-</s:div>
-
-</s:fragment>

Added: trunk/examples/wiki/view/includes/wikitext/editor/editor.xhtml
===================================================================
--- trunk/examples/wiki/view/includes/wikitext/editor/editor.xhtml	                        (rev 0)
+++ trunk/examples/wiki/view/includes/wikitext/editor/editor.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -0,0 +1,225 @@
+<s:fragment
+        xmlns:s="http://jboss.com/products/seam/taglib"
+        xmlns:ui="http://java.sun.com/jsf/facelets"
+        xmlns:f="http://java.sun.com/jsf/core"
+        xmlns:h="http://java.sun.com/jsf/html"
+        xmlns:a="https://ajax4jsf.dev.java.net/ajax"
+        xmlns:wiki="http://jboss.com/products/seam/wiki">
+
+<a:region>
+<s:div styleClass="textEditor" id="#{textEditor.key}TextEditor">
+
+    <!-- ################################# JavaScript functions ################################# -->
+
+    <script type="text/javascript">
+
+        /* Make text area resizable */
+        jQuery(function() {
+            eval("#{textEditor.key}SizeTextArea()")
+        })
+
+        function #{textEditor.key}SizeTextArea() {
+            var width = jQuery("##{namingContainer}\\:#{textEditor.key}TextEditor").width();
+            jQuery("##{namingContainer}\\:#{textEditor.key}TextArea").width(
+              width-20 // Safety for IE scrollbar
+            );
+            makeTextAreaResizable("##{namingContainer}\\:#{textEditor.key}TextArea")
+        }
+
+        /* Some functions we need to store the cursor position and restore it after reRender */
+        function #{textEditor.key}StoreSettings() {
+            storeEditorSettings('##{namingContainer}\\:#{textEditor.key}TextArea');
+        }
+
+        function #{textEditor.key}RecallSettings() {
+            recallEditorSettings('##{namingContainer}\\:#{textEditor.key}TextArea');
+        }
+    </script>
+
+    <a:jsFunction name="#{textEditor.key}ValidateDelayed"
+                  action="#{textEditor.validate}"
+                  reRender="#{textEditor.key}Messages, #{textEditor.key}PreviewOption, #{textEditor.key}Preview"
+                  status="globalStatus"
+                  requestDelay="3000"
+                  ignoreDupResponses="true"
+                  eventsQueue="ajaxEventQueue"
+                  oncomplete="onAjaxRequestComplete();"/>
+
+    <a:jsFunction name="#{textEditor.key}ValidateImmediately"
+                  action="#{textEditor.validate}"
+                  reRender="#{textEditor.key}Messages, #{textEditor.key}PreviewOption, #{textEditor.key}Preview"
+                  status="globalStatus"
+                  ignoreDupResponses="true"
+                  eventsQueue="ajaxEventQueue"
+                  oncomplete="onAjaxRequestComplete();"/>
+
+    <!-- Now the reRender-able functions -->
+    <s:div id="#{textEditor.key}Functions">
+
+        <!--
+            Bind preview update to keyup on textarea - we do this so we don't have to reRender the textarea when
+             the preview is enabled or disabled, this would disrupt the workflow of the user and it flashes on the screen.
+         -->
+        <s:fragment rendered="#{textEditor.previewEnabled}">
+            <script type="text/javascript">jQuery(function() {
+                jQuery("##{namingContainer}\\:#{textEditor.key}TextArea").bind(
+                    "keyup",
+                    function(e) {
+                        eval("#{textEditor.key}ValidateDelayed()");
+                    }
+                ).attr("wrap", "virtual");
+            });</script>
+        </s:fragment>
+        <s:fragment rendered="#{not textEditor.previewEnabled}">
+            <script type="text/javascript">jQuery(function() {
+                jQuery("##{namingContainer}\\:#{textEditor.key}TextArea").unbind("keyup").attr("wrap", "virtual");
+            });</script>
+        </s:fragment>
+
+        <!-- Toolbar formatter doesn't work on IE, so only fade it in if it is a) hidden and b) no MSFT software -->
+        <script type="text/javascript">jQuery(function() {
+            if(!jQuery.browser.msie &amp;&amp; jQuery("##{textEditor.key}Formatter").css("display") == "none"){
+                jQuery("##{textEditor.key}Formatter").fadeIn(1000);
+            }
+        });</script>
+
+    </s:div>
+
+    <!-- ################################# Toolbar ################################# -->
+    <s:div id="#{textEditor.key}Toolbar" styleClass="textEditorToolbar">
+        <h:panelGrid columns="2" style="width:100%;" columnClasses="alignLeft, alignRight"
+                     cellpadding="0" cellspacing="0" border="0">
+
+            <s:div id="#{textEditor.key}ToolbarFormatter">
+                <select id="#{textEditor.key}Formatter" style="display:none"
+                        onchange="formatText(
+                                    jQuery('##{namingContainer}\\:#{textEditor.key}TextArea')[0],
+                                    jQuery('##{textEditor.key}Formatter')[0].options[jQuery('##{textEditor.key}Formatter')[0].selectedIndex].value
+                                  );
+                                  eval('#{textEditor.key}ValidateImmediately()');
+                                  jQuery('##{textEditor.key}Formatter')[0].options[0].selected = true;">
+                    <s:fragment rendered="#{textEditor.valuePlaintext}">
+                        <option value="">#{messages['lacewiki.msg.wikiTextEditor.MarkupDisabled']}</option>
+                    </s:fragment>
+                    <s:fragment rendered="#{not textEditor.valuePlaintext}">
+                        <option value="">#{messages['lacewiki.msg.wikiTextEditor.FormatSelection']}</option>
+                        <option value="">#{messages['lacewiki.msg.wikiTextEditor.FormatInline']}</option>
+                        <option value="|{i}|">#{messages['lacewiki.msg.wikiTextEditor.FormatMonospace']}</option>
+                        <option value="*{i}*">#{messages['lacewiki.msg.wikiTextEditor.FormatEmphasis']}</option>
+                        <option value="_{i}_">#{messages['lacewiki.msg.wikiTextEditor.FormatUnderline']}</option>
+                        <option value="~{i}~">#{messages['lacewiki.msg.wikiTextEditor.FormatStrikeout']}</option>
+                        <option value="^{i}^">#{messages['lacewiki.msg.wikiTextEditor.FormatSuperscript']}</option>
+                        <option value="&quot;{i}&quot;">#{messages['lacewiki.msg.wikiTextEditor.FormatQuote']}</option>
+                        <option value="[My Link=>{i}]">#{messages['lacewiki.msg.wikiTextEditor.FormatLink']}</option>
+                        <option value="">#{messages['lacewiki.msg.wikiTextEditor.FormatBlock']}</option>
+                        <option value="`{b}`">#{messages['lacewiki.msg.wikiTextEditor.FormatCodeBlock']}</option>
+                        <option value="&quot;{b}&quot;">#{messages['lacewiki.msg.wikiTextEditor.FormatQuoteBlock']}</option>
+                        <option value="= {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatUnorderedList']}</option>
+                        <option value="# {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatOrderedList']}</option>
+                        <option value="+ {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatHeadline1']}</option>
+                        <option value="++ {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatHeadline2']}</option>
+                        <option value="+++ {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatHeadline3']}</option>
+                        <option value="++++ {b}">#{messages['lacewiki.msg.wikiTextEditor.FormatHeadline4']}</option>
+                    </s:fragment>
+                </select>
+
+            </s:div>
+
+            <ui:decorate template="../../helpPopupButton.xhtml">
+                <ui:param name="label"        value="#{messages['lacewiki.button.help.Help']}"/>
+                <ui:param name="width"        value="450"/>
+                <ui:param name="height"       value="350"/>
+                <ui:param name="offsetId"     value="#{namingContainer}\\\\:#{textEditor.key}TextAreaDiv"/>
+                <ui:param name="helpDocument" value="Wiki Text Markup"/>
+             </ui:decorate>
+
+        </h:panelGrid>
+    </s:div>
+
+    <!-- ################################# Messages ################################# -->
+
+    <s:div id="#{textEditor.key}Messages"
+            styleClass="#{not textEditor.valid ? 'textEditorErrorMessages' : 'textEditorMessages'}">
+
+        <s:div styleClass="errorMessage" rendered="#{not textEditor.valid}">
+            <h:panelGrid columns="2" cellpadding="0" cellspacing="0" border="0">
+                <h:graphicImage value="#{imagePath}/attention.gif"
+                                width="18" height="18"
+                                styleClass="attentionImage"/>
+                <s:span styleClass="attentionMessage"><span
+                        id="#{textEditor.key}MessageText"><h:outputText
+                        value="#{messages[textEditor.lastValidationError]}"/></span></s:span>
+            </h:panelGrid>
+        </s:div>
+
+        <s:fragment rendered="#{not empty tabId}">
+            <s:span rendered="#{not textEditor.valid}">
+                <script type="text/javascript">jQuery(function() {
+                    formTabRaiseError("#{tabId}", "#{textEditor.key}TextArea", '#{messages[textEditor.lastValidationError]}');
+                });</script>
+            </s:span>
+            <s:span rendered="#{textEditor.valid}">
+                <script type="text/javascript">jQuery(function() {
+                    formTabClearError("#{tabId}", "#{textEditor.key}TextArea");
+                });</script>
+            </s:span>
+        </s:fragment>
+
+    </s:div>
+
+    <!-- ################################# Text Area ################################# -->
+
+    <s:div id="#{textEditor.key}TextAreaDiv" styleClass="textEditResizable">
+
+        <h:inputTextarea id="#{textEditor.key}TextArea"
+                         styleClass="ajaxSupport"
+                         tabindex="1"
+                         rows="#{textEditor.rows}"
+                         value="#{textEditor.value}"/>
+
+        <s:div id="#{textEditor.key}TextAreaResizeHandle"
+               styleClass="textAreaResizeHandle" style="display:none;float:right;"/>
+    </s:div>
+
+    <!-- ################################# Options ################################# -->
+
+    <s:div id="#{textEditor.key}PlaintextOption">
+        <h:panelGroup rendered="#{textEditor.allowPlaintext}">
+            <h:selectBooleanCheckbox value="#{textEditor.valuePlaintext}"
+                                     tabindex="1"
+                                     onclick="eval('#{textEditor.key}StoreSettings()');">
+                <a:support status="globalStatus" event="onchange"
+                           action="#{textEditor.switchPlaintext}"
+                           reRender="#{textEditor.key}Functions, #{textEditor.key}Messages, #{textEditor.key}ToolbarFormatter,
+                                     #{textEditor.key}PlaintextOption, #{textEditor.key}PreviewOption, #{textEditor.key}Preview"
+                           oncomplete="onAjaxRequestComplete(); eval('#{textEditor.key}RecallSettings()');"/>
+            </h:selectBooleanCheckbox>
+            <s:span style="white-space:nowrap;">
+                <h:outputText value="#{messages['lacewiki.label.wikiTextEditor.DisableContentMarkup']}"/>
+            </s:span>
+        </h:panelGroup>
+    </s:div>
+
+    <s:div id="#{textEditor.key}PreviewOption">
+        <h:panelGroup>
+            <h:selectBooleanCheckbox value="#{textEditor.previewEnabled}"
+                                     tabindex="1"
+                                     onclick="eval('#{textEditor.key}StoreSettings()');">
+                <a:support status="globalStatus" event="onchange"
+                           reRender="#{textEditor.key}Functions, #{textEditor.key}Messages,
+                                     #{textEditor.key}PreviewOption, #{textEditor.key}Preview"
+                           oncomplete="onAjaxRequestComplete(); eval('#{textEditor.key}RecallSettings()');"/>
+            </h:selectBooleanCheckbox>
+            <s:span style="white-space:nowrap;">
+                <h:outputText value="#{messages['lacewiki.label.wikiTextEditor.EnableLivePreview']}"/>
+                <h:outputText rendered="#{textEditor.previewEnabled}"
+                              value=" (#{textEditor.remainingCharacters} #{messages['lacewiki.label.wikiTextEditor.CharactersLeft']})"/>
+            </s:span>
+        </h:panelGroup>
+    </s:div>
+
+</s:div>
+</a:region>
+
+</s:fragment>
+

Added: trunk/examples/wiki/view/includes/wikitext/editor/preview.xhtml
===================================================================
--- trunk/examples/wiki/view/includes/wikitext/editor/preview.xhtml	                        (rev 0)
+++ trunk/examples/wiki/view/includes/wikitext/editor/preview.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -0,0 +1,40 @@
+<s:fragment
+        xmlns:s="http://jboss.com/products/seam/taglib"
+        xmlns:ui="http://java.sun.com/jsf/facelets"
+        xmlns:f="http://java.sun.com/jsf/core"
+        xmlns:h="http://java.sun.com/jsf/html"
+        xmlns:a="https://ajax4jsf.dev.java.net/ajax"
+        xmlns:wiki="http://jboss.com/products/seam/wiki">
+
+<s:div id="#{textEditor.key}Preview">
+    <s:fragment rendered="#{textEditor.previewEnabled}">
+
+        <s:div styleClass="textPreview"
+               rendered="#{not textEditor.valuePlaintext and textEditor.valid}">
+
+            <wiki:formattedText value="#{textEditor.value}"
+                                linkStyleClass="regularLink"
+                                brokenLinkStyleClass="brokenLink"
+                                attachmentLinkStyleClass="regularLink"
+                                thumbnailLinkStyleClass="regularLink"
+                                linkBaseFile="#{baseDocument}"
+                                currentAreaNumber="#{baseDirectory.areaNumber}"
+                                enableMacroRendering="false"/>
+        </s:div>
+
+        <s:div styleClass="textPreview"
+               rendered="#{not textEditor.valuePlaintext and not textEditor.valid}">
+            <h:outputText value="#{messages['lacewiki.msg.wikiTextValidator.InvalidWikiText']}"/>
+        </s:div>
+
+        <s:div styleClass="textPreview"
+               rendered="#{textEditor.valuePlaintext}">
+            <s:div styleClass="plaintext">
+                <h:outputText escape="false" value="#{wiki:escapeHTML(textEditor.value, true, true)}"/>
+            </s:div>
+        </s:div>
+
+    </s:fragment>
+</s:div>
+
+</s:fragment>

Modified: trunk/examples/wiki/view/themes/default/css/template.css
===================================================================
--- trunk/examples/wiki/view/themes/default/css/template.css	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/themes/default/css/template.css	2008-06-19 14:57:46 UTC (rev 8386)
@@ -686,7 +686,31 @@
 
 .wideLabels .textEditResizable {}
 
-.textEditResizeHandle {
+.textEditor {
+    padding-top: 5px;
+    padding-bottom: 5px;
+    margin-left: 80px;
+    margin-right: 80px;
+}
+
+.textEditorToolbar {
+    padding-right: 10px;
+}
+
+.textEditorMessages {
+    margin-top: 5px;
+    margin-bottom: 5px;
+    margin-right: 15px;
+}
+
+.textEditorErrorMessages {
+    background-color: #ffeeee;
+    margin-top: 5px;
+    margin-bottom: 5px;
+    margin-right: 15px;
+}
+
+.textAreaResizeHandle {
     width: 15px;
     height: 15px;
     background: #f5f5f5 url(../img/icon.resize_se.gif) no-repeat;
@@ -702,9 +726,20 @@
     padding-bottom: 5px;
     background-color: white;
     margin-left: 80px;
-    margin-right: 80px;
+    margin-right: 95px;
 }
 
+.plaintext {
+    font-family: Andale Mono, Courier New, monospace;
+    overflow-x: auto;
+    border: none;
+    background: none;
+    padding-left: 0;
+    padding-right: 0;
+    padding-top: 10px;
+    padding-bottom: 10px;
+}
+
 /* Directory Browser
 ----------------------------------------------- */
 

Modified: trunk/examples/wiki/view/themes/default/js/lacewiki.js
===================================================================
--- trunk/examples/wiki/view/themes/default/js/lacewiki.js	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/themes/default/js/lacewiki.js	2008-06-19 14:57:46 UTC (rev 8386)
@@ -128,9 +128,31 @@
     }
 }
 
-var cursorPosition;
-var scrollPosition;
-function rememberCursorPosition(textAreaId) {
+function makeTextAreaResizable(textAreaId) {
+    if(jQuery.browser.mozilla){
+        var textAreaDivId = textAreaId + "Div";
+        var textAreaResizeHandleId = textAreaId + "ResizeHandle";
+        jQuery(textAreaDivId).Resizable({
+            minHeight: 50,
+            minWidth: 250,
+            handlers: {
+                se: textAreaResizeHandleId
+            },
+            onResize: function(size) {
+                jQuery(textAreaId).height(size.height-10);
+                jQuery(textAreaId).width(size.width-10);
+            }
+        }).width(jQuery(textAreaId).width()+10);
+        jQuery(textAreaResizeHandleId).show();
+    };
+
+}
+
+var editorCursorPosition;
+var editorScrollPosition;
+var editorSizeX;
+var editorSizeY;
+function storeEditorSettings(textAreaId) {
     var textArea = jQuery(textAreaId)[0];
     if (typeof(textArea.caretPos) != "undefined" && textArea.createTextRange) {
         cursorPosition = textArea.caretPos;
@@ -140,9 +162,11 @@
     } else {
         cursorPosition = textArea.value.length - 1;
     }
+    editorSizeX = jQuery(textAreaId).width();
+    editorSizeY = jQuery(textAreaId).height();
 
 }
-function setRememberedCursorPosition(textAreaId) {
+function recallEditorSettings(textAreaId) {
     var textArea = jQuery(textAreaId)[0];
     if(textArea.createTextRange) {
         var range = textArea.createTextRange();
@@ -155,4 +179,6 @@
     } else {
         textArea.focus(cursorPosition);
     }
-}
\ No newline at end of file
+    jQuery(textAreaId).width(editorSizeX);
+    jQuery(textAreaId).height(editorSizeY);
+}

Modified: trunk/examples/wiki/view/themes/inrelationto/css/inrelationto.css
===================================================================
--- trunk/examples/wiki/view/themes/inrelationto/css/inrelationto.css	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/themes/inrelationto/css/inrelationto.css	2008-06-19 14:57:46 UTC (rev 8386)
@@ -697,14 +697,38 @@
 
 .wideLabels .textEditResizable {}
 
-.textEditResizeHandle {
+.textEditor {
+    padding-top: 5px;
+    padding-bottom: 5px;
+    margin-left: 80px;
+    margin-right: 80px;
+}
+
+.textEditorToolbar {
+    padding-right: 10px;
+}
+
+.textEditorMessages {
+    margin-top: 5px;
+    margin-bottom: 5px;
+    margin-right: 15px;
+}
+
+.textEditorErrorMessages {
+    background-color: #ffeeee;
+    margin-top: 5px;
+    margin-bottom: 5px;
+    margin-right: 15px;
+}
+
+.textAreaResizeHandle {
     width: 15px;
     height: 15px;
     background: #f5f5f5 url(../img/icon.resize_se.gif) no-repeat;
     cursor: se-resize;
 }
 
-.wideLabels .textEditResizeHandle {
+.wideLabels .textAreaResizeHandle {
 }
 
 .textPreview {
@@ -716,9 +740,21 @@
     padding-bottom: 5px;
     background-color: white;
     margin-left: 80px;
-    margin-right: 80px;
+    margin-right: 95px;
 }
 
+.plaintext {
+    font-family: Andale Mono, Courier New, monospace;
+    overflow-x: auto;
+    border: none;
+    background: none;
+    padding-left: 0;
+    padding-right: 0;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    font-size: 95%;
+}
+
 /* Directory Browser
 ----------------------------------------------- */
 

Modified: trunk/examples/wiki/view/themes/inrelationto/js/lacewiki.js
===================================================================
--- trunk/examples/wiki/view/themes/inrelationto/js/lacewiki.js	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/themes/inrelationto/js/lacewiki.js	2008-06-19 14:57:46 UTC (rev 8386)
@@ -128,9 +128,31 @@
     }
 }
 
-var cursorPosition;
-var scrollPosition;
-function rememberCursorPosition(textAreaId) {
+function makeTextAreaResizable(textAreaId) {
+    if(jQuery.browser.mozilla){
+        var textAreaDivId = textAreaId + "Div";
+        var textAreaResizeHandleId = textAreaId + "ResizeHandle";
+        jQuery(textAreaDivId).Resizable({
+            minHeight: 50,
+            minWidth: 250,
+            handlers: {
+                se: textAreaResizeHandleId
+            },
+            onResize: function(size) {
+                jQuery(textAreaId).height(size.height-10);
+                jQuery(textAreaId).width(size.width-10);
+            }
+        }).width(jQuery(textAreaId).width()+10);
+        jQuery(textAreaResizeHandleId).show();
+    };
+
+}
+
+var editorCursorPosition;
+var editorScrollPosition;
+var editorSizeX;
+var editorSizeY;
+function storeEditorSettings(textAreaId) {
     var textArea = jQuery(textAreaId)[0];
     if (typeof(textArea.caretPos) != "undefined" && textArea.createTextRange) {
         cursorPosition = textArea.caretPos;
@@ -140,9 +162,11 @@
     } else {
         cursorPosition = textArea.value.length - 1;
     }
+    editorSizeX = jQuery(textAreaId).width();
+    editorSizeY = jQuery(textAreaId).height();
 
 }
-function setRememberedCursorPosition(textAreaId) {
+function recallEditorSettings(textAreaId) {
     var textArea = jQuery(textAreaId)[0];
     if(textArea.createTextRange) {
         var range = textArea.createTextRange();
@@ -155,4 +179,6 @@
     } else {
         textArea.focus(cursorPosition);
     }
-}
\ No newline at end of file
+    jQuery(textAreaId).width(editorSizeX);
+    jQuery(textAreaId).height(editorSizeY);
+}

Modified: trunk/examples/wiki/view/themes/sfwkorg/css/sfwk.css
===================================================================
--- trunk/examples/wiki/view/themes/sfwkorg/css/sfwk.css	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/themes/sfwkorg/css/sfwk.css	2008-06-19 14:57:46 UTC (rev 8386)
@@ -981,7 +981,31 @@
 
 .wideLabels .textEditResizable {}
 
-.textEditResizeHandle {
+.textEditor {
+    padding-top: 5px;
+    padding-bottom: 5px;
+    margin-left: 80px;
+    margin-right: 80px;
+}
+
+.textEditorToolbar {
+    padding-right: 10px;
+}
+
+.textEditorMessages {
+    margin-top: 5px;
+    margin-bottom: 5px;
+    margin-right: 15px;
+}
+
+.textEditorErrorMessages {
+    background-color: #ffeeee;
+    margin-top: 5px;
+    margin-bottom: 5px;
+    margin-right: 15px;
+}
+
+.textAreaResizeHandle {
     width: 15px;
     height: 15px;
     background: #f5f5f5 url(../img/icon.resize_se.gif) no-repeat;
@@ -996,10 +1020,22 @@
     padding-top: 5px;
     padding-bottom: 5px;
     background-color: white;
-    margin-left: 50px;
-    margin-right: 50px;
+    margin-left: 80px;
+    margin-right: 95px;
 }
 
+.plaintext {
+    font-family: Andale Mono, Courier New, monospace;
+    overflow-x: auto;
+    border: none;
+    background: none;
+    padding-left: 0;
+    padding-right: 0;
+    padding-top: 10px;
+    padding-bottom: 10px;
+    font-size: 95%;
+}
+
 /* Box on page
 ----------------------------------------------- */
 

Modified: trunk/examples/wiki/view/themes/sfwkorg/js/lacewiki.js
===================================================================
--- trunk/examples/wiki/view/themes/sfwkorg/js/lacewiki.js	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/themes/sfwkorg/js/lacewiki.js	2008-06-19 14:57:46 UTC (rev 8386)
@@ -128,9 +128,31 @@
     }
 }
 
-var cursorPosition;
-var scrollPosition;
-function rememberCursorPosition(textAreaId) {
+function makeTextAreaResizable(textAreaId) {
+    if(jQuery.browser.mozilla){
+        var textAreaDivId = textAreaId + "Div";
+        var textAreaResizeHandleId = textAreaId + "ResizeHandle";
+        jQuery(textAreaDivId).Resizable({
+            minHeight: 50,
+            minWidth: 250,
+            handlers: {
+                se: textAreaResizeHandleId
+            },
+            onResize: function(size) {
+                jQuery(textAreaId).height(size.height-10);
+                jQuery(textAreaId).width(size.width-10);
+            }
+        }).width(jQuery(textAreaId).width()+10);
+        jQuery(textAreaResizeHandleId).show();
+    };
+
+}
+
+var editorCursorPosition;
+var editorScrollPosition;
+var editorSizeX;
+var editorSizeY;
+function storeEditorSettings(textAreaId) {
     var textArea = jQuery(textAreaId)[0];
     if (typeof(textArea.caretPos) != "undefined" && textArea.createTextRange) {
         cursorPosition = textArea.caretPos;
@@ -140,9 +162,11 @@
     } else {
         cursorPosition = textArea.value.length - 1;
     }
+    editorSizeX = jQuery(textAreaId).width();
+    editorSizeY = jQuery(textAreaId).height();
 
 }
-function setRememberedCursorPosition(textAreaId) {
+function recallEditorSettings(textAreaId) {
     var textArea = jQuery(textAreaId)[0];
     if(textArea.createTextRange) {
         var range = textArea.createTextRange();
@@ -155,4 +179,6 @@
     } else {
         textArea.focus(cursorPosition);
     }
-}
\ No newline at end of file
+    jQuery(textAreaId).width(editorSizeX);
+    jQuery(textAreaId).height(editorSizeY);
+}

Modified: trunk/examples/wiki/view/userHome_d.xhtml
===================================================================
--- trunk/examples/wiki/view/userHome_d.xhtml	2008-06-18 20:49:04 UTC (rev 8385)
+++ trunk/examples/wiki/view/userHome_d.xhtml	2008-06-19 14:57:46 UTC (rev 8386)
@@ -25,7 +25,7 @@
 <ui:define name="content">
 
 <h:form id="userHomeForm" styleClass="box" enctype="multipart/form-data">
-    <div class="form">
+    <div class="form">    
 
         <script type="text/javascript">startSessionTimeoutCheck()</script>
 
@@ -44,6 +44,7 @@
                 <h:outputText escape="false" value="#{messages['lacewiki.button.userHome.Account']}"/>
             </a></li>
             <li id="userProfileTab"><a href="#userProfile"
+                                       onclick="setTimeout('bioSizeTextArea(); signatureSizeTextArea();', 200);"
                                        accesskey="#{messages['lacewiki.button.userHome.Profile.accesskey']}">
                 <h:outputText escape="false" value="#{messages['lacewiki.button.userHome.Profile']}"/>
             </a></li>
@@ -213,20 +214,17 @@
                         </s:span>
                     </s:div>
 
-                    <ui:include src="includes/wikiTextEditor.xhtml">
-                        <ui:param name="tabId" value="userProfileTab"/>
-                        <ui:param name="textEditorId" value="bio"/>
+                    <s:div styleClass="entry">
+                        <div class="label"><h:outputText value="#{messages['lacewiki.label.userHome.Bio']}:"/></div>
+                        <div class="output">&#160;</div>
+                    </s:div>
+                    <ui:include src="includes/wikitext/editor/editor.xhtml">
+                        <ui:param name="textEditor" value="#{userHome.bioTextEditor}"/>
                         <ui:param name="namingContainer" value="userHomeForm"/>
-                        <ui:param name="label" value="#{messages['lacewiki.label.userHome.Bio']}"/>
-                        <ui:param name="valueBinding" value="#{userHome.instance.profile.bio}"/>
-                        <ui:param name="valueMaxLength" value="1000"/>
-                        <ui:param name="textEditorColumns" value="50"/>
-                        <ui:param name="textEditorRows" value="5"/>
+                        <ui:param name="tabId" value="userProfileTab"/>
                     </ui:include>
-
-                    <ui:include src="includes/wikiTextPreview.xhtml">
-                        <ui:param name="textEditorId" value="bio"/>
-                        <ui:param name="valueBinding" value="#{userHome.instance.profile.bio}"/>
+                    <ui:include src="includes/wikitext/editor/preview.xhtml">
+                        <ui:param name="textEditor" value="#{userHome.bioTextEditor}"/>
                         <ui:param name="baseDocument" value="#{wikiStart}"/>
                         <ui:param name="baseDirectory" value="#{wikiStart.parent}"/>
                     </ui:include>
@@ -258,20 +256,17 @@
                         </h:inputText>
                     </s:decorate>
 
-                    <ui:include src="includes/wikiTextEditor.xhtml">
-                        <ui:param name="tabId" value="userProfileTab"/>
-                        <ui:param name="textEditorId" value="signature"/>
+                    <s:div styleClass="entry">
+                        <div class="label"><h:outputText value="#{messages['lacewiki.label.userHome.Signature']}:"/></div>
+                        <div class="output">&#160;</div>
+                    </s:div>
+                    <ui:include src="includes/wikitext/editor/editor.xhtml">
+                        <ui:param name="textEditor" value="#{userHome.signatureTextEditor}"/>
                         <ui:param name="namingContainer" value="userHomeForm"/>
-                        <ui:param name="label" value="#{messages['lacewiki.label.userHome.Signature']}"/>
-                        <ui:param name="valueBinding" value="#{userHome.instance.profile.signature}"/>
-                        <ui:param name="valueMaxLength" value="1000"/>
-                        <ui:param name="textEditorColumns" value="50"/>
-                        <ui:param name="textEditorRows" value="5"/>
+                        <ui:param name="tabId" value="userProfileTab"/>
                     </ui:include>
-
-                    <ui:include src="includes/wikiTextPreview.xhtml">
-                        <ui:param name="textEditorId" value="signature"/>
-                        <ui:param name="valueBinding" value="#{userHome.instance.profile.signature}"/>
+                    <ui:include src="includes/wikitext/editor/preview.xhtml">
+                        <ui:param name="textEditor" value="#{userHome.signatureTextEditor}"/>
                         <ui:param name="baseDocument" value="#{wikiStart}"/>
                         <ui:param name="baseDirectory" value="#{wikiStart.parent}"/>
                     </ui:include>




More information about the seam-commits mailing list