[prev in list] [next in list] [prev in thread] [next in thread] 

List:       koffice-devel
Subject:    kword patch
From:       Ulrich Kuettler <ulrich.kuettler () mailbox ! tu-dresden ! de>
Date:       2002-03-23 14:12:25
[Download RAW message or body]

Hi,

here is a formula related kword patch that generously adds two new functions 
to KWCanvas. And I fear those violate some design decisions. Or could be done 
better. Anyway, I would like to hear from you kword hackers before I commit.

The patch:
- makes formula frames active right after they are created (F4 pressed)
- makes it possible to move the cursor out of a formula at both ends (but not 
into it.)

Uli

PS: Ellis, I hope I didn't get in your way with this.

["formula-cursor-move.patch" (text/x-diff)]

Index: kwcanvas.cc
===================================================================
RCS file: /home/kde/koffice/kword/kwcanvas.cc,v
retrieving revision 1.329
diff -u -3 -p -r1.329 kwcanvas.cc
--- kwcanvas.cc	2002/03/11 09:17:21	1.329
+++ kwcanvas.cc	2002/03/23 13:52:25
@@ -1697,6 +1697,42 @@ KWTableFrameSet *KWCanvas::getTable()
     return 0L;
 }
 
+void KWCanvas::editFrame( KWFrame * frame )
+{
+    if ( selectAllFrames( false ) )
+        emit frameSelectedChanged();
+
+    KWFrameSet * fs = frame ? frame->frameSet() : 0L;
+    bool emitChanged = false;
+    if ( fs )
+    {
+        KWTableFrameSet *table = fs->getGroupManager();
+        emitChanged = checkCurrentEdit( table ? table : fs );
+    }
+
+    if ( emitChanged ) // emitted after mousePressEvent [for tables]
+        emit currentFrameSetEditChanged();
+    emit updateRuler();
+}
+
+void KWCanvas::editTextFrameSet( KWFrameSet * fs, KoTextParag* parag, int index )
+{
+    if ( selectAllFrames( false ) )
+        emit frameSelectedChanged();
+
+    bool emitChanged = false;
+    KWTableFrameSet *table = fs->getGroupManager();
+    emitChanged = checkCurrentEdit( table ? table : fs );
+
+    if ( emitChanged ) { // emitted after mousePressEvent [for tables]
+        emit currentFrameSetEditChanged();
+        if ( m_currentFrameSetEdit && \
m_currentFrameSetEdit->frameSet()->type()==FT_TEXT ) { +            \
static_cast<KWTextFrameSetEdit*>( m_currentFrameSetEdit )->setCursor( parag, index ); \
+        } +    }
+    emit updateRuler();
+}
+
 bool KWCanvas::checkCurrentTextEdit( KWFrameSet * fs )
 {
     bool emitChanged = false;
Index: kwcanvas.h
===================================================================
RCS file: /home/kde/koffice/kword/kwcanvas.h,v
retrieving revision 1.92
diff -u -3 -p -r1.92 kwcanvas.h
--- kwcanvas.h	2002/02/21 16:54:34	1.92
+++ kwcanvas.h	2002/03/23 13:52:26
@@ -170,6 +170,8 @@ public:
 
     void inlinePictureStarted();
 
+    void editFrame( KWFrame * frame );
+    void editTextFrameSet( KWFrameSet * fs, KoTextParag* parag, int index );
     bool checkCurrentTextEdit( KWFrameSet * fs );
     bool checkCurrentEdit( KWFrameSet * fs );
 
Index: kwframe.cc
===================================================================
RCS file: /home/kde/koffice/kword/kwframe.cc,v
retrieving revision 1.249
diff -u -3 -p -r1.249 kwframe.cc
--- kwframe.cc	2002/03/17 19:49:40	1.249
+++ kwframe.cc	2002/03/23 13:52:41
@@ -1842,11 +1842,28 @@ void KWPartFrameSetEdit::mouseDoubleClic
 }
 
 
