#30: Adaptives Layout (https://polymap.org/mosaic/ticket/30)
[polymap3:falkos-polymap3-rhei.git] / plugins / org.polymap.rhei.batik / src / org / polymap / rhei / batik / toolkit / ConstraintData.java
1 /* 
2  * polymap.org
3  * Copyright 2013, Polymap GmbH. All rights reserved.
4  *
5  * This is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU Lesser General Public License as
7  * published by the Free Software Foundation; either version 3.0 of
8  * the License, or (at your option) any later version.
9  *
10  * This software is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  */
15 package org.polymap.rhei.batik.toolkit;
16
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import org.apache.commons.logging.Log;
20 import org.apache.commons.logging.LogFactory;
21
22 import com.google.common.base.Predicates;
23 import com.google.common.collect.Iterables;
24
25 import org.eclipse.swt.SWT;
26 import org.eclipse.swt.graphics.Point;
27 import org.eclipse.swt.widgets.Control;
28
29 import org.polymap.rhei.batik.internal.cp.ISolver;
30
31
32 /**
33  * Layout data to be used for child widgets of {@link ILayoutContainer}s such
34  * as {@link IPanelSection}.
35  * 
36  * @author <a href="http://www.polymap.de">Falko Bräutigam</a>
37  */
38 public class ConstraintData {
39
40     private static Log log = LogFactory.getLog( ConstraintData.class );
41     
42     protected int                   defaultWidth = -1, defaultHeight = -1;
43
44     protected int                   currentWhint, currentHhint, currentWidth = -1, currentHeight = -1;
45     
46     protected ArrayList<LayoutConstraint> constraints = new ArrayList( 3 );
47
48     
49     public ConstraintData( LayoutConstraint... constraints ) {
50         this.constraints.addAll( Arrays.asList( constraints ) );
51     }
52     
53     
54     @SuppressWarnings("hiding")
55     public ConstraintData add( LayoutConstraint... constraints ) {
56 //        // already exists?
57 //        for (ListIterator<LayoutConstraint> it=constraints.listIterator(); it.hasNext(); ) {
58 //            if (it.next().getClass().equals( constraint.getClass() )) {
59 //                it.set( constraint );
60 //                return this;
61 //            }
62 //        }
63 //        // no? -> add
64         this.constraints.addAll( Arrays.asList( constraints ) );
65         return this;
66     }
67     
68     
69     public void fillSolver( ISolver solver ) {
70         for (LayoutConstraint constraint : constraints) {
71             solver.addConstraint( constraint );
72         }
73     }
74
75     
76     public <T extends LayoutConstraint> T constraint( Class<T> type, T defaultValue ) {
77         return (T)Iterables.find( constraints, Predicates.instanceOf( type ), defaultValue );
78     }
79     
80     
81     public Point computeSize( Control control, int wHint, int hHint, boolean flushCache ) {
82         if (flushCache) {
83             flushCache();
84         }
85         if (wHint == SWT.DEFAULT && hHint == SWT.DEFAULT) {
86             if (defaultWidth == -1 || defaultHeight == -1) {
87                 Point size = control.computeSize( wHint, hHint, flushCache );
88                 defaultWidth = size.x;
89                 defaultHeight = size.y;
90             }
91             return new Point( defaultWidth, defaultHeight );
92         }
93         if (currentWidth == -1 || currentHeight == -1 || wHint != currentWhint || hHint != currentHhint) {
94             Point size = control.computeSize( wHint, hHint, flushCache );
95             currentWhint = wHint;
96             currentHhint = hHint;
97             currentWidth = size.x;
98             currentHeight = size.y;
99         }
100         return new Point( currentWidth, currentHeight );
101     }
102     
103     
104     protected void flushCache () {
105         defaultWidth = defaultHeight = -1;
106         currentWidth = currentHeight = -1;
107     }
108
109 }