All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.citytechinc.cq.component.touchuidialog.layout.tabs.TabsLayoutMaker Maven / Gradle / Ivy

There is a newer version: 7.0.0
Show newest version
/**
 *    Copyright 2017 ICF Olson
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package com.citytechinc.cq.component.touchuidialog.layout.tabs;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.plexus.util.StringUtils;

import com.citytechinc.cq.component.annotations.Component;
import com.citytechinc.cq.component.annotations.Property;
import com.citytechinc.cq.component.annotations.Tab;
import com.citytechinc.cq.component.touchuidialog.DefaultTouchUIDialogElement;
import com.citytechinc.cq.component.touchuidialog.DefaultTouchUIDialogElementParameters;
import com.citytechinc.cq.component.touchuidialog.TouchUIDialogElement;
import com.citytechinc.cq.component.touchuidialog.TouchUIDialogElementComparator;
import com.citytechinc.cq.component.touchuidialog.TouchUIDialogElementParameters;
import com.citytechinc.cq.component.touchuidialog.container.Section;
import com.citytechinc.cq.component.touchuidialog.container.SectionParameters;
import com.citytechinc.cq.component.touchuidialog.container.items.Items;
import com.citytechinc.cq.component.touchuidialog.container.items.ItemsParameters;
import com.citytechinc.cq.component.touchuidialog.layout.Layout;
import com.citytechinc.cq.component.touchuidialog.layout.LayoutElement;
import com.citytechinc.cq.component.touchuidialog.layout.columns.Column;
import com.citytechinc.cq.component.touchuidialog.layout.columns.ColumnParameters;
import com.citytechinc.cq.component.touchuidialog.layout.columns.fixedcolumns.FixedColumnsLayoutElement;
import com.citytechinc.cq.component.touchuidialog.layout.columns.fixedcolumns.FixedColumnsLayoutElementParameters;
import com.citytechinc.cq.component.touchuidialog.layout.maker.AbstractLayoutMaker;
import com.citytechinc.cq.component.touchuidialog.layout.maker.LayoutMakerParameters;
import com.citytechinc.cq.component.touchuidialog.layout.maker.exceptions.LayoutMakerException;
import com.citytechinc.cq.component.touchuidialog.util.TouchUIDialogUtil;
import com.citytechinc.cq.component.touchuidialog.widget.factory.TouchUIWidgetFactory;
import com.citytechinc.cq.component.touchuidialog.widget.maker.TouchUIWidgetMakerParameters;
import com.citytechinc.cq.component.util.Constants;
import com.citytechinc.cq.component.xml.XmlElement;

public class TabsLayoutMaker extends AbstractLayoutMaker {

	public TabsLayoutMaker(LayoutMakerParameters parameters) {
		super(parameters);
	}

	@Override
	public Layout make() throws LayoutMakerException {

		// Construct the TabsLayout Parameters
		TabsLayoutParameters layoutParameters = new TabsLayoutParameters();

		// Construct the appropriate Layout Element
		TabsLayoutElementParameters tabsLayoutElementParameters = new TabsLayoutElementParameters();
		TabsLayoutElement layoutElement = new TabsLayoutElement(tabsLayoutElementParameters);

		// TODO: Some of the example tab layouts use a type of 'nav'. Determine
		// what this does and if it is appropriate to set type here

		// Add the Layout element and Items to the contained elements list
		List containedElements = new ArrayList();
		containedElements.add(layoutElement);
		containedElements.add(makeItems());

		layoutParameters.setContainedElements(containedElements);

		// TODO: Determine how to set this - in the case of nested layouts this
		// won't always be "content"
		layoutParameters.setFieldName("content");

		return new TabsLayout(layoutParameters);

	}

	protected Items makeItems() throws LayoutMakerException {

		ItemsParameters itemsParameters = new ItemsParameters();
		itemsParameters.setFieldName("items");

		Component componentAnnotation = null;
		try {
			componentAnnotation = (Component) parameters.getComponentClass().getAnnotation(Component.class);
		} catch (ClassNotFoundException e) {
			throw new LayoutMakerException("Class Not Found Exception encountered looking up Component annotation", e);
		}

		// Determine the Tabs to create
		List tabParametersList = new ArrayList();
		List tabContentParametersList = new ArrayList();
		if (componentAnnotation.tabs().length > 0) {
			for (Tab currentTabAnnotation : componentAnnotation.tabs()) {
				if (StringUtils.isNotEmpty(currentTabAnnotation.title())
					&& StringUtils.isNotEmpty(currentTabAnnotation.touchUIPath())) {
					throw new LayoutMakerException("Tabs can have only a path or a title");
				}
				if (StringUtils.isNotEmpty(currentTabAnnotation.title())
					|| StringUtils.isNotEmpty(currentTabAnnotation.touchUIPath())) {
					SectionParameters currentTabParameters = new SectionParameters();
					if (StringUtils.isNotEmpty(currentTabAnnotation.title())) {
						currentTabParameters.setTitle(currentTabAnnotation.title());
						currentTabParameters.setNodeName(currentTabAnnotation.touchUINodeName());
						LayoutElement currentTabLayoutElement =
							new FixedColumnsLayoutElement(new FixedColumnsLayoutElementParameters());
						currentTabParameters.setLayoutElement(currentTabLayoutElement);
						ColumnParameters tabContentParameters = new ColumnParameters();
						tabContentParameters.setFieldName("column");
						tabContentParametersList.add(tabContentParameters);
					}

					if (StringUtils.isNotEmpty(currentTabAnnotation.touchUIPath())) {
						currentTabParameters.setPath(currentTabAnnotation.touchUIPath());
						tabContentParametersList.add(null);
					}
					if (StringUtils.isNotEmpty(currentTabAnnotation.renderConditionResourceType())) {
						TouchUIDialogElementParameters renderParameters = new DefaultTouchUIDialogElementParameters();
						renderParameters.setFieldName("rendercondition");
						renderParameters.setPrimaryType(Constants.NT_UNSTRUCTURED);
						renderParameters.setResourceType(currentTabAnnotation.renderConditionResourceType());
						Map additionalPropertiesMap = new HashMap();
						for (Property property : currentTabAnnotation.renderConditionProperties()) {
							additionalPropertiesMap.put(property.name(), property.value());
						}
						renderParameters.setAdditionalProperties(additionalPropertiesMap);
						DefaultTouchUIDialogElement renderConditionElement =
							new DefaultTouchUIDialogElement(renderParameters);
						currentTabParameters.setRenderCondition(renderConditionElement);
					}
					currentTabParameters.setShowOnCreate(currentTabAnnotation.showOnCreate());
					currentTabParameters.setHideOnEdit(currentTabAnnotation.hideOnEdit());
					if (StringUtils.isNotEmpty(currentTabAnnotation.orderBefore())) {
						currentTabParameters.setOrderBefore(currentTabAnnotation.orderBefore());
					}
					tabParametersList.add(currentTabParameters);
				} else {
					tabContentParametersList.add(null);
					tabParametersList.add(null);
				}
			}
		} else {
			SectionParameters currentTabParameters = new SectionParameters();

			currentTabParameters.setTitle(componentAnnotation.value());

			// Determine the layout to use for the Tab
			// TODO: This probably needs to allow for dynamic in tab layout at
			// some point
			LayoutElement currentTabLayoutElement =
				new FixedColumnsLayoutElement(new FixedColumnsLayoutElementParameters());
			currentTabParameters.setLayoutElement(currentTabLayoutElement);

			// Based on the layout set up container parameters to match the tab
			// parameters
			// TODO: This probably needs to allow for dynamic in tab layout at
			// some point
			ColumnParameters tabContentParameters = new ColumnParameters();
			tabContentParameters.setFieldName("column");

			tabContentParametersList.add(tabContentParameters);
			tabParametersList.add(currentTabParameters);
		}

		try {
			// Populate the content for each tab
			List widgetMakerParameters =
				TouchUIDialogUtil.getWidgetMakerParametersForComponentClass(parameters.getComponentClass(),
					parameters.getClassLoader(), parameters.getClassPool(), parameters.getWidgetRegistry());

			for (TouchUIWidgetMakerParameters currentWidgetMakerParameters : widgetMakerParameters) {

				TouchUIDialogElement currentElement = TouchUIWidgetFactory.make(currentWidgetMakerParameters, -1);
				if (currentElement != null) {
					currentElement.setRanking(currentWidgetMakerParameters.getDialogFieldConfig().getRanking());

					if (currentWidgetMakerParameters.getDialogFieldConfig().getTab() <= tabParametersList.size()) {
						tabContentParametersList.get(currentWidgetMakerParameters.getDialogFieldConfig().getTab() - 1)
							.addItem(currentElement);
					} else {
						throw new LayoutMakerException("Field "
							+ currentWidgetMakerParameters.getDialogFieldConfig().getName() + " of class "
							+ currentWidgetMakerParameters.getClass().getName() + " placed in non-existant tab "
							+ currentWidgetMakerParameters.getDialogFieldConfig().getTab());
					}
				}

			}
		} catch (Exception e) {
			throw new LayoutMakerException("Exception encountered while constructing widgets for layout", e);
		}

		// Add content to all the tabs
		for (int i = 0; i < tabParametersList.size(); i++) {
			if (tabContentParametersList.get(i) != null) {
				Collections.sort(tabContentParametersList.get(i).getItems(), new TouchUIDialogElementComparator());
				tabParametersList.get(i).addItem(new Column(tabContentParametersList.get(i)));
			}
		}

		// Create all the Tabs
		List
tabs = new ArrayList
(); for (int i = 0; i < tabParametersList.size(); i++) { if (tabParametersList.get(i) != null) { SectionParameters currentSectionParameters = tabParametersList.get(i); if (StringUtils.isNotEmpty(tabParametersList.get(i).getNodeName())) { currentSectionParameters.setFieldName(tabParametersList.get(i).getNodeName()); } else if (StringUtils.isNotEmpty(tabParametersList.get(i).getTitle())) { currentSectionParameters.setFieldName(tabParametersList.get(i).getTitle()); } else { currentSectionParameters.setFieldName("tab_" + i); } tabs.add(new Section(currentSectionParameters)); } } itemsParameters.setContainedElements(tabs); return new Items(itemsParameters); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy