lib

KoFrame.cpp
1/* This file is part of the KDE project
2 Copyright (C) 1998, 1999, 2000 Torben Weis <weis@kde.org>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#include <KoFrame.h>
21#include <KoView.h>
22
23#include <tqpainter.h>
24#include <tdeparts/event.h>
25#include <kcursor.h>
26#include <kdebug.h>
27
28#define TQMAX32767(a,b) TQMAX(TQMAX(32767,a),b)
29
30class KoFramePrivate
31{
32public:
33 KoFramePrivate()
34 {
35 }
36 ~KoFramePrivate()
37 {
38 }
39
40 KoView *m_view;
41
42 TQPoint m_mousePressPos;
43 TQPoint m_framePos;
44 int m_width;
45 int m_height;
46 int m_mode;
47
48 KoFrame::State m_state;
49};
50
51KoFrame::KoFrame( TQWidget *parent, const char *name )
52 : TQWidget( parent, name )
53{
54 d = new KoFramePrivate;
55 d->m_state = Inactive;
56 d->m_mode = -1;
57 d->m_view = 0;
58
59 setBackgroundColor( white );
60 setMouseTracking( true );
61}
62
63KoFrame::~KoFrame()
64{
65 delete d;
66}
67
68void KoFrame::setView( KoView *view )
69{
70 if ( view == d->m_view )
71 return;
72
73 if ( d->m_view )
74 d->m_view->removeEventFilter( this );
75
76 d->m_view = view;
77 if ( d->m_view )
78 d->m_view->installEventFilter( this );
79
80 resizeEvent( 0L );
81}
82
83KoView *KoFrame::view() const
84{
85 return d->m_view;
86}
87
88void KoFrame::setState( State s )
89{
90 if ( d->m_state == s )
91 return;
92
93 State old = d->m_state;
94 d->m_state = s;
95
96 if ( d->m_view )
97 {
98 /*
99 kdDebug(30003) << "KoFrame::setView setMaximumSize "
100 << "QMAX32767(" << d->m_view->maximumWidth() + 2 * border() << "," << d->m_view->maximumWidth() << "), "
101 << "QMAX32767(" << d->m_view->maximumHeight() + 2 * border() << "," << d->m_view->maximumHeight() << ")"
102 << endl;
103 */
104 setMaximumSize( TQMAX32767( d->m_view->maximumWidth() + 2 * border(), d->m_view->maximumWidth() ),
105 TQMAX32767( d->m_view->maximumHeight() + 2 * border(), d->m_view->maximumHeight() ) );
106 setMinimumSize( d->m_view->minimumWidth() + leftBorder() + rightBorder(),
107 d->m_view->minimumHeight() + topBorder() + bottomBorder() );
108 }
109
110 if ( d->m_state == Inactive )
111 {
112 d->m_state = old;
113 int l = leftBorder();
114 int r = rightBorder();
115 int t = topBorder();
116 int b = bottomBorder();
117 d->m_state = Inactive;
118 setGeometry( x() + l, y() + t, width() - l - r, height() - t - b );
119 }
120 else if ( ( d->m_state == Active || d->m_state == Selected ) && old == Inactive )
121 setGeometry( x() - leftBorder(), y() - topBorder(),
122 width() + leftBorder() + rightBorder(),
123 height() + topBorder() + bottomBorder() );
124 else if ( d->m_state == Active && old == Selected )
125 {
126 setGeometry( x() - leftBorder() + border(), y() - topBorder() + border(),
127 width() + leftBorder() + rightBorder() - 2 * border(),
128 height() + topBorder() + bottomBorder() - 2 * border() );
129 }
130
131 update();
132}
133
134KoFrame::State KoFrame::state() const
135{
136 return d->m_state;
137}
138
139int KoFrame::leftBorder() const
140{
141 if ( d->m_state == Inactive )
142 return 0;
143 if ( d->m_state == Selected || !d->m_view )
144 return border();
145
146 return d->m_view->leftBorder() + border();
147}
148
149int KoFrame::rightBorder() const
150{
151 if ( d->m_state == Inactive )
152 return 0;
153 if ( d->m_state == Selected || !d->m_view )
154 return border();
155
156 return d->m_view->rightBorder() + border();
157}
158
159int KoFrame::topBorder() const
160{
161 if ( d->m_state == Inactive )
162 return 0;
163 if ( d->m_state == Selected || !d->m_view )
164 return border();
165
166 return d->m_view->topBorder() + border();
167}
168
169int KoFrame::bottomBorder() const
170{
171 if ( d->m_state == Inactive )
172 return 0;
173 if ( d->m_state == Selected || !d->m_view )
174 return border();
175
176 return d->m_view->bottomBorder() + border();
177}
178
179int KoFrame::border() const
180{
181 if ( d->m_state == Inactive )
182 return 0;
183 return 5;
184}
185
186void KoFrame::paintEvent( TQPaintEvent* )
187{
188 TQPainter painter;
189 painter.begin( this );
190
191 painter.setPen( black );
192 painter.fillRect( 0, 0, width(), height(), BDiagPattern );
193
194 if ( d->m_state == Selected )
195 {
196 painter.fillRect( 0, 0, 5, 5, black );
197 painter.fillRect( 0, height() - 5, 5, 5, black );
198 painter.fillRect( width() - 5, height() - 5, 5, 5, black );
199 painter.fillRect( width() - 5, 0, 5, 5, black );
200 painter.fillRect( width() / 2 - 3, 0, 5, 5, black );
201 painter.fillRect( width() / 2 - 3, height() - 5, 5, 5, black );
202 painter.fillRect( 0, height() / 2 - 3, 5, 5, black );
203 painter.fillRect( width() - 5, height() / 2 - 3, 5, 5, black );
204 }
205
206 painter.end();
207}
208
209void KoFrame::mousePressEvent( TQMouseEvent* ev )
210{
211 TQRect r1( 0, 0, 5, 5 );
212 TQRect r2( 0, height() - 5, 5, 5 );
213 TQRect r3( width() - 5, height() - 5, 5, 5 );
214 TQRect r4( width() - 5, 0, 5, 5 );
215 TQRect r5( width() / 2 - 3, 0, 5, 5 );
216 TQRect r6( width() / 2 - 3, height() - 5, 5, 5 );
217 TQRect r7( 0, height() / 2 - 3, 5, 5 );
218 TQRect r8( width()- 5, height() / 2 - 3, 5, 5 );
219
220 if ( r1.contains( ev->pos() ) )
221 d->m_mode = 1;
222 else if ( r2.contains( ev->pos() ) )
223 d->m_mode = 2;
224 else if ( r3.contains( ev->pos() ) )
225 d->m_mode = 3;
226 else if ( r4.contains( ev->pos() ) )
227 d->m_mode = 4;
228 else if ( r5.contains( ev->pos() ) )
229 d->m_mode = 5;
230 else if ( r6.contains( ev->pos() ) )
231 d->m_mode = 6;
232 else if ( r7.contains( ev->pos() ) )
233 d->m_mode = 7;
234 else if ( r8.contains( ev->pos() ) )
235 d->m_mode = 8;
236 else
237 d->m_mode = 0;
238
239 // if ( d->m_state == Active )
240 // d->m_mode = 0;
241
242 kdDebug(30003) << "---- MODE=" << d->m_mode << endl;
243
244 d->m_mousePressPos = mapToParent( ev->pos() );
245 d->m_framePos = mapToParent( TQPoint( 0, 0 ) );
246 d->m_width = width();
247 d->m_height = height();
248}
249
250void KoFrame::mouseMoveEvent( TQMouseEvent* ev )
251{
252 if ( d->m_mode == 0 )
253 {
254 TQPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
255 move( TQPoint( p.x() + d->m_framePos.x() - d->m_mousePressPos.x(),
256 p.y() + d->m_framePos.y() - d->m_mousePressPos.y() ) );
257 // The other modes change the geometry so they call resizeEvent.
258 // This one doesn't, so it has to emit geometryChangedby itself.
259 emit geometryChanged();
260 //kdDebug() << "KoFrame::mouseMoveEvent koFrame position is " << x() << "," << y() << endl;
261 }
262 else if ( d->m_mode == 1 )
263 {
264 TQPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
265 int w = TQMIN( TQMAX( d->m_width + d->m_mousePressPos.x() - p.x(), minimumWidth() ), maximumWidth() );
266 int h = TQMIN( TQMAX( d->m_height + d->m_mousePressPos.y() - p.y(), minimumHeight() ), maximumHeight() );
267 setGeometry( d->m_framePos.x() - w + d->m_width,
268 d->m_framePos.y() - h + d->m_height, w, h );
269 }
270 else if ( d->m_mode == 2 )
271 {
272 TQPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
273 int w = TQMIN( TQMAX( d->m_width + d->m_mousePressPos.x() - p.x(), minimumWidth() ), maximumWidth() );
274 int h = TQMIN( TQMAX( d->m_height - d->m_mousePressPos.y() + p.y(), minimumHeight() ), maximumHeight() );
275 setGeometry( d->m_framePos.x() - w + d->m_width,
276 d->m_framePos.y(), w, h );
277 }
278 else if ( d->m_mode == 3 )
279 {
280 TQPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
281 int w = TQMIN( TQMAX( d->m_width - d->m_mousePressPos.x() + p.x(), minimumWidth() ), maximumWidth() );
282 int h = TQMIN( TQMAX( d->m_height - d->m_mousePressPos.y() + p.y(), minimumHeight() ), maximumHeight() );
283 resize( w, h );
284 }
285 else if ( d->m_mode == 4 )
286 {
287 TQPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
288 int w = TQMIN( TQMAX( d->m_width - d->m_mousePressPos.x() + p.x(), minimumWidth() ), maximumWidth() );
289 int h = TQMIN( TQMAX( d->m_height + d->m_mousePressPos.y() - p.y(), minimumHeight() ), maximumHeight() );
290 setGeometry( d->m_framePos.x(),
291 d->m_framePos.y() - h + d->m_height, w, h );
292 }
293 else if ( d->m_mode == 5 )
294 {
295 TQPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
296 int h = TQMIN( TQMAX( d->m_height + d->m_mousePressPos.y() - p.y(), minimumHeight() ), maximumHeight() );
297 setGeometry( d->m_framePos.x(),
298 d->m_framePos.y() - h + d->m_height, d->m_width, h );
299 }
300 else if ( d->m_mode == 6 )
301 {
302 TQPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
303 int h = TQMIN( TQMAX( d->m_height - d->m_mousePressPos.y() + p.y(), minimumHeight() ), maximumHeight() );
304 resize( d->m_width, h );
305 }
306 else if ( d->m_mode == 7 )
307 {
308 TQPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
309 int w = TQMIN( TQMAX( d->m_width + d->m_mousePressPos.x() - p.x(), minimumWidth() ), maximumWidth() );
310 setGeometry( d->m_framePos.x() - w + d->m_width,
311 d->m_framePos.y(), w, d->m_height );
312 }
313 else if ( d->m_mode == 8 )
314 {
315 TQPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
316 int w = TQMIN( TQMAX( d->m_width - d->m_mousePressPos.x() + p.x(), minimumWidth() ), maximumWidth() );
317 resize( w, d->m_height );
318 }
319 else if ( d->m_state == Selected || d->m_state == Active )
320 {
321 TQRect r1( 0, 0, 5, 5 );
322 TQRect r2( 0, height() - 5, 5, 5 );
323 TQRect r3( width() - 5, height() - 5, 5, 5 );
324 TQRect r4( width() - 5, 0, 5, 5 );
325 TQRect r5( width() / 2 - 3, 0, 5, 5 );
326 TQRect r6( width() / 2 - 3, height() - 5, 5, 5 );
327 TQRect r7( 0, height() / 2 - 3, 5, 5 );
328 TQRect r8( width()- 5, height() / 2 - 3, 5, 5 );
329
330 if ( r1.contains( ev->pos() ) || r3.contains( ev->pos() ) )
331 setCursor( sizeFDiagCursor );
332 else if ( r2.contains( ev->pos() ) || r4.contains( ev->pos() ) )
333 setCursor( sizeBDiagCursor );
334 else if ( r5.contains( ev->pos() ) || r6.contains( ev->pos() ) )
335 setCursor( sizeVerCursor );
336 else if ( r7.contains( ev->pos() ) || r8.contains( ev->pos() ) )
337 setCursor( sizeHorCursor );
338 else
339 setCursor( KCursor::handCursor() );
340 }
341 else
342 setCursor( KCursor::handCursor() );
343}
344
345void KoFrame::mouseReleaseEvent( TQMouseEvent* )
346{
347 d->m_mode = -1;
348}
349
350void KoFrame::resizeEvent( TQResizeEvent* )
351{
352 if ( !d->m_view )
353 return;
354
355 if ( d->m_state == Active || d->m_state == Selected )
356 d->m_view->setGeometry( 5, 5, width() - 10, height() - 10 );
357 else
358 d->m_view->setGeometry( 0, 0, width(), height() );
359
360 emit geometryChanged();
361}
362
363bool KoFrame::eventFilter( TQObject* obj, TQEvent* ev )
364{
365 if ( obj == d->m_view && KParts::PartActivateEvent::test( ev ) )
366 {
367 kdDebug(30003) << "Activate event"<< endl;
368 KParts::PartActivateEvent* e = (KParts::PartActivateEvent*)ev;
369 if ( e->part() == (KParts::Part *)d->m_view->koDocument() )
370 {
371 if ( e->activated() )
372 setState( Active );
373 else
374 setState( Inactive );
375 }
376 }
377 else if ( obj == d->m_view && KParts::PartSelectEvent::test( ev ) )
378 {
379 kdDebug(30003) << "Selected event" << endl;
380 KParts::PartSelectEvent* e = (KParts::PartSelectEvent*)ev;
381 if ( e->part() == (KParts::Part *)d->m_view->koDocument() )
382 {
383 if ( e->selected() )
384 setState( Selected );
385 else
386 setState( Inactive );
387 }
388 }
389
390 return false;
391}
392
393#include <KoFrame.moc>
static TQCursor handCursor()
This class is used to display a KoDocument.
Definition KoView.h:58
const char * name(StdAction id)