Set the height of the data element in the Details View.
[online-glom:gwt-glom.git] / src / main / java / org / glom / web / client / ui / FlowTable.java
1 /*
2  * Copyright (C) 2011 Openismus GmbH
3  *
4  * This file is part of GWT-Glom.
5  *
6  * GWT-Glom is free software: you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by the
8  * Free Software Foundation, either version 3 of the License, or (at your
9  * option) any later version.
10  *
11  * GWT-Glom is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
14  * for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with GWT-Glom.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 package org.glom.web.client.ui;
21
22 import java.util.ArrayList;
23
24 import org.glom.web.shared.layout.Formatting;
25 import org.glom.web.shared.layout.LayoutGroup;
26 import org.glom.web.shared.layout.LayoutItem;
27 import org.glom.web.shared.layout.LayoutItemField;
28 import org.glom.web.shared.layout.LayoutItemPortal;
29
30 import com.google.gwt.user.client.ui.FlowPanel;
31 import com.google.gwt.user.client.ui.Label;
32
33 /**
34  * @author Ben Konrath <ben@bagu.org>
35  * 
36  */
37 class FlowTable extends FlowPanel {
38         FlowPanel groupContents;
39         private final ArrayList<Label> dataLabels = new ArrayList<Label>();
40
41         @SuppressWarnings("unused")
42         private FlowTable() {
43         }
44
45         public FlowTable(LayoutGroup layoutGroup, boolean subGroup, boolean mainTitleSet) {
46                 super();
47                 this.setStyleName(subGroup ? "subgroup" : "group");
48
49                 String groupTitle = layoutGroup.getTitle();
50                 if (!groupTitle.isEmpty()) {
51                         Label label = new Label(groupTitle);
52                         this.add(label);
53
54                         // the "group-title" class could could be used for the subgroup title if the group title is empty
55                         label.setStyleName(mainTitleSet ? "subgroup-title" : "group-title");
56                         mainTitleSet = true;
57
58                         groupContents = new FlowPanel();
59                         groupContents.setStyleName("group-contents");
60                         this.add(groupContents);
61                 } else {
62                         // don't make a separate contents panel when the group title has not been set
63                         groupContents = this;
64                 }
65
66                 // create the appropriate UI element for each child item
67                 for (LayoutItem layoutItem : layoutGroup.getItems()) {
68
69                         if (layoutItem == null)
70                                 continue;
71
72                         if (layoutItem instanceof LayoutItemField) {
73                                 addDetailsCell((LayoutItemField) layoutItem);
74                         } else if (layoutItem instanceof LayoutItemPortal) {
75                                 // TODO implement support for portals
76                                 continue;
77                         } else if (layoutItem instanceof LayoutGroup) {
78                                 // create a FlowTable for the child group
79                                 FlowTable flowTable = new FlowTable((LayoutGroup) layoutItem, true, mainTitleSet);
80                                 groupContents.add(flowTable);
81                                 dataLabels.addAll(flowTable.getDataLabels());
82                         }
83                 }
84
85         }
86
87         private void addDetailsCell(LayoutItemField layoutItemField) {
88
89                 // Labels (text in div a element) are being used so that the height of the details-data element can be set for
90                 // the multiline height of LayoutItemFeilds. This allows the the data element to display the correct height
91                 // if style is applied that shows the height. This has the added benefit of allowing the order of the label and
92                 // data elements to be changed for right-to-left languages.
93
94                 Label detailsLabel = new Label(layoutItemField.getTitle() + ":");
95                 detailsLabel.setStyleName("details-label");
96
97                 Label detailsData = new Label();
98                 detailsData.setStyleName("details-data");
99                 Formatting formatting = layoutItemField.getFormatting();
100                 detailsData.setHeight(formatting.getTextFormatMultilineHeightLines() + "em");
101
102                 FlowPanel fieldPanel = new FlowPanel();
103                 fieldPanel.setStyleName("details-cell");
104
105                 fieldPanel.add(detailsLabel);
106                 fieldPanel.add(detailsData);
107
108                 groupContents.add(fieldPanel);
109                 dataLabels.add(detailsData);
110         }
111
112         public ArrayList<Label> getDataLabels() {
113                 return dataLabels;
114         }
115 }