/*
* Created on 22 Sep 2006 Temp fix for http://www.caret.cam.ac.uk/jira/browse/RSF-44 from
* http://ponder.org.uk/rsf/posts/list/184.page
*
* This class replaces the text area with the FCKEditor.
*/
package org.sakaiproject.lessonbuildertool.tool.evolvers;
import java.util.Iterator;
import org.sakaiproject.content.api.ContentHostingService;
import org.sakaiproject.component.cover.ServerConfigurationService;
import uk.org.ponder.htmlutil.HTMLUtil;
import uk.org.ponder.rsf.components.UIContainer;
import uk.org.ponder.rsf.components.UIInput;
import uk.org.ponder.rsf.components.UIOutput;
import uk.org.ponder.rsf.components.UIJointContainer;
import uk.org.ponder.rsf.components.UIVerbatim;
import uk.org.ponder.rsf.components.decorators.UIDecorator;
import uk.org.ponder.rsf.components.decorators.UIFreeAttributeDecorator;
import uk.org.ponder.rsf.evolvers.TextInputEvolver;
public class SakaiFCKTextEvolver implements TextInputEvolver {
public static final String COMPONENT_ID = "sakai-FCKEditor:";
private String context;
private ContentHostingService contentHostingService;
private static boolean newEditor = isNewEditor();
/*
* Default height and width, can be set at the tool level in the requestContext.xml bean def or
* by setting decorators at the producer level.
*/
public String height = "600";
public String width = "400";
public void setContext(String context) {
this.context = context;
}
public void setContentHostingService(ContentHostingService contentHostingService) {
this.contentHostingService = contentHostingService;
}
public UIJointContainer evolveTextInput(UIInput toevolve) {
return evolveTextInput(toevolve, "1");
}
private static boolean isNewEditor() {
// 2.8 and later are new editor calling
String sakaiVersion = ServerConfigurationService.getString("version.sakai", "2.6");
boolean isNew = false;
int cle = 2;
int major = 6;
int minor = 0;
if (sakaiVersion != null) {
String []parts = sakaiVersion.split("\\.");
if (parts.length >= 1) {
try {
cle = Integer.parseInt(parts[0]);
} catch (Exception e) {
};
}
if (parts.length >= 2) {
try {
String[] s = parts[1].split("\\D");
major = Integer.parseInt(s[0]);
} catch (Exception e) {
};
}
// may be something like 2.8.1-foo, so must terminate on non-digit
if (parts.length >= 3) {
try {
String[] s = parts[2].split("\\D");
minor = Integer.parseInt(s[0]);
} catch (Exception e) {
};
}
// samigo starting with 2.8.0 has the new editor calling protocol
if (cle > 2 || (cle == 2 && major >= 8))
isNew = true;
System.out.println("EditPage thinks CLE is " + cle + " major " + major + " isNew=" + isNew);
}
//System.out.println("isnew " + isNew);
return isNew;
}
public UIJointContainer evolveTextInput(UIInput toevolve, String index) {
// dig out the size decorators and adjust the editor size.
// TODO: If you know a cleaner way, please replace this block!
for (Iterator<UIDecorator> decorators = toevolve.decorators.iterator(); decorators.hasNext();) {
UIDecorator decorator = decorators.next();
if (decorator instanceof uk.org.ponder.rsf.components.decorators.UIFreeAttributeDecorator) {
if (((UIFreeAttributeDecorator) decorator).attributes.get("height") != null) {
try {
height = (String) ((UIFreeAttributeDecorator) decorator).attributes.get("height");
} catch (Exception e) {
// height isn't set to a string, show the developer a stack trace since
// he/she is lost...
e.printStackTrace();
}
} else if (((UIFreeAttributeDecorator) decorator).attributes.get("width") != null) {
try {
width = (String) ((UIFreeAttributeDecorator) decorator).attributes.get("width");
} catch (Exception e) {
// height isn't set to a string, show the developer a stack trace since
// he/she is lost...
e.printStackTrace();
}
}
}
}
String editor = ServerConfigurationService.getString("wysiwyg.editor");
UIContainer parent = toevolve.parent;
toevolve.parent.remove(toevolve);
UIJointContainer joint = new UIJointContainer(parent, toevolve.ID, COMPONENT_ID);
joint.decorators = toevolve.decorators;
String id = toevolve.ID;
toevolve.ID = SEED_ID; // must change ID while unattached
joint.addComponent(toevolve);
String js = null;
if (newEditor || "ckeditor".equals(editor)) {
js = HTMLUtil.emitJavascriptCall("sakai.editor.launch", new String[] { toevolve.getFullID(), null, "800px", "200px"});
} else {
String collectionID = context.equals("") ? "" : contentHostingService.getSiteCollection(context);
js = HTMLUtil.emitJavascriptCall("SakaiProject.fckeditor.initializeEditor", new String[] { toevolve.getFullID(), collectionID, height, width });
}
UIVerbatim.make(joint, "textarea-js", js);
return joint;
}
}