diff --git a/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java b/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java index b350a65781f26cd54271b866f1c1edc1396d7f83..3db93ca28da25fd2af378bdf91c9e0cad31c8e19 100644 --- a/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java +++ b/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java @@ -226,9 +226,13 @@ public class InfoDisplayController extends FormBasicController { } private InfoMessageForDisplay createInfoMessageForDisplay(InfoMessage info) { - String message = ""; - if(StringHelper.containsNonWhitespace(info.getMessage())) { + String message = info.getMessage(); + boolean html = StringHelper.isHtml(message); + if(html) { + message = message.toString(); + } else if(StringHelper.containsNonWhitespace(message)) { message = Formatter.escWithBR(info.getMessage()).toString(); + message = Formatter.formatURLsAsLinks(message); } Formatter formatter = Formatter.getInstance(getLocale()); diff --git a/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java b/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java index d1e03bdfbece4d4f137e123a91c2a166fa50918e..c1eee0815014b04ae7a2c07003ae4499203252b8 100644 --- a/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java +++ b/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java @@ -22,6 +22,7 @@ package org.olat.commons.info.ui; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.RichTextElement; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; @@ -41,7 +42,7 @@ import org.olat.core.util.StringHelper; public class InfoEditFormController extends FormBasicController { private TextElement title; - private TextElement message; + private RichTextElement message; public InfoEditFormController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl); @@ -59,7 +60,12 @@ public class InfoEditFormController extends FormBasicController { title = uifactory.addTextElement("info_title", "edit.info_title", 512, "", formLayout); title.setMandatory(true); - message = uifactory.addTextAreaElement("edit.info_message", 6, 80, "", formLayout); + //message = uifactory.addTextAreaElement("edit.info_message", 6, 80, "", formLayout); + //message.setMandatory(true); + //message.setMaxLength(2000); + + message = uifactory.addRichTextElementForStringDataMinimalistic("edit.info_message", "edit.info_message", "", 6, 80, false, + formLayout, ureq.getUserSession(), getWindowControl()); message.setMandatory(true); message.setMaxLength(2000); } diff --git a/src/main/java/org/olat/commons/info/ui/_content/display.html b/src/main/java/org/olat/commons/info/ui/_content/display.html index c3cd0fa6be5ff52aa6cb017e14d4fcd4d836855c..88a126ec61a43d47bfd0f366b8ca1e7714ff0969 100644 --- a/src/main/java/org/olat/commons/info/ui/_content/display.html +++ b/src/main/java/org/olat/commons/info/ui/_content/display.html @@ -25,7 +25,7 @@ <p class="o_item_info">$info.getInfos()#if($info.isModified()), <span class="o_item_info_mod">$info.getModifier()</span>#end</p> <p></p> #if($info.getMessage()) - <p>$r.formatURLsAsLinks($info.getMessage())</p> + <p>$info.getMessage()</p> #end </div> #end diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java index 8ac6a0a41edae57247ea014621353009215b615a..5a784e41d1a7d08362d04828546de3389d3a9641 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import java.util.StringTokenizer; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.controllers.linkchooser.CustomLinkTreeModel; @@ -1523,6 +1524,10 @@ public class RichTextConfiguration implements Disposable { plugins4.remove("advlink"); plugins4.remove("xhtmlxtras"); plugins4.remove("advimage"); + if(plugins4.contains("visualchars")) { + plugins4.remove("visualchars"); + plugins4.add("charmap"); + } if(plugins4.remove("-olatmatheditor")) { plugins4.add("olatmatheditor"); } @@ -1544,37 +1549,80 @@ public class RichTextConfiguration implements Disposable { if(theme_advanced_buttons3.contains(CODE_BUTTON)) { plugins4.add("code"); } + + if(theme_advanced_buttons1.contains("forecolor,backcolor") || theme_advanced_buttons1.contains("bakcolor")) { + plugins4.add("textcolor"); + } + + + List<String> menubar = new ArrayList<String>(); + //if(theme_advanced_buttons3.contains("tablecontrols")) menubar.add("table"); + //if(theme_advanced_buttons3.contains("code")) menubar.add("tools"); + + List<String> buttons1 = new ArrayList<String>(theme_advanced_buttons1); + if(buttons1.contains("justifyleft")) buttons1.set(buttons1.indexOf("justifyleft"), "alignleft"); + if(buttons1.contains("justifycenter")) buttons1.set(buttons1.indexOf("justifycenter"), "aligncenter"); + if(buttons1.contains("justifyright")) buttons1.set(buttons1.indexOf("justifyright"), "alignright"); + if(buttons1.contains("justifyfull")) buttons1.set(buttons1.indexOf("justifyfull"), "alignjustify"); + if(buttons1.contains(JUSTIFY_BUTTONGROUP)) { + int index = buttons1.indexOf(JUSTIFY_BUTTONGROUP); + buttons1.remove(index); + buttons1.add(index, "alignleft"); + buttons1.add(index, "aligncenter"); + buttons1.add(index, "alignright"); + buttons1.add(index, "alignjustify"); + } - int i = appendValuesFromList(sb, PLUGINS, plugins4); - // Add toolbars - sb.append(",\n"); - sb.append("menubar:false,\n"); - sb.append("image_advtab:true,\n"); + List<String> buttons2 = new ArrayList<String>(theme_advanced_buttons2); + List<String> buttons3 = new ArrayList<String>(theme_advanced_buttons3); + if(buttons3.contains("visualchars")) buttons3.set(buttons3.indexOf("visualchars"), "charmap"); + if(buttons3.contains("tablecontrols")) buttons3.set(buttons3.indexOf("tablecontrols"), "table"); + buttons3.remove("cleanup"); + + System.out.println("Plugins: " + plugins); + System.out.println("Buttons 1: " + theme_advanced_buttons1); + System.out.println("Buttons 1n: " +buttons1); + System.out.println("Buttons 2: " + theme_advanced_buttons2); + System.out.println("Buttons 2n: " + buttons2); + System.out.println("Buttons 3: " + theme_advanced_buttons3); + System.out.println("Buttons 3n: " + buttons3); - if (theme_advanced_buttons1.size() == 0) { - sb.append(THEME_ADVANCED_BUTTONS1).append(":\"\""); + appendValuesFromList(sb, PLUGINS, plugins4); + sb.append(",\n") + .append("image_advtab:true,\n") + .append("statusbar:true,\n"); + + //menubar + if(menubar.isEmpty()) { + sb.append("menubar:false,\n"); } else { - i += appendValuesFromList(sb, "toolbar1", theme_advanced_buttons1); + listToString(sb, "menubar", menubar); + sb.append(",\n"); } - List<String> buttons2 = new ArrayList<String>(theme_advanced_buttons2); - buttons2.add("inserttable"); - if (i > 0) sb.append(","); + //toolbar 1 + if (buttons1.size() == 0) { + sb.append("toolbar1").append(":false,\n"); + } else { + listToString(sb, "toolbar1", buttons1); + sb.append(",\n"); + } + if (buttons2.size() == 0) { - sb.append(THEME_ADVANCED_BUTTONS2).append(":\"\""); + sb.append("toolbar2").append(": false,\n"); } else { - i += appendValuesFromList(sb, "toolbar2", buttons2); + listToString(sb, "toolbar2", buttons2); + sb.append(",\n"); } - if (i > 0) sb.append(","); - List<String> buttons3 = new ArrayList<String>(theme_advanced_buttons3); + if (buttons3.size() == 0) { - sb.append(THEME_ADVANCED_BUTTONS3).append(":\"\""); + sb.append("toolbar3").append(":false,\n"); } else { - i += appendValuesFromList(sb, "toolbar3", buttons3); + listToString(sb, "toolbar3", buttons3); + sb.append(",\n"); } - // Now add disabled buttons - if (i > 0 && theme_advanced_disable.size() > 0) sb.append(","); - i += appendValuesFromList(sb, THEME_ADVANCED_DISABLE, theme_advanced_disable); + + // Now add the quoted values Map<String,String> copyValues = new HashMap<String,String>(quotedConfigValues); //remove unused configurations in 4 @@ -1586,23 +1634,20 @@ public class RichTextConfiguration implements Disposable { copyValues.remove("theme_advanced_resize_horizontal"); copyValues.remove("theme_advanced_resizing"); copyValues.remove("theme_advanced_toolbar_align"); + copyValues.remove("theme_advanced_link_targets"); copyValues.remove("dialog_type"); copyValues.remove("mode"); copyValues.remove("elements"); - - //update value from 3 to 4 String tabfocus = copyValues.remove("tab_focus"); if(tabfocus != null) { copyValues.put("tabfocus_elements", tabfocus); } - for (Map.Entry<String, String> entry : copyValues.entrySet()) { - if (i > 0) sb.append(","); - sb.append(entry.getKey()).append(": \"").append(entry.getValue()).append("\"\n"); - i++; + sb.append(entry.getKey()).append(": \"").append(entry.getValue()).append("\",\n"); } - + + // Now add the non-quoted values (e.g. true, false or functions) Map<String,String> copyNonValues = new HashMap<String,String>(nonQuotedConfigValues); copyNonValues.remove("theme_advanced_resizing"); copyNonValues.remove("theme_advanced_resize_horizontal"); @@ -1610,36 +1655,30 @@ public class RichTextConfiguration implements Disposable { if(converter != null) { copyNonValues.put("convert_urls", converter); } - - // Now add the non-quoted values (e.g. true, false or functions) for (Map.Entry<String, String> entry : copyNonValues.entrySet()) { - if (i > 0) sb.append(","); - sb.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n"); - i++; + sb.append(entry.getKey()).append(": ").append(entry.getValue()).append(",\n"); } - - // Now add on init callback functions - /*if (oninit.size() > 0) { - if (i > 0) sb.append(","); - sb.append(ONINIT_CALLBACK).append(": "); - if (oninit.size() == 1) { - sb.append(oninit.iterator().next()); - } else { - Iterator<String> iter = oninit.iterator(); - sb.append("function(){"); - while (iter.hasNext()) { - String function = iter.next(); - sb.append(function); - if(function.endsWith(")")) { - sb.append(";"); - } else { - sb.append("();"); - } + + System.out.println("Quoted: " + quotedConfigValues); + System.out.println("Non quoted: " + copyNonValues); + } + + + private int listToString(StringOutput sb, String key, List<String> values) { + if (values.size() == 0) return 0; + sb.append(key).append(": \""); + for (String value : values) { + for(StringTokenizer tokenizer=new StringTokenizer(value,","); tokenizer.hasMoreTokens(); ) { + String token = tokenizer.nextToken(); + if("separator".equals(token)) { + sb.append(" | "); + } else { + sb.append(token).append(" "); } - sb.append("}"); - } - i++; - }*/ + } + } + sb.append("\""); + return 1; } /** diff --git a/src/main/java/org/olat/core/util/StringHelper.java b/src/main/java/org/olat/core/util/StringHelper.java index a175824cdd56d9d037efed4119f82658ca7ca402..a9a2e101d33874f886f0cf170e1ec9170265615c 100644 --- a/src/main/java/org/olat/core/util/StringHelper.java +++ b/src/main/java/org/olat/core/util/StringHelper.java @@ -282,6 +282,12 @@ public class StringHelper { // contain non-whitespace return !matcher.find(); } + + public static boolean isHtml(String s) { + if (s == null) return false; + + return s.contains("<html") || s.contains("<body") || s.contains("<p") || s.contains("<span"); + } /** * takes an array of Identies and converts them to a String containing the diff --git a/src/main/resources/database/mysql/alter_9_0_0_to_9_1_0.sql b/src/main/resources/database/mysql/alter_9_0_0_to_9_1_0.sql index d20bd44fcbf4f3d04a21bcb56ae34577845dfab0..173f5b04dba619a5d110017667f8fb9e8485e4a8 100644 --- a/src/main/resources/database/mysql/alter_9_0_0_to_9_1_0.sql +++ b/src/main/resources/database/mysql/alter_9_0_0_to_9_1_0.sql @@ -1,3 +1,6 @@ -- salted password alter table o_bs_authentication add column salt varchar(255) default null; alter table o_bs_authentication add column hashalgorithm varchar(16) default null; + + +alter table o_info_message modify message longtext; diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql index 34163159a3676bc8a909cdbb36761ce7c9b73122..52141169ef6dbc42ff72955b6ef7221cf4e1e66d 100644 --- a/src/main/resources/database/mysql/setupDatabase.sql +++ b/src/main/resources/database/mysql/setupDatabase.sql @@ -688,7 +688,7 @@ create table if not exists o_info_message ( creationdate datetime, modificationdate datetime, title varchar(2048), - message varchar(2048), + message longtext, resname varchar(50) NOT NULL, resid bigint NOT NULL, ressubpath varchar(2048), diff --git a/src/main/resources/database/oracle/alter_9_0_0_to_9_1_0.sql b/src/main/resources/database/oracle/alter_9_0_0_to_9_1_0.sql index 3df574818a9baf40033195d1a031a9bd21e65360..7b57583fcd957260a8b300a0bc5ed22989bc1dc8 100644 --- a/src/main/resources/database/oracle/alter_9_0_0_to_9_1_0.sql +++ b/src/main/resources/database/oracle/alter_9_0_0_to_9_1_0.sql @@ -1,3 +1,5 @@ -- salted password alter table o_bs_authentication add (salt varchar(255)); alter table o_bs_authentication add (hashalgorithm varchar(16)); + + diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql index db0de6b77b66c472ccf23715a6cab12bd523c08a..78e9f7a8543a5d83de25f8760887d1dbd2200aaf 100644 --- a/src/main/resources/database/oracle/setupDatabase.sql +++ b/src/main/resources/database/oracle/setupDatabase.sql @@ -623,7 +623,7 @@ CREATE TABLE o_info_message ( creationdate date, modificationdate date, title varchar2(2048 char), - message varchar2(2048 char), + message clob, resname varchar(50 char) NOT NULL, resid number(20) NOT NULL, ressubpath varchar2(2048 char), diff --git a/src/main/resources/database/postgresql/alter_9_0_0_to_9_1_0.sql b/src/main/resources/database/postgresql/alter_9_0_0_to_9_1_0.sql index d20bd44fcbf4f3d04a21bcb56ae34577845dfab0..1895a20d8a5310cee583faeedcbee5fcaa1280b0 100644 --- a/src/main/resources/database/postgresql/alter_9_0_0_to_9_1_0.sql +++ b/src/main/resources/database/postgresql/alter_9_0_0_to_9_1_0.sql @@ -1,3 +1,15 @@ -- salted password alter table o_bs_authentication add column salt varchar(255) default null; alter table o_bs_authentication add column hashalgorithm varchar(16) default null; + + +alter table o_info_message add message_copy varchar2(4000); +update o_info_message set message_copy = message; +Commit; +update o_info_message set message = null; +commit; +alter table o_info_message modify message long; +alter table o_info_message modify message clob; +update o_info_message set message = message_copy; +Commit; +alter table o_info_message drop column message_copy; \ No newline at end of file diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql index 23f1872ffd5ddf0ff9eae715a946ac6b898dd6aa..bebe83d400370e2da10a86f2e0ac37149f0e966c 100644 --- a/src/main/resources/database/postgresql/setupDatabase.sql +++ b/src/main/resources/database/postgresql/setupDatabase.sql @@ -532,7 +532,7 @@ create table o_info_message ( creationdate timestamp, modificationdate timestamp, title varchar(2048), - message varchar(2048), + message text, resname varchar(50) NOT NULL, resid int8 NOT NULL, ressubpath varchar(2048),