ISIS-993: optional left and right columns either side of tab groups; tweaks to CSS; HasPath for all elements of the layout metadata classes (working towards support for persistence of widget state and hints)
Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/b709b9aa Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/b709b9aa Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/b709b9aa Branch: refs/heads/ISIS-993 Commit: b709b9aa778f99cc15afe6b79de58f8a905af7e9 Parents: e9e18b9 Author: Dan Haywood <d...@haywood-associates.co.uk> Authored: Thu Jan 14 07:16:00 2016 +0000 Committer: Dan Haywood <d...@haywood-associates.co.uk> Committed: Mon Jan 25 15:06:07 2016 +0000 ---------------------------------------------------------------------- .../schema/applib/layout/layout-1.0.xsd | 38 ++++----- .../asciidoc/schema/applib/layout/layout.xsd | 38 ++++----- .../isis/applib/layout/v1_0/ActionHolder.java | 25 ------ .../layout/v1_0/ActionLayoutMetadata.java | 26 +++++- .../isis/applib/layout/v1_0/ActionOwner.java | 25 ++++++ .../layout/v1_0/CollectionLayoutMetadata.java | 20 ++++- .../apache/isis/applib/layout/v1_0/Column.java | 27 ++++++- .../isis/applib/layout/v1_0/ColumnHolder.java | 23 ------ .../isis/applib/layout/v1_0/ColumnOwner.java | 23 ++++++ .../apache/isis/applib/layout/v1_0/HasPath.java | 32 ++++++++ .../layout/v1_0/ObjectLayoutMetadata.java | 67 +++++++++++---- .../apache/isis/applib/layout/v1_0/Owned.java | 23 ++++++ .../apache/isis/applib/layout/v1_0/Owner.java | 24 ++++++ .../isis/applib/layout/v1_0/PropertyGroup.java | 21 ++++- .../layout/v1_0/PropertyLayoutMetadata.java | 20 ++++- .../org/apache/isis/applib/layout/v1_0/Tab.java | 20 ++++- .../isis/applib/layout/v1_0/TabGroup.java | 45 +++++++---- .../isis/applib/layout/v1_0/TabGroupOwner.java | 23 ++++++ .../ObjectLayoutMetadataFacetDefault.java | 85 +++++++++++++++++--- .../v1_0/ObjectLayoutMetadataTest.java | 2 + .../properties/EntityPropertiesPanel.html | 2 +- .../entity/tabgroups/EntityTabGroupsPanel.html | 10 ++- .../entity/tabgroups/EntityTabGroupsPanel.java | 51 ++++++++++-- .../wicket/ui/pages/bootstrap-overrides.css | 26 +++++- .../dom/simple/SimpleObject.layout.xml | 30 +++---- 25 files changed, 558 insertions(+), 168 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd ---------------------------------------------------------------------- diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd index 7a3e949..9628c78 100644 --- a/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd +++ b/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout-1.0.xsd @@ -12,7 +12,9 @@ </xs:sequence> </xs:complexType> </xs:element> + <xs:element name="left" type="tns:column" minOccurs="0"/> <xs:element name="tabGroup" type="tns:tabGroup" maxOccurs="unbounded"/> + <xs:element name="right" type="tns:column" minOccurs="0"/> </xs:sequence> </xs:complexType> @@ -32,25 +34,10 @@ <xs:attribute name="position" type="tns:position"/> </xs:complexType> - <xs:complexType name="tabGroup"> - <xs:sequence> - <xs:element name="tab" type="tns:tab" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="tab"> - <xs:sequence> - <xs:element name="left" type="tns:column"/> - <xs:element name="middle" type="tns:column" minOccurs="0"/> - <xs:element name="right" type="tns:column" minOccurs="0"/> - </xs:sequence> - <xs:attribute name="name" type="xs:string" use="required"/> - </xs:complexType> - <xs:complexType name="column"> <xs:sequence> <xs:element name="propertyGroup" type="tns:propertyGroup" minOccurs="0" maxOccurs="unbounded"/> - <xs:element name="collection" type="tns:collectionLayoutXml" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="collection" type="tns:collectionLayoutMetadata" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="span" type="xs:int" use="required"/> </xs:complexType> @@ -92,7 +79,7 @@ <xs:attribute name="typicalLength" type="xs:int"/> </xs:complexType> - <xs:complexType name="collectionLayoutXml"> + <xs:complexType name="collectionLayoutMetadata"> <xs:sequence> <xs:element name="named" type="xs:string" minOccurs="0"/> <xs:element name="describedAs" type="xs:string" minOccurs="0"/> @@ -114,6 +101,21 @@ <xs:attribute name="paged" type="xs:int"/> </xs:complexType> + <xs:complexType name="tabGroup"> + <xs:sequence> + <xs:element name="tab" type="tns:tab" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="tab"> + <xs:sequence> + <xs:element name="left" type="tns:column"/> + <xs:element name="middle" type="tns:column" minOccurs="0"/> + <xs:element name="right" type="tns:column" minOccurs="0"/> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + <xs:simpleType name="bookmarkPolicy"> <xs:restriction base="xs:string"> <xs:enumeration value="AS_ROOT"/> @@ -162,4 +164,4 @@ <xs:enumeration value="NONE"/> </xs:restriction> </xs:simpleType> -</xs:schema> +</xs:schema> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd ---------------------------------------------------------------------- diff --git a/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd b/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd index 7a3e949..9628c78 100644 --- a/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd +++ b/adocs/documentation/src/main/asciidoc/schema/applib/layout/layout.xsd @@ -12,7 +12,9 @@ </xs:sequence> </xs:complexType> </xs:element> + <xs:element name="left" type="tns:column" minOccurs="0"/> <xs:element name="tabGroup" type="tns:tabGroup" maxOccurs="unbounded"/> + <xs:element name="right" type="tns:column" minOccurs="0"/> </xs:sequence> </xs:complexType> @@ -32,25 +34,10 @@ <xs:attribute name="position" type="tns:position"/> </xs:complexType> - <xs:complexType name="tabGroup"> - <xs:sequence> - <xs:element name="tab" type="tns:tab" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="tab"> - <xs:sequence> - <xs:element name="left" type="tns:column"/> - <xs:element name="middle" type="tns:column" minOccurs="0"/> - <xs:element name="right" type="tns:column" minOccurs="0"/> - </xs:sequence> - <xs:attribute name="name" type="xs:string" use="required"/> - </xs:complexType> - <xs:complexType name="column"> <xs:sequence> <xs:element name="propertyGroup" type="tns:propertyGroup" minOccurs="0" maxOccurs="unbounded"/> - <xs:element name="collection" type="tns:collectionLayoutXml" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="collection" type="tns:collectionLayoutMetadata" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="span" type="xs:int" use="required"/> </xs:complexType> @@ -92,7 +79,7 @@ <xs:attribute name="typicalLength" type="xs:int"/> </xs:complexType> - <xs:complexType name="collectionLayoutXml"> + <xs:complexType name="collectionLayoutMetadata"> <xs:sequence> <xs:element name="named" type="xs:string" minOccurs="0"/> <xs:element name="describedAs" type="xs:string" minOccurs="0"/> @@ -114,6 +101,21 @@ <xs:attribute name="paged" type="xs:int"/> </xs:complexType> + <xs:complexType name="tabGroup"> + <xs:sequence> + <xs:element name="tab" type="tns:tab" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="tab"> + <xs:sequence> + <xs:element name="left" type="tns:column"/> + <xs:element name="middle" type="tns:column" minOccurs="0"/> + <xs:element name="right" type="tns:column" minOccurs="0"/> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + <xs:simpleType name="bookmarkPolicy"> <xs:restriction base="xs:string"> <xs:enumeration value="AS_ROOT"/> @@ -162,4 +164,4 @@ <xs:enumeration value="NONE"/> </xs:restriction> </xs:simpleType> -</xs:schema> +</xs:schema> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionHolder.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionHolder.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionHolder.java deleted file mode 100644 index d5a6b37..0000000 --- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionHolder.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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.v1_0; - -import java.util.List; - -public interface ActionHolder { - List<ActionLayoutMetadata> getActions(); -} http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayoutMetadata.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayoutMetadata.java index bf454d1..5c07ffa 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayoutMetadata.java +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionLayoutMetadata.java @@ -26,6 +26,7 @@ import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import org.apache.isis.applib.annotation.BookmarkPolicy; +import org.apache.isis.applib.annotation.Programmatic; import org.apache.isis.applib.annotation.Where; /** @@ -44,7 +45,7 @@ import org.apache.isis.applib.annotation.Where; , "metadataError" } ) -public class ActionLayoutMetadata implements Serializable { +public class ActionLayoutMetadata implements Serializable, HasPath, Owned<ActionOwner> { private static final long serialVersionUID = 1L; @@ -188,7 +189,7 @@ public class ActionLayoutMetadata implements Serializable { - private ActionHolder owner; + private ActionOwner owner; /** * Owner. * @@ -197,11 +198,11 @@ public class ActionLayoutMetadata implements Serializable { * </p> */ @XmlTransient - public ActionHolder getOwner() { + public ActionOwner getOwner() { return owner; } - public void setOwner(final ActionHolder owner) { + public void setOwner(final ActionOwner owner) { this.owner = owner; } @@ -220,4 +221,21 @@ public class ActionLayoutMetadata implements Serializable { this.metadataError = metadataError; } + + + private String path; + + @Programmatic + @XmlTransient + public String getPath() { + return path; + } + + @Programmatic + public void setPath(final String path) { + this.path = path; + } + + + } http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionOwner.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionOwner.java new file mode 100644 index 0000000..4dde062 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ActionOwner.java @@ -0,0 +1,25 @@ +/* + * 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.v1_0; + +import java.util.List; + +public interface ActionOwner extends Owner { + List<ActionLayoutMetadata> getActions(); +} http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java index 7aa17f6..e6ce973 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/CollectionLayoutMetadata.java @@ -29,6 +29,7 @@ import javax.xml.bind.annotation.XmlType; import com.google.common.base.Function; +import org.apache.isis.applib.annotation.Programmatic; import org.apache.isis.applib.annotation.Where; /** @@ -48,7 +49,7 @@ import org.apache.isis.applib.annotation.Where; , "metadataError" } ) -public class CollectionLayoutMetadata implements ColumnContent, ActionHolder, Serializable { +public class CollectionLayoutMetadata implements ColumnContent, ActionOwner, Serializable, HasPath, Owned<Column> { private static final long serialVersionUID = 1L; @@ -226,6 +227,23 @@ public class CollectionLayoutMetadata implements ColumnContent, ActionHolder, Se } + + + private String path; + + @Programmatic + @XmlTransient + public String getPath() { + return path; + } + + @Programmatic + public void setPath(final String path) { + this.path = path; + } + + + public static class Functions { private Functions(){} http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java index fc8ec6d..6ff7527 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Column.java @@ -29,6 +29,7 @@ import javax.xml.bind.annotation.XmlType; import com.google.common.collect.Lists; import org.apache.isis.applib.annotation.MemberGroupLayout; +import org.apache.isis.applib.annotation.Programmatic; @XmlType( propOrder = { @@ -36,7 +37,7 @@ import org.apache.isis.applib.annotation.MemberGroupLayout; , "collections" } ) -public class Column implements Serializable { +public class Column implements Serializable, Owner, Owned<ColumnOwner> { private static final long serialVersionUID = 1L; @@ -86,7 +87,7 @@ public class Column implements Serializable { } - private ColumnHolder owner; + private ColumnOwner owner; /** * Owner. * @@ -95,14 +96,32 @@ public class Column implements Serializable { * </p> */ @XmlTransient - public ColumnHolder getOwner() { + public ColumnOwner getOwner() { return owner; } - public void setOwner(final ColumnHolder owner) { + public void setOwner(final ColumnOwner owner) { this.owner = owner; } + + + private String path; + + @Programmatic + @XmlTransient + public String getPath() { + return path; + } + + @Programmatic + public void setPath(final String path) { + this.path = path; + } + + + + public enum Hint { LEFT, MIDDLE, http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnHolder.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnHolder.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnHolder.java deleted file mode 100644 index 8211750..0000000 --- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnHolder.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.v1_0; - -public interface ColumnHolder { - -} http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnOwner.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnOwner.java new file mode 100644 index 0000000..62f6007 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ColumnOwner.java @@ -0,0 +1,23 @@ +/* + * 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.v1_0; + +public interface ColumnOwner extends Owner { + +} http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/HasPath.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/HasPath.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/HasPath.java new file mode 100644 index 0000000..39cdb85 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/HasPath.java @@ -0,0 +1,32 @@ +/* + * 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.v1_0; + +import javax.xml.bind.annotation.XmlTransient; + +import org.apache.isis.applib.annotation.Programmatic; + +public interface HasPath { + + @Programmatic + @XmlTransient + String getPath(); + + +} http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ObjectLayoutMetadata.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ObjectLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ObjectLayoutMetadata.java index 727bba2..6cbf901 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ObjectLayoutMetadata.java +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/ObjectLayoutMetadata.java @@ -19,7 +19,6 @@ package org.apache.isis.applib.layout.v1_0; import java.io.Serializable; -import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -41,10 +40,12 @@ import org.apache.isis.applib.services.dto.Dto; name = "objectLayout" , propOrder = { "actions" + , "left" , "tabGroups" + , "right" } ) -public class ObjectLayoutMetadata implements Dto, ActionHolder, Serializable { +public class ObjectLayoutMetadata implements Dto, ActionOwner, Serializable, ColumnOwner, HasPath, TabGroupOwner { private static final long serialVersionUID = 1L; @@ -61,16 +62,23 @@ public class ObjectLayoutMetadata implements Dto, ActionHolder, Serializable { } - // must have at least one tab group - private List<TabGroup> tabGroups = new ArrayList<TabGroup>() {{ - add(new TabGroup()); - }}; - // no wrapper + private Column left; - /** - * Must have at least one tab group; no wrapper. - */ + @XmlElement(required = false) + public Column getLeft() { + return left; + } + + public void setLeft(final Column left) { + this.left = left; + } + + + + private List<TabGroup> tabGroups; + + // no wrapper @XmlElement(name = "tabGroup", required = true) public List<TabGroup> getTabGroups() { return tabGroups; @@ -81,6 +89,19 @@ public class ObjectLayoutMetadata implements Dto, ActionHolder, Serializable { } + + private Column right; + + @XmlElement(required = false) + public Column getRight() { + return right; + } + + public void setRight(final Column right) { + this.right = right; + } + + public interface Visitor { void visit(final ObjectLayoutMetadata objectLayoutMetadata); void visit(final TabGroup tabGroup); @@ -119,6 +140,7 @@ public class ObjectLayoutMetadata implements Dto, ActionHolder, Serializable { public void visit(final Visitor visitor) { visitor.visit(this); traverseActions(this, visitor); + traverseColumn(getLeft(), this, visitor); final List<TabGroup> tabGroups = getTabGroups(); for (final TabGroup tabGroup : tabGroups) { tabGroup.setOwner(this); @@ -132,13 +154,14 @@ public class ObjectLayoutMetadata implements Dto, ActionHolder, Serializable { traverseColumn(tab.getRight(), tab, visitor); } } + traverseColumn(getRight(), this, visitor); } - private void traverseColumn(final Column column, final Tab tab, final Visitor visitor) { + private void traverseColumn(final Column column, final ColumnOwner columnOwner, final Visitor visitor) { if(column == null) { return; } - column.setOwner(tab); + column.setOwner(columnOwner); visitor.visit(column); traversePropertyGroups(column, visitor); traverseCollections(column, visitor); @@ -166,13 +189,13 @@ public class ObjectLayoutMetadata implements Dto, ActionHolder, Serializable { } } - private void traverseActions(final ActionHolder actionHolder, final Visitor visitor) { - final List<ActionLayoutMetadata> actionLayoutMetadatas = actionHolder.getActions(); + private void traverseActions(final ActionOwner actionOwner, final Visitor visitor) { + final List<ActionLayoutMetadata> actionLayoutMetadatas = actionOwner.getActions(); if(actionLayoutMetadatas == null) { return; } for (final ActionLayoutMetadata actionLayoutMetadata : actionLayoutMetadatas) { - actionLayoutMetadata.setOwner(actionHolder); + actionLayoutMetadata.setOwner(actionOwner); visitor.visit(actionLayoutMetadata); } } @@ -251,6 +274,20 @@ public class ObjectLayoutMetadata implements Dto, ActionHolder, Serializable { } + private String path; + + @Programmatic + @XmlTransient + public String getPath() { + return path; + } + + @Programmatic + public void setPath(final String path) { + this.path = path; + } + + private boolean normalized; @Programmatic http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owned.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owned.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owned.java new file mode 100644 index 0000000..a209293 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owned.java @@ -0,0 +1,23 @@ +/* + * 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.v1_0; + +public interface Owned<T extends Owner> { + T getOwner(); +} http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owner.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owner.java new file mode 100644 index 0000000..7b8940c --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Owner.java @@ -0,0 +1,24 @@ +/* + * 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.v1_0; + +public interface Owner extends HasPath { + + +} http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java index 2fb52e3..a91deea 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyGroup.java @@ -32,6 +32,7 @@ import com.google.common.base.Function; import com.google.common.collect.Lists; import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.Programmatic; @XmlType( propOrder = { @@ -40,7 +41,7 @@ import org.apache.isis.applib.annotation.MemberOrder; , "properties" } ) -public class PropertyGroup implements ColumnContent, ActionHolder, Serializable { +public class PropertyGroup implements ColumnContent, ActionOwner, Serializable, HasPath, Owned<Column> { private static final long serialVersionUID = 1L; @@ -111,6 +112,24 @@ public class PropertyGroup implements ColumnContent, ActionHolder, Serializable } + + + private String path; + + @Programmatic + @XmlTransient + public String getPath() { + return path; + } + + @Programmatic + public void setPath(final String path) { + this.path = path; + } + + + + public static class Util { private Util(){} public static Function<? super PropertyGroup, String> nameOf() { http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayoutMetadata.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayoutMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayoutMetadata.java index 5f6b3b1..dccf7b8 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayoutMetadata.java +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/PropertyLayoutMetadata.java @@ -28,6 +28,7 @@ import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import org.apache.isis.applib.annotation.LabelPosition; +import org.apache.isis.applib.annotation.Programmatic; import org.apache.isis.applib.annotation.Where; /** @@ -42,7 +43,7 @@ import org.apache.isis.applib.annotation.Where; , "metadataError" } ) -public class PropertyLayoutMetadata implements ActionHolder, Serializable { +public class PropertyLayoutMetadata implements ActionOwner, Serializable, HasPath, Owned<PropertyGroup> { private static final long serialVersionUID = 1L; @@ -224,4 +225,21 @@ public class PropertyLayoutMetadata implements ActionHolder, Serializable { this.metadataError = metadataError; } + + + + private String path; + + @Programmatic + @XmlTransient + public String getPath() { + return path; + } + + @Programmatic + public void setPath(final String path) { + this.path = path; + } + + } http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Tab.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Tab.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Tab.java index 4f0a5c3..1a8f652 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Tab.java +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/Tab.java @@ -40,7 +40,7 @@ import org.apache.isis.applib.annotation.Programmatic; , "right" } ) -public class Tab implements ColumnHolder, Serializable { +public class Tab implements ColumnOwner, Serializable, HasPath, Owned<TabGroup> { private static final long serialVersionUID = 1L; @@ -123,6 +123,24 @@ public class Tab implements ColumnHolder, Serializable { return contents; } + + + + private String path; + + @Programmatic + @XmlTransient + public String getPath() { + return path; + } + + @Programmatic + public void setPath(final String path) { + this.path = path; + } + + + private static void appendContent(final List<ColumnContent> contents, final Column column) { if(column == null) { return; http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroup.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroup.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroup.java index 6fb93ee..acb91c3 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroup.java +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroup.java @@ -29,8 +29,15 @@ import javax.xml.bind.annotation.XmlType; import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; -@XmlType() -public class TabGroup implements ColumnHolder, Serializable { +import org.apache.isis.applib.annotation.Programmatic; + +@XmlType( + propOrder = { + "tabs" + } + +) +public class TabGroup implements ColumnOwner, Serializable, HasPath, Owned<TabGroupOwner> { private static final long serialVersionUID = 1L; @@ -53,18 +60,7 @@ public class TabGroup implements ColumnHolder, Serializable { - private Column fixed; - - @XmlElement(required = false) - public Column getFixed() { - return fixed; - } - - public void setFixed(final Column fixed) { - this.fixed = fixed; - } - - private ObjectLayoutMetadata owner; + private TabGroupOwner owner; /** * Owner. @@ -74,15 +70,32 @@ public class TabGroup implements ColumnHolder, Serializable { * </p> */ @XmlTransient - public ObjectLayoutMetadata getOwner() { + public TabGroupOwner getOwner() { return owner; } - public void setOwner(final ObjectLayoutMetadata owner) { + public void setOwner(final TabGroupOwner owner) { this.owner = owner; } + + + private String path; + + @Programmatic + @XmlTransient + public String getPath() { + return path; + } + + @Programmatic + public void setPath(final String path) { + this.path = path; + } + + + public static class Predicates { public static Predicate<TabGroup> notEmpty() { return new Predicate<TabGroup>() { http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupOwner.java ---------------------------------------------------------------------- diff --git a/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupOwner.java b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupOwner.java new file mode 100644 index 0000000..12dc645 --- /dev/null +++ b/core/applib/src/main/java/org/apache/isis/applib/layout/v1_0/TabGroupOwner.java @@ -0,0 +1,23 @@ +/* + * 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.v1_0; + +public interface TabGroupOwner extends Owner { + +} http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java index fdc12ef..6137a53 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/layoutmetadata/ObjectLayoutMetadataFacetDefault.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import com.google.common.base.Strings; @@ -31,12 +32,13 @@ import com.google.common.collect.Maps; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.isis.applib.layout.v1_0.ActionHolder; import org.apache.isis.applib.layout.v1_0.ActionLayoutMetadata; +import org.apache.isis.applib.layout.v1_0.ActionOwner; import org.apache.isis.applib.layout.v1_0.CollectionLayoutMetadata; import org.apache.isis.applib.layout.v1_0.Column; -import org.apache.isis.applib.layout.v1_0.ColumnHolder; +import org.apache.isis.applib.layout.v1_0.ColumnOwner; import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; +import org.apache.isis.applib.layout.v1_0.Owned; import org.apache.isis.applib.layout.v1_0.PropertyGroup; import org.apache.isis.applib.layout.v1_0.PropertyLayoutMetadata; import org.apache.isis.applib.layout.v1_0.Tab; @@ -273,6 +275,65 @@ public class ObjectLayoutMetadataFacetDefault actions.add(new ActionLayoutMetadata(actionId)); } } + + // set paths + metadata.visit(new ObjectLayoutMetadata.Visitor() { + + private final Map<String,AtomicInteger> sequenceByPath = Maps.newHashMap(); + + @Override + public void visit(final ObjectLayoutMetadata objectLayoutMetadata) { + objectLayoutMetadata.setPath("/layout"); + } + + @Override + public void visit(final TabGroup tabGroup) { + tabGroup.setPath(pathFor(tabGroup, "tabGroup")); + } + + @Override + public void visit(final Tab tab) { + tab.setPath(pathFor(tab, "tab")); + } + + @Override + public void visit(final Column column) { + column.setPath(pathFor(column, "column")); + } + + @Override + public void visit(final PropertyGroup propertyGroup) { + propertyGroup.setPath(pathFor(propertyGroup, "propertyGroup")); + } + + @Override + public void visit(final PropertyLayoutMetadata propertyLayoutMetadata) { + propertyLayoutMetadata.setPath(pathFor(propertyLayoutMetadata, "property")); + } + + @Override + public void visit(final CollectionLayoutMetadata collectionLayoutMetadata) { + collectionLayoutMetadata.setPath(pathFor(collectionLayoutMetadata, "collection")); + } + + @Override + public void visit(final ActionLayoutMetadata actionLayoutMetadata) { + actionLayoutMetadata.setPath(pathFor(actionLayoutMetadata, "action")); + } + + private String pathFor(final Owned<?> owned, final String type) { + final String ownerPath = owned.getOwner().getPath(); + final String prefix = ownerPath + "/" + type; + AtomicInteger atomicInteger = sequenceByPath.get(prefix); + if(atomicInteger == null) { + atomicInteger = new AtomicInteger(-1); + sequenceByPath.put(prefix, atomicInteger); + } + final int seq = atomicInteger.incrementAndGet(); + return prefix + seq; + } + + }); } static class Tuple<T> { @@ -314,7 +375,7 @@ public class ObjectLayoutMetadataFacetDefault @Override public void visit(final ActionLayoutMetadata actionLayoutMetadata) { - final ActionHolder actionHolder = actionLayoutMetadata.getOwner(); + final ActionOwner actionOwner = actionLayoutMetadata.getOwner(); final ObjectAction objectAction = objectActionById.get(actionLayoutMetadata.getId()); if(objectAction == null) { return; @@ -322,18 +383,18 @@ public class ObjectLayoutMetadataFacetDefault final String memberOrderName; final int memberOrderSequence; - if(actionHolder instanceof PropertyGroup) { - final PropertyGroup propertyGroup = (PropertyGroup) actionHolder; + if(actionOwner instanceof PropertyGroup) { + final PropertyGroup propertyGroup = (PropertyGroup) actionOwner; final List<PropertyLayoutMetadata> properties = propertyGroup.getProperties(); final PropertyLayoutMetadata propertyLayoutMetadata = properties.get(0); // any will do memberOrderName = propertyLayoutMetadata.getId(); memberOrderSequence = actionPropertyGroupSequence++; - } else if(actionHolder instanceof PropertyLayoutMetadata) { - final PropertyLayoutMetadata propertyLayoutMetadata = (PropertyLayoutMetadata) actionHolder; + } else if(actionOwner instanceof PropertyLayoutMetadata) { + final PropertyLayoutMetadata propertyLayoutMetadata = (PropertyLayoutMetadata) actionOwner; memberOrderName = propertyLayoutMetadata.getId(); memberOrderSequence = actionPropertySequence++; - } else if(actionHolder instanceof CollectionLayoutMetadata) { - final CollectionLayoutMetadata collectionLayoutMetadata = (CollectionLayoutMetadata) actionHolder; + } else if(actionOwner instanceof CollectionLayoutMetadata) { + final CollectionLayoutMetadata collectionLayoutMetadata = (CollectionLayoutMetadata) actionOwner; memberOrderName = collectionLayoutMetadata.getId(); memberOrderSequence = actionCollectionSequence++; } else { @@ -345,13 +406,13 @@ public class ObjectLayoutMetadataFacetDefault new MemberOrderFacetXml(memberOrderName, ""+memberOrderSequence, translationService, objectAction)); - if(actionHolder instanceof PropertyGroup) { + if(actionOwner instanceof PropertyGroup) { if(actionLayoutMetadata.getPosition() == null || actionLayoutMetadata.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.BELOW || actionLayoutMetadata.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.RIGHT) { actionLayoutMetadata.setPosition(org.apache.isis.applib.annotation.ActionLayout.Position.PANEL); } - } else if(actionHolder instanceof PropertyLayoutMetadata) { + } else if(actionOwner instanceof PropertyLayoutMetadata) { if(actionLayoutMetadata.getPosition() == null || actionLayoutMetadata.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.PANEL_DROPDOWN || actionLayoutMetadata.getPosition() == org.apache.isis.applib.annotation.ActionLayout.Position.PANEL) { @@ -421,7 +482,7 @@ public class ObjectLayoutMetadataFacetDefault // if there is only a single column and no other contents, then copy the collection Id onto the tab' final Column column = collectionLayoutMetadata.getOwner(); - final ColumnHolder holder = column.getOwner(); + final ColumnOwner holder = column.getOwner(); if(holder instanceof Tab) { final Tab tab = (Tab) holder; if(tab.getContents().size() == 1 && Strings.isNullOrEmpty(tab.getName()) ) { http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java index c5e8c1b..7e72c7a 100644 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/layoutxml/v1_0/ObjectLayoutMetadataTest.java @@ -62,6 +62,8 @@ public class ObjectLayoutMetadataTest { final ObjectLayoutMetadata objectLayoutMetadata = new ObjectLayoutMetadata(); + objectLayoutMetadata.setTabGroups(Lists.<TabGroup>newArrayList()); + objectLayoutMetadata.getTabGroups().add(new TabGroup()); TabGroup tabGroup = objectLayoutMetadata.getTabGroups().get(0); Tab tab = tabGroup.getTabs().get(0); tab.setName("Common"); http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesPanel.html ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesPanel.html index 8fbcfb4..e204c12 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesPanel.html +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/properties/EntityPropertiesPanel.html @@ -22,7 +22,7 @@ <wicket:panel> <div class="entityPropertiesPanel entityPropertiesComponentType"> <form wicket:id="entityProperties" class="inputForm" role="form"> - <div class="row" style="padding-bottom: 20px"> + <div class="row"> <div wicket:id="leftColumn"> <div wicket:id="entityMembers"/> <div class="feedbackPanel"> http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.html ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.html index 4e45e96..f954e5d 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.html +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.html @@ -23,12 +23,14 @@ <div class="entityTabbed"> <div wicket:id="entitySummary"></div> - <div wicket:id="tabGroups"> - <div class="row"> - <div wicket:id="tabGroup" class="col-xs-12">[tabbed panel will be here]</div> - <div XXXXwicket:id="entityColumnMembers" class = "fixedColumn col-xs-4"> + <div class="row"> + <div wicket:id="leftColumn" class = "leftColumn"/> + <div wicket:id="tabGroupsContainer" class="tabGroups"> + <div class="row" wicket:id="tabGroups"> + <div wicket:id="tabGroup" class="col-xs-12">[tabbed panel will be here]</div> </div> </div> + <div wicket:id="rightColumn" class = "rightColumn"/> </div> </div> </wicket:panel> http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.java ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.java index 671ccd1..a729188 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.java +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/tabgroups/EntityTabGroupsPanel.java @@ -20,18 +20,22 @@ package org.apache.isis.viewer.wicket.ui.components.entity.tabgroups; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import com.google.common.collect.FluentIterable; import com.google.common.collect.Lists; +import org.apache.wicket.MarkupContainer; import org.apache.wicket.extensions.markup.html.tabs.AbstractTab; import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.extensions.markup.html.tabs.TabbedPanel; +import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; +import org.apache.isis.applib.layout.v1_0.Column; import org.apache.isis.applib.layout.v1_0.ObjectLayoutMetadata; import org.apache.isis.applib.layout.v1_0.Tab; import org.apache.isis.applib.layout.v1_0.TabGroup; @@ -44,6 +48,7 @@ import org.apache.isis.core.runtime.system.context.IsisContext; import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento; import org.apache.isis.viewer.wicket.model.models.EntityModel; import org.apache.isis.viewer.wicket.ui.ComponentType; +import org.apache.isis.viewer.wicket.ui.components.entity.properties.EntityColumnMembers; import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract; import org.apache.isis.viewer.wicket.ui.util.CssClassAppender; @@ -60,6 +65,8 @@ public class EntityTabGroupsPanel extends PanelAbstract<EntityModel> { private static final String ID_ENTITY_PROPERTIES_AND_COLLECTIONS = "entityPropertiesAndCollections"; private static final String ID_TAB_GROUPS = "tabGroups"; private static final String ID_TAB_GROUP = "tabGroup"; + private static final String ID_LEFT_COLUMN = "leftColumn"; + private static final String ID_RIGHT_COLUMN = "rightColumn"; public EntityTabGroupsPanel(final String id, final EntityModel entityModel) { super(id, entityModel); @@ -82,11 +89,13 @@ public class EntityTabGroupsPanel extends PanelAbstract<EntityModel> { addOrReplace(ComponentType.ENTITY_SUMMARY, model); + final int leftSpan = addColumnIfRequired(ID_LEFT_COLUMN, objectLayoutMetadata.getLeft(), Column.Hint.LEFT); + final List<TabGroup> tabGroups = FluentIterable .from(objectLayoutMetadata.getTabGroups()) .filter(TabGroup.Predicates.notEmpty()) .toList(); - final int[] tabGroupCount = new int[]{0}; + final AtomicInteger tabGroupRef = new AtomicInteger(0); final ListView<TabGroup> tabGroupsList = new ListView<TabGroup>(ID_TAB_GROUPS, tabGroups) { @@ -110,11 +119,11 @@ public class EntityTabGroupsPanel extends PanelAbstract<EntityModel> { } }); } - final AjaxBootstrapTabbedPanel ajaxBootstrapTabbedPanel = newTabbedPanel(tabs, tabGroupCount[0]); + final AjaxBootstrapTabbedPanel ajaxBootstrapTabbedPanel = newTabbedPanel(tabs, tabGroupRef.get()); item.add(ajaxBootstrapTabbedPanel); - tabGroupCount[0]++; + tabGroupRef.incrementAndGet(); } private AjaxBootstrapTabbedPanel newTabbedPanel(final List<ITab> tabs, final int tabGroupNumber) { @@ -137,7 +146,11 @@ public class EntityTabGroupsPanel extends PanelAbstract<EntityModel> { final String value = (String) getSession().getAttribute(key); if(value != null) { final int tabIndex = Integer.parseInt(value); - ajaxBootstrapTabbedPanel.setSelectedTab(tabIndex); + final int numTabs = ajaxBootstrapTabbedPanel.getTabs().size(); + if(tabIndex < numTabs) { + // to support dynamic reloading; the data in the session might not be compatible with current layout. + ajaxBootstrapTabbedPanel.setSelectedTab(tabIndex); + } } } @@ -157,11 +170,34 @@ public class EntityTabGroupsPanel extends PanelAbstract<EntityModel> { }; - add(tabGroupsList); + final MarkupContainer tabGroupsContainer = new WebMarkupContainer("tabGroupsContainer"); + add(tabGroupsContainer); + + tabGroupsContainer.add(tabGroupsList); + + final int rightSpan = addColumnIfRequired(ID_RIGHT_COLUMN, objectLayoutMetadata.getRight(), Column.Hint.RIGHT); + final int columnSpans = leftSpan + rightSpan; + int tabGroupSpan = columnSpans < 12 ? 12 - (columnSpans) : 12; + CssClassAppender.appendCssClassTo(tabGroupsContainer, "col-xs-" + tabGroupSpan); } + private int addColumnIfRequired(final String id, final Column col, final Column.Hint hint) { + if(col != null) { + final EntityModel entityModel = + getModel().cloneWithColumnMetadata(col, hint); + final int span = entityModel.getColumnMetadata().getSpan(); + if(span > 0) { + final EntityColumnMembers entityColumnMembers = new EntityColumnMembers(id, entityModel, this); + addOrReplace(entityColumnMembers); + CssClassAppender.appendCssClassTo(entityColumnMembers, "col-xs-" + span); + return span; + } + } + permanentlyHide(id); + return 0; + } private static class EntityTabPanel extends PanelAbstract { private static final long serialVersionUID = 1L; @@ -171,7 +207,10 @@ public class EntityTabGroupsPanel extends PanelAbstract<EntityModel> { final EntityModel modelWithTabHints = model.cloneWithTabMetadata(tab); - getComponentFactoryRegistry().addOrReplaceComponent(this, ID_ENTITY_PROPERTIES_AND_COLLECTIONS, ComponentType.ENTITY_PROPERTIES, modelWithTabHints); + getComponentFactoryRegistry() + .addOrReplaceComponent(this, + ID_ENTITY_PROPERTIES_AND_COLLECTIONS, ComponentType.ENTITY_PROPERTIES, modelWithTabHints); + } } } http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css ---------------------------------------------------------------------- diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css index ace0e00..dd192d1 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css @@ -724,4 +724,28 @@ tr.headers th form input { #aboutLink { padding-right: 30px; -} \ No newline at end of file +} + +/* +.entityTabbed > .row > .leftColumn, +.entityTabbed > .row > .rightColumn { + margin-top: 41px; +} +*/ + +.tab-content { + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; + border-bottom: 1px solid #ddd; + padding-top: 10px; + padding-left: 10px; + padding-right: 10px; +} + +.nav-tabs { + margin-bottom: 0; +} + +.tabGroups > .row { + padding-bottom: 10px; +} http://git-wip-us.apache.org/repos/asf/isis/blob/b709b9aa/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml ---------------------------------------------------------------------- diff --git a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml index 1c56232..79bc6a5 100644 --- a/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml +++ b/example/application/simpleapp/dom/src/main/java/domainapp/dom/simple/SimpleObject.layout.xml @@ -3,19 +3,10 @@ <actions> <action id="delete"/> </actions> + <left span="0"> + </left> <tabGroup> - <tab name="Metadata"> - <left span="6"> - <propertyGroup name="Persistence"> - <actions> - <action id="downloadJdoMetadata"/> - <action id="downloadLayoutXml"/> - </actions> - <property id="versionSequence"/> - </propertyGroup> - </left> - </tab> - <tab name="Common"> + <tab name="General"> <left span="6"> <propertyGroup name="General"> <property id="name" labelPosition="TOP"> @@ -24,19 +15,24 @@ </actions> </property> </propertyGroup> - <collection id="similarTo" defaultView="table"/> </left> <right span="6"> - <collection id="others" defaultView="hide"/> + <propertyGroup name="Metadata"> + <actions> + <action id="downloadJdoMetadata" position="PANEL_DROPDOWN"/> + <action id="downloadLayoutXml" position="PANEL_DROPDOWN"/> + </actions> + <property id="versionSequence"/> + </propertyGroup> </right> </tab> </tabGroup> -<!-- <tabGroup> <tab name="Collections"> - <left span="6"> + <left span="12"> + <collection id="others" defaultView="table"/> + <collection id="similarTo" defaultView="hide"/> </left> </tab> </tabGroup> ---> </objectLayout> \ No newline at end of file