1 package org.apache.myfaces.tobago.component;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 import org.apache.commons.logging.Log;
21 import org.apache.commons.logging.LogFactory;
22 import org.apache.myfaces.tobago.OnComponentCreated;
23 import org.apache.myfaces.tobago.layout.Display;
24 import org.apache.myfaces.tobago.layout.Interval;
25 import org.apache.myfaces.tobago.layout.IntervalList;
26 import org.apache.myfaces.tobago.layout.LayoutComponent;
27 import org.apache.myfaces.tobago.layout.LayoutContainer;
28 import org.apache.myfaces.tobago.layout.LayoutContext;
29 import org.apache.myfaces.tobago.layout.LayoutManager;
30 import org.apache.myfaces.tobago.layout.LayoutUtils;
31 import org.apache.myfaces.tobago.layout.Measure;
32
33 import javax.faces.component.UIComponent;
34 import javax.faces.context.FacesContext;
35
36 public abstract class AbstractUISheetLayout extends UILayout implements LayoutManager, OnComponentCreated {
37
38 private static final Log LOG = LogFactory.getLog(AbstractUIGridLayout.class);
39
40 private boolean horizontalAuto;
41 private boolean verticalAuto;
42
43 public void onComponentCreated(FacesContext context, UIComponent component) {
44 }
45
46 public void init() {
47 for (LayoutComponent component : getLayoutContainer().getComponents()) {
48 if (component instanceof LayoutContainer) {
49 ((LayoutContainer) component).getLayoutManager().init();
50 }
51 }
52 }
53
54 public void fixRelativeInsideAuto(boolean orientation, boolean auto) {
55
56 if (orientation) {
57 horizontalAuto = auto;
58 } else {
59 verticalAuto = auto;
60 }
61
62 for (LayoutComponent component : getLayoutContainer().getComponents()) {
63 if (component instanceof LayoutContainer) {
64 ((LayoutContainer) component).getLayoutManager().fixRelativeInsideAuto(orientation, auto);
65 }
66 }
67 }
68
69 public void preProcessing(boolean orientation) {
70
71
72 int i = 0;
73 IntervalList intervals = new IntervalList();
74 for (LayoutComponent component : getLayoutContainer().getComponents()) {
75
76 if (component instanceof LayoutContainer) {
77 ((LayoutContainer) component).getLayoutManager().preProcessing(orientation);
78 }
79
80 if (orientation && horizontalAuto || !orientation && verticalAuto) {
81 intervals.add(new Interval(component, orientation));
82 }
83 }
84
85 if (intervals.size() >= 1) {
86 Measure size = intervals.computeAuto();
87 size = size.add(LayoutUtils.getBeginOffset(orientation, getLayoutContainer()));
88 size = size.add(LayoutUtils.getEndOffset(orientation, getLayoutContainer()));
89 LayoutUtils.setSize(orientation, getLayoutContainer(), size);
90 }
91 }
92
93 public void mainProcessing(boolean orientation) {
94
95
96 if (orientation && !horizontalAuto || !orientation && !verticalAuto) {
97
98 LayoutContainer container = getLayoutContainer();
99 Measure available = LayoutUtils.getSize(orientation, container);
100 if (available != null) {
101 available = available.substractNotNegative(LayoutUtils.getBeginOffset(orientation, container));
102 available = available.substractNotNegative(LayoutUtils.getEndOffset(orientation, container));
103
104 for (LayoutComponent component : getLayoutContainer().getComponents()) {
105
106 component.setDisplay(Display.BLOCK);
107 LayoutUtils.setSize(orientation, component, available);
108
109
110
111 if (component instanceof LayoutContainer) {
112 ((LayoutContainer) component).getLayoutManager().mainProcessing(orientation);
113 }
114 }
115 } else {
116 LOG.warn("No width/height set but needed for *!");
117 }
118 }
119 }
120
121 public void postProcessing(boolean orientation) {
122
123
124
125 for (LayoutComponent component : getLayoutContainer().getComponents()) {
126
127 component.setDisplay(Display.BLOCK);
128
129
130 Measure position = LayoutUtils.getBeginOffset(orientation, getLayoutContainer());
131 if (orientation) {
132 component.setLeft(position);
133 } else {
134 component.setTop(position);
135 }
136
137
138 if (component instanceof LayoutContainer) {
139 ((LayoutContainer) component).getLayoutManager().postProcessing(orientation);
140 }
141
142
143 }
144 }
145
146 public void collect(LayoutContext layoutContext, LayoutContainer container, int horizontalIndex, int verticalIndex) {
147 }
148
149 public void distribute(LayoutContext layoutContext, LayoutContainer container) {
150 }
151
152 private LayoutContainer getLayoutContainer() {
153
154 return ((LayoutContainer) getParent());
155 }
156
157 @Override
158 public boolean getRendersChildren() {
159 return false;
160 }
161 }