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

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

package ru.itbasis.utils.zk.ui;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Components;
import org.zkoss.zk.ui.HtmlBasedComponent;
import org.zkoss.zk.ui.Page;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.util.ConventionWires;
import org.zkoss.zul.Borderlayout;
import org.zkoss.zul.Cell;
import org.zkoss.zul.Center;
import org.zkoss.zul.Column;
import org.zkoss.zul.Columns;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Label;
import org.zkoss.zul.LayoutRegion;
import org.zkoss.zul.North;
import org.zkoss.zul.Row;
import org.zkoss.zul.Rows;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Tabbox;
import org.zkoss.zul.Toolbar;
import org.zkoss.zul.Vbox;
import org.zkoss.zul.West;
import org.zkoss.zul.Window;
import ru.itbasis.utils.core.ISelf;
import ru.itbasis.utils.zk.LogMsg;
import ru.itbasis.utils.zk.ui.form.fields.AbstractField;

public abstract class AbstractDialog extends Window implements ISelf {
	public static final String LABEL_CORE_DIALOG_TAB_GENERAL_TITLE = "core.dialog.tab.general.title";

	public static final String TAB_ID_GENERAL = "tabGeneral";

	protected static final String DEFAULT_COLUMN_LABEL_WIDTH = "35%";
	protected static final String DEFAULT_HFLEX              = "1";
	protected static final String DEFAULT_VFLEX              = "1";

	protected static final int MIN_FORM_HEIGHT   = 400;
	protected static final int MIN_FORM_WIDTH    = 500;
	protected static final int MIN_PREVIEW_WIDTH = 400;

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

	private Borderlayout _layout;
	private Grid         _gridGeneral;
	private Toolbar      _toolbar;
	private boolean      _enablePreview;
	private Tabbox       _tabBox;

	public AbstractDialog(final Page page) {
		LOG.trace(LogMsg.PAGE, page);

		setClosable(true);
		setBorder(true);
		setTitle(StringUtils.SPACE);

		setMinwidth(MIN_FORM_WIDTH);
		setMinheight(MIN_FORM_HEIGHT);

		setHeight(Integer.toString(MIN_FORM_HEIGHT) + "px");
		setWidth(Integer.toString(MIN_FORM_WIDTH) + "px");

		setMaximizable(true);
		setSizable(true);

		ConventionWires.wireVariables(this, this);
		ConventionWires.addForwards(this, this);

		initLayout();

		setPage(page);
	}

	protected abstract void initTitle();

	protected Row appendRow(final AbstractField field) {
		LOG.trace("field: {}", field);
		return appendRow(field.getBox());
	}

	protected Row appendRow(final HtmlBasedComponent comp) {
		LOG.trace("comp: {}", comp);
		final Row row = appendRow();

		final Cell cell = new Cell();
		cell.setColspan(_gridGeneral.getColumns().getChildren().size());
		cell.setParent(row);

		comp.setParent(cell);

		return row;
	}

	protected Row appendRow() {
		final Row row = new Row();
		row.setParent(_gridGeneral.getRows());
		LOG.trace("row: {}", row);
		return row;
	}

	protected Row appendRowField(final String fieldLabel, final AbstractField fieldComp, final EventListener listener) {
		return appendRowField(fieldLabel, fieldComp.getBox(), listener);
	}

	protected Row appendRowField(final String fieldLabel, final HtmlBasedComponent fieldComp, final EventListener listener) {
		final Row row = appendRowField(fieldLabel, fieldComp);
		row.addEventListener(Events.ON_CLICK, listener);
		return row;
	}

	protected Row appendRowField(final String fieldLabel, final AbstractField fieldComp) {
		return appendRowField(fieldLabel, fieldComp.getBox());
	}

	protected Row appendRowField(final String fieldLabel, final HtmlBasedComponent fieldComp) {
		if (LOG.isTraceEnabled()) {
			LOG.trace("fieldLabel: {}", fieldLabel);
			LOG.trace("fieldComp: {}", fieldComp);
		}
		final Row row = appendRow();

		new Label(Labels.getRequiredLabel(fieldLabel)).setParent(row);
		fieldComp.setParent(row);

		return row;
	}

	private void disablePreview() {
		final Center center = _layout.getCenter();
		Components.removeAllChildren(center);
		_gridGeneral.setParent(center);
		setWidth(MIN_FORM_WIDTH + "px");
		if (_layout.getWest() != null) {
			_layout.removeChild(_layout.getWest());
		}
		_enablePreview = false;
	}

