8a3c0db94d8f95a39556941886f42f82462c05c7
[WebKit-https.git] / WebCore / kwq / KWQSlider.mm
1 /*
2  * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "KWQSlider.h"
27
28 #import "KWQButton.h"
29 #import "KWQExceptions.h"
30 #import "KWQView.h"
31
32 @interface KWQSlider : NSSlider <KWQWidgetHolder>
33 {
34     QSlider* slider;
35 }
36
37 - (id)initWithQSlider:(QSlider*)s;
38 - (void)detachQSlider;
39
40 @end
41
42 @implementation KWQSlider
43
44 - (id)initWithQSlider:(QSlider*)s
45 {
46     self = [self init];
47
48     slider = s;
49
50     [self setTarget:self];
51     [self setAction:@selector(slide:)];
52     [self setContinuous:YES]; // Our sliders are always continuous by default.
53     [self setMinValue:0.0];
54     [self setMaxValue:100.0];
55     [self setDoubleValue:50.0];
56
57     return self;
58 }
59
60 - (void)detachQSlider
61 {
62     [self setTarget:nil];
63     slider = 0;
64 }
65
66 - (void)mouseDown:(NSEvent *)event
67 {
68     QWidget::beforeMouseDown(self);
69     [super mouseDown:event];
70     QWidget::afterMouseDown(self);
71     if (slider) {
72         slider->sendConsumedMouseUp();
73         slider->clicked();
74     }
75 }
76
77 - (IBAction)slide:(NSSlider*)sender
78 {
79     slider->sliderValueChanged();
80 }
81
82 - (QWidget *)widget
83 {
84     return slider;
85 }
86
87 @end
88
89 enum {
90     dimWidth,
91     dimHeight
92 };
93
94 QSlider::QSlider()
95 : m_sliderValueChanged(this, SIGNAL(sliderValueChanged())), 
96   m_clicked(this, SIGNAL(clicked())),
97   m_minVal(0.0), m_maxVal(100.0), m_val(50.0)
98 {
99     KWQ_BLOCK_EXCEPTIONS;
100     KWQSlider* slider = [[KWQSlider alloc] initWithQSlider:this];
101     [[slider cell] setControlSize:NSSmallControlSize];
102     setView(slider);
103     [slider release];
104     KWQ_UNBLOCK_EXCEPTIONS;
105 }
106
107 QSlider::~QSlider()
108 {
109     KWQSlider* slider = (KWQSlider*)getView();
110     [slider detachQSlider];
111 }
112
113 void QSlider::setFont(const QFont &f)
114 {
115     KWQ_BLOCK_EXCEPTIONS;
116     
117     QWidget::setFont(f);
118     
119     const NSControlSize size = KWQNSControlSizeForFont(f);    
120     NSControl * const slider = static_cast<NSControl *>(getView());
121     [[slider cell] setControlSize:size];
122     [slider setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:size]]];
123     
124     KWQ_UNBLOCK_EXCEPTIONS;
125 }
126
127 QSize QSlider::sizeHint() const 
128 {
129     return QSize(dimensions()[dimWidth], dimensions()[dimHeight]);
130 }
131
132 void QSlider::setValue(double v)
133 {
134     double val = kMax(m_minVal, kMin(v, m_maxVal));
135     
136     KWQSlider* slider = (KWQSlider*)getView();
137     [slider setDoubleValue: val];
138     m_val = val;
139 }
140
141 void QSlider::setMinValue(double v)
142 {
143     if (v == m_minVal) return;
144
145     KWQSlider* slider = (KWQSlider*)getView();
146     [slider setMinValue: v];
147 }
148
149 void QSlider::setMaxValue(double v)
150 {
151     if (v == m_maxVal) return;
152
153     KWQSlider* slider = (KWQSlider*)getView();
154     [slider setMaxValue: v];
155 }
156
157 double QSlider::value() const
158 {
159     return m_val;
160 }
161
162 double QSlider::minValue() const
163 {
164     return m_minVal;
165 }
166
167 double QSlider::maxValue() const
168 {
169     return m_maxVal;
170 }
171
172 void QSlider::sliderValueChanged()
173 {
174     KWQSlider* slider = (KWQSlider*)getView();
175     double v = [slider doubleValue];
176     if (m_val != v) {
177         m_val = v;
178         m_sliderValueChanged.call();
179     }
180 }
181
182 const int* QSlider::dimensions() const
183 {
184     // We empirically determined these dimensions.
185     // It would be better to get this info from AppKit somehow.
186     static const int w[3][2] = {
187         { 129, 21 },
188         { 129, 15 },
189         { 129, 12 },
190     };
191     NSControl * const slider = static_cast<NSControl *>(getView());
192     
193     KWQ_BLOCK_EXCEPTIONS;
194     return w[[[slider cell] controlSize]];
195     KWQ_UNBLOCK_EXCEPTIONS;
196     
197     return w[NSSmallControlSize];
198 }
199
200 void QSlider::clicked()
201 {
202     m_clicked.call();
203 }