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
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"