summaryrefslogtreecommitdiffstats
path: root/macosx/NSWindow+HBAdditions.m
blob: 17eb5ba722f741d49cc960b1497367e017ce3ef6 (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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*  NSWindow+HBAdditions.m

 This file is part of the HandBrake source code.
 Homepage: <http://handbrake.fr/>.
 It may be used under the terms of the GNU General Public License. */

#import "NSWindow+HBAdditions.h"

@implementation NSWindow (HBAdditions)

- (void)HB_resizeToBestSizeForViewSize:(NSSize)viewSize keepInScreenRect:(BOOL)keepInScreenRect centerPoint:(NSPoint)center animate:(BOOL)animateFlag
{
    NSSize currentSize = self.contentView.frame.size;
    NSRect frame = self.frame;

    // Calculate border around content region of the frame
    int borderX = (int)(frame.size.width - currentSize.width);
    int borderY = (int)(frame.size.height - currentSize.height);

    // Make sure the frame is smaller than the screen
    NSSize maxSize = self.screen.visibleFrame.size;

    // if we are not Scale To Screen, put an 10% of visible screen on the window
    maxSize.width = maxSize.width * 0.90;
    maxSize.height = maxSize.height * 0.90;

    // Set the new frame size
    // Add the border to the new frame size so that the content region
    // of the frame is large enough to accommodate the preview image
    frame.size.width = viewSize.width + borderX;
    frame.size.height = viewSize.height + borderY;

    // compare frame to max size of screen
    if (frame.size.width > maxSize.width)
    {
        frame.size.width = maxSize.width;
    }
    if (frame.size.height > maxSize.height)
    {
        frame.size.height = maxSize.height;
    }

    // Since upon launch we can open up the preview window if it was open
    // the last time we quit (and at the size it was) we want to make
    // sure that upon resize we do not have the window off the screen
    // So check the origin against the screen origin and adjust if
    // necessary.

    if (center.x == 0 && center.y == 0)
    {
        center = [self HB_centerPoint];
    }
    frame.origin.x = center.x - floor(frame.size.width / 2);
    frame.origin.y = center.y - floor(frame.size.height / 2);

    if (keepInScreenRect)
    {
        NSSize screenSize = self.screen.visibleFrame.size;
        NSPoint screenOrigin = self.screen.visibleFrame.origin;

        // our origin is off the screen to the left
        if (frame.origin.x < screenOrigin.x)
        {
            // so shift our origin to the right
            frame.origin.x = screenOrigin.x;
        }
        else if ((frame.origin.x + frame.size.width) > (screenOrigin.x + screenSize.width))
        {
            // the right side of the preview is off the screen, so shift to the left
            frame.origin.x = (screenOrigin.x + screenSize.width) - frame.size.width;
        }

        // our origin is off the screen to the bottom
        if (frame.origin.y < screenOrigin.y)
        {
            // so shift our origin to the top
            frame.origin.y = screenOrigin.y;
        }
        else if ((frame.origin.y + frame.size.height) > (screenOrigin.y + screenSize.height))
        {
            // the top side of the preview is off the screen, so shift to the bottom
            frame.origin.y = (screenOrigin.y + screenSize.height) - frame.size.height;
        }
    }

    [self setFrame:frame display:YES animate:animateFlag];
}

- (NSPoint)HB_centerPoint
{
    NSPoint center = NSMakePoint(floor(self.frame.origin.x + self.frame.size.width / 2),
                                 floor(self.frame.origin.y + self.frame.size.height / 2));
    return center;
}

- (BOOL)HB_endEditing
{
    BOOL success;
    NSRange selectedRange = NSMakeRange(0, 0);
    id responder = self.firstResponder;

    // If we're dealing with the field editor, the real first responder is
    // its delegate.
    if ((responder != nil) && [responder isKindOfClass:[NSTextView class]] && [(NSTextView *)responder isFieldEditor])
    {
        responder = ([[responder delegate] isKindOfClass:[NSResponder class]]) ? [responder delegate] : nil;
        if ([responder isKindOfClass:[NSTextField class]])
        {
            NSTextField *textField = (NSTextField *)responder;
            selectedRange = textField.currentEditor.selectedRange;
        }
    }

    success = [self makeFirstResponder:nil];

    // Return first responder status.
    if (success && responder != nil)
    {
        [self makeFirstResponder:responder];
        if ([responder isKindOfClass:[NSTextField class]])
        {
            NSTextField *textField = (NSTextField *)responder;
            textField.currentEditor.selectedRange = selectedRange;
        }
    }

    return success;
}

- (void)HB_forceEndEditing
{
    [self endEditingFor:nil];
}



@end