SVN commit 685336 by zander: Introduce a KoFind class which is a controller that creates the find actions and is able to work with the text tool to let the user search for text in the current text document. This will work for all KOffice apps; so feel free to add it to your app if you think it makes sense to have a Find on the current text-shape. CCMAIL: koffice-devel@kde.org TODO; limit results based on text-style / replace. M +4 -6 kword/part/KWView.cpp M +1 -0 libs/kotext/CMakeLists.txt A libs/kotext/KoFind.cpp [License: LGPL (v2+)] A libs/kotext/KoFind.h [License: LGPL (v2+)] M +0 -1 libs/kotext/KoRulerController.cpp M +3 -3 libs/kotext/KoText.h M +30 -4 shapes/text/TextTool.cpp M +5 -1 shapes/text/TextTool.h --- trunk/koffice/kword/part/KWView.cpp #685335:685336 @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -87,8 +88,10 @@ setupActions(); - connect( kwcanvas()->shapeManager()->selection(), SIGNAL( selectionChanged() ), this, SLOT( selectionChanged() ) ); + connect( m_canvas->shapeManager()->selection(), SIGNAL( selectionChanged() ), this, SLOT( selectionChanged() ) ); + new KoFind(this, m_canvas->resourceProvider(), actionCollection()); + m_zoomController = new KoZoomController(m_gui->canvasController(), &m_zoomHandler, actionCollection(), true); KoZoomMode::Modes modes = KoZoomMode::ZOOM_WIDTH; if ( m_canvas->viewMode()->hasPages() ) @@ -245,11 +248,6 @@ // -------------- Edit actions m_actionEditCut = actionCollection()->addAction(KStandardAction::Cut, "edit_cut", this, SLOT( editCut() )); m_actionEditCopy = actionCollection()->addAction(KStandardAction::Copy, "edit_copy", this, SLOT( editCopy() )); - m_actionEditFind = actionCollection()->addAction(KStandardAction::Find, "edit_find", this, SLOT( editFind() )); - m_actionEditFindNext = actionCollection()->addAction(KStandardAction::FindNext, "edit_findnext", this, SLOT( editFindNext() )); - m_actionEditFindPrevious = actionCollection()->addAction(KStandardAction::FindPrev, "edit_findprevious", this, SLOT( editFindPrevious() )); - m_actionEditReplace = actionCollection()->addAction(KStandardAction::Replace, "edit_replace", this, SLOT( editReplace() )); - m_actionEditSelectAll = actionCollection()->addAction(KStandardAction::SelectAll, "edit_selectall", this, SLOT( editSelectAll() )); new KAction( i18n( "Select All Frames" ), 0, this, SLOT( editSelectAllFrames() ), actionCollection(), "edit_selectallframes" ); m_actionEditSelectCurrentFrame = new KAction( i18n( "Select Frame" ), 0, 0, this, SLOT( editSelectCurrentFrame() ), --- trunk/koffice/libs/kotext/CMakeLists.txt #685335:685336 @@ -53,6 +53,7 @@ KoBookmark.cpp KoBookmarkManager.cpp KoRulerController.cpp + KoFind.cpp styles/Styles_p.cpp styles/KoCharacterStyle.cpp --- trunk/koffice/libs/kotext/KoRulerController.cpp #685335:685336 @@ -88,7 +88,6 @@ } void tabsChanged(bool final) { -kDebug() << "tabsChanged\n"; Q_UNUSED(final); // TODO use this to cache the tab struct I'm altering. QTextBlock block = currentBlock(); if(! block.isValid()) --- trunk/koffice/libs/kotext/KoText.h #685335:685336 @@ -37,9 +37,9 @@ enum Options { ShowTextFrames = 278622039, BidiDocument = 493038196, - CurrentTextDocument = 382490375, - CurrentTextPosition = 183523, - CurrentTextAnchor = 341899485 + CurrentTextDocument = 382490375, ///< set by the text plugin whenever the document is changed + CurrentTextPosition = 183523, ///< set by the text plugin whenever the position is changed + CurrentTextAnchor = 341899485 ///< set by the text plugin whenever the anchor-position is changed }; /// enum for a type of tabulator used --- trunk/koffice/shapes/text/TextTool.cpp #685335:685336 @@ -108,6 +108,7 @@ m_allowActions(true), m_allowAddUndoCommand(true), m_trackChanges(false), + m_allowResourceProviderUpdates(true), m_prevCursorPosition(-1), m_currentCommand(0), m_currentCommandHasChildren(false) @@ -357,7 +358,7 @@ if(canMoveCaret) { bool shiftPressed = event->modifiers() & Qt::ShiftModifier; if(m_caret.hasSelection() && !shiftPressed) - repaintSelection(m_caret.position(), m_caret.anchor()); // will erase selection + repaintSelection(); // will erase selection else if(! m_caret.hasSelection()) repaintCaret(); int prevPosition = m_caret.position(); @@ -441,6 +442,7 @@ clipboard->setText(m_caret.selectedText(), QClipboard::Selection); } KoCanvasResourceProvider *p = m_canvas->resourceProvider(); + m_allowResourceProviderUpdates = false; if(m_textShapeData) { p->setResource(KoText::CurrentTextPosition, m_caret.position()); p->setResource(KoText::CurrentTextAnchor, m_caret.anchor()); @@ -453,6 +455,7 @@ p->clearResource(KoText::CurrentTextAnchor); p->clearResource(KoText::CurrentTextDocument); } + m_allowResourceProviderUpdates = true; } void TextTool::copy() const { @@ -526,7 +529,7 @@ if(qAbs(pos - m_caret.position()) <= 1) // clicked between two words m_caret.movePosition(QTextCursor::WordRight, QTextCursor::KeepAnchor); - repaintSelection(m_caret.anchor(), m_caret.position()); + repaintSelection(); } void TextTool::mouseMoveEvent( KoPointerEvent *event ) { @@ -686,7 +689,7 @@ useCursor(Qt::BlankCursor); bool shiftPressed = event->modifiers() & Qt::ShiftModifier; if(m_caret.hasSelection() && !shiftPressed) - repaintSelection(m_caret.position(), m_caret.anchor()); // will erase selection + repaintSelection(); // will erase selection else if(! m_caret.hasSelection()) repaintCaret(); QTextBlockFormat format = m_caret.blockFormat(); @@ -898,7 +901,7 @@ void TextTool::repaintDecorations() { if(m_textShapeData) - repaintSelection(m_caret.position(), m_caret.anchor()); + repaintSelection(); } void TextTool::repaintCaret() { @@ -918,6 +921,10 @@ } } +void TextTool::repaintSelection() { + repaintSelection(m_caret.position(), m_caret.anchor()); +} + void TextTool::repaintSelection(int startPosition, int endPosition) { QList shapes; if(m_textShapeData->position() > startPosition || m_textShapeData->endPosition() < endPosition) { @@ -1400,6 +1407,25 @@ updateActions(); } +void TextTool::resourceChanged(int key, const QVariant &var) { + if(m_allowResourceProviderUpdates == false) + return; + if(key == KoText::CurrentTextPosition) { + repaintSelection(); + m_caret.setPosition(var.toInt()); + ensureCursorVisible(); + } + else if(key == KoText::CurrentTextAnchor) { + repaintSelection(); + int pos = m_caret.position(); + m_caret.setPosition(var.toInt()); + m_caret.setPosition(pos, QTextCursor::KeepAnchor); + } + else return; + + repaintSelection(); +} + // ---------- editing plugins methods. void TextTool::editingPluginEvents() { if(m_prevCursorPosition == -1 || m_prevCursorPosition == m_caret.position()) --- trunk/koffice/shapes/text/TextTool.h #685335:685336 @@ -88,6 +88,8 @@ public slots: /// add a command to the undo stack, executing it as well. void addCommand(QUndoCommand *command); + /// reimplemented from KoTool + virtual void resourceChanged (int key, const QVariant &res); signals: /// emitted every time a different styleManager is set. @@ -157,6 +159,7 @@ private: void repaintCaret(); + void repaintSelection(); void repaintSelection(int from, int to); void ensureCursorVisible(); QRectF textRect(int startPosition, int endPosition) const; @@ -183,6 +186,7 @@ bool m_allowActions; bool m_allowAddUndoCommand; bool m_trackChanges; + bool m_allowResourceProviderUpdates; int m_prevCursorPosition; /// used by editingPluginEvents QAction *m_actionFormatBold; @@ -211,7 +215,7 @@ }; UpdatePageDirection m_updateParagDirection; - /// structur that allows us to remember the text position and selection of previously edited documents. + /// structure that allows us to remember the text position and selection of previously edited documents. struct TextSelection { QTextDocument *document; // be warned that this may end up being a dangling pointer, so don't use. int position; _______________________________________________ koffice-devel mailing list koffice-devel@kde.org https://mail.kde.org/mailman/listinfo/koffice-devel