00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <iostream>
00022
00023 #include <qpainter.h>
00024
00025 #include <kapplication.h>
00026 #include <kdebug.h>
00027
00028 #include "basicelement.h"
00029 #include "formulacursor.h"
00030 #include "formulaelement.h"
00031 #include "kformulacontainer.h"
00032 #include "kformuladocument.h"
00033 #include "kformulaview.h"
00034
00035 KFORMULA_NAMESPACE_BEGIN
00036
00037 struct View::View_Impl {
00038
00039 View_Impl(Container* doc, View* view)
00040 : smallCursor(false), cursorHasChanged(true),
00041 document(doc)
00042 {
00043 connect(document, SIGNAL(elementWillVanish(BasicElement*)),
00044 view, SLOT(slotElementWillVanish(BasicElement*)));
00045 connect(document, SIGNAL(formulaLoaded(FormulaElement*)),
00046 view, SLOT(slotFormulaLoaded(FormulaElement*)));
00047 connect(document, SIGNAL(cursorMoved(FormulaCursor*)),
00048 view, SLOT(slotCursorMoved(FormulaCursor*)));
00049
00050 cursor = document->createCursor();
00051 }
00052
00053 ~View_Impl()
00054 {
00055 if ( document->activeCursor() == cursor ) {
00056 document->setActiveCursor( 0 );
00057 }
00058 delete cursor;
00059 }
00060
00064 bool smallCursor;
00065
00070 bool cursorHasChanged;
00071
00075 Container* document;
00076
00080 FormulaCursor* cursor;
00081 };
00082
00083
00084 FormulaCursor* View::cursor() const { return impl->cursor; }
00085 bool& View::cursorHasChanged() { return impl->cursorHasChanged; }
00086 bool& View::smallCursor() { return impl->smallCursor; }
00087 Container* View::container() const { return impl->document; }
00088
00089
00090 View::View(Container* doc)
00091 {
00092 impl = new View_Impl(doc, this);
00093 cursor()->calcCursorSize( contextStyle(), smallCursor() );
00094 }
00095
00096 View::~View()
00097 {
00098 delete impl;
00099 }
00100
00101
00102 QPoint View::getCursorPoint() const
00103 {
00104 return contextStyle().layoutUnitToPixel( cursor()->getCursorPoint() );
00105 }
00106
00107 void View::setReadOnly(bool ro)
00108 {
00109 cursor()->setReadOnly(ro);
00110 }
00111
00112
00113 void View::calcCursor()
00114 {
00115 cursor()->calcCursorSize( contextStyle(), smallCursor() );
00116 }
00117
00118
00119 void View::draw(QPainter& painter, const QRect& rect, const QColorGroup& cg)
00120 {
00121
00122
00123 container()->draw( painter, rect, cg, true );
00124 if ( cursorVisible() ) {
00125 cursor()->draw( painter, contextStyle(), smallCursor() );
00126 }
00127 }
00128
00129 void View::draw(QPainter& painter, const QRect& rect)
00130 {
00131 container()->draw( painter, rect, true );
00132 if ( cursorVisible() ) {
00133 cursor()->draw( painter, contextStyle(), smallCursor() );
00134 }
00135 }
00136
00137 void View::keyPressEvent( QKeyEvent* event )
00138 {
00139 container()->input( event );
00140 }
00141
00142
00143 void View::focusInEvent(QFocusEvent*)
00144 {
00145
00146 container()->setActiveCursor(cursor());
00147 }
00148
00149 void View::focusOutEvent(QFocusEvent*)
00150 {
00151
00152 }
00153
00154 void View::mousePressEvent( QMouseEvent* event )
00155 {
00156 const ContextStyle& context = contextStyle();
00157 mousePressEvent( event, context.pixelToLayoutUnit( event->pos() ) );
00158 }
00159
00160 void View::mouseReleaseEvent( QMouseEvent* event )
00161 {
00162 const ContextStyle& context = contextStyle();
00163 mouseReleaseEvent( event, context.pixelToLayoutUnit( event->pos() ) );
00164 }
00165
00166 void View::mouseDoubleClickEvent( QMouseEvent* event )
00167 {
00168 const ContextStyle& context = contextStyle();
00169 mouseDoubleClickEvent( event, context.pixelToLayoutUnit( event->pos() ) );
00170 }
00171
00172 void View::mouseMoveEvent( QMouseEvent* event )
00173 {
00174 const ContextStyle& context = contextStyle();
00175 mouseMoveEvent( event, context.pixelToLayoutUnit( event->pos() ) );
00176 }
00177
00178 void View::wheelEvent( QWheelEvent* event )
00179 {
00180 const ContextStyle& context = contextStyle();
00181 wheelEvent( event, context.pixelToLayoutUnit( event->pos() ) );
00182 }
00183
00184 void View::mousePressEvent( QMouseEvent* event, const PtPoint& pos )
00185 {
00186 const ContextStyle& context = contextStyle();
00187 mousePressEvent( event, context.ptToLayoutUnitPix( pos ) );
00188 }
00189
00190 void View::mouseReleaseEvent( QMouseEvent* event, const PtPoint& pos )
00191 {
00192 const ContextStyle& context = contextStyle();
00193 mouseReleaseEvent( event, context.ptToLayoutUnitPix( pos ) );
00194 }
00195
00196 void View::mouseDoubleClickEvent( QMouseEvent* event, const PtPoint& pos )
00197 {
00198 const ContextStyle& context = contextStyle();
00199 mouseDoubleClickEvent( event, context.ptToLayoutUnitPix( pos ) );
00200 }
00201
00202 void View::mouseMoveEvent( QMouseEvent* event, const PtPoint& pos )
00203 {
00204 const ContextStyle& context = contextStyle();
00205 mouseMoveEvent( event, context.ptToLayoutUnitPix( pos ) );
00206 }
00207
00208 void View::wheelEvent( QWheelEvent* event, const PtPoint& pos )
00209 {
00210 const ContextStyle& context = contextStyle();
00211 wheelEvent( event, context.ptToLayoutUnitPix( pos ) );
00212 }
00213
00214
00215 void View::mousePressEvent( QMouseEvent* event, const LuPixelPoint& pos )
00216 {
00217 int flags = movementFlag( event->state() );
00218 cursor()->mousePress( pos, flags );
00219 emitCursorChanged();
00220 }
00221
00222 void View::mouseReleaseEvent( QMouseEvent* event, const LuPixelPoint& pos )
00223 {
00224 int flags = movementFlag( event->state() );
00225 cursor()->mouseRelease( pos, flags );
00226 emitCursorChanged();
00227 }
00228
00229 void View::mouseDoubleClickEvent( QMouseEvent*, const LuPixelPoint& )
00230 {
00231 cursor()->moveRight( WordMovement );
00232 cursor()->moveLeft( SelectMovement | WordMovement );
00233 emitCursorChanged();
00234 }
00235
00236 void View::mouseMoveEvent( QMouseEvent* event, const LuPixelPoint& pos )
00237 {
00238 int flags = movementFlag( event->state() );
00239 cursor()->mouseMove( pos, flags );
00240 emitCursorChanged();
00241 }
00242
00243 void View::wheelEvent( QWheelEvent*, const LuPixelPoint& )
00244 {
00245 }
00246
00247
00248 void View::slotCursorMoved(FormulaCursor* c)
00249 {
00250 if (c == cursor()) {
00251 cursorHasChanged() = true;
00252 emitCursorChanged();
00253 }
00254 }
00255
00256 void View::slotFormulaLoaded(FormulaElement* formula)
00257 {
00258 cursor()->formulaLoaded(formula);
00259 }
00260
00261 void View::slotElementWillVanish(BasicElement* element)
00262 {
00263 cursor()->elementWillVanish(element);
00264 emitCursorChanged();
00265 }
00266
00267 void View::slotSelectAll()
00268 {
00269 cursor()->moveHome(WordMovement);
00270 cursor()->moveEnd(SelectMovement | WordMovement);
00271 emitCursorChanged();
00272 }
00273
00274
00275 void View::moveLeft( int flag )
00276 {
00277 cursor()->moveLeft( flag );
00278 emitCursorChanged();
00279 }
00280
00281 void View::moveRight( int flag )
00282 {
00283 cursor()->moveRight( flag );
00284 emitCursorChanged();
00285 }
00286
00287 void View::moveUp( int flag )
00288 {
00289 cursor()->moveUp( flag );
00290 emitCursorChanged();
00291 }
00292
00293 void View::moveDown( int flag )
00294 {
00295 cursor()->moveDown( flag );
00296 emitCursorChanged();
00297 }
00298
00299
00300 void View::moveHome( int flag )
00301 {
00302 cursor()->moveHome( flag );
00303 emitCursorChanged();
00304 }
00305
00306 void View::moveEnd( int flag )
00307 {
00308 cursor()->moveEnd( flag );
00309 emitCursorChanged();
00310 }
00311
00312
00313 void View::setSmallCursor(bool small)
00314 {
00315 smallCursor() = small;
00316 }
00317
00318 bool View::isHome() const
00319 {
00320 return cursor()->isHome();
00321 }
00322
00323 bool View::isEnd() const
00324 {
00325 return cursor()->isEnd();
00326 }
00327
00328 void View::eraseSelection( Direction direction )
00329 {
00330 DirectedRemove r( req_remove, direction );
00331 container()->performRequest( &r );
00332 }
00333
00334 void View::addText( QString str )
00335 {
00336 TextRequest r( str );
00337 container()->performRequest( &r );
00338 }
00339
00340 void View::emitCursorChanged()
00341 {
00342 if (cursor()->hasChanged() || cursorHasChanged()) {
00343 getDocument()->updateMatrixActions();
00344 cursor()->clearChangedFlag();
00345 cursorHasChanged() = false;
00346 cursor()->calcCursorSize( contextStyle(), smallCursor() );
00347
00348 emit cursorChanged(cursorVisible(), cursor()->isSelection());
00349 }
00350 }
00351
00352 const ContextStyle& View::contextStyle() const
00353 {
00354 return container()->document()->getContextStyle();
00355 }
00356
00357 bool View::cursorVisible()
00358 {
00359
00360 return true;
00361 }
00362
00363 KFORMULA_NAMESPACE_END
00364
00365 using namespace KFormula;
00366 #include "kformulaview.moc"