package org.aktionmensch.abbrrtf.factory; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.google.inject.Inject; import com.vaadin.data.Item; import com.vaadin.server.VaadinService; import com.vaadin.server.WebBrowser; import com.vaadin.ui.Field; import info.magnolia.ui.api.app.AppController; import info.magnolia.ui.api.app.ItemChosenListener; import info.magnolia.ui.api.app.SubAppContext; import info.magnolia.ui.form.field.definition.FieldDefinition; import info.magnolia.ui.form.field.definition.RichTextFieldDefinition; import info.magnolia.ui.form.field.factory.AbstractFieldFactory; import info.magnolia.ui.form.field.factory.LinkFieldFactory; import info.magnolia.ui.vaadin.integration.jcr.JcrItemAdapter; import info.magnolia.ui.vaadin.richtext.MagnoliaRichTextField; import info.magnolia.ui.vaadin.richtext.MagnoliaRichTextFieldConfig; import info.magnolia.ui.vaadin.richtext.MagnoliaRichTextFieldConfig.ToolbarGroup; public class AbbrRTFFactory extends AbstractFieldFactory { private static final String PLUGIN_NAME_MAGNOLIALINK = "magnolialink"; private static final String PLUGIN_PATH_MAGNOLIALINK = "/VAADIN/js/magnolialink/"; //Abbr plugin added vars: private static final String ABBR_PLUGIN_NAME = "abbr"; private static final String ABBR_PLUGIN_PATH = "/VAADIN/js/abbr/"; /** * Event is emit from server to client when link has been selected. */ public static final String EVENT_SEND_MAGNOLIA_LINK = "mgnlLinkSelected"; /** * Event is emit from server to client when link dialog has been * canceled or exception has occurred. In case of exception * the event will carry error message. */ public static final String EVENT_CANCEL_LINK = "mgnlLinkCancel"; /** * Event is emit from client to server when user requests a link dialog. * Event carries optional link that should be treated as default link value. */ public static final String EVENT_GET_MAGNOLIA_LINK = "mgnlGetLink"; private final AppController appController; private MagnoliaRichTextField richTextEditor; private static final Logger log = LoggerFactory.getLogger(LinkFieldFactory.class); private final SubAppContext subAppContext; @Inject public AbbrRTFFactory(RichTextFieldDefinition definition, Item relatedFieldItem, AppController appController, SubAppContext subAppContext) { super(definition, relatedFieldItem); this.appController = appController; this.subAppContext = subAppContext; } @Override protected Field createFieldComponent() { // RichTextFieldDefinition editDefinition = definition; final MagnoliaRichTextFieldConfig config = new MagnoliaRichTextFieldConfig(); List toolbars = new ArrayList(); //Abbr plugin added button: toolbars.add(new ToolbarGroup("basictyles", new String[] { "Bold", "Italic", "Underline", "SpecialChar", "Abbr" })); toolbars.add(new ToolbarGroup("paragraph", new String[] { "NumberedList", "BulletedList" })); toolbars.add(new ToolbarGroup("insert", new String[] { "Link", "InternalLink", "DamLink", "Unlink" })); toolbars.add(new ToolbarGroup("clipboard", new String[] { "Cut", "Copy", "Paste", "PasteText", "PasteFromWord" })); toolbars.add(new ToolbarGroup("objects", new String[] { "Table" })); toolbars.add(new ToolbarGroup("special", new String[] { "Undo", "Redo" })); config.addToolbarLine(toolbars); config.addListenedEvent(EVENT_GET_MAGNOLIA_LINK); config.setResizeEnabled(false); richTextEditor = new MagnoliaRichTextField(config) { @Override public void attach() { super.attach(); String path = VaadinService.getCurrentRequest().getContextPath(); //Abbr plugin added line: config.addPlugin(ABBR_PLUGIN_NAME, path + ABBR_PLUGIN_PATH); config.addPlugin(PLUGIN_NAME_MAGNOLIALINK, path + PLUGIN_PATH_MAGNOLIALINK); WebBrowser browser = getSession().getBrowser(); if (browser.isTouchDevice()) { // MGNLUI-1528: Workaround. richTextEditor.setEnabled(false); richTextEditor.setReadOnly(true); richTextEditor.addStyleName("richtextfield-disabled"); } } }; richTextEditor.addListener(new MagnoliaRichTextField.PluginListener() { @Override public void onPluginEvent(String eventName, String value) { if (eventName.equals(EVENT_GET_MAGNOLIA_LINK)) { try { Gson gson = new Gson(); PluginData pluginData = gson.fromJson(value, PluginData.class); openLinkDialog(pluginData.path, pluginData.workspace); } catch (Exception e) { log.error("openLinkDialog failed", e); richTextEditor.firePluginEvent(EVENT_CANCEL_LINK, "Could not open target App"); } } } }); return richTextEditor; } private static class PluginData { public String workspace; public String path; } private String mapWorkSpaceToApp(String workspace) { if (workspace.equalsIgnoreCase("dam")) { return "assets"; } else if (workspace.equalsIgnoreCase("website")) { return "pages"; } return ""; } private void openLinkDialog(String path, String workspace) { appController.openChooseDialog(mapWorkSpaceToApp(workspace), path, subAppContext, null, new ItemChosenListener() { @Override public void onItemChosen(Item chosenValue) { if (!(chosenValue instanceof JcrItemAdapter)) { richTextEditor .firePluginEvent(EVENT_CANCEL_LINK); return; } try { javax.jcr.Item jcrItem = ((JcrItemAdapter) chosenValue).getJcrItem(); if (!jcrItem.isNode()) { return; } final Node selected = (Node) jcrItem; Gson gson = new Gson(); MagnoliaLink mlink = new MagnoliaLink(); mlink.identifier = selected.getIdentifier(); mlink.repository = selected.getSession().getWorkspace().getName(); mlink.path = selected.getPath(); if (selected.hasProperty("title")) { mlink.caption = selected.getProperty("title").getString(); } else { mlink.caption = selected.getName(); } richTextEditor.firePluginEvent(EVENT_SEND_MAGNOLIA_LINK, gson.toJson(mlink)); } catch (Exception e) { String error = "Not able to access the selected item. Value will not be set."; log.error(error, e); richTextEditor.firePluginEvent(EVENT_CANCEL_LINK, error); } } @Override public void onChooseCanceled() { richTextEditor.firePluginEvent(EVENT_CANCEL_LINK); } }); } private static class MagnoliaLink { @SuppressWarnings("unused") public String identifier; @SuppressWarnings("unused") public String repository; @SuppressWarnings("unused") public String path; @SuppressWarnings("unused") public String caption; } @Override protected Class getDefaultFieldType(FieldDefinition fieldDefinition) { return String.class; } }