summaryrefslogtreecommitdiff
path: root/src/plugins/debugger/disassembleragent.cpp
diff options
context:
space:
mode:
authorhjk <hjk121@nokiamail.com>2014-05-07 11:51:40 +0200
committerhjk <hjk121@nokiamail.com>2014-05-08 09:32:21 +0200
commitf1cfb5c515b5f6af221a1bc86d5df8557e0e638e (patch)
tree1d1648e7fecb978ae26ffebb913e4d42ae35cd09 /src/plugins/debugger/disassembleragent.cpp
parent5bc9461d8363c1f89fab07fd7fa165321c285016 (diff)
downloadqt-creator-f1cfb5c515b5f6af221a1bc86d5df8557e0e638e.tar.gz
Debugger: Base DisassemblerAgent on documents, not editors
Change-Id: I7b7a0fc95ed4ce39b49e76755133030fffc13daf Reviewed-by: Eike Ziller <eike.ziller@digia.com>
Diffstat (limited to 'src/plugins/debugger/disassembleragent.cpp')
-rw-r--r--src/plugins/debugger/disassembleragent.cpp119
1 files changed, 46 insertions, 73 deletions
diff --git a/src/plugins/debugger/disassembleragent.cpp b/src/plugins/debugger/disassembleragent.cpp
index ae8d95a093..ebcec8cca6 100644
--- a/src/plugins/debugger/disassembleragent.cpp
+++ b/src/plugins/debugger/disassembleragent.cpp
@@ -99,10 +99,10 @@ public:
DisassemblerLines contentsAtCurrentLocation() const;
public:
- QPointer<TextEditor::ITextEditor> editor;
+ QPointer<BaseTextDocument> document;
Location location;
QPointer<DebuggerEngine> engine;
- ITextMark *locationMark;
+ ITextMark locationMark;
QList<ITextMark *> breakpointMarks;
QList<CacheEntry> cache;
QString mimeType;
@@ -112,21 +112,21 @@ public:
};
DisassemblerAgentPrivate::DisassemblerAgentPrivate()
- : editor(0),
+ : document(0),
locationMark(0),
mimeType(_("text/x-qtcreator-generic-asm")),
tryMixedInitialized(false),
tryMixed(true),
resetLocationScheduled(false)
{
-
+ locationMark.setIcon(debuggerCore()->locationMarkIcon());
+ locationMark.setPriority(TextEditor::ITextMark::HighPriority);
}
DisassemblerAgentPrivate::~DisassemblerAgentPrivate()
{
- EditorManager::closeEditor(editor);
- editor = 0;
- delete locationMark;
+ EditorManager::closeDocuments(QList<IDocument *>() << document);
+ document = 0;
qDeleteAll(breakpointMarks);
}
@@ -187,12 +187,11 @@ void DisassemblerAgent::scheduleResetLocation()
void DisassemblerAgent::resetLocation()
{
- if (!d->editor)
+ if (!d->document)
return;
if (d->resetLocationScheduled) {
d->resetLocationScheduled = false;
- if (d->locationMark)
- d->editor->textDocument()->markableInterface()->removeMark(d->locationMark);
+ d->document->markableInterface()->removeMark(&d->locationMark);
}
}
@@ -235,7 +234,7 @@ void DisassemblerAgent::setLocation(const Location &loc)
.arg(key.startAddress, 0, 16).arg(key.endAddress, 0, 16)
.arg(loc.functionName(), QDir::toNativeSeparators(loc.fileName()));
d->engine->showMessage(msg);
- setContentsToEditor(d->cache.at(index).second);
+ setContentsToDocument(d->cache.at(index).second);
d->resetLocationScheduled = false; // In case reset from previous run still pending.
} else {
d->engine->fetchDisassembler(this);
@@ -244,22 +243,18 @@ void DisassemblerAgent::setLocation(const Location &loc)
void DisassemblerAgentPrivate::configureMimeType()
{
- QTC_ASSERT(editor, return);
-
- TextEditor::BaseTextDocument *doc =
- qobject_cast<TextEditor::BaseTextDocument *>(editor->document());
- QTC_ASSERT(doc, return);
- doc->setMimeType(mimeType);
+ QTC_ASSERT(document, return);
- TextEditor::PlainTextEditorWidget *pe =
- qobject_cast<TextEditor::PlainTextEditorWidget *>(editor->widget());
- QTC_ASSERT(pe, return);
+ document->setMimeType(mimeType);
MimeType mtype = MimeDatabase::findByType(mimeType);
- if (mtype)
- pe->configure(mtype);
- else
+ if (mtype) {
+ foreach (IEditor *editor, EditorManager::documentModel()->editorsForDocument(document))
+ if (PlainTextEditorWidget *widget = qobject_cast<PlainTextEditorWidget *>(editor->widget()))
+ widget->configure(mtype);
+ } else {
qWarning("Assembler mimetype '%s' not found.", qPrintable(mimeType));
+ }
}
QString DisassemblerAgent::mimeType() const
@@ -272,7 +267,7 @@ void DisassemblerAgent::setMimeType(const QString &mt)
if (mt == d->mimeType)
return;
d->mimeType = mt;
- if (d->editor)
+ if (d->document)
d->configureMimeType();
}
@@ -291,43 +286,32 @@ void DisassemblerAgent::setContents(const DisassemblerLines &contents)
d->cache.append(CacheEntry(key, contents));
}
}
- setContentsToEditor(contents);
+ setContentsToDocument(contents);
}
-void DisassemblerAgent::setContentsToEditor(const DisassemblerLines &contents)
+void DisassemblerAgent::setContentsToDocument(const DisassemblerLines &contents)
{
QTC_ASSERT(d, return);
- using namespace Core;
- using namespace TextEditor;
-
- if (!d->editor) {
+ if (!d->document) {
QString titlePattern = QLatin1String("Disassembler");
- d->editor = qobject_cast<ITextEditor *>(
- EditorManager::openEditorWithContents(
+ IEditor *editor = EditorManager::openEditorWithContents(
Core::Constants::K_DEFAULT_TEXT_EDITOR_ID,
- &titlePattern));
- QTC_ASSERT(d->editor, return);
- IDocument *document = d->editor->document();
- document->setProperty(Debugger::Constants::OPENED_BY_DEBUGGER, true);
- document->setProperty(Debugger::Constants::OPENED_WITH_DISASSEMBLY, true);
+ &titlePattern);
+ QTC_ASSERT(editor, return);
+ if (BaseTextEditorWidget *widget = qobject_cast<BaseTextEditorWidget *>(editor->widget())) {
+ widget->setReadOnly(true);
+ widget->setRequestMarkEnabled(true);
+ }
+ d->document = qobject_cast<BaseTextDocument *>(editor->document());
+ QTC_ASSERT(d->document, return);
+ d->document->setProperty(Debugger::Constants::OPENED_BY_DEBUGGER, true);
+ d->document->setProperty(Debugger::Constants::OPENED_WITH_DISASSEMBLY, true);
d->configureMimeType();
-
- BaseTextEditorWidget *baseTextEdit =
- qobject_cast<BaseTextEditorWidget *>(d->editor->widget());
- if (baseTextEdit)
- baseTextEdit->setRequestMarkEnabled(true);
- } else {
- EditorManager::activateEditor(d->editor);
}
- QPlainTextEdit *plainTextEdit =
- qobject_cast<QPlainTextEdit *>(d->editor->widget());
- QTC_ASSERT(plainTextEdit, return);
+ d->document->setPlainText(contents.toString());
- plainTextEdit->setPlainText(contents.toString());
- plainTextEdit->setReadOnly(true);
-
- d->editor->document()->setDisplayName(_("Disassembler (%1)")
+ d->document->setDisplayName(_("Disassembler (%1)")
.arg(d->location.functionName()));
updateBreakpointMarkers();
@@ -336,35 +320,24 @@ void DisassemblerAgent::setContentsToEditor(const DisassemblerLines &contents)
void DisassemblerAgent::updateLocationMarker()
{
- QTC_ASSERT(d->editor, return);
+ QTC_ASSERT(d->document, return);
const DisassemblerLines contents = d->contentsAtCurrentLocation();
int lineNumber = contents.lineForAddress(d->location.address());
if (d->location.needsMarker()) {
- if (d->locationMark)
- d->editor->textDocument()->markableInterface()->removeMark(d->locationMark);
- delete d->locationMark;
- d->locationMark = 0;
- if (lineNumber) {
- d->locationMark = new ITextMark(lineNumber);
- d->locationMark->setIcon(debuggerCore()->locationMarkIcon());
- d->locationMark->setPriority(TextEditor::ITextMark::HighPriority);
- d->editor->textDocument()->markableInterface()->addMark(d->locationMark);
- }
+ d->document->markableInterface()->removeMark(&d->locationMark);
+ d->locationMark.updateLineNumber(lineNumber);
+ d->document->markableInterface()->addMark(&d->locationMark);
}
- QPlainTextEdit *plainTextEdit =
- qobject_cast<QPlainTextEdit *>(d->editor->widget());
- QTC_ASSERT(plainTextEdit, return);
- QTextCursor tc = plainTextEdit->textCursor();
- QTextBlock block = tc.document()->findBlockByNumber(lineNumber - 1);
- tc.setPosition(block.position());
- plainTextEdit->setTextCursor(tc);
- plainTextEdit->centerCursor();
+ // Center cursor.
+ if (EditorManager::currentDocument() == d->document)
+ if (BaseTextEditor *textEditor = qobject_cast<BaseTextEditor *>(EditorManager::currentEditor()))
+ textEditor->gotoLine(lineNumber);
}
void DisassemblerAgent::updateBreakpointMarkers()
{
- if (!d->editor)
+ if (!d->document)
return;
BreakHandler *handler = breakHandler();
@@ -374,7 +347,7 @@ void DisassemblerAgent::updateBreakpointMarkers()
const DisassemblerLines contents = d->contentsAtCurrentLocation();
foreach (TextEditor::ITextMark *marker, d->breakpointMarks)
- d->editor->textDocument()->markableInterface()->removeMark(marker);
+ d->document->markableInterface()->removeMark(marker);
qDeleteAll(d->breakpointMarks);
d->breakpointMarks.clear();
foreach (BreakpointModelId id, ids) {
@@ -388,7 +361,7 @@ void DisassemblerAgent::updateBreakpointMarkers()
marker->setIcon(handler->icon(id));
marker->setPriority(ITextMark::NormalPriority);
d->breakpointMarks.append(marker);
- d->editor->textDocument()->markableInterface()->addMark(marker);
+ d->document->markableInterface()->addMark(marker);
}
}