Subversion Repositories filter_foundry

Rev

Rev 193 | Rev 268 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
259 daniel-mar 1
/*
2
        This file is part of a common library
3
    Copyright (C) 1990-2006 Toby Thain, toby@telegraphics.com.au
4
 
5
    This program is free software; you can redistribute it and/or modify
6
    it under the terms of the GNU General Public License as published by  
7
    the Free Software Foundation; either version 2 of the License, or
8
    (at your option) any later version.
9
 
10
    This program 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
13
    GNU General Public License for more details.
14
 
15
    You should have received a copy of the GNU General Public License  
16
    along with this program; if not, write to the Free Software
17
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
*/
19
 
20
#include "calc_std_state.h"
21
#include "wind.h"
22
 
23
void set_std_state(WindowPtr w,Rect *r){
24
        if(ZOOMABLE(w))
25
                (*(WStateDataHandle)((WindowPeek)w)->dataHandle)->stdState = *r;
26
}
27
void std_user_state(WindowPtr w){
28
        WStateDataHandle h = (WStateDataHandle)((WindowPeek)w)->dataHandle; // ppcc wants cast
29
        if(ZOOMABLE(w))
30
                (*h)->userState = (*h)->stdState;
31
}
32
 
33
void calc_std_state(WindowPtr w,Boolean force_default,Boolean stagger,Rect *s){
34
        short i,new_left,new_top,h_offset,v_offset;
35
        Rect d,wr,sr,r;
36
        Boolean spot_taken,too_wide,too_high;
37
        WindowPeek peek;
38
        Point size;
39
 
40
/* As per Human Interface Note 7,
41
 * recalculate standard state starting from user state,
42
 * so that top-left corner of window only moves if necessary.
43
 */
44
 
45
/* "display each additional window on the screen that
46
 *  contains the largest portion of the frontmost window" */
47
 
48
        size = natural_size(w);
49
        d = FrontWindow() ? dominant_device_rect(FrontWindow()) : main_device_rect();
50
        global_wind_rect(w,&wr);
51
        get_struc_bbox(w,&sr);
52
        InsetRect(&d,2,2);
53
        d.left += wr.left - sr.left;
54
        d.top += wr.top - sr.top;
55
        d.right += wr.right - sr.right;
56
        d.bottom += wr.bottom - sr.bottom;
57
 
58
        h_offset = v_offset = 0;
59
        do{
60
                *s = d;
61
                new_left = (force_default || wr.left<s->left ? s->left : wr.left) + h_offset;
62
                new_top = (force_default || wr.top<s->top ? s->top : wr.top) + v_offset;
63
                if(too_wide = (i=new_left+size.h)>s->right)
64
                        if((i=s->right-size.h)>s->left)
65
                                s->left = i; // move window left to expose entire content
66
                        else{ // natural size is wider than screen
67
                                short new_width = width_filter(w,i = s->right - s->left);
68
                                new_width>i ? (s->right=s->left+new_width) : (s->left=s->right-new_width);
69
                        }
70
                else{
71
                        s->left = new_left;
72
                        s->right = i;
73
                }
74
                if(too_high = (i=new_top+size.v)>s->bottom)
75
                        if((i=s->bottom-size.v)>s->top)
76
                                s->top = i; // move window up to expose entire content
77
                        else{ // natural size is higher than screen
78
                                short new_height = height_filter(w,i = s->bottom - s->top);
79
                                new_height>i ? (s->bottom=s->top+new_height) : (s->top=s->bottom-new_height);
80
                        }
81
                else{
82
                        s->top = new_top;
83
                        s->bottom = i;
84
                }
85
 
86
                spot_taken = false;
87
                if(stagger && !(too_wide||too_high))
88
                        for(peek = (WindowPeek)FrontWindow(); peek; peek = peek->nextWindow)
89
                                if(peek->visible){
90
                                        global_wind_rect((WindowPtr)peek,&r);
91
                                        if( abs(s->left-r.left) + abs(s->top-r.top) < STAGGER_SLOP ){
92
                                                spot_taken = true;
93
                                                h_offset += STAGGER_H;
94
                                                v_offset += STAGGER_V;
95
                                                break;
96
                                        }
97
                                }
98
        }while(spot_taken);
99
}
100
 
101
void zoom_to_std_state(WindowPtr w,Boolean force_default,Boolean stagger){ Rect r;
102
        calc_std_state(w,force_default,stagger,&r);
103
        if(ZOOMABLE(w)){
104
                set_std_state(w,&r);
105
                SetPort(w);
106
                ZoomWindow(w,inZoomOut,false);
107
        }else{
108
                MoveWindow(w,r.left,r.top,false);
109
                SizeWindow(w,r.right-r.left,r.bottom-r.top,true/*???*/);
110
        }
111
}