package org.gwtbootstrap3.client.ui;
/*
* #%L
* GwtBootstrap3
* %%
* Copyright (C) 2013 GwtBootstrap3
* %%
* 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.
* #L%
*/
import org.gwtbootstrap3.client.ui.constants.ColumnOffset;
import org.gwtbootstrap3.client.ui.constants.ColumnPull;
import org.gwtbootstrap3.client.ui.constants.ColumnPush;
import org.gwtbootstrap3.client.ui.constants.ColumnSize;
import org.gwtbootstrap3.client.ui.html.Div;
import com.google.gwt.dom.client.Style;
import com.google.gwt.uibinder.client.UiConstructor;
import com.google.gwt.user.client.ui.Widget;
/**
* A column of Bootstrap's fluid grid system.
*
* @author Sven Jacobs
* @author Joshua Godi
* @author Pontus Enmark
* @see Row
*/
public class Column extends Div {
private static final String SEPARATOR = "[, ]+";
/**
* Creates a column with one size, and with one or more additional widgets added.
* <p/>
* Additional sizes can be added with {@link #addSize(ColumnSize...)}.
* Additional widgets can be added with {@link #add(Widget)}.
*
* @param size Size of column
* @param firstWidget Widget to add
* @param otherWidgets Other widgets to add
*/
public Column(final ColumnSize size, final Widget firstWidget, final Widget... otherWidgets) {
this(size);
add(firstWidget);
for (final Widget widget : otherWidgets) {
add(widget);
}
}
/**
* Creates column with one or more additional sizes.
* <p/>
* Additional sizes can be added with {@link #addSize(ColumnSize...)}
*
* @param firstSize Size of column
* @param otherSizes Other sizes of column
* @see #addSize(ColumnSize...)
*/
public Column(final ColumnSize firstSize, final ColumnSize... otherSizes) {
setSize(firstSize, otherSizes);
}
/**
* Convenience constructor for UiBinder to create a Column with one or more
* sizes.
* <p/>
* Size needs to be a space-separated String of {@link ColumnSize} enum
* names, e.g. "SM_3 LG_3"
*
* @param size Space-separated String of {@link ColumnSize}
* @see ColumnSize
*/
@UiConstructor
public Column(final String size) {
setSize(size);
}
/**
* Adds one or more additional column sizes.
*
* @param firstSize Column size
* @param otherSizes Additional column sizes
*/
public void setSize(final ColumnSize firstSize, final ColumnSize... otherSizes) {
addEnumVarargsValues(new ColumnSize[]{firstSize}, ColumnSize.class, true);
addEnumVarargsValues(otherSizes, ColumnSize.class, false);
}
public void setSize(final String sizes) {
addEnumStringValues(sizes, ColumnSize.class, true);
}
public void addSize(final ColumnSize... sizes) {
addEnumVarargsValues(sizes, ColumnSize.class, false);
}
public void addSize(final String sizes) {
addEnumStringValues(sizes, ColumnSize.class, false);
}
public void setPull(final ColumnPull... pulls) {
addEnumVarargsValues(pulls, ColumnPull.class, true);
}
public void setPull(final String pulls) {
addEnumStringValues(pulls, ColumnPull.class, true);
}
public void addPull(final ColumnPull... pulls) {
addEnumVarargsValues(pulls, ColumnPull.class, false);
}
public void addPull(final String pulls) {
addEnumStringValues(pulls, ColumnPull.class, false);
}
public void setPush(final ColumnPush... pushes) {
addEnumVarargsValues(pushes, ColumnPush.class, true);
}
public void setPush(final String pushes) {
addEnumStringValues(pushes, ColumnPush.class, true);
}
public void addPush(final ColumnPush... pushes) {
addEnumVarargsValues(pushes, ColumnPush.class, false);
}
public void addPush(final String pushes) {
addEnumStringValues(pushes, ColumnPush.class, false);
}
public void setOffset(final ColumnOffset... offsets) {
addEnumVarargsValues(offsets, ColumnOffset.class, true);
}
public void setOffset(final String offsets) {
addEnumStringValues(offsets, ColumnOffset.class, true);
}
public void addOffset(final ColumnOffset... offsets) {
addEnumVarargsValues(offsets, ColumnOffset.class, false);
}
public void addOffset(final String offsets) {
addEnumStringValues(offsets, ColumnOffset.class, false);
}
private <E extends Enum<? extends Style.HasCssName>> void addEnumVarargsValues(final E[] values,
final Class<E> enumClass,
final boolean clearOld) {
if (clearOld) {
// Remove the previous values
removeStyleNames(enumClass);
}
for (final E value : values) {
addStyleName(((Style.HasCssName) value).getCssName());
}
}
private <E extends Enum<? extends Style.HasCssName>> void addEnumStringValues(final String values,
final Class<E> enumClass,
final boolean clearOld) {
if (clearOld) {
// Remove the previous values
removeStyleNames(enumClass);
}
// Add new ones
final String[] valuesSplit = values.split(SEPARATOR);
for (final String value : valuesSplit) {
for (final E constant : enumClass.getEnumConstants()) {
if (value.equalsIgnoreCase(constant.name())) {
addStyleName(((Style.HasCssName) constant).getCssName());
}
}
}
}
private <E extends Enum<? extends Style.HasCssName>> void removeStyleNames(final Class<E> enumClass) {
for (final E constant : enumClass.getEnumConstants()) {
removeStyleName(((Style.HasCssName) constant).getCssName());
}
}
}