+
+class FormulaView : public KFormula::View {
+public:
+    FormulaView( KWFormulaFrameSetEdit* edit, KFormula::Container* c )
+        : KFormula::View( c ), m_edit( edit ) {}
+
+    /** Gets called if the cursor ties to leave the formula at its begin. */
+    virtual void exitLeft() { m_edit->exitLeft(); }
+
+    /** Gets called if the cursor ties to leave the formula at its end. */
+    virtual void exitRight() { m_edit->exitRight(); }
+
+private:
+    KWFormulaFrameSetEdit* m_edit;
+};
+
+
 /******************************************************************/
 /* Class: KWFormulaFrameSet                                       */
 /******************************************************************/
 KWFormulaFrameSet::KWFormulaFrameSet( KWDocument *_doc, const QString & name )
-    : KWFrameSet( _doc ), m_changed( false ), m_loading( false )
+    : KWFrameSet( _doc ), m_changed( false )
 {
     kdDebug(32001) << "KWFormulaFrameSet::KWFormulaFrameSet" << endl;
     formula = _doc->getFormulaDocument()->createFormula();
@@ -1888,6 +1905,15 @@ KWFormulaFrameSet::~KWFormulaFrameSet()
     delete formula;
 }
 
+void KWFormulaFrameSet::addFrame( KWFrame *_frame, bool recalc )
+{
+    if ( formula ) {
+        _frame->setWidth( formula->width() );
+        _frame->setHeight( formula->height() );
+    }
+    KWFrameSet::addFrame( _frame, recalc );
+}
+
 KWFrameSetEdit* KWFormulaFrameSet::createFrameSetEdit(KWCanvas* canvas)
 {
     return new KWFormulaFrameSetEdit(this, canvas);
@@ -1934,14 +1960,12 @@ void KWFormulaFrameSet::slotFormulaChang
 
     updateFrames();
     kWordDocument()->layout();
-    if ( !m_loading && ( ( oldWidth != width ) || ( oldHeight != height ) ) ) {
+    if ( ( oldWidth != width ) || ( oldHeight != height ) ) {
         kWordDocument()->repaintAllViews( false );
         kWordDocument()->updateRulerFrameStartEnd();
     }
 
     m_changed = true;
-    //if ( !m_loading )
-    //    emit repaintChanged( this );
 }
 
 void KWFormulaFrameSet::updateFrames()
@@ -1974,7 +1998,6 @@ void KWFormulaFrameSet::load(QDomElement
 void KWFormulaFrameSet::paste( QDomNode& formulaElem )
 {
     if (!formulaElem.isNull()) {
-        m_loading = true;
         if (formula == 0) {
             formula = m_doc->getFormulaDocument()->createFormula();
             connect(formula, SIGNAL(formulaChanged(double, double)),
@@ -1983,7 +2006,6 @@ void KWFormulaFrameSet::paste( QDomNode&
         if (!formula->load(formulaElem)) {
             kdError(32001) << "Error loading formula" << endl;
         }
-        m_loading = false;
     }
     else {
         kdError(32001) << "Missing FORMULA tag in FRAMESET" << endl;
@@ -2019,7 +2041,7 @@ KWFormulaFrameSetEdit::KWFormulaFrameSet
         : KWFrameSetEdit(fs, canvas)
 {
     //kdDebug(32001) << "KWFormulaFrameSetEdit::KWFormulaFrameSetEdit" << endl;
-    formulaView = new KFormula::View(fs->getFormula());
+    formulaView = new FormulaView( this, fs->getFormula() );
     //formulaView->setSmallCursor(true);
 
     connect( formulaView, SIGNAL( cursorChanged( bool, bool ) ),
@@ -2037,7 +2059,6 @@ DCOPObject* KWFormulaFrameSetEdit::dcopO
     return dcop;
 }
 
-
 KWFormulaFrameSetEdit::~KWFormulaFrameSetEdit()
 {
     //kdDebug(32001) << "KWFormulaFrameSetEdit::~KWFormulaFrameSetEdit" << endl;
@@ -2051,26 +2072,12 @@ KWFormulaFrameSetEdit::~KWFormulaFrameSe
     delete dcop;
 }
 
+const KFormula::View* KWFormulaFrameSetEdit::getFormulaView() const { return \
formulaView; } +KFormula::View* KWFormulaFrameSetEdit::getFormulaView() { return \
formulaView; } +
 void KWFormulaFrameSetEdit::keyPressEvent( QKeyEvent* event )
 {
     //kdDebug(32001) << "KWFormulaFrameSetEdit::keyPressEvent" << endl;
-    int action = event->key();
-    if ( event->state() == 0 ) {
-        switch ( action ) {
-        case Qt::Key_Left:
-            if ( formulaView->isHome() ) {
-                // leave left
-                //return;
-            }
-            break;
-        case Qt::Key_Right:
-            if ( formulaView->isEnd() ) {
-                // leave right
-                //return;
-            }
-            break;
-        }
-    }
     formulaView->keyPressEvent( event );;
 }
 
@@ -2133,11 +2140,25 @@ void KWFormulaFrameSetEdit::selectAll()
 
 void KWFormulaFrameSetEdit::moveHome()
 {
-    //formulaView->slotMoveHome( KFormula::WordMovement );
+    formulaView->moveHome( KFormula::WordMovement );
 }
 void KWFormulaFrameSetEdit::moveEnd()
+{
+    formulaView->moveEnd( KFormula::WordMovement );
+}
+
+void KWFormulaFrameSetEdit::exitLeft()
+{
+    int index = formulaFrameSet()->findAnchor(0)->index();
+    KoTextParag *parag = static_cast<KoTextParag*>( formulaFrameSet()->findAnchor( 0 \
)->paragraph() ); +    m_canvas->editTextFrameSet( \
formulaFrameSet()->anchorFrameset(), parag, index ); +}
+
+void KWFormulaFrameSetEdit::exitRight()
 {
-    //formulaView->slotMoveEnd( KFormula::WordMovement );
+    int index = formulaFrameSet()->findAnchor(0)->index();
+    KoTextParag *parag = static_cast<KoTextParag*>( formulaFrameSet()->findAnchor( 0 \
)->paragraph() ); +    m_canvas->editTextFrameSet( \
formulaFrameSet()->anchorFrameset(), parag, index+1 );  }
 
 void KWFormulaFrameSetEdit::cursorChanged( bool visible, bool /*selecting*/ )
Index: kwframe.h
===================================================================
RCS file: /home/kde/koffice/kword/kwframe.h,v
retrieving revision 1.152
diff -u -3 -p -r1.152 kwframe.h
--- kwframe.h	2002/03/18 19:00:24	1.152
+++ kwframe.h	2002/03/23 13:52:43
@@ -34,6 +34,7 @@ namespace KFormula {
     class Container;
     class View;
 }
+class FormulaView;
 
 class KCommand;
 class KWAnchor;
@@ -810,6 +811,7 @@ public:
      *  the framesets. Each implementation will return a different frameType.
      */
     virtual FrameSetType type() { return FT_FORMULA; }
+    virtual void addFrame( KWFrame *_frame, bool recalc = true );
 
     virtual KWFrameSetEdit* createFrameSetEdit(KWCanvas*);
 
@@ -844,7 +846,6 @@ protected slots:
 private:
     KFormula::Container* formula;
     bool m_changed;
-    bool m_loading;
 };
 
 
@@ -860,8 +861,8 @@ public:
         return static_cast<KWFormulaFrameSet*>(frameSet());
     }
 
-    const KFormula::View* getFormulaView() const { return formulaView; }
-    KFormula::View* getFormulaView() { return formulaView; }
+    const KFormula::View* getFormulaView() const;
+    KFormula::View* getFormulaView();
 
     virtual DCOPObject* dcopObject();
 
@@ -887,6 +888,12 @@ public:
     /** Moves the cursor to the last position */
     void moveEnd();
 
+    /** Gets called if the cursor ties to leave the formula at its begin. */
+    void exitLeft();
+
+    /** Gets called if the cursor ties to leave the formula at its end. */
+    void exitRight();
+
 protected slots:
 
     /**
@@ -895,7 +902,7 @@ protected slots:
     void cursorChanged( bool visible, bool selecting );
 
 private:
-    KFormula::View* formulaView;
+    FormulaView* formulaView;
     DCOPObject *dcop;
 };
 
Index: kwtextframeset.cc
===================================================================
RCS file: /home/kde/koffice/kword/kwtextframeset.cc,v
retrieving revision 1.490
diff -u -3 -p -r1.490 kwtextframeset.cc
--- kwtextframeset.cc	2002/03/22 10:15:03	1.490
+++ kwtextframeset.cc	2002/03/23 13:53:13
@@ -2578,6 +2578,15 @@ void KWTextFrameSetEdit::ctrlPgDownKeyPr
     }
 }
 
+void KWTextFrameSetEdit::setCursor( KoTextParag* parag, int index )
+{
+    if ( m_currentFrame )
+    {
+        cursor()->setParag( parag );
+        cursor()->setIndex( index );
+    }
+}
+
 void KWTextFrameSetEdit::insertExpression(const QString &_c)
 {
     if(textObject()->hasSelection() )
Index: kwtextframeset.h
===================================================================
RCS file: /home/kde/koffice/kword/kwtextframeset.h,v
retrieving revision 1.169
diff -u -3 -p -r1.169 kwtextframeset.h
--- kwtextframeset.h	2002/03/22 10:15:03	1.169
+++ kwtextframeset.h	2002/03/23 13:53:13
@@ -305,6 +305,8 @@ public:
     virtual void ctrlPgUpKeyPressed();
     virtual void ctrlPgDownKeyPressed();
 
+    void setCursor( KoTextParag* parag, int index );
+
     void insertFrameBreak() { textFrameSet()->insertFrameBreak( cursor() ); }
     void insertVariable( int type, int subtype = 0 );
     void insertCustomVariable( const QString &name);
Index: kwview.cc
===================================================================
RCS file: /home/kde/koffice/kword/kwview.cc,v
retrieving revision 1.524
diff -u -3 -p -r1.524 kwview.cc
--- kwview.cc	2002/03/23 08:46:19	1.524
+++ kwview.cc	2002/03/23 13:53:21
@@ -67,8 +67,6 @@
 #include <koFrame.h>
 #include <kotextobject.h>
 
-#include <kformulamimesource.h>
-
 #include <ktempfile.h>
 #include <kdebug.h>
 #include <kfiledialog.h>
@@ -81,6 +79,7 @@
 #include <kstandarddirs.h>
 #include <kparts/event.h>
 #include <kformuladocument.h>
+#include <kformulamimesource.h>
 
 #include <stdlib.h>
 
@@ -2831,24 +2830,21 @@ void KWView::insertFormula( QMimeSource*
     {
         KWFormulaFrameSet *frameset = new KWFormulaFrameSet( m_doc, QString::null );
         m_doc->addFrameSet( frameset, false ); // done first since the frame number \
                is stored in the undo/redo
-        KWFrame *frame = new KWFrame(frameset, 0, 0, 10, 10 );
-        frameset->addFrame( frame, false );
         if ( source ) {
             QByteArray data = source->encodedData( \
KFormula::MimeSource::selectionMimeType() );  QDomDocument formula;
             formula.setContent( data );
             frameset->paste( formula );
         }
+        KWFrame *frame = new KWFrame(frameset, 0, 0, 10, 10 );
+        frameset->addFrame( frame, false );
         edit->insertFloatingFrameSet( frameset, i18n("Insert Formula") );
         frameset->finalize(); // done last since it triggers a redraw
-
-        // Strange, seems we need this - hmm, do we, still ?
-        // There was a bug in KWFormulaFrameSet::slotFormulaChanged that could
-        // have been the cause of this. Maybe we don't need this any longer.
-        //edit->cursor()->parag()->invalidate( 0 ); // and that's done by \
                KWTextParag::setCustomItem. Hmm.
-        //edit->cursor()->parag()->setChanged( true );
-        //m_doc->slotRepaintChanged( edit->frameSet() );
         m_doc->refreshDocStructure(FT_FORMULA);
+
+        m_gui->canvasWidget()->editFrame( frame );
+        frameset->setChanged();
+        m_gui->canvasWidget()->repaintChanged( frameset, true );
     }
 }
 


_______________________________________________
koffice-devel mailing list
koffice-devel@mail.kde.org
http://mail.kde.org/mailman/listinfo/koffice-devel

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic