de.espirit.firstspirit.access.editor.DomEditorValueExample


package de.espirit.firstspirit.access.editor;

import de.espirit.firstspirit.access.Language;
import de.espirit.firstspirit.access.UserService;
import de.espirit.firstspirit.access.editor.value.DefaultDomNode;
import de.espirit.firstspirit.access.editor.value.DomElement;
import de.espirit.firstspirit.access.editor.value.DomNode;
import de.espirit.firstspirit.access.editor.value.InvalidValueException;
import de.espirit.firstspirit.access.editor.value.TableCell;
import de.espirit.firstspirit.access.editor.value.TableDomNode;
import de.espirit.firstspirit.access.editor.value.TableRowDomNode;
import de.espirit.firstspirit.access.link.Link;
import de.espirit.firstspirit.access.store.templatestore.FormatTemplate;
import de.espirit.firstspirit.access.store.templatestore.FormatTemplates;
import de.espirit.firstspirit.access.store.templatestore.LinkTemplate;
import de.espirit.firstspirit.access.store.templatestore.LinkTemplates;
import de.espirit.firstspirit.access.store.templatestore.TableFormatTemplate;
import de.espirit.firstspirit.access.store.templatestore.TemplateStoreRoot;

/**
 * Example how to get the value of a DomEditorValue and how to store a value into a DomEditorValue.
 *
 * @since 4.2.34
 */
public class DomEditorValueExample {

	/**
	 * A simple example how to append a paragraph containing some text and a link to the DomEditorValue.
	 *
	 * @since 4.2.34
	 */
	public void appendParagraphForLanguage(final DomEditorValue editor, final Language language, final UserService userService) throws InvalidValueException {

		// 1. check if language is provided if editor is language dependent ("useLanguages='yes'" in gom syntax)
		if (editor.isLanguageDependent() && language == null) {
			throw new NullPointerException("Language is missing!");
		}

		// 2. get the dom element of the editor value
		final DomElement domElement = editor.get(language);

		// 3. get the root dom node of the dom element
		final DefaultDomNode rootDomNode = domElement.getRoot();

		// 4. retrieve some templates (format, link) we need to append content to dom
		final TemplateStoreRoot templateStore = userService.getTemplateStore();
		final FormatTemplates formatTemplates = templateStore.getFormatTemplates();
		final FormatTemplate paragraphTemplate = formatTemplates.getFormatTemplate("p");
		if (paragraphTemplate == null) {
			throw new NullPointerException("Format template not found!");
		}
		final LinkTemplates linkTemplates = templateStore.getLinkTemplates();
		final LinkTemplate linkTemplate = linkTemplates.getTemplate("myLinkTemplate");
		if (linkTemplate == null) {
			throw new NullPointerException("Link template not found!");
		}

		// 5. append a paragraph by using the paragraphTemplate
		final DefaultDomNode paragraph = (DefaultDomNode) rootDomNode.appendChild(paragraphTemplate);

		// 6. append some text to the paragraph node
		paragraph.appendChild("sample text with ");

		// 7. create a link by using the link template retrieved in step 4
		final Link link = linkTemplate.createLink(language);
		// 8. set the text to be displayed for link
		link.setText("link");
		// 9. append created link to the paragraph node
		paragraph.appendChild(link);

		// 10. store dom element back into the editor value
		editor.set(language, domElement);
	}


	/**
	 * A simple example how to append an inline table of 2 rows to the DomEditorValue.
	 * <b>Note:</b> <code>CMS_INPUT_DOM</code> configuration has to be configured to allow usage of inline tables (<code>table="yes"</code>).
	 *
	 * -------------------
	 * | cell 0 | cell 1 |
	 * -------------------
	 * |     cell 2      |
	 * -------------------
	 *
	 * @since 4.2.34
	 */
	public void appendTableForLanguage(final DomEditorValue editor, final Language language, final UserService userService) throws InvalidValueException {

		// 1. check if language is provided if editor is language dependent ("useLanguages='yes'" in gom syntax)
		if (editor.isLanguageDependent() && language == null) {
			throw new NullPointerException("Language is missing!");
		}

		// 2. get the dom element of the editor value
		final DomElement domElement = editor.get(language);

		// 3. get the root dom node of the dom element
		final DefaultDomNode rootDomNode = domElement.getRoot();

		// 4. retrieve some templates (format, link) we need to append content to dom
		final TemplateStoreRoot templateStore = userService.getTemplateStore();
		final FormatTemplates formatTemplates = templateStore.getFormatTemplates();
		final TableFormatTemplate tableFormatTemplate = formatTemplates.getTableFormatTemplate("table");
		final FormatTemplate rowTemplate = formatTemplates.getFormatTemplate("tr");
		final FormatTemplate cellTemplate = formatTemplates.getFormatTemplate("td");

		// 5. append an inline by using the tableFormatTemplate
		final TableDomNode table = rootDomNode.appendChild(tableFormatTemplate);

		// 6. append a row to table and two cells to the created row
		final TableRowDomNode tableRow0 = (TableRowDomNode) table.appendChild(rowTemplate);
		final TableCell tableCell0 = (TableCell) tableRow0.appendChild(cellTemplate);
		tableCell0.appendChild("cell 0");
		final TableCell tableCell1 = (TableCell) tableRow0.appendChild(cellTemplate);
		tableCell1.appendChild("cell 1");

		// 7. append another row to table and one cell (with a colspan of 2) to the created row
		final TableRowDomNode tableRow1 = (TableRowDomNode) table.appendChild(rowTemplate);
		final TableCell tableCell2 = (TableCell) tableRow1.appendChild(cellTemplate);
		tableCell2.setColSpan(2);
		tableCell2.appendChild("cell 2");

		// 8. store dom element back into the editor value
		editor.set(language, domElement);
	}


	/**
	 * A simple example how to remove all children of a dom node.
	 *
	 * @since 4.2.34
	 */
	public void clearValueForLanguage(final DomEditorValue editor, final Language language) throws InvalidValueException {

		// 1. check if language is provided if editor is language dependent ("useLanguages='yes'" in gom syntax)
		if (editor.isLanguageDependent() && language == null) {
			throw new NullPointerException("Language is missing!");
		}

		// 2. get the dom element of the editor value
		final DomElement domElement = editor.get(language);

		// 3. get the root dom node of the dom element
		final DefaultDomNode rootDomNode = domElement.getRoot();

		// 4. remove all children from root dom node
		for (final DomNode child : rootDomNode.getChildren()) {
			rootDomNode.removeChild(child);
		}

		// 5. store dom element back into the editor value
		editor.set(language, domElement);
	}


	/**
	 * Returns the value of the DomEditorValue for the given language.
	 *
	 * @since 4.2.34
	 */
	public DomElement getValueForLanguage(final DomEditorValue editor, final Language language) {

		// 1. get the stored instance in the editor value
		final DomElement value = editor.get(language);

		// 2. and return the value for further processing
		return value;
	}
}