FormulaCursor::FormulaCursor (const FormulaCursor& other ) { m_currentElement=other.currentElement(); m_position=other.position(); m_mark=other.mark(); m_selecting=other.isSelecting(); }
void FormulaCursor::moveTo ( const FormulaCursor& pos ) { m_currentElement=pos.currentElement(); m_position=pos.position(); m_selecting=pos.isSelecting(); m_mark=pos.mark(); }
void FormulaCommandRemove::undo() { FormulaCursor* cursor = new FormulaCursor( m_ownerElement ); cursor->setPosition( m_positionInElement ); foreach( BasicElement* tmp, m_removedElements ) m_ownerElement->insertChild( cursor, tmp ); delete cursor; }
void FormulaCommandReplace::redo() { foreach( BasicElement* tmp, m_replacedElements ) m_ownerElement->removeElement( tmp ); FormulaCursor* cursor = new FormulaCursor( m_ownerElement ); cursor->setPosition( m_positionInElement ); foreach( BasicElement* tmp, m_replacingElements ) m_ownerElement->insertChild( cursor, tmp ); delete cursor; }
bool FormulaCursor::moveCloseTo(BasicElement* element, FormulaCursor& cursor) { if (element->setCursorTo(*this,cursor.getCursorPosition()-element->absoluteBoundingRect().topLeft())) { return true; } else { return false; } }
bool TableDataElement::moveCursor ( FormulaCursor& newcursor, FormulaCursor& oldcursor ) { if (newcursor.isSelecting() || newcursor.direction()==MoveLeft || newcursor.direction()==MoveRight) { return RowElement::moveCursor(newcursor,oldcursor); } else { TableRowElement* tr= static_cast<TableRowElement*>(parentElement()); TableElement* te = static_cast<TableElement*>(tr->parentElement()); int rn=te->positionOfChild(tr)/2; //table elements have a cursor int cn=tr->positionOfChild(this); //positions before and after each element if (newcursor.direction()==MoveUp) { if (rn>1) { return newcursor.moveCloseTo(te->childElements()[rn-1]->childElements()[cn],oldcursor); } else { return false; } } else { if (rn < te->endPosition()/2) { return newcursor.moveCloseTo(te->childElements()[rn+1]->childElements()[cn],oldcursor); } else { return false; } } } }
bool TableRowElement::setCursorTo(FormulaCursor& cursor, QPointF point) { if (cursor.isSelecting()) { if (m_data.isEmpty() || point.x()<0.0) { cursor.setCurrentElement(this); cursor.setPosition(0); return true; } //check if the point is behind all child elements if (point.x() >= width()) { cursor.setCurrentElement(this); cursor.setPosition(endPosition()); return true; } } int i=0; qreal x=0.0; TableElement* parentTable = static_cast<TableElement*>( parentElement() ); for (; i<m_data.count()-1; ++i) { //Find the child element the point is in x+=parentTable->columnWidth( i ); if (x>=point.x()) { break; } } if (cursor.isSelecting()) { //we don't need to change current element because we are already in this element if (cursor.mark()<=i) { cursor.setPosition(i+1); } else { cursor.setPosition(i); } return true; } else { point-=m_data[i]->origin(); return m_data[i]->setCursorTo(cursor,point); } }
bool TableRowElement::acceptCursor( const FormulaCursor& cursor ) { return (cursor.isSelecting()); }
bool TableRowElement::moveCursor(FormulaCursor& newcursor, FormulaCursor& oldcursor) { //TODO: Moving the cursor vertically in the tableelement is a little bit fragile if ( (newcursor.isHome() && newcursor.direction()==MoveLeft) || (newcursor.isEnd() && newcursor.direction()==MoveRight) ) { return false; } int rowpos=parentElement()->positionOfChild(this); int colpos=(newcursor.position()!=endPosition() ? newcursor.position() : newcursor.position()-1); if (newcursor.isSelecting()) { switch(newcursor.direction()) { case MoveLeft: newcursor.moveTo(this,newcursor.position()-1); break; case MoveRight: newcursor.moveTo(this,newcursor.position()+1); break; case MoveUp: case MoveDown: return false; default: break; } } else { switch(newcursor.direction()) { case MoveLeft: newcursor.setCurrentElement(m_data[newcursor.position()-1]); newcursor.moveEnd(); break; case MoveRight: newcursor.setCurrentElement(m_data[newcursor.position()]); newcursor.moveHome(); break; case MoveUp: if ( rowpos>1 ) { BasicElement* b=parentElement()->childElements()[rowpos/2-1]->childElements()[colpos]; return newcursor.moveCloseTo(b, oldcursor); } else { return false; } case MoveDown: if ( rowpos<endPosition()-1 ) { BasicElement* b=parentElement()->childElements()[rowpos/2+1]->childElements()[colpos]; return newcursor.moveCloseTo(b, oldcursor); } else { return false; } default: break; } } return true; }
bool FixedElement::moveHorSituation(FormulaCursor& newcursor, FormulaCursor& oldcursor, int pos1, int pos2) { if ((newcursor.position()/2==pos1 && newcursor.direction()==MoveUp) || (newcursor.position()/2==pos2 && newcursor.direction()==MoveDown) || (newcursor.position()==2*pos1 && newcursor.direction()==MoveLeft) || (newcursor.position()==2*pos2+1 && newcursor.direction()==MoveRight) ) { return false; } switch (newcursor.direction()) { case MoveLeft: if (newcursor.position()==2*pos2+1) { newcursor.moveTo(newcursor.currentElement()->childElements()[pos2]); } else { newcursor.moveTo(newcursor.currentElement()->childElements()[pos1]); } break; case MoveRight: if (newcursor.position()==2*pos1) { newcursor.moveTo(newcursor.currentElement()->childElements()[pos1]); } else { newcursor.moveTo(newcursor.currentElement()->childElements()[pos2]); } break; case MoveUp: case MoveDown: return newcursor.moveCloseTo(childElements()[newcursor.direction()==MoveUp ? pos1 : pos2],oldcursor); case NoDirection: break; } return true; }