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

ru.itbasis.utils.zk.ui.TabboxUtils Maven / Gradle / Ivy

package ru.itbasis.utils.zk.ui;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.select.Selectors;
import org.zkoss.zul.Include;
import org.zkoss.zul.Menuitem;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Tabbox;
import org.zkoss.zul.Tabpanel;
import org.zkoss.zul.Tabpanels;
import org.zkoss.zul.Tabs;
import ru.itbasis.utils.zk.Utils;

import java.util.List;

public final class TabboxUtils {
	public static final String FLAG_TAB_LABEL      = "|";
	public static final String FLAG_TAB_PAGE_CLASS = "class:";
	public static final String FLAG_TAB_PAGE_ZUL   = "zul:";

	private static final transient Logger LOG = LoggerFactory.getLogger(TabboxUtils.class.getName());

	private static final String LOG_TAB_PAGE_PATH = "tabPagePath: '{}'";
	private static final String PREFIX_TAB_ID     = "tabId_";

	private TabboxUtils() {
	}

	public static Tab goTab(final Component root, final Menuitem menuitem) {
		String tabLabel = menuitem.getLabel();
		String tabPagePath = menuitem.getValue();
		LOG.trace(LOG_TAB_PAGE_PATH, tabPagePath);
		if (tabPagePath.contains(FLAG_TAB_LABEL)) {
			final int of = tabPagePath.indexOf(FLAG_TAB_LABEL);
			tabLabel = tabPagePath.substring(0, of);
			tabPagePath = tabPagePath.substring(of + 1);
			LOG.trace(LOG_TAB_PAGE_PATH, tabPagePath);
		}

		final List tabboxes = Selectors.find(root, Tabbox.class.getSimpleName());
		LOG.trace("tabboxes: {}", tabboxes);

		final Tabbox tabbox = (Tabbox) tabboxes.get(0);

		final Component compChild = getComp(tabPagePath);
		return goTab(tabbox, tabLabel, compChild);
	}

	public static Tab goTab(final Tabbox tabbox, final String label, final Class childClass) {
		try {
			final String tabId = PREFIX_TAB_ID + Integer.toString(childClass.getCanonicalName().hashCode());
			final Tab tab = findTab(tabbox, tabId);
			if (tab != null) {
				return tab;
			}
			return appendTab(tabbox, tabId, label, (Component) childClass.newInstance());
		} catch (InstantiationException | IllegalAccessException e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}

	public static Tab goTab(final Tabbox tabbox, final String label, final Component child) {
		if (child == null) {
			return null;
		}

		final String tabId = PREFIX_TAB_ID + child.getUuid();
		final Tab tab = findTab(tabbox, tabId);
		if (tab != null) {
			return tab;
		}

		return appendTab(tabbox, tabId, label, child);
	}

	public static Tab findTab(final Tabbox tabbox, final String tabId) {
		LOG.trace("tabId: {}", tabId);

		final List tabs = Selectors.find(tabbox, ((!tabId.startsWith("#")) ? ("#" + tabId) : tabId));
		if (tabs.size() > 0) {
			final Tab tab = (Tab) tabs.get(0);
			tabbox.setSelectedTab(tab);
			return tab;
		}
		return null;
	}

	public static Component getComp(final String tabPagePath) {
		LOG.trace(LOG_TAB_PAGE_PATH, tabPagePath);
		if (tabPagePath.startsWith(FLAG_TAB_PAGE_ZUL)) {
			final String zulPage = Utils.getZulPage(tabPagePath.substring(FLAG_TAB_PAGE_ZUL.length()));
			LOG.trace(LOG_TAB_PAGE_PATH, zulPage);
			final Include include = new Include();
			include.invalidate();
			include.setSrc(zulPage);
			return include;

		} else if (tabPagePath.startsWith(FLAG_TAB_PAGE_CLASS)) {
			final String className = tabPagePath.substring(FLAG_TAB_PAGE_CLASS.length());
			LOG.trace("className: '{}'", className);
			try {
				final Class clazz = Class.forName(className);
				return (Component) clazz.newInstance();
			} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
				LOG.error(e.getMessage(), e);
			}
		}
		return null;
	}

	public static Tab appendTab(final Tabbox tabbox, final String tabId, final String tabLabel, final Component compChild) {
		LOG.trace("tabId: '{}'", tabId);
		LOG.trace("tabLabel: '{}'", tabLabel);
		LOG.trace("compChild: {}", compChild);

		fixTabPanels(tabbox);

		final Tab tab = new Tab(tabLabel);
		tab.setClosable(true);
		tab.setSelected(true);
		tab.setId(tabId);

		final Tabpanel tabPanel = new Tabpanel();
		tabPanel.appendChild(compChild);

		tabPanel.setParent(tabbox.getTabpanels());
		tab.setParent(tabbox.getTabs());

		tabPanel.invalidate();

		return tab;
	}

	public static void fixTabPanels(final Tabbox tabbox) {
		Tabs tabs = tabbox.getTabs();
		if (tabs == null) {
			tabs = new Tabs();
			tabs.setParent(tabbox);
		}

		Tabpanels tabPanels = tabbox.getTabpanels();
		if (tabPanels == null) {
			tabPanels = new Tabpanels();
			tabPanels.setParent(tabbox);
		}

		final int cTabs = tabs.getChildren().size();
		final int cPanels = tabPanels.getChildren().size();
		if (cTabs == cPanels) {
			return;
		}
		for (int i = cPanels; i < cTabs; i++) {
			tabPanels.appendChild(new Tabpanel());
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy