summaryrefslogtreecommitdiffstats
path: root/lib/kformula/kformulaview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kformula/kformulaview.cpp')
-rw-r--r--lib/kformula/kformulaview.cpp413
1 files changed, 413 insertions, 0 deletions
diff --git a/lib/kformula/kformulaview.cpp b/lib/kformula/kformulaview.cpp
new file mode 100644
index 00000000..1e50694d
--- /dev/null
+++ b/lib/kformula/kformulaview.cpp
@@ -0,0 +1,413 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Andrea Rizzi <rizzi@kde.org>
+ Ulrich Kuettler <ulrich.kuettler@mailbox.tu-dresden.de>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <iostream>
+
+#include <tqpainter.h>
+#include <tqtimer.h>
+
+#include <tdeapplication.h>
+#include <kdebug.h>
+
+#include "basicelement.h"
+#include "formulacursor.h"
+#include "formulaelement.h"
+#include "kformulacontainer.h"
+#include "kformuladocument.h"
+#include "kformulaview.h"
+
+KFORMULA_NAMESPACE_BEGIN
+
+struct View::View_Impl {
+
+ View_Impl(Container* doc, View* view)
+ : smallCursor(false), activeCursor(true), cursorHasChanged(true),
+ document(doc)
+ {
+ connect(document, TQT_SIGNAL(elementWillVanish(BasicElement*)),
+ view, TQT_SLOT(slotElementWillVanish(BasicElement*)));
+ connect(document, TQT_SIGNAL(formulaLoaded(FormulaElement*)),
+ view, TQT_SLOT(slotFormulaLoaded(FormulaElement*)));
+ connect(document, TQT_SIGNAL(cursorMoved(FormulaCursor*)),
+ view, TQT_SLOT(slotCursorMoved(FormulaCursor*)));
+
+ cursor = document->createCursor();
+ blinkTimer = new TQTimer( view );
+ connect( blinkTimer, TQT_SIGNAL( timeout() ),
+ view, TQT_SLOT( slotBlinkCursor() ) );
+ if ( TQApplication::cursorFlashTime() > 0 )
+ blinkTimer->start( TQApplication::cursorFlashTime() / 2 );
+ }
+
+ void startTimer()
+ {
+ if ( TQApplication::cursorFlashTime() > 0 )
+ blinkTimer->start( TQApplication::cursorFlashTime() / 2 );
+ }
+
+ void stopTimer()
+ {
+ blinkTimer->stop();
+ }
+
+ ~View_Impl()
+ {
+ if ( document->activeCursor() == cursor ) {
+ document->setActiveCursor( 0 );
+ }
+ delete cursor;
+ delete blinkTimer;
+ }
+
+ /**
+ * If set the cursor will never be bigger that the formula.
+ */
+ bool smallCursor;
+
+ /**
+ * Whether the cursor is visible (for blinking)
+ */
+ bool activeCursor;
+
+ /**
+ * Whether the cursor changed since the last time
+ * we emitted a cursorChanged signal.
+ */
+ bool cursorHasChanged;
+
+ /**
+ * Timer for cursor blinking
+ */
+ TQTimer *blinkTimer;
+
+ /**
+ * The formula we show.
+ */
+ Container* document;
+
+ /**
+ * Out cursor.
+ */
+ FormulaCursor* cursor;
+};
+
+
+FormulaCursor* View::cursor() const { return impl->cursor; }
+bool& View::cursorHasChanged() { return impl->cursorHasChanged; }
+bool& View::smallCursor() { return impl->smallCursor; }
+bool& View::activeCursor() { return impl->activeCursor; }
+Container* View::container() const { return impl->document; }
+void View::startCursorTimer() { impl->startTimer(); }
+void View::stopCursorTimer() { impl->stopTimer(); }
+
+
+View::View(Container* doc)
+{
+ impl = new View_Impl(doc, this);
+ cursor()->calcCursorSize( contextStyle(), smallCursor() );
+}
+
+View::~View()
+{
+ delete impl;
+}
+
+
+TQPoint View::getCursorPoint() const
+{
+ return contextStyle().layoutUnitToPixel( cursor()->getCursorPoint() );
+}
+
+void View::setReadOnly(bool ro)
+{
+ cursor()->setReadOnly(ro);
+}
+
+
+void View::calcCursor()
+{
+ cursor()->calcCursorSize( contextStyle(), smallCursor() );
+}
+
+
+void View::draw(TQPainter& painter, const TQRect& rect, const TQColorGroup& cg)
+{
+// kdDebug( DEBUGID ) << "View::draw: " << rect.x() << " " << rect.y() << " "
+// << rect.width() << " " << rect.height() << endl;
+ container()->draw( painter, rect, cg, true );
+ if ( cursorVisible() ) {
+ StyleAttributes style;
+ cursor()->draw( painter, contextStyle(), style, smallCursor(), activeCursor() );
+ }
+}
+
+void View::draw(TQPainter& painter, const TQRect& rect)
+{
+ container()->draw( painter, rect, true );
+ if ( cursorVisible() ) {
+ StyleAttributes style;
+ cursor()->draw( painter, contextStyle(), style, smallCursor(), activeCursor() );
+ }
+}
+
+void View::keyPressEvent( TQKeyEvent* event )
+{
+ container()->input( event );
+}
+
+
+void View::focusInEvent(TQFocusEvent*)
+{
+ //cursor()->calcCursorSize( contextStyle(), smallCursor() );
+ container()->setActiveCursor(cursor());
+ activeCursor() = true;
+ startCursorTimer();
+ smallCursor() = false;
+ emitCursorChanged();
+}
+
+void View::focusOutEvent(TQFocusEvent*)
+{
+ //container()->setActiveCursor(0);
+ activeCursor() = false;
+ stopCursorTimer();
+ smallCursor() = true;
+ emitCursorChanged();
+}
+
+void View::mousePressEvent( TQMouseEvent* event )
+{
+ const ContextStyle& context = contextStyle();
+ mousePressEvent( event, context.pixelToLayoutUnit( event->pos() ) );
+}
+
+void View::mouseReleaseEvent( TQMouseEvent* event )
+{
+ const ContextStyle& context = contextStyle();
+ mouseReleaseEvent( event, context.pixelToLayoutUnit( event->pos() ) );
+}
+
+void View::mouseDoubleClickEvent( TQMouseEvent* event )
+{
+ const ContextStyle& context = contextStyle();
+ mouseDoubleClickEvent( event, context.pixelToLayoutUnit( event->pos() ) );
+}
+
+void View::mouseMoveEvent( TQMouseEvent* event )
+{
+ const ContextStyle& context = contextStyle();
+ mouseMoveEvent( event, context.pixelToLayoutUnit( event->pos() ) );
+}
+
+void View::wheelEvent( TQWheelEvent* event )
+{
+ const ContextStyle& context = contextStyle();
+ wheelEvent( event, context.pixelToLayoutUnit( event->pos() ) );
+}
+
+void View::mousePressEvent( TQMouseEvent* event, const PtPoint& pos )
+{
+ const ContextStyle& context = contextStyle();
+ mousePressEvent( event, context.ptToLayoutUnitPix( pos ) );
+}
+
+void View::mouseReleaseEvent( TQMouseEvent* event, const PtPoint& pos )
+{
+ const ContextStyle& context = contextStyle();
+ mouseReleaseEvent( event, context.ptToLayoutUnitPix( pos ) );
+}
+
+void View::mouseDoubleClickEvent( TQMouseEvent* event, const PtPoint& pos )
+{
+ const ContextStyle& context = contextStyle();
+ mouseDoubleClickEvent( event, context.ptToLayoutUnitPix( pos ) );
+}
+
+void View::mouseMoveEvent( TQMouseEvent* event, const PtPoint& pos )
+{
+ const ContextStyle& context = contextStyle();
+ mouseMoveEvent( event, context.ptToLayoutUnitPix( pos ) );
+}
+
+void View::wheelEvent( TQWheelEvent* event, const PtPoint& pos )
+{
+ const ContextStyle& context = contextStyle();
+ wheelEvent( event, context.ptToLayoutUnitPix( pos ) );
+}
+
+
+void View::mousePressEvent( TQMouseEvent* event, const LuPixelPoint& pos )
+{
+ int flags = movementFlag( event->state() );
+ cursor()->mousePress( pos, flags );
+ emitCursorChanged();
+}
+
+void View::mouseReleaseEvent( TQMouseEvent* event, const LuPixelPoint& pos )
+{
+ int flags = movementFlag( event->state() );
+ cursor()->mouseRelease( pos, flags );
+ emitCursorChanged();
+}
+
+void View::mouseDoubleClickEvent( TQMouseEvent*, const LuPixelPoint& )
+{
+ cursor()->moveRight( WordMovement );
+ cursor()->moveLeft( SelectMovement | WordMovement );
+ emitCursorChanged();
+}
+
+void View::mouseMoveEvent( TQMouseEvent* event, const LuPixelPoint& pos )
+{
+ int flags = movementFlag( event->state() );
+ cursor()->mouseMove( pos, flags );
+ emitCursorChanged();
+}
+
+void View::wheelEvent( TQWheelEvent*, const LuPixelPoint& )
+{
+}
+
+
+void View::slotCursorMoved(FormulaCursor* c)
+{
+ if (c == cursor()) {
+ cursorHasChanged() = true;
+ emitCursorChanged();
+ }
+}
+
+void View::slotFormulaLoaded(FormulaElement* formula)
+{
+ cursor()->formulaLoaded(formula);
+}
+
+void View::slotElementWillVanish(BasicElement* element)
+{
+ cursor()->elementWillVanish(element);
+ emitCursorChanged();
+}
+
+void View::slotBlinkCursor()
+{
+ activeCursor() = ! activeCursor();
+ emitCursorChanged();
+}
+
+void View::slotSelectAll()
+{
+ cursor()->moveHome(WordMovement);
+ cursor()->moveEnd(SelectMovement | WordMovement);
+ emitCursorChanged();
+}
+
+
+void View::moveLeft( int flag )
+{
+ cursor()->moveLeft( flag );
+ emitCursorChanged();
+}
+
+void View::moveRight( int flag )
+{
+ cursor()->moveRight( flag );
+ emitCursorChanged();
+}
+
+void View::moveUp( int flag )
+{
+ cursor()->moveUp( flag );
+ emitCursorChanged();
+}
+
+void View::moveDown( int flag )
+{
+ cursor()->moveDown( flag );
+ emitCursorChanged();
+}
+
+
+void View::moveHome( int flag )
+{
+ cursor()->moveHome( flag );
+ emitCursorChanged();
+}
+
+void View::moveEnd( int flag )
+{
+ cursor()->moveEnd( flag );
+ emitCursorChanged();
+}
+
+
+void View::setSmallCursor(bool small)
+{
+ smallCursor() = small;
+}
+
+bool View::isHome() const
+{
+ return cursor()->isHome();
+}
+
+bool View::isEnd() const
+{
+ return cursor()->isEnd();
+}
+
+void View::eraseSelection( Direction direction )
+{
+ DirectedRemove r( req_remove, direction );
+ container()->performRequest( &r );
+}
+
+void View::addText( TQString str )
+{
+ TextRequest r( str );
+ container()->performRequest( &r );
+}
+
+void View::emitCursorChanged()
+{
+ if (cursor()->hasChanged() || cursorHasChanged()) {
+ getDocument()->updateMatrixActions();
+ cursor()->clearChangedFlag();
+ cursorHasChanged() = false;
+ cursor()->calcCursorSize( contextStyle(), smallCursor() );
+ activeCursor() = true;
+ startCursorTimer();
+ }
+ emit cursorChanged(cursorVisible(), cursor()->isSelection());
+}
+
+const ContextStyle& View::contextStyle() const
+{
+ return container()->document()->getContextStyle();
+}
+
+bool View::cursorVisible()
+{
+ return !cursor()->isReadOnly() || cursor()->isSelection();
+}
+
+KFORMULA_NAMESPACE_END
+
+using namespace KFormula;
+#include "kformulaview.moc"