summaryrefslogtreecommitdiff
path: root/starmath/inc/cursor.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'starmath/inc/cursor.hxx')
-rw-r--r--starmath/inc/cursor.hxx482
1 files changed, 0 insertions, 482 deletions
diff --git a/starmath/inc/cursor.hxx b/starmath/inc/cursor.hxx
deleted file mode 100644
index 6b6e7168a5..0000000000
--- a/starmath/inc/cursor.hxx
+++ /dev/null
@@ -1,482 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * Version: MPL 1.1 / GPLv3+ / LGPLv3+
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Initial Developer of the Original Code is
- * Jonas Finnemann Jensen <jopsen@gmail.com>
- * Portions created by the Initial Developer are Copyright (C) 2010 the
- * Initial Developer. All Rights Reserved.
- *
- * Contributor(s): Jonas Finnemann Jensen <jopsen@gmail.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
- * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
- * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
- * instead of those above.
- */
-#ifndef SMCURSOR_H
-#define SMCURSOR_H
-
-#include "node.hxx"
-#include "caret.hxx"
-
-/** Factor to multiple the squared horizontical distance with
- * Used for Up and Down movement.
- */
-#define HORIZONTICAL_DISTANCE_FACTOR 10
-
-/** Enum of direction for movement */
-enum SmMovementDirection{
- MoveUp,
- MoveDown,
- MoveLeft,
- MoveRight
-};
-
-/** Enum of elements that can inserted into a formula */
-enum SmFormulaElement{
- BlankElement,
- FactorialElement,
- PlusElement,
- MinusElement,
- CDotElement,
- EqualElement,
- LessThanElement,
- GreaterThanElement,
- PercentElement
-};
-
-/** Bracket types that can be inserted */
-enum SmBracketType {
- /** None brackets, left command "none" */
- NoneBrackets,
- /** Round brackets, left command "(" */
- RoundBrackets,
- /**Square brackets, left command "[" */
- SquareBrackets,
- /** Double square brackets, left command "ldbracket" */
- DoubleSquareBrackets,
- /** Line brackets, left command "lline" */
- LineBrackets,
- /** Double line brackets, left command "ldline" */
- DoubleLineBrackets,
- /** Curly brackets, left command "lbrace" */
- CurlyBrackets,
- /** Angle brackets, left command "langle" */
- AngleBrackets,
- /** Ceiling brackets, left command "lceil" */
- CeilBrackets,
- /** Floor brackets, left command "lfloor" */
- FloorBrackets
-};
-
-/** A list of nodes */
-typedef std::list<SmNode*> SmNodeList;
-
-class SmDocShell;
-
-/** Formula cursor
- *
- * This class is used to represent a cursor in a formula, which can be used to manipulate
- * an formula programmatically.
- * @remarks This class is a very intimite friend of SmDocShell.
- */
-class SmCursor{
-public:
- SmCursor(SmNode* tree, SmDocShell* pShell){
- //Initialize members
- pTree = tree;
- anchor = NULL;
- position = NULL;
- pGraph = NULL;
- pDocShell = pShell;
- pClipboard = NULL;
- nEditSections = 0;
- //Build graph
- BuildGraph();
- }
-
- ~SmCursor(){
- SetClipboard();
- if(pGraph)
- delete pGraph;
- pGraph = NULL;
- }
-
- /** Gets the anchor */
- SmCaretPos GetAnchor(){ return anchor->CaretPos; }
-
- /** Get position */
- SmCaretPos GetPosition() { return position->CaretPos; }
-
- /** True, if the cursor has a selection */
- bool HasSelection() { return anchor != position; }
-
- /** Move the position of this cursor */
- void Move(OutputDevice* pDev, SmMovementDirection direction, bool bMoveAnchor = true);
-
- /** Move to the caret position closet to a given point */
- void MoveTo(OutputDevice* pDev, Point pos, bool bMoveAnchor = true);
-
- /** Delete the current selection or do nothing */
- void Delete();
-
- /** Delete selection, previous element or merge lines
- *
- * This method implements the behaviour of backspace.
- */
- void DeletePrev(OutputDevice* pDev);
-
- /** Insert text at the current position */
- void InsertText(XubString aString);
-
- /** Insert an element into the formula */
- void InsertElement(SmFormulaElement element);
-
- /** Insert a command specified in commands.src*/
- void InsertCommand(sal_uInt16 nCommand);
-
- /** Insert command text translated into line entries at position
- *
- * Note: This method uses the parser to translate a command text into a
- * tree, then it copies line entries from this tree into the current tree.
- * Will not work for commands such as newline or ##, if position is in a matrix.
- * This will work for stuff like "A intersection B". But stuff spaning multiple lines
- * or dependent on the context which position is placed in will not work!
- */
- void InsertCommandText(String aCommandText);
-
- /** Insert a special node created from aString
- *
- * Used for handling insert request from the "catalog" dialog.
- * The provided string should be formatet as the desired command: %phi
- * Note: this method ONLY supports commands defined in Math.xcu
- *
- * For more complex expressions use InsertCommandText, this method doesn't
- * use SmParser, this means that it's faster, but not as strong.
- */
- void InsertSpecial(XubString aString);
-
- /** Create sub-/super script
- *
- * If there's a selection, it will be move into the appropriate sub-/super scription
- * of the node in front of it. If there's no node in front of position (or the selection),
- * a sub-/super scription of a new SmPlaceNode will be made.
- *
- * If there's is an existing subscription of the node, the caret will be moved into it,
- * and any selection will replace it.
- */
- void InsertSubSup(SmSubSup eSubSup);
-
- /** Create a limit on an SmOperNode
- *
- * This this method only work if the caret is inside an SmOperNode, or to the right of one.
- * Notice also that this method ignores any selection made.
- *
- * @param bMoveCaret If true that caret will be moved into the limit.
- *
- * @returns True, if the caret was in a context where this operation was possible.
- */
- bool InsertLimit(SmSubSup eSubSup, bool bMoveCaret = true);
-
- /** Insert a new row or newline
- *
- * Inserts a new row if position is in an matrix or stack command.
- * Otherwise a newline is inserted if we're in a toplevel line.
- *
- * @returns True, if a new row/line could be inserted.
- *
- * @remarks If the caret is placed in a subline of a command that doesn't support
- * this operator the method returns FALSE, and doesn't do anything.
- */
- bool InsertRow();
-
- /** Insert a fraction, use selection as numerator */
- void InsertFraction();
-
- /** Create brackets around current selection, or new SmPlaceNode */
- void InsertBrackets(SmBracketType eBracketType);
-
- /** Copy the current selection */
- void Copy();
- /** Cut the current selection */
- void Cut(){
- Copy();
- Delete();
- }
- /** Paste the clipboard */
- void Paste();
-
- /** Returns true if more than one node is selected
- *
- * This method is used for implementing backspace and delete.
- * If one of these causes a complex selection, e.g. a node with
- * subnodes or similar, this should not be deleted imidiately.
- */
- bool HasComplexSelection();
-
- /** Finds the topmost node in a visual line
- *
- * If MoveUpIfSelected is true, this will move up to the parent line
- * if the parent of the current line is selected.
- */
- static SmNode* FindTopMostNodeInLine(SmNode* pSNode, bool MoveUpIfSelected = false);
-
- /** Draw the caret */
- void Draw(OutputDevice& pDev, Point Offset, bool isCaretVisible);
-
-private:
- friend class SmDocShell;
-
- SmCaretPosGraphEntry *anchor,
- *position;
- /** Formula tree */
- SmNode* pTree;
- /** Owner of the formula tree */
- SmDocShell* pDocShell;
- /** Graph over caret position in the current tree */
- SmCaretPosGraph* pGraph;
- /** Clipboard holder */
- SmNodeList* pClipboard;
-
- /** Returns a node that is selected, if any could be found */
- SmNode* FindSelectedNode(SmNode* pNode);
-
- /** Is this one of the nodes used to compose a line
- *
- * These are SmExpression, SmBinHorNode, SmUnHorNode etc.
- */
- static bool IsLineCompositionNode(SmNode* pNode);
-
- /** Count number of selected nodes, excluding line composition nodes
- *
- * Note this function doesn't count line composition nodes and it
- * does count all subnodes as well as the owner nodes.
- *
- * Used by SmCursor::HasComplexSelection()
- */
- int CountSelectedNodes(SmNode* pNode);
-
- /** Convert a visual line to a list
- *
- * Note this method will delete all the nodes that will no longer be needed.
- * that includes pLine!
- * This method also deletes SmErrorNode's as they're just meta info in the line.
- */
- static SmNodeList* LineToList(SmStructureNode* pLine, SmNodeList* pList = new SmNodeList());
-
- /** Auxiliary function for calling LineToList on a node
- *
- * This method sets pNode = NULL and remove it from it's parent.
- * (Assuming it has a parent, and is a child of it).
- */
- static SmNodeList* NodeToList(SmNode*& rpNode, SmNodeList* pList = new SmNodeList()){
- //Remove from parent and NULL rpNode
- SmNode* pNode = rpNode;
- if(rpNode && rpNode->GetParent()){ //Don't remove this, correctness relies on it
- int index = rpNode->GetParent()->IndexOfSubNode(rpNode);
- if(index != -1)
- rpNode->GetParent()->SetSubNode(index, NULL);
- }
- rpNode = NULL;
- //Create line from node
- if(pNode && IsLineCompositionNode(pNode))
- return LineToList((SmStructureNode*)pNode, pList);
- if(pNode)
- pList->push_front(pNode);
- return pList;
- }
-
- /** Clone a visual line to a list
- *
- * Doesn't clone SmErrorNode's these are ignored, as they are context dependent metadata.
- */
- static SmNodeList* CloneLineToList(SmStructureNode* pLine,
- bool bOnlyIfSelected = false,
- SmNodeList* pList = new SmNodeList());
-
- /** Build pGraph over caret positions */
- void BuildGraph();
-
- /** Insert new nodes in the tree after position */
- void InsertNodes(SmNodeList* pNewNodes);
-
- /** tries to set position to a specific SmCaretPos
- *
- * @returns false on failure to find the position in pGraph.
- */
- bool SetCaretPosition(SmCaretPos pos, bool moveAnchor = false);
-
- /** Set selected on nodes of the tree */
- void AnnotateSelection();
-
- /** Set the clipboard, and release current clipboard
- *
- * Call this method with NULL to reset the clipboard
- * @remarks: This method takes ownership of pList.
- */
- void SetClipboard(SmNodeList* pList = NULL);
-
- /** Clone list of nodes (creates a deep clone) */
- static SmNodeList* CloneList(SmNodeList* pList);
-
- /** Find an iterator pointing to the node in pLineList following aCaretPos
- *
- * If aCaretPos::pSelectedNode cannot be found it is assumed that it's in front of pLineList,
- * thus not an element in pLineList. In this case this method returns an iterator to the
- * first element in pLineList.
- *
- * If the current position is inside an SmTextNode, this node will be split in two, for this
- * reason you should beaware that iterators to elements in pLineList may be invalidated, and
- * that you should call PatchLineList() with this iterator if no action is taken.
- */
- static SmNodeList::iterator FindPositionInLineList(SmNodeList* pLineList, SmCaretPos aCaretPos);
-
- /** Patch a line list after modification, merge SmTextNode, remove SmPlaceNode etc.
- *
- * @param pLineList The line list to patch
- * @param aIter Iterator pointing to the element that needs to be patched with it's previous.
- *
- * When the list is patched text nodes before and after aIter will be merged.
- * If there's an, in the context, inappropriate SmPlaceNode before or after aIter it will also be
- * removed.
- *
- * @returns A caret position equivalent to one selecting the node before aIter, the method returns
- * an invalid SmCaretPos to indicate placement in front of the line.
- */
- static SmCaretPos PatchLineList(SmNodeList* pLineList, SmNodeList::iterator aIter);
-
- /** Take selected nodes from a list
- *
- * Puts the selected nodes into pSelectedNodes, or if pSelectedNodes is NULL deletes
- * the selected nodes.
- * Note: If there's a selection inside an SmTextNode this node will be split, and it
- * will not be merged when the selection have been taken. Use PatchLineList on the
- * iterator returns to fix this.
- *
- * @returns An iterator pointing to the element following the selection taken.
- */
- static SmNodeList::iterator TakeSelectedNodesFromList(SmNodeList *pLineList,
- SmNodeList *pSelectedNodes = NULL);
-
- /** Create an instance of SmMathSymbolNode usable for brackets */
- static SmNode *CreateBracket(SmBracketType eBracketType, bool bIsLeft);
-
- /** The number of times BeginEdit have been called
- * Used to allow nesting of BeginEdit() and EndEdit() sections
- */
- int nEditSections;
- /** Holds data for BeginEdit() and EndEdit() */
- bool bIsEnabledSetModifiedSmDocShell;
- /** Begin edit section where the tree will be modified */
- void BeginEdit();
- /** End edit section where the tree will be modified */
- void EndEdit();
- /** Finish editing
- *
- * Finishes editing by parsing pLineList and inserting back into pParent at nParentIndex.
- * This method also rebuilts the graph, annotates the selection, sets caret position and
- * Calls EndEdit.
- *
- * @remarks Please note that this method will delete pLineList, as the elements are taken.
- *
- * @param pLineList List the constitutes the edited line.
- * @param pParent Parent to which the line should be inserted.
- * @param nParentIndex Index in parent where the line should be inserted.
- * @param PosAfterEdit Caret position to look for after rebuilding graph.
- * @param pStartLine Line to take first position in, if PosAfterEdit cannot be found,
- * leave it NULL for pLineList.
- */
- void FinishEdit(SmNodeList* pLineList,
- SmStructureNode* pParent,
- int nParentIndex,
- SmCaretPos PosAfterEdit,
- SmNode* pStartLine = NULL);
- /** Request the formula is repainted */
- void RequestRepaint();
-};
-
-/** Minimalistic recursive decent SmNodeList parser
- *
- * This parser is used to take a list of nodes that constitues a line
- * and parse them to a tree of SmBinHorNode, SmUnHorNode and SmExpression.
- *
- * Please note, this will not handle all kinds of nodes, only nodes that
- * constitues and entry in a line.
- *
- * Below is an EBNF representation of the grammar used for this parser:
- * \code
- * Expression -> Relation*
- * Relation -> Sum [(=|<|>|...) Sum]*
- * Sum -> Product [(+|-) Product]*
- * Product -> Factor [(*|/) Factor]*
- * Factor -> [+|-|-+|...]* Factor | Postfix
- * Postfix -> node [!]*
- * \endcode
- */
-class SmNodeListParser{
-public:
- /** Create an instance of SmNodeListParser */
- SmNodeListParser(){
- pList = NULL;
- }
- /** Parse a list of nodes to an expression
- *
- * If bDeleteErrorNodes is true, old error nodes will be deleted.
- */
- SmNode* Parse(SmNodeList* list, bool bDeleteErrorNodes = true);
- /** True, if the token is an operator */
- static bool IsOperator(const SmToken &token);
- /** True, if the token is a relation operator */
- static bool IsRelationOperator(const SmToken &token);
- /** True, if the token is a sum operator */
- static bool IsSumOperator(const SmToken &token);
- /** True, if the token is a product operator */
- static bool IsProductOperator(const SmToken &token);
- /** True, if the token is a unary operator */
- static bool IsUnaryOperator(const SmToken &token);
- /** True, if the token is a postfix operator */
- static bool IsPostfixOperator(const SmToken &token);
-private:
- SmNodeList* pList;
- /** Get the current terminal */
- SmNode* Terminal(){
- if(pList->size() > 0)
- return pList->front();
- return NULL;
- }
- /** Move to next terminal */
- SmNode* Next(){
- pList->pop_front();
- return Terminal();
- }
- /** Take the current terminal */
- SmNode* Take(){
- SmNode* pRetVal = Terminal();
- Next();
- return pRetVal;
- }
- SmNode* Expression();
- SmNode* Relation();
- SmNode* Sum();
- SmNode* Product();
- SmNode* Factor();
- SmNode* Postfix();
- SmNode* Error();
-};
-
-
-#endif /* SMCURSOR_H */
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */