aboutsummaryrefslogtreecommitdiffstats
path: root/src/graphui/classes/com/jogamp/graph/ui/layout/Alignment.java
blob: 17b4df85c07b92cbd91105f7075a3586551dfc17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
 * Copyright 2023 JogAmp Community. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of JogAmp Community.
 */
package com.jogamp.graph.ui.layout;

import java.util.List;

/**
 * Immutable layout alignment options, including {@link Bit#Fill}.
 */
public final class Alignment {
    /** No alignment constant. */
    public static final Alignment None = new Alignment();
    /** {@link Bit#CenterHoriz} and {@link Bit#CenterVert} alignment constant. */
    public static final Alignment Center = new Alignment(Alignment.Bit.CenterHoriz.value | Alignment.Bit.CenterVert.value );
    /** {@link Bit#Fill} alignment constant. */
    public static final Alignment Fill = new Alignment(Alignment.Bit.Fill.value);
    /** {@link Bit#Fill}, {@link Bit#CenterHoriz} and {@link Bit#CenterVert} alignment constant. */
    public static final Alignment FillCenter = new Alignment(Alignment.Bit.Fill.value | Alignment.Bit.CenterHoriz.value | Alignment.Bit.CenterVert.value);

    public enum Bit {
        /** Left alignment. */
        Left ( ( 1 << 0 ) ),

        /** Right alignment. */
        Right ( ( 1 << 1 ) ),

        /** Bottom alignment. */
        Bottom ( ( 1 << 2 ) ),

        /** Top alignment. */
        Top ( ( 1 << 3 ) ),

        /** Scale object to parent size, e.g. fill {@link GridLayout} or {@link BoxLayout} cell size. */
        Fill ( ( 1 << 4 ) ),

        /** Horizontal center alignment. */
        CenterHoriz ( ( 1 << 5 ) ),

        /** Vertical center alignment. */
        CenterVert ( ( 1 << 6 ) );

        Bit(final int v) { value = v; }
        public final int value;
    }
    public final int mask;

    public static int getBits(final List<Bit> v) {
        int res = 0;
        for(final Bit b : v) {
            res |= b.value;
        }
        return res;
    }
    public Alignment(final List<Bit> v) {
        mask = getBits(v);
    }
    public Alignment(final Bit v) {
        mask = v.value;
    }
    public Alignment(final int v) {
        mask = v;
    }
    private Alignment() {
        mask = 0;
    }

    public boolean isSet(final Bit bit) { return bit.value == ( mask & bit.value ); }
    public boolean isSet(final List<Bit> bits) { final int bits_i = getBits(bits); return bits_i == ( mask & bits_i ); }
    public boolean isSet(final int bits) { return bits == ( mask & bits ); }

    @Override
    public String toString() {
        int count = 0;
        final StringBuilder out = new StringBuilder();
        for (final Bit dt : Bit.values()) {
            if( isSet(dt) ) {
                if( 0 < count ) { out.append(", "); }
                out.append(dt.name()); count++;
            }
        }
        if( 0 == count ) {
            out.append("None");
        } else if( 1 < count ) {
            out.insert(0, "[");
            out.append("]");
        }
        return out.toString();
    }

    @Override
    public boolean equals(final Object other) {
        if (this == other) {
            return true;
        }
        return (other instanceof Alignment) &&
               this.mask == ((Alignment)other).mask;
    }
}