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

org.nasdanika.html.bootstrap.impl.BootstrapElementImpl Maven / Gradle / Ivy

package org.nasdanika.html.bootstrap.impl;

import org.nasdanika.html.HTMLElement;
import org.nasdanika.html.bootstrap.BootstrapElement;
import org.nasdanika.html.bootstrap.BootstrapFactory;
import org.nasdanika.html.bootstrap.Color;
import org.nasdanika.html.bootstrap.Breakpoint;
import org.nasdanika.html.bootstrap.Placement;
import org.nasdanika.html.bootstrap.Spacing;
import org.nasdanika.html.bootstrap.Text;

public abstract class BootstrapElementImpl,B extends BootstrapElement> implements BootstrapElement {
	
	private BootstrapFactory factory;

	protected BootstrapElementImpl(BootstrapFactory factory) {
		this.factory = factory;
	}
	
	@Override
	public BootstrapFactory getFactory() {
		return factory;
	}
	
	@Override
	public String toString() {
		return toHTMLElement().toString();
	}
	
	@Override
	public Object produce(int indent) {
		return toHTMLElement().produce(indent);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public B border(Color color, Placement... placement) {
		H htmlElement = toHTMLElement();
		if (htmlElement != null && color != Color.NONE) {
			for (Placement p: placement) {
				htmlElement.addClass("border-"+p.name().toLowerCase());
			}
			htmlElement.addClassConditional(placement.length == 0, "border");
			if (color != null && color.code != null) {
				htmlElement.addClass("border-"+color.code);
			}
		}		
		return (B) this;
	}
	
	@SuppressWarnings("unchecked")
	public B background(Color color) {
		toHTMLElement().addClassConditional(color != null && color.code != null, "bg-"+color.code);
		return (B) this;
	}
	
	@Override
	public Text text() {
		return new Text() {

			@SuppressWarnings("unchecked")
			@Override
			public B toBootstrapElement() {
				return (B) BootstrapElementImpl.this;
			}

			@Override
			public Text color(Color color) {
				toHTMLElement().addClassConditional(color != null && color.code != null, "text-"+color.code);
				return this;
			}

			@Override
			public Text alignment(Alignment alignment) {
				toHTMLElement().addClass("text-"+alignment.name().toLowerCase());
				return this;
			}

			@Override
			public Text alignment(Breakpoint breakpoint, Alignment alignment) {
				String code = breakpoint.code;
				String prefix = code.length() == 0 ? "text" : "text-"+code;				
				toHTMLElement().addClass(prefix+"-"+alignment.name().toLowerCase());
				return this;
			}

			@Override
			public Text transform(Transform transform) {
				toHTMLElement().addClass("text-"+transform.name().toLowerCase());
				return this;
			}

			@Override
			public Text weight(Weight weight) {
				toHTMLElement().addClass("font-weight-"+weight.name().toLowerCase());
				return this;
			}

			@Override
			public Text monospace() {
				return monospace(true);
			}

			@Override
			public Text monospace(boolean monospace) {
				toHTMLElement().addClassConditional(monospace, "text-monospace");
				return this;
			}

			@Override
			public Text italic() {
				return italic(true);
			}

			@Override
			public Text italic(boolean italic) {
				toHTMLElement().addClassConditional(italic, "font-italic");
				return this;
			}

			@Override
			public Text nowrap() {
				return nowrap(true);
			}

			@Override
			public Text nowrap(boolean nowrap) {
				toHTMLElement().addClassConditional(nowrap, "text-nowrap");
				return this;
			}

			@Override
			public Text truncate() {
				return truncate(true);
			}

			@Override
			public Text truncate(boolean truncate) {
				toHTMLElement().addClassConditional(truncate, "text-truncate");
				return this;
			}
			
		};
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public org.nasdanika.html.bootstrap.Float _float() {
		return new FloatImpl((B) this);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public Spacing margin() {
		return new SpacingImpl((B) this, "m");
	}

	@SuppressWarnings("unchecked")
	@Override
	public Spacing padding() {
		return new SpacingImpl((B) this, "p");
	}

}