Skip to content

Commit

Permalink
Breakpoint markers for models inside package
Browse files Browse the repository at this point in the history
Calculate the line numbering from model line start instead of text block start
  • Loading branch information
adeas31 committed Oct 8, 2019
1 parent be7c680 commit fa6b8e7
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 42 deletions.
Expand Up @@ -78,8 +78,8 @@ void BreakpointMarker::documentClosing()
}

//! @class DocumentMarker
DocumentMarker::DocumentMarker(QTextDocument *doc)
: ITextMarkable(doc) , mpTextDocument(doc)
DocumentMarker::DocumentMarker(QTextDocument *doc, int lineStartNumber)
: ITextMarkable(doc) , mpTextDocument(doc), mLineStartNumber(lineStartNumber)
{

}
Expand All @@ -92,11 +92,11 @@ bool DocumentMarker::addMark(ITextMark *mark, int line)
if (!docLayout) {
return false;
}
QTextBlock block = mpTextDocument->findBlockByNumber(blockNumber);
QTextBlock block = mpTextDocument->findBlockByNumber(mLineStartNumber > 0 ? line - mLineStartNumber : blockNumber);
if (block.isValid()) {
TextBlockUserData *userData = BaseEditorDocumentLayout::userData(block);
userData->addMark(mark);
mark->updateLineNumber(blockNumber + 1);
mark->updateLineNumber(line);
mark->updateBlock(block);
docLayout->mHasBreakpoint = true;
docLayout->requestUpdate();
Expand Down Expand Up @@ -153,8 +153,9 @@ void DocumentMarker::updateMark(ITextMark *mark)
{
Q_UNUSED(mark)
BaseEditorDocumentLayout *docLayout = qobject_cast<BaseEditorDocumentLayout*>(mpTextDocument->documentLayout());
if (docLayout)
if (docLayout) {
docLayout->requestUpdate();
}
}

void DocumentMarker::updateBreakpointsLineNumber()
Expand All @@ -164,7 +165,7 @@ void DocumentMarker::updateBreakpointsLineNumber()
while (block.isValid()) {
if (const TextBlockUserData *userData = BaseEditorDocumentLayout::testUserData(block))
foreach (ITextMark *mrk, userData->marks()) {
mrk->updateLineNumber(blockNumber + 1);
mrk->updateLineNumber(mLineStartNumber > 0 ? blockNumber + mLineStartNumber : blockNumber + 1);
}
block = block.next();
++blockNumber;
Expand All @@ -174,6 +175,7 @@ void DocumentMarker::updateBreakpointsLineNumber()
void DocumentMarker::updateBreakpointsBlock(const QTextBlock &block)
{
if (const TextBlockUserData *userData = BaseEditorDocumentLayout::testUserData(block))
foreach (ITextMark *mrk, userData->marks())
foreach (ITextMark *mrk, userData->marks()) {
mrk->updateBlock(block);
}
}
Expand Up @@ -121,7 +121,7 @@ class DocumentMarker : public ITextMarkable
{
Q_OBJECT
public:
DocumentMarker(QTextDocument *);
DocumentMarker(QTextDocument *, int = 0);

// ITextMarkable
bool addMark(ITextMark *mark, int line);
Expand All @@ -135,6 +135,7 @@ class DocumentMarker : public ITextMarkable

private:
QTextDocument *mpTextDocument;
int mLineStartNumber;
};

#endif // BREAKPOINTMARKER_H
Expand Down
28 changes: 15 additions & 13 deletions OMEdit/OMEdit/OMEditGUI/Debugger/Breakpoints/BreakpointsWidget.cpp
Expand Up @@ -354,10 +354,10 @@ QVariant BreakpointsTreeModel::data(const QModelIndex &index, int role) const
*/
BreakpointMarker* BreakpointsTreeModel::findBreakpointMarker(const QString &fileName, int lineNumber)
{
foreach (BreakpointMarker *pBreakpointMarker, mBreakpointMarkersList)
{
if ((pBreakpointMarker->filePath().compare(fileName) == 0) && (pBreakpointMarker->lineNumber() == lineNumber))
foreach (BreakpointMarker *pBreakpointMarker, mBreakpointMarkersList) {
if ((pBreakpointMarker->filePath().compare(fileName) == 0) && (pBreakpointMarker->lineNumber() == lineNumber)) {
return pBreakpointMarker;
}
}
return 0;
}
Expand All @@ -371,11 +371,14 @@ BreakpointMarker* BreakpointsTreeModel::findBreakpointMarker(const QString &file
BreakpointTreeItem* BreakpointsTreeModel::findBreakpointTreeItem(const QString &fileName, int lineNumber, BreakpointTreeItem *pRootBreakpointTreeItem) const
{
QString ln = QString::number(lineNumber);
if ((pRootBreakpointTreeItem->getFilePath().compare(fileName) == 0) && (pRootBreakpointTreeItem->getLineNumber().compare(ln) == 0))
if ((pRootBreakpointTreeItem->getFilePath().compare(fileName) == 0) && (pRootBreakpointTreeItem->getLineNumber().compare(ln) == 0)) {
return pRootBreakpointTreeItem;
for (int i = pRootBreakpointTreeItem->getChildren().size(); --i >= 0; )
if (BreakpointTreeItem *pBreakpointTreeItem = findBreakpointTreeItem(fileName, lineNumber, pRootBreakpointTreeItem->getChildren().at(i)))
}
for (int i = pRootBreakpointTreeItem->getChildren().size(); --i >= 0; ) {
if (BreakpointTreeItem *pBreakpointTreeItem = findBreakpointTreeItem(fileName, lineNumber, pRootBreakpointTreeItem->getChildren().at(i))) {
return pBreakpointTreeItem;
}
}
return 0;
}

Expand All @@ -392,18 +395,18 @@ QModelIndex BreakpointsTreeModel::breakpointTreeItemIndex(const BreakpointTreeIt
Helper function to find BreakpointTreeItem QModelIndex
\see BreakpointsTreeModel::breakpointTreeItemIndex
*/
QModelIndex BreakpointsTreeModel::breakpointTreeItemIndexHelper(const BreakpointTreeItem *pBreakpointTreeItem,
const BreakpointTreeItem *pParentBreakpointTreeItem,
const QModelIndex &parentIndex) const
QModelIndex BreakpointsTreeModel::breakpointTreeItemIndexHelper(const BreakpointTreeItem *pBreakpointTreeItem, const BreakpointTreeItem *pParentBreakpointTreeItem, const QModelIndex &parentIndex) const
{
if (pBreakpointTreeItem == pParentBreakpointTreeItem)
if (pBreakpointTreeItem == pParentBreakpointTreeItem) {
return parentIndex;
}
for (int i = pParentBreakpointTreeItem->getChildren().size(); --i >= 0; ) {
const BreakpointTreeItem *childItem = pParentBreakpointTreeItem->getChildren().at(i);
QModelIndex childIndex = index(i, 0, parentIndex);
QModelIndex index = breakpointTreeItemIndexHelper(pBreakpointTreeItem, childItem, childIndex);
if (index.isValid())
if (index.isValid()) {
return index;
}
}
return QModelIndex();
}
Expand All @@ -417,8 +420,7 @@ QModelIndex BreakpointsTreeModel::breakpointTreeItemIndexHelper(const Breakpoint
\param pLibraryTreeItem - pointer LibraryTreeItem
\param pParentBreakpointTreeItem - pointer BreakpointTreeItem
*/
void BreakpointsTreeModel::insertBreakpoint(BreakpointMarker *pBreakpointMarker, LibraryTreeItem *pLibraryTreeItem,
BreakpointTreeItem *pParentBreakpointTreeItem)
void BreakpointsTreeModel::insertBreakpoint(BreakpointMarker *pBreakpointMarker, LibraryTreeItem *pLibraryTreeItem, BreakpointTreeItem *pParentBreakpointTreeItem)
{
// Add the breakpoint to the list.
mBreakpointMarkersList.append(pBreakpointMarker);
Expand Down
Expand Up @@ -99,12 +99,10 @@ class BreakpointsTreeModel : public QAbstractItemModel
BreakpointMarker* findBreakpointMarker(const QString &fileName, int lineNumber);
BreakpointTreeItem* findBreakpointTreeItem(const QString &fileName, int lineNumber, BreakpointTreeItem *pRootBreakpointTreeItem) const;
QModelIndex breakpointTreeItemIndex(const BreakpointTreeItem *pBreakpointTreeItem) const;
QModelIndex breakpointTreeItemIndexHelper(const BreakpointTreeItem *pBreakpointTreeItem, const BreakpointTreeItem *pParentBreakpointTreeItem,
const QModelIndex &parentIndex) const;
QModelIndex breakpointTreeItemIndexHelper(const BreakpointTreeItem *pBreakpointTreeItem, const BreakpointTreeItem *pParentBreakpointTreeItem, const QModelIndex &parentIndex) const;
void insertBreakpoint(BreakpointMarker *pBreakpointMarker, LibraryTreeItem *pLibraryTreeItem, BreakpointTreeItem *pParentBreakpointTreeItem);
void updateBreakpoint(BreakpointMarker *pBreakpointMarker, int lineNumber);
void updateBreakpoint(BreakpointTreeItem *pBreakpointTreeItem, QString filePath, int lineNumber, bool enabled, int ignoreCount,
QString condition);
void updateBreakpoint(BreakpointTreeItem *pBreakpointTreeItem, QString filePath, int lineNumber, bool enabled, int ignoreCount, QString condition);
void removeBreakpoint(BreakpointMarker *pBreakpointMarker);
void removeBreakpoint(BreakpointTreeItem *pBreakpointTreeItem);
private:
Expand Down
46 changes: 30 additions & 16 deletions OMEdit/OMEdit/OMEditGUI/Editors/BaseEditor.cpp
Expand Up @@ -865,7 +865,11 @@ void PlainTextEdit::setCanHaveBreakpoints(bool canHaveBreakpoints)
int PlainTextEdit::lineNumberAreaWidth()
{
int digits = 2;
int max = qMax(1, document()->blockCount());
int lines = document()->blockCount();
if (mpBaseEditor->isModelicaModelInPackageOneFile()) {
lines = document()->blockCount() + mpBaseEditor->getModelWidget()->getLibraryTreeItem()->mClassInformation.lineNumberStart;
}
int max = qMax(1, lines);
while (max >= 100) {
max /= 10;
++digits;
Expand Down Expand Up @@ -937,18 +941,16 @@ void PlainTextEdit::lineNumberAreaPaintEvent(QPaintEvent *event)
if (pTextBlockUserData && canHaveBreakpoints()) {
int xoffset = 0;
foreach (ITextMark *mk, pTextBlockUserData->marks()) {
int x = 0;
int radius = fmLineSpacing;
QRect r(x + xoffset, top, radius, radius);
QRect r(xoffset, top, radius, radius);
mk->icon().paint(&painter, r, Qt::AlignCenter);
xoffset += 2;
}
}
/* paint line numbers */
if (block.isVisible() && bottom >= event->rect().top()) {
QString number;
if (mpBaseEditor->getModelWidget() && mpBaseEditor->getModelWidget()->getLibraryTreeItem()->isInPackageOneFile() &&
mpBaseEditor->getModelWidget()->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::Modelica) {
if (mpBaseEditor->isModelicaModelInPackageOneFile()) {
number = QString::number(blockNumber + mpBaseEditor->getModelWidget()->getLibraryTreeItem()->mClassInformation.lineNumberStart);
} else {
number = QString::number(blockNumber + 1);
Expand Down Expand Up @@ -1046,6 +1048,9 @@ void PlainTextEdit::lineNumberAreaMouseEvent(QMouseEvent *event)
}
QString fileName = mpBaseEditor->getModelWidget()->getLibraryTreeItem()->getFileName();
int lineNumber = cursor.blockNumber() + 1;
if (mpBaseEditor->isModelicaModelInPackageOneFile()) {
lineNumber = cursor.blockNumber() + mpBaseEditor->getModelWidget()->getLibraryTreeItem()->mClassInformation.lineNumberStart;
}
if (event->button() == Qt::LeftButton) { //! left clicked: add/remove breakpoint
toggleBreakpoint(fileName, lineNumber);
} else if (event->button() == Qt::RightButton) { //! right clicked: show context menu
Expand Down Expand Up @@ -1079,8 +1084,7 @@ void PlainTextEdit::lineNumberAreaMouseEvent(QMouseEvent *event)
*/
void PlainTextEdit::goToLineNumber(int lineNumber)
{
if (mpBaseEditor->getModelWidget() && mpBaseEditor->getModelWidget()->getLibraryTreeItem()->isInPackageOneFile() &&
mpBaseEditor->getModelWidget()->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::Modelica) {
if (mpBaseEditor->isModelicaModelInPackageOneFile()) {
int lineNumberStart = mpBaseEditor->getModelWidget()->getLibraryTreeItem()->mClassInformation.lineNumberStart;
int lineNumberDifferenceFromStart = lineNumberStart - 1;
lineNumber -= lineNumberDifferenceFromStart;
Expand Down Expand Up @@ -1416,7 +1420,10 @@ void PlainTextEdit::updateCursorPosition()
{
if (mpBaseEditor->getModelWidget() && isVisible()) {
const QTextBlock block = textCursor().block();
const int line = block.blockNumber() + 1;
int line = block.blockNumber() + 1;
if (mpBaseEditor->isModelicaModelInPackageOneFile()) {
line = block.blockNumber() + mpBaseEditor->getModelWidget()->getLibraryTreeItem()->mClassInformation.lineNumberStart;
}
const int column = textCursor().columnNumber();
Label *pPositionLabel = MainWindow::instance()->getPositionLabel();
pPositionLabel->setText(QString("Ln: %1, Col: %2").arg(line).arg(column));
Expand Down Expand Up @@ -2037,6 +2044,13 @@ QString BaseEditor::wordUnderCursor()
return cursor.selectedText();
}

bool BaseEditor::isModelicaModelInPackageOneFile()
{
return (mpModelWidget &&
mpModelWidget->getLibraryTreeItem()->isInPackageOneFile() &&
mpModelWidget->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::Modelica);
}

/*!
* \brief BaseEditor::initialize
* Initializes the editor with default values.
Expand Down Expand Up @@ -2786,16 +2800,16 @@ GotoLineDialog::GotoLineDialog(BaseEditor *pBaseEditor)
*/
int GotoLineDialog::exec()
{
if (mpBaseEditor->getModelWidget() && mpBaseEditor->getModelWidget()->getLibraryTreeItem()->isInPackageOneFile() &&
mpBaseEditor->getModelWidget()->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::Modelica) {
int lineNumberStart = mpBaseEditor->getModelWidget()->getLibraryTreeItem()->mClassInformation.lineNumberStart;
mpLineNumberLabel->setText(tr("Enter line number (%1 to %2):").arg(QString::number(lineNumberStart))
.arg(QString::number(mpBaseEditor->getPlainTextEdit()->blockCount() + lineNumberStart - 1)));
QIntValidator *intValidator = new QIntValidator(this);
if (mpBaseEditor->isModelicaModelInPackageOneFile()) {
int from = mpBaseEditor->getModelWidget()->getLibraryTreeItem()->mClassInformation.lineNumberStart;
int to = mpBaseEditor->getPlainTextEdit()->blockCount() + from - 1;
mpLineNumberLabel->setText(tr("Enter line number (%1 to %2):").arg(from).arg(to));
intValidator->setRange(from, to);
} else {
mpLineNumberLabel->setText(tr("Enter line number (1 to %1):").arg(QString::number(mpBaseEditor->getPlainTextEdit()->blockCount())));
mpLineNumberLabel->setText(tr("Enter line number (1 to %1):").arg(mpBaseEditor->getPlainTextEdit()->blockCount()));
intValidator->setRange(1, mpBaseEditor->getPlainTextEdit()->blockCount());
}
QIntValidator *intValidator = new QIntValidator(this);
intValidator->setRange(1, mpBaseEditor->getPlainTextEdit()->blockCount());
mpLineNumberTextBox->setValidator(intValidator);
return QDialog::exec();
}
Expand Down
1 change: 1 addition & 0 deletions OMEdit/OMEdit/OMEditGUI/Editors/BaseEditor.h
Expand Up @@ -331,6 +331,7 @@ class BaseEditor : public QWidget
void setForceSetPlainText(bool forceSetPlainText) {mForceSetPlainText = forceSetPlainText;}
virtual void popUpCompleter () = 0;
virtual QString wordUnderCursor();
bool isModelicaModelInPackageOneFile();
private:
void initialize();
void createActions();
Expand Down
6 changes: 5 additions & 1 deletion OMEdit/OMEdit/OMEditGUI/Editors/ModelicaEditor.cpp
Expand Up @@ -61,7 +61,11 @@ ModelicaEditor::ModelicaEditor(QWidget *pParent)
mpPlainTextEdit->setCanHaveBreakpoints(true);
mpPlainTextEdit->setCompletionCharacters(".");
/* set the document marker */
mpDocumentMarker = new DocumentMarker(mpPlainTextEdit->document());
if (isModelicaModelInPackageOneFile()) {
mpDocumentMarker = new DocumentMarker(mpPlainTextEdit->document(), mpModelWidget->getLibraryTreeItem()->mClassInformation.lineNumberStart);
} else {
mpDocumentMarker = new DocumentMarker(mpPlainTextEdit->document());
}
}

/*!
Expand Down

0 comments on commit fa6b8e7

Please sign in to comment.