Debugger: Allow for custom Disassembler highlighters.

Remove hardcoded highlighter, give DisassemblerViewAgent
a mimetype property. Default to a generic Qt Creator
Assembler mimetype.
Acked-by: hjk
Rubber-stamped-by: Leandro T. C. Melo <leandro.melo@nokia.com>
This commit is contained in:
Friedemann Kleint
2010-06-22 14:06:42 +02:00
parent a34676238f
commit 0db5e80261
3 changed files with 66 additions and 31 deletions

View File

@@ -37,12 +37,15 @@
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/editormanager/ieditor.h> #include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/mimedatabase.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <texteditor/basetexteditor.h> #include <texteditor/basetexteditor.h>
#include <texteditor/plaintexteditor.h>
#include <texteditor/basetextmark.h> #include <texteditor/basetextmark.h>
#include <texteditor/itexteditor.h> #include <texteditor/itexteditor.h>
#include <texteditor/texteditorconstants.h> #include <texteditor/texteditorconstants.h>
#include <texteditor/basetextdocument.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -51,7 +54,6 @@
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
#include <QtGui/QPlainTextEdit> #include <QtGui/QPlainTextEdit>
#include <QtGui/QTextCursor> #include <QtGui/QTextCursor>
#include <QtGui/QSyntaxHighlighter>
#include <limits.h> #include <limits.h>
@@ -161,7 +163,8 @@ public:
struct DisassemblerViewAgentPrivate struct DisassemblerViewAgentPrivate
{ {
DisassemblerViewAgentPrivate() { tryMixed = true; } DisassemblerViewAgentPrivate();
void configureMimeType();
QPointer<TextEditor::ITextEditor> editor; QPointer<TextEditor::ITextEditor> editor;
StackFrame frame; StackFrame frame;
@@ -169,31 +172,16 @@ struct DisassemblerViewAgentPrivate
QPointer<DebuggerEngine> engine; QPointer<DebuggerEngine> engine;
LocationMark2 *locationMark; LocationMark2 *locationMark;
QHash<QString, QString> cache; QHash<QString, QString> cache;
QString mimeType;
}; };
/*! DisassemblerViewAgentPrivate::DisassemblerViewAgentPrivate() :
\class DisassemblerSyntaxHighlighter editor(0),
tryMixed(true),
Simple syntax highlighter to make the disassembler text less prominent. locationMark(new LocationMark2),
*/ mimeType(_("text/x-qtcreator-generic-asm"))
class DisassemblerHighlighter : public QSyntaxHighlighter
{ {
public: }
DisassemblerHighlighter(QPlainTextEdit *parent)
: QSyntaxHighlighter(parent->document())
{}
private:
void highlightBlock(const QString &text)
{
if (!text.isEmpty() && text.at(0) != ' ') {
QTextCharFormat format;
format.setForeground(QColor(128, 128, 128));
setFormat(0, text.size(), format);
}
}
};
/*! /*!
\class DisassemblerViewAgent \class DisassemblerViewAgent
@@ -206,8 +194,6 @@ private:
DisassemblerViewAgent::DisassemblerViewAgent(DebuggerEngine *engine) DisassemblerViewAgent::DisassemblerViewAgent(DebuggerEngine *engine)
: QObject(0), d(new DisassemblerViewAgentPrivate) : QObject(0), d(new DisassemblerViewAgentPrivate)
{ {
d->editor = 0;
d->locationMark = new LocationMark2();
d->engine = engine; d->engine = engine;
} }
@@ -271,6 +257,38 @@ void DisassemblerViewAgent::setFrame(const StackFrame &frame, bool tryMixed)
d->engine->fetchDisassembler(this); d->engine->fetchDisassembler(this);
} }
void DisassemblerViewAgentPrivate::configureMimeType()
{
QTC_ASSERT(editor, return);
TextEditor::BaseTextDocument *doc = qobject_cast<TextEditor::BaseTextDocument *>(editor->file());
QTC_ASSERT(doc, return);
doc->setMimeType(mimeType);
TextEditor::PlainTextEditor *pe = qobject_cast<TextEditor::PlainTextEditor *>(editor->widget());
QTC_ASSERT(pe, return);
if (const Core::MimeType mtype = Core::ICore::instance()->mimeDatabase()->findByType(mimeType)) {
pe->configure(mtype);
} else {
qWarning("Assembler mimetype '%s' not found.", qPrintable(mimeType));
}
}
QString DisassemblerViewAgent::mimeType() const
{
return d->mimeType;
}
void DisassemblerViewAgent::setMimeType(const QString &mt)
{
if (mt == d->mimeType)
return;
d->mimeType = mt;
if (d->editor)
d->configureMimeType();
}
void DisassemblerViewAgent::setContents(const QString &contents) void DisassemblerViewAgent::setContents(const QString &contents)
{ {
QTC_ASSERT(d, return); QTC_ASSERT(d, return);
@@ -286,18 +304,19 @@ void DisassemblerViewAgent::setContents(const QString &contents)
editorManager->openEditorWithContents( editorManager->openEditorWithContents(
Core::Constants::K_DEFAULT_TEXT_EDITOR_ID, Core::Constants::K_DEFAULT_TEXT_EDITOR_ID,
&titlePattern)); &titlePattern));
QTC_ASSERT(d->editor, return);
d->editor->setProperty("OpenedByDebugger", true); d->editor->setProperty("OpenedByDebugger", true);
d->editor->setProperty("DisassemblerView", true); d->editor->setProperty("DisassemblerView", true);
QTC_ASSERT(d->editor, return); d->configureMimeType();
if ((plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget())))
(void) new DisassemblerHighlighter(plainTextEdit);
} }
editorManager->activateEditor(d->editor); editorManager->activateEditor(d->editor);
plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget()); plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget());
if (plainTextEdit) if (plainTextEdit) {
plainTextEdit->setPlainText(contents); plainTextEdit->setPlainText(contents);
plainTextEdit->setReadOnly(true);
}
d->editor->markableInterface()->removeMark(d->locationMark); d->editor->markableInterface()->removeMark(d->locationMark);
d->editor->setDisplayName(_("Disassembler (%1)").arg(d->frame.function)); d->editor->setDisplayName(_("Disassembler (%1)").arg(d->frame.function));

View File

@@ -73,7 +73,7 @@ struct DisassemblerViewAgentPrivate;
class DisassemblerViewAgent : public QObject class DisassemblerViewAgent : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString mimeType READ mimeType WRITE setMimeType)
public: public:
// Called from Gui // Called from Gui
explicit DisassemblerViewAgent(DebuggerEngine *engine); explicit DisassemblerViewAgent(DebuggerEngine *engine);
@@ -83,6 +83,11 @@ public:
const StackFrame &frame() const; const StackFrame &frame() const;
void resetLocation(); void resetLocation();
Q_SLOT void setContents(const QString &contents); Q_SLOT void setContents(const QString &contents);
// Mimetype: "text/a-asm" or some specialized architecture
QString mimeType() const;
Q_SLOT void setMimeType(const QString &mt);
QString address() const; QString address() const;
bool contentsCoversAddress(const QString &contents) const; bool contentsCoversAddress(const QString &contents) const;
void cleanup(); void cleanup();

View File

@@ -15,4 +15,15 @@
<glob pattern="*.xbl"/> <glob pattern="*.xbl"/>
<alias type="text/xml"/> <alias type="text/xml"/>
</mime-type> </mime-type>
<mime-type type="text/x-asm">
<sub-class-of type="text/plain"/>
<comment>Assembler</comment>
<glob pattern="*.asm"/>
</mime-type>
<!-- Catch-all for assemblers -->
<mime-type type="text/x-qtcreator-generic-asm">
<sub-class-of type="text/x-asm"/>
<comment>Qt Creator Generic Assembler</comment>
<glob pattern="*.asm"/>
</mime-type>
</mime-info> </mime-info>