/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.isis.applib.layout.grid.bootstrap3; import java.util.List; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import com.google.common.collect.Lists; import org.apache.isis.applib.layout.component.ActionLayoutData; import org.apache.isis.applib.layout.component.ActionLayoutDataOwner; import org.apache.isis.applib.layout.component.CollectionLayoutData; import org.apache.isis.applib.layout.component.CollectionLayoutDataOwner; import org.apache.isis.applib.layout.component.DomainObjectLayoutData; import org.apache.isis.applib.layout.component.DomainObjectLayoutDataOwner; import org.apache.isis.applib.layout.component.FieldSet; import org.apache.isis.applib.layout.component.FieldSetOwner; /** * A column within a row which, depending on its {@link #getSpan()}, could be as narrow as 1/12th of the page's width, all the way up to spanning the entire page. * * <p> * Pretty much other content can be contained within a column, though most commonly it will be {@link FieldSet fieldset}s * (a group of properties) or {@link CollectionLayoutData collection}s. However, columns can also be used to * contain further {@link BS3Row row}s (creating a nested grid of rows/cols/rows/cols) and {@link BS3TabGroup tabgroup}s. * </p> * * <p> * It is rendered as a (eg) <div class="col-md-4 ..."> * </p> */ @XmlRootElement( name = "col" ) @XmlType( name = "col" , propOrder = { "sizeSpans", "domainObject", "actions", "rows", "tabGroups", "fieldSets", "collections", "metadataError" } ) public class BS3Col extends BS3RowContent implements ActionLayoutDataOwner, BS3TabGroupOwner, BS3RowOwner, FieldSetOwner, HasCssId, CollectionLayoutDataOwner, DomainObjectLayoutDataOwner { private static final long serialVersionUID = 1L; private String id; /** * As per <div id="...">...</div> : must be unique across entire page. */ @XmlAttribute(required = false) public String getId() { return id; } public void setId(final String id) { this.id = id; } private int span; @XmlAttribute(required = true) public int getSpan() { return span; } public void setSpan(final int span) { this.span = span; } private Boolean unreferencedActions; /** * Whether this column should be used to hold any unreferenced actions (contributed or "native"). * * <p> * Any layout must have precisely one column or {@link FieldSet} that has this attribute set. * </p> */ @XmlAttribute(required = false) public Boolean isUnreferencedActions() { return unreferencedActions; } public void setUnreferencedActions(final Boolean unreferencedActions) { this.unreferencedActions = unreferencedActions; } private Boolean unreferencedCollections; /** * Whether this column should be used to hold any unreferenced collections (contributed or "native"). * * <p> * Any layout must have precisely one column or {@link BS3TabGroup tabgroup} that has this attribute set. * </p> */ @XmlAttribute(required = false) public Boolean isUnreferencedCollections() { return unreferencedCollections; } public void setUnreferencedCollections(final Boolean unreferencedCollections) { this.unreferencedCollections = unreferencedCollections; } private DomainObjectLayoutData domainObject; /** * Whether to show the object's icon and title. */ @XmlElementRef(type=DomainObjectLayoutData.class, name="domainObject", required = false) public DomainObjectLayoutData getDomainObject() { return domainObject; } public void setDomainObject(final DomainObjectLayoutData domainObjectLayoutData) { this.domainObject = domainObjectLayoutData; } private List<SizeSpan> sizeSpans = Lists.newArrayList(); // no wrapper @XmlElement(name = "sizeSpan", required = false) public List<SizeSpan> getSizeSpans() { return sizeSpans; } public void setSizeSpans(final List<SizeSpan> sizeSpans) { this.sizeSpans = sizeSpans; } private List<ActionLayoutData> actions = Lists.newArrayList(); // no wrapper @XmlElementRef(type = ActionLayoutData.class, name = "action", required = false) public List<ActionLayoutData> getActions() { return actions; } public void setActions(final List<ActionLayoutData> actions) { this.actions = actions; } private List<BS3Row> rows = Lists.newArrayList(); // no wrapper @XmlElement(name = "row", required = false) public List<BS3Row> getRows() { return rows; } public void setRows(final List<BS3Row> rows) { this.rows = rows; } private List<BS3TabGroup> tabGroups = Lists.newArrayList(); // no wrapper @XmlElement(name = "tabGroup", required = false) public List<BS3TabGroup> getTabGroups() { return tabGroups; } public void setTabGroups(final List<BS3TabGroup> tabGroups) { this.tabGroups = tabGroups; } private List<FieldSet> fieldSets = Lists.newArrayList(); // no wrapper @XmlElementRef(type=FieldSet.class, name = "fieldSet", required = false) public List<FieldSet> getFieldSets() { return fieldSets; } public void setFieldSets(final List<FieldSet> fieldSets) { this.fieldSets = fieldSets; } private List<CollectionLayoutData> collections = Lists.newArrayList(); // no wrapper @XmlElementRef(type=CollectionLayoutData.class, name = "collection", required = false) public List<CollectionLayoutData> getCollections() { return collections; } public void setCollections(final List<CollectionLayoutData> collections) { this.collections = collections; } private String metadataError; /** * For diagnostics; populated by the framework if and only if a metadata error. */ @XmlElement(required = false) public String getMetadataError() { return metadataError; } public void setMetadataError(final String metadataError) { this.metadataError = metadataError; } public String toCssClass() { final StringBuilder buf = new StringBuilder(); final Size size = getSize() != null? getSize(): Size.MD; SizeSpan.with(size, getSpan()).appendCssClassFragment(buf); for (SizeSpan sizeSpan : getSizeSpans()) { sizeSpan.appendCssClassFragment(buf); } buf.append((getCssClass() != null? " " + getCssClass(): "")); return buf.toString(); } @Override public String toString() { return (id != null? "#" + id + " ": "") + toCssClass(); } }