HorizontalPanelView.st
author claus
Fri, 16 Jul 1993 11:44:44 +0200
changeset 0 e6a541c1c0eb
child 3 9d7eefb5e69f
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     1
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1989-92 by Claus Gittinger
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     4
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    11
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    12
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    13
PanelView subclass:#HorizontalPanelView
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    17
       category:'Views-Layout'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    18
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    19
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    20
HorizontalPanelView comment:'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    21
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    22
COPYRIGHT (c) 1989-92 by Claus Gittinger
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    23
              All Rights Reserved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    24
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    25
a View for childViews oriented horizontal
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    26
all real work is done in PanelView - just redefine layout
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    27
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    28
%W% %E%
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    29
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    30
written spring/summer 89 by claus
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    31
'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    32
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    33
!HorizontalPanelView methodsFor:'queries'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    34
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    35
preferedExtent
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    36
    "return a good extent, one that makes subviews fit"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    37
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    38
    |sumOfWidths maxHeight|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    39
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    40
    subViews isNil ifTrue:[^ horizontalSpace @ verticalSpace].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    41
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    42
    "compute net height needed"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    43
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    44
    sumOfWidths := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    45
    maxHeight := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    46
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    47
    subViews do:[:child |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    48
        sumOfWidths := sumOfWidths + child widthIncludingBorder.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    49
        maxHeight := maxHeight max:(child heightIncludingBorder)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    50
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    51
    borderWidth ~~ 0 ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    52
        sumOfWidths := sumOfWidths + (horizontalSpace * 2).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    53
        maxHeight := maxHeight + (verticalSpace * 2).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    54
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    55
    sumOfWidths := sumOfWidths + ((subViews size - 1) * horizontalSpace).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    56
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    57
    ^ sumOfWidths @ maxHeight
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    58
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    59
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    60
!HorizontalPanelView methodsFor:'layout'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    61
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    62
setChildPositions
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    63
    "(re)compute position of every child whenever childs are added or
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    64
     my size has changed"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    65
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    66
    |xpos ypos space sumOfChildWidths numChilds l|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    67
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    68
    subViews isNil ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    69
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    70
    space := horizontalSpace.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    71
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    72
    "compute net width needed"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    73
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    74
    sumOfChildWidths := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    75
    numChilds := subViews size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    76
    subViews do:[:child |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    77
        sumOfChildWidths := sumOfChildWidths + child widthIncludingBorder.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    78
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    79
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    80
    l := layout.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    81
    ((l == #center) and:[numChilds == 1]) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    82
        l := #spread
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    83
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    84
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    85
    "compute position of leftmost subview and space between them;
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    86
     if they do hardly fit, leave no space between them "
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    87
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    88
    (sumOfChildWidths >= width) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    89
        xpos := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    90
        space := 0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    91
    ] ifFalse: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    92
        (l == #right) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    93
            xpos := width - (horizontalSpace * numChilds)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    94
                          - sumOfChildWidths.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    95
            borderWidth == 0 ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    96
                xpos := xpos + horizontalSpace 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    97
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    98
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    99
            (l == #spread) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   100
                space := (width - sumOfChildWidths) // (numChilds + 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   101
                xpos := space.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   102
                (space == 0) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   103
                    xpos := (width - sumOfChildWidths) // 2
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   104
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   105
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   106
                (l == #center) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   107
                    xpos := (width - (sumOfChildWidths
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   108
                                      + ((numChilds - 1) * space))) // 2
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   109
                ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   110
                    borderWidth == 0 ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   111
                        xpos := 0 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   112
                    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   113
                        xpos := horizontalSpace
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   114
                    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   115
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   116
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   117
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   118
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   119
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   120
    "now set positions"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   121
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   122
    subViews do:[:child |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   123
        ypos := (height - child heightIncludingBorder) // 2.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   124
        (ypos < 0) ifTrue:[ypos := 0].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   125
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   126
        child origin:(xpos @ ypos).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   127
        xpos := xpos + (child widthIncludingBorder) + space
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   128
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   129
! !