diff options
-rw-r--r-- | starmath/inc/edit.hxx | 6 | ||||
-rw-r--r-- | starmath/inc/node.hxx | 11 | ||||
-rw-r--r-- | starmath/inc/view.hxx | 20 | ||||
-rw-r--r-- | starmath/source/document.cxx | 6 | ||||
-rw-r--r-- | starmath/source/edit.cxx | 61 | ||||
-rw-r--r-- | starmath/source/view.cxx | 155 |
6 files changed, 235 insertions, 24 deletions
diff --git a/starmath/inc/edit.hxx b/starmath/inc/edit.hxx index cd0c6cbf4f..7249cc3a44 100644 --- a/starmath/inc/edit.hxx +++ b/starmath/inc/edit.hxx @@ -65,13 +65,15 @@ class SmEditWindow : public Window, public DropTargetHelper ScrollBar *pHScrollBar, *pVScrollBar; ScrollBarBox *pScrollBox; - Timer aModifyTimer; + Timer aModifyTimer, + aCursorMoveTimer; ESelection aOldSelection; virtual void KeyInput(const KeyEvent& rKEvt); virtual void Command(const CommandEvent& rCEvt); DECL_LINK(MenuSelectHdl, Menu *); DECL_LINK(ModifyTimerHdl, Timer *); + DECL_LINK(CursorMoveTimerHdl, Timer *); virtual void DataChanged( const DataChangedEvent& ); virtual void Resize(); @@ -133,6 +135,8 @@ public: void ApplyColorConfigValues( const svtools::ColorConfig &rColorCfg ); BOOL HandleWheelCommands( const CommandEvent &rCEvt ); + bool IsInlineEditEnabled(); + void StartCursorMove(); // for Accessibility virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible(); diff --git a/starmath/inc/node.hxx b/starmath/inc/node.hxx index f6a33a6e98..7f7981d9a2 100644 --- a/starmath/inc/node.hxx +++ b/starmath/inc/node.hxx @@ -34,9 +34,10 @@ #include <iostream> #include <stdio.h> -//My special assert macro -//TODO: replace this with DBG_ASSERT when this patch moves to production, can be done using search/replace -#define j_assert(cond, msg) do{ \ +#define j_assert(cond, msg) DBG_ASSERT(cond, msg) +#if 0 +// easier to read assert macro + do{ \ if(!(cond)) \ { \ std::cerr<<"Failed assertion: "<<msg<<", at line "; \ @@ -48,7 +49,9 @@ fprintf(stderr, "%d in %s\n", __LINE__, f + 1); \ } \ } while(false) -//TODO: Comment out below to disable dumpasdot +#endif + +// Comment out below to disable dumpasdot #define DEBUG_ENABLE_DUMPASDOT #include "parse.hxx" diff --git a/starmath/inc/view.hxx b/starmath/inc/view.hxx index 67e83ac243..f867e4a9df 100644 --- a/starmath/inc/view.hxx +++ b/starmath/inc/view.hxx @@ -51,8 +51,23 @@ class SmPrintUIOptions; class SmGraphicWindow : public ScrollableWindow { - Point aFormulaDrawPos; + Point aFormulaDrawPos; + // old style editing pieces + Rectangle aCursorRect; + bool bIsCursorVisible; +public: + BOOL IsCursorVisible() const { return bIsCursorVisible; } + void ShowCursor(BOOL bShow); + const SmNode * SetCursorPos(USHORT nRow, USHORT nCol); +protected: + void SetIsCursorVisible(BOOL bVis) { bIsCursorVisible = bVis; } + using Window::SetCursor; + void SetCursor(const SmNode *pNode); + void SetCursor(const Rectangle &rRect); + bool IsInlineEditEnabled() const; + +private: ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAccessible; SmGraphicAccessible * pAccessible; @@ -298,6 +313,9 @@ public: void SetInsertIntoEditWindow(BOOL bEditWindowHadFocusLast = TRUE){ bInsertIntoEditWindow = bEditWindowHadFocusLast; } + bool IsInlineEditEnabled() const { + return false; + } }; #endif diff --git a/starmath/source/document.cxx b/starmath/source/document.cxx index 7029228e9e..d2d893f57c 100644 --- a/starmath/source/document.cxx +++ b/starmath/source/document.cxx @@ -98,6 +98,7 @@ #include <sfx2/sfxsids.hrc> #include <svx/svxids.hrc> #include "cursor.hxx" +#include "visitors.hxx" using namespace ::com::sun::star; using namespace ::com::sun::star::accessibility; @@ -435,8 +436,6 @@ SfxItemPool& SmDocShell::GetEditEngineItemPool() OSL_ENSURE( pEditEngineItemPool, "EditEngineItemPool missing" ); return *pEditEngineItemPool; } -//TODO: Move to the top of the file... -#include "visitors.hxx" void SmDocShell::DrawFormula(OutputDevice &rDev, Point &rPosition, BOOL bDrawSelection) { @@ -530,8 +529,7 @@ Size SmDocShell::GetSize() } void SmDocShell::InvalidateCursor(){ - if(pCursor) - delete pCursor; + delete pCursor; pCursor = NULL; } diff --git a/starmath/source/edit.cxx b/starmath/source/edit.cxx index 397406573e..a9a1ad2394 100644 --- a/starmath/source/edit.cxx +++ b/starmath/source/edit.cxx @@ -96,6 +96,11 @@ void SmGetLeftSelectionPart(const ESelection aSel, } } +bool SmEditWindow::IsInlineEditEnabled() +{ + return GetView()->IsInlineEditEnabled(); +} + //////////////////////////////////////// SmEditWindow::SmEditWindow( SmCmdBoxWindow &rMyCmdBoxWin ) : @@ -122,6 +127,12 @@ SmEditWindow::SmEditWindow( SmCmdBoxWindow &rMyCmdBoxWin ) : aModifyTimer.SetTimeoutHdl(LINK(this, SmEditWindow, ModifyTimerHdl)); aModifyTimer.SetTimeout(500); + if (!IsInlineEditEnabled()) + { + aCursorMoveTimer.SetTimeoutHdl(LINK(this, SmEditWindow, CursorMoveTimerHdl)); + aCursorMoveTimer.SetTimeout(500); + } + // if not called explicitly the this edit window within the // command window will just show an empty gray panel. Show(); @@ -132,6 +143,7 @@ SmEditWindow::~SmEditWindow() { aModifyTimer.Stop(); + StartCursorMove(); // #112565# clean up of classes used for accessibility // must be done before EditView (and thus EditEngine) is no longer @@ -156,6 +168,12 @@ SmEditWindow::~SmEditWindow() delete pScrollBox; } +void SmEditWindow::StartCursorMove() +{ + if (!IsInlineEditEnabled()) + aCursorMoveTimer.Stop(); +} + void SmEditWindow::InvalidateSlots() { SfxBindings& rBind = GetView()->GetViewFrame()->GetBindings(); @@ -253,6 +271,35 @@ IMPL_LINK( SmEditWindow, ModifyTimerHdl, Timer *, EMPTYARG /*pTimer*/ ) return 0; } +IMPL_LINK(SmEditWindow, CursorMoveTimerHdl, Timer *, EMPTYARG /*pTimer*/) + // every once in a while check cursor position (selection) of edit + // window and if it has changed (try to) set the formula-cursor + // according to that. +{ + if (IsInlineEditEnabled()) + return 0; + + ESelection aNewSelection(GetSelection()); + + if (!aNewSelection.IsEqual(aOldSelection)) + { + SmViewShell *pView = rCmdBox.GetView(); + if (pView) + { + // get row and column to look for + USHORT nRow, nCol; + SmGetLeftSelectionPart(aNewSelection, nRow, nCol); + nRow++; + nCol++; + pView->GetGraphicWindow().SetCursorPos(nRow, nCol); + aOldSelection = aNewSelection; + } + } + aCursorMoveTimer.Stop(); + + return 0; +} + void SmEditWindow::Resize() { if (!pEditView) @@ -286,6 +333,8 @@ void SmEditWindow::MouseButtonUp(const MouseEvent &rEvt) else Window::MouseButtonUp (rEvt); + if (!IsInlineEditEnabled()) + CursorMoveTimerHdl(&aCursorMoveTimer); InvalidateSlots(); } @@ -390,6 +439,8 @@ void SmEditWindow::KeyInput(const KeyEvent& rKEvt) } else { + StartCursorMove(); + if (!pEditView) CreateEditView(); if ( !pEditView->PostKeyEvent(rKEvt) ) @@ -616,7 +667,7 @@ void SmEditWindow::GetFocus() pEditEngine->SetStatusEventHdl( LINK(this, SmEditWindow, EditStatusHdl) ); //Let SmViewShell know we got focus - if(GetView()) + if(GetView() && IsInlineEditEnabled()) GetView()->SetInsertIntoEditWindow(TRUE); } @@ -700,7 +751,7 @@ void SmEditWindow::InsertCommand(USHORT nCommand) } aModifyTimer.Start(); - + StartCursorMove(); GrabFocus(); } } @@ -887,6 +938,7 @@ void SmEditWindow::InsertText(const String& Text) { pEditView->InsertText(Text); aModifyTimer.Start(); + StartCursorMove(); } } @@ -904,6 +956,11 @@ void SmEditWindow::Flush() new SfxStringItem(SID_TEXT, GetText()), 0L); } } + if (aCursorMoveTimer.IsActive()) + { + aCursorMoveTimer.Stop(); + CursorMoveTimerHdl(&aCursorMoveTimer); + } } diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx index f06244b3f2..7e98170f5c 100644 --- a/starmath/source/view.cxx +++ b/starmath/source/view.cxx @@ -169,16 +169,50 @@ void SmGraphicWindow::MouseButtonDown(const MouseEvent& rMEvt) Point aPos (PixelToLogic(rMEvt.GetPosPixel()) - GetFormulaDrawPos()); - const SmNode* pTree = pViewShell->GetDoc()->GetFormulaTree(); - + const SmNode *pTree = pViewShell->GetDoc()->GetFormulaTree(); + if (!pTree) + return; + + if (IsInlineEditEnabled()) { + // if it was clicked inside the formula then get the appropriate node + if (pTree->OrientedDist(aPos) <= 0) + pViewShell->GetDoc()->GetCursor().MoveTo(this, aPos, !rMEvt.IsShift()); + return; + } + const SmNode *pNode = 0; // if it was clicked inside the formula then get the appropriate node if (pTree->OrientedDist(aPos) <= 0) - pViewShell->GetDoc()->GetCursor().MoveTo(this, aPos, !rMEvt.IsShift()); + pNode = pTree->FindRectClosestTo(aPos); + + if (pNode) + { SmEditWindow *pEdit = pViewShell->GetEditWindow(); + const SmToken aToken (pNode->GetToken()); + + // set selection to the beginning of the token + ESelection aSel (aToken.nRow - 1, aToken.nCol - 1); + + if (rMEvt.GetClicks() != 1 || aToken.eType == TPLACE) + aSel.nEndPos = aSel.nEndPos + sal::static_int_cast< USHORT >(aToken.aText.Len()); + + pEdit->SetSelection(aSel); + SetCursor(pNode); + + // allow for immediate editing and + //! implicitly synchronize the cursor position mark in this window + pEdit->GrabFocus(); + } } } +bool SmGraphicWindow::IsInlineEditEnabled() const +{ + return pViewShell->GetEditWindow()->IsInlineEditEnabled(); +} + void SmGraphicWindow::GetFocus() { + if (!IsInlineEditEnabled()) + return; pViewShell->GetEditWindow()->Flush(); //Let view shell know what insertions should be done in visual editor pViewShell->SetInsertIntoEditWindow(FALSE); @@ -197,6 +231,80 @@ void SmGraphicWindow::LoseFocus() } } +void SmGraphicWindow::ShowCursor(BOOL bShow) + // shows or hides the formula-cursor depending on 'bShow' is TRUE or not +{ + if (IsInlineEditEnabled()) + return; + + BOOL bInvert = bShow != IsCursorVisible(); + + if (bInvert) + InvertTracking(aCursorRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW); + + SetIsCursorVisible(bShow); +} + + +void SmGraphicWindow::SetCursor(const SmNode *pNode) +{ + if (IsInlineEditEnabled()) + return; + + const SmNode *pTree = pViewShell->GetDoc()->GetFormulaTree(); + + // get appropriate rectangle + Point aOffset (pNode->GetTopLeft() - pTree->GetTopLeft()), + aTLPos (GetFormulaDrawPos() + aOffset); + aTLPos.X() -= pNode->GetItalicLeftSpace(); + Size aSize (pNode->GetItalicSize()); + Point aBRPos (aTLPos.X() + aSize.Width(), aTLPos.Y() + aSize.Height()); + + SetCursor(Rectangle(aTLPos, aSize)); +} + +void SmGraphicWindow::SetCursor(const Rectangle &rRect) + // sets cursor to new position (rectangle) 'rRect'. + // The old cursor will be removed, and the new one will be shown if + // that is activated in the ConfigItem +{ + if (IsInlineEditEnabled()) + return; + + SmModule *pp = SM_MOD(); + + if (IsCursorVisible()) + ShowCursor(FALSE); // clean up remainings of old cursor + aCursorRect = rRect; + if (pp->GetConfig()->IsShowFormulaCursor()) + ShowCursor(TRUE); // draw new cursor +} + +const SmNode * SmGraphicWindow::SetCursorPos(USHORT nRow, USHORT nCol) + // looks for a VISIBLE node in the formula tree with it's token at + // (or around) the position 'nRow', 'nCol' in the edit window + // (row and column numbering starts with 1 there!). + // If there is such a node the formula-cursor is set to cover that nodes + // rectangle. If not the formula-cursor will be hidden. + // In any case the search result is being returned. +{ + if (IsInlineEditEnabled()) + return NULL; + + // find visible node with token at nRow, nCol + const SmNode *pTree = pViewShell->GetDoc()->GetFormulaTree(), + *pNode = 0; + if (pTree) + pNode = pTree->FindTokenAt(nRow, nCol); + + if (pNode) + SetCursor(pNode); + else + ShowCursor(FALSE); + + return pNode; +} + void SmGraphicWindow::Paint(const Rectangle&) { OSL_ENSURE(pViewShell, "Sm : NULL pointer"); @@ -207,9 +315,27 @@ void SmGraphicWindow::Paint(const Rectangle&) rDoc.DrawFormula(*this, aPoint, TRUE); //! modifies aPoint to be the topleft //! corner of the formula SetFormulaDrawPos(aPoint); - //Draw cursor if any... - if(pViewShell->GetDoc()->HasCursor()) - pViewShell->GetDoc()->GetCursor().Draw(*this, aPoint); + if(IsInlineEditEnabled()) { + //Draw cursor if any... + if(pViewShell->GetDoc()->HasCursor()) + pViewShell->GetDoc()->GetCursor().Draw(*this, aPoint); + } else { + SetIsCursorVisible(FALSE); // (old) cursor must be drawn again + + const SmEditWindow *pEdit = pViewShell->GetEditWindow(); + if (pEdit) + { // get new position for formula-cursor (for possible altered formula) + USHORT nRow, nCol; + SmGetLeftSelectionPart(pEdit->GetSelection(), nRow, nCol); + nRow++; + nCol++; + const SmNode *pFound = SetCursorPos(nRow, nCol); + + SmModule *pp = SM_MOD(); + if (pFound && pp->GetConfig()->IsShowFormulaCursor()) + ShowCursor(TRUE); + } + } } @@ -223,6 +349,11 @@ void SmGraphicWindow::SetTotalSize () void SmGraphicWindow::KeyInput(const KeyEvent& rKEvt) { + if (!IsInlineEditEnabled()) { + if (! (GetView() && GetView()->KeyInput(rKEvt)) ) + ScrollableWindow::KeyInput(rKEvt); + return; + } USHORT nCode = rKEvt.GetKeyCode().GetCode(); SmCursor& rCursor = pViewShell->GetDoc()->GetCursor(); switch(nCode) @@ -1360,8 +1491,8 @@ void SmViewShell::Execute(SfxRequest& rReq) bVal = !pp->GetConfig()->IsShowFormulaCursor(); pp->GetConfig()->SetShowFormulaCursor(bVal); - //GetGraphicWindow().ShowCursor(bVal); - //TODO Consider disabling this option!!! + if (!IsInlineEditEnabled()) + GetGraphicWindow().ShowCursor(bVal); break; } case SID_DRAW: @@ -1506,9 +1637,9 @@ void SmViewShell::Execute(SfxRequest& rReq) const SfxInt16Item& rItem = (const SfxInt16Item&)rReq.GetArgs()->Get(SID_INSERTCOMMAND); - if (pWin && bInsertIntoEditWindow) + if (pWin && (bInsertIntoEditWindow || !IsInlineEditEnabled())) pWin->InsertCommand(rItem.GetValue()); - if (GetDoc() && !bInsertIntoEditWindow) { + if (IsInlineEditEnabled() && (GetDoc() && !bInsertIntoEditWindow)) { GetDoc()->GetCursor().InsertCommand(rItem.GetValue()); GetGraphicWindow().GrabFocus(); } @@ -1520,9 +1651,9 @@ void SmViewShell::Execute(SfxRequest& rReq) const SfxStringItem& rItem = (const SfxStringItem&)rReq.GetArgs()->Get(SID_INSERTSYMBOL); - if (pWin && bInsertIntoEditWindow) + if (pWin && (bInsertIntoEditWindow || !IsInlineEditEnabled())) pWin->InsertText(rItem.GetValue()); - if(GetDoc() && !bInsertIntoEditWindow) + if (IsInlineEditEnabled() && (GetDoc() && !bInsertIntoEditWindow)) GetDoc()->GetCursor().InsertSpecial(rItem.GetValue()); break; } |