	public Self disableTabs() {
		_gridGeneral.setParent(getMainBox());
		Components.removeAllChildren(_tabBox);
		_tabBox = null;
		return getSelf();
	}

	public void enablePreview(final boolean flag) {
		if (flag) {
			enablePreview(MIN_FORM_WIDTH);
		} else {
			disablePreview();
		}
	}

	public void enablePreview(final int formWidth) {
		West west = _layout.getWest();
		if (west == null) {
			west = new West();
			west.setBorder("none");
			west.setSplittable(true);
			west.setParent(_layout);
		}
		west.setWidth(formWidth + "px");
		setWidth((MIN_PREVIEW_WIDTH + formWidth) + "px");
		_gridGeneral.setParent(_layout.getWest());

		_enablePreview = true;
	}

	public Self enableTabs() {
		initTabbox();

		return getSelf();
	}

	protected LayoutRegion getMainBox() {
		if (isEnablePreview()) {
			return _layout.getWest();
		}
		return _layout.getCenter();
	}

	protected LayoutRegion getPreviewBox() {
		if (isEnablePreview()) {
			return _layout.getCenter();
		}
		return null;
	}

	protected String getTabId(final String suffix) {
		return getUuid().hashCode() + "_" + suffix;
	}

	public Toolbar getToolbar() {
		assert _toolbar != null;
		return _toolbar;
	}

	protected void initGridColumns(final Grid grid) {
		grid.appendChild(new GridOneColumn());
	}

	private void initGridGeneral(final Component parent) {
		_gridGeneral = new Grid();
		_gridGeneral.setVflex(DEFAULT_VFLEX);
		_gridGeneral.setParent(parent);

		initGridColumns(_gridGeneral);

		new Rows().setParent(_gridGeneral);
	}

	private void initLayout() {
		_layout = new Borderlayout();
		_layout.setVflex(DEFAULT_VFLEX);
		_layout.setParent(this);

		initLayoutNorth();
		initLayoutCenter();
	}

	private void initLayoutCenter() {
		final Center center = new Center();
		center.setBorder("true");
		center.setParent(_layout);

		initGridGeneral(center);
		initLayoutCenterContent();
	}

	protected void initLayoutCenterContent() {
	}

	private void initLayoutNorth() {
		_toolbar = new Toolbar();
		_toolbar.setHflex(DEFAULT_HFLEX);
		if (!initToolbarContent(_toolbar)) {
			_toolbar = null;
			return;
		}

		final North north = new North();
		north.setBorder("none");
		north.setParent(_layout);
		north.appendChild(_toolbar);
	}

	protected void initTabBoxExtTabs(final Tabbox tb) {
	}

	protected Tab initTabGeneral(final Tabbox tb) {
		final Tab tab = TabboxUtils.appendTab(tb, getTabId(TAB_ID_GENERAL), Labels.getRequiredLabel(LABEL_CORE_DIALOG_TAB_GENERAL_TITLE), _gridGeneral);
		tab.setClosable(false);
		return tab;
	}

	private void initTabbox() {
		_tabBox = new Tabbox();
		_tabBox.setVflex(DEFAULT_VFLEX);

		initTabGeneral(_tabBox);
		initTabBoxExtTabs(_tabBox);

		getMainBox().appendChild(_tabBox);
	}

	protected boolean initToolbarContent(final Toolbar tb) {
		return false;
	}

	public boolean isEnablePreview() {
		return _enablePreview;
	}

	public boolean isTabEnabled() {
		return _tabBox != null;
	}

	public void preview(final Component comp) {
		if (_layout.getWest() == null) {
			return;
		}
		final Center infoBox = _layout.getCenter();
		Components.removeAllChildren(infoBox);
		if (comp != null) {
			comp.setParent(infoBox);
			return;
		}
		final Vbox vbox = new Vbox();
		vbox.setPack("center");
		vbox.setAlign("center");
		vbox.appendChild(new Label(Labels.getLabel("empty.exInfo")));
		vbox.setParent(infoBox);
	}

	public Self toogleTabs() {
		if (isTabEnabled()) {
			return disableTabs();
		}
		return enableTabs();
	}

	protected class GridOneColumn extends Columns {
		public GridOneColumn() {
			setVisible(false);

			final Column c0 = new Column();
			c0.setParent(this);
		}
	}

	protected class GridTwoColumn extends Columns {
		public GridTwoColumn() {
			setVisible(false);

			final Column c0 = new Column();
			c0.setAlign("right");
			c0.setWidth(DEFAULT_COLUMN_LABEL_WIDTH);
			c0.setParent(this);

			final Column c1 = new Column();
			c1.setParent(this);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy