Skip to content
Snippets Groups Projects
Commit d462696c authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Added the method combo.

parent 14839418
No related branches found
No related tags found
No related merge requests found
...@@ -49,16 +49,81 @@ ...@@ -49,16 +49,81 @@
#include <texteditor/texteditorconstants.h> #include <texteditor/texteditorconstants.h>
#include <texteditor/texteditorsettings.h> #include <texteditor/texteditorsettings.h>
#include <QtGui/QMenu>
#include <QtCore/QTimer> #include <QtCore/QTimer>
#include <QtCore/QtDebug>
#include <QtGui/QMenu>
#include <QtGui/QComboBox>
enum { enum {
UPDATE_DOCUMENT_DEFAULT_INTERVAL = 100 UPDATE_DOCUMENT_DEFAULT_INTERVAL = 100
}; };
using namespace JavaScript::AST;
namespace QtScriptEditor { namespace QtScriptEditor {
namespace Internal { namespace Internal {
class FindDeclarations: protected Visitor
{
QList<Declaration> declarations;
public:
QList<Declaration> accept(JavaScript::AST::Node *node)
{
JavaScript::AST::Node::acceptChild(node, this);
return declarations;
}
protected:
using Visitor::visit;
virtual bool visit(FunctionExpression *)
{
return false;
}
virtual bool visit(FunctionDeclaration *ast)
{
QString text = ast->name->asString();
text += QLatin1Char('(');
for (FormalParameterList *it = ast->formals; it; it = it->next) {
text += it->name->asString();
if (it->next)
text += QLatin1String(", ");
}
text += QLatin1Char(')');
Declaration d;
d.text = text;
d.startLine= ast->startLine;
d.startColumn = ast->startColumn;
d.endLine = ast->endLine;
d.endColumn = ast->endColumn;
declarations.append(d);
return false;
}
virtual bool visit(VariableDeclaration *ast)
{
Declaration d;
d.text = ast->name->asString();
d.startLine= ast->startLine;
d.startColumn = ast->startColumn;
d.endLine = ast->endLine;
d.endColumn = ast->endColumn;
declarations.append(d);
return false;
}
};
ScriptEditorEditable::ScriptEditorEditable(ScriptEditor *editor, const QList<int>& context) ScriptEditorEditable::ScriptEditorEditable(ScriptEditor *editor, const QList<int>& context)
: BaseTextEditorEditable(editor), m_context(context) : BaseTextEditorEditable(editor), m_context(context)
{ {
...@@ -67,7 +132,8 @@ ScriptEditorEditable::ScriptEditorEditable(ScriptEditor *editor, const QList<int ...@@ -67,7 +132,8 @@ ScriptEditorEditable::ScriptEditorEditable(ScriptEditor *editor, const QList<int
ScriptEditor::ScriptEditor(const Context &context, ScriptEditor::ScriptEditor(const Context &context,
QWidget *parent) : QWidget *parent) :
TextEditor::BaseTextEditor(parent), TextEditor::BaseTextEditor(parent),
m_context(context) m_context(context),
m_methodCombo(0)
{ {
setParenthesesMatchingEnabled(true); setParenthesesMatchingEnabled(true);
setMarksVisible(true); setMarksVisible(true);
...@@ -135,7 +201,20 @@ void ScriptEditor::updateDocumentNow() ...@@ -135,7 +201,20 @@ void ScriptEditor::updateDocumentNow()
QList<QTextEdit::ExtraSelection> selections; QList<QTextEdit::ExtraSelection> selections;
if (parser.parse(&driver)) { if (parser.parse(&driver)) {
// do something here
FindDeclarations decls;
m_declarations = decls.accept(driver.ast());
QStringList items;
items.append(tr("<Select Symbol>"));
foreach (Declaration decl, m_declarations)
items.append(decl.text);
m_methodCombo->clear();
m_methodCombo->addItems(items);
updateMethodBoxIndex();
} else { } else {
QTextEdit::ExtraSelection sel; QTextEdit::ExtraSelection sel;
sel.format.setUnderlineColor(Qt::red); sel.format.setUnderlineColor(Qt::red);
...@@ -157,6 +236,46 @@ void ScriptEditor::updateDocumentNow() ...@@ -157,6 +236,46 @@ void ScriptEditor::updateDocumentNow()
setExtraSelections(CodeWarningsSelection, selections); setExtraSelections(CodeWarningsSelection, selections);
} }
void ScriptEditor::jumpToMethod(int index)
{
if (index) {
Declaration d = m_declarations.at(index - 1);
gotoLine(d.startLine, d.startColumn - 1);
setFocus();
}
}
void ScriptEditor::updateMethodBoxIndex()
{
int line = 0, column = 0;
convertPosition(position(), &line, &column);
int currentSymbolIndex = 0;
for (int index = 0; index < m_declarations.size(); ++index) {
const Declaration &d = m_declarations.at(index);
// qDebug() << line << column << d.startLine << d.startColumn << d.endLine << d.endColumn;
if (line >= d.startLine || (line == d.startLine && column > d.startColumn)) {
if (line < d.endLine || (line == d.endLine && column < d.endColumn)) {
currentSymbolIndex = index + 1;
break;
}
}
}
m_methodCombo->setCurrentIndex(currentSymbolIndex);
}
void ScriptEditor::updateMethodBoxToolTip()
{
}
void ScriptEditor::updateFileName()
{
}
void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs) void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs)
{ {
TextEditor::BaseTextEditor::setFontSettings(fs); TextEditor::BaseTextEditor::setFontSettings(fs);
...@@ -210,6 +329,36 @@ void ScriptEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typed ...@@ -210,6 +329,36 @@ void ScriptEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typed
indentScriptBlock(tabSettings(), block, begin, end, typedChar); indentScriptBlock(tabSettings(), block, begin, end, typedChar);
} }
TextEditor::BaseTextEditorEditable *ScriptEditor::createEditableInterface()
{
ScriptEditorEditable *editable = new ScriptEditorEditable(this, m_context);
createToolBar(editable);
return editable;
}
void ScriptEditor::createToolBar(ScriptEditorEditable *editable)
{
m_methodCombo = new QComboBox;
m_methodCombo->setMinimumContentsLength(22);
//m_methodCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents);
// Make the combo box prefer to expand
QSizePolicy policy = m_methodCombo->sizePolicy();
policy.setHorizontalPolicy(QSizePolicy::Expanding);
m_methodCombo->setSizePolicy(policy);
connect(m_methodCombo, SIGNAL(activated(int)), this, SLOT(jumpToMethod(int)));
connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(updateMethodBoxIndex()));
connect(m_methodCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateMethodBoxToolTip()));
connect(file(), SIGNAL(changed()), this, SLOT(updateFileName()));
QToolBar *toolBar = editable->toolBar();
QList<QAction*> actions = toolBar->actions();
toolBar->insertWidget(actions.first(), m_methodCombo);
}
void ScriptEditor::contextMenuEvent(QContextMenuEvent *e) void ScriptEditor::contextMenuEvent(QContextMenuEvent *e)
{ {
QMenu *menu = createStandardContextMenu(); QMenu *menu = createStandardContextMenu();
......
...@@ -31,7 +31,11 @@ ...@@ -31,7 +31,11 @@
#define QTSCRIPTDITORW_H #define QTSCRIPTDITORW_H
#include <texteditor/basetexteditor.h> #include <texteditor/basetexteditor.h>
#include <QTimer>
QT_BEGIN_NAMESPACE
class QComboBox;
class QTimer;
QT_END_NAMESPACE
namespace Core { namespace Core {
class ICore; class ICore;
...@@ -40,7 +44,7 @@ namespace Core { ...@@ -40,7 +44,7 @@ namespace Core {
namespace QtScriptEditor { namespace QtScriptEditor {
namespace Internal { namespace Internal {
class QtScriptHighlighter; class QtScriptHighlighter;
class ScriptEditor; class ScriptEditor;
...@@ -53,13 +57,28 @@ public: ...@@ -53,13 +57,28 @@ public:
bool duplicateSupported() const { return true; } bool duplicateSupported() const { return true; }
Core::IEditor *duplicate(QWidget *parent); Core::IEditor *duplicate(QWidget *parent);
const char *kind() const; const char *kind() const;
QToolBar *toolBar() { return 0; }
private: private:
QList<int> m_context; QList<int> m_context;
}; };
struct Declaration
{
QString text;
int startLine;
int startColumn;
int endLine;
int endColumn;
Declaration()
: startLine(0),
startColumn(0),
endLine(0),
endColumn(0)
{ }
};
class ScriptEditor : public TextEditor::BaseTextEditor class ScriptEditor : public TextEditor::BaseTextEditor
{ {
Q_OBJECT Q_OBJECT
...@@ -77,10 +96,15 @@ public slots: ...@@ -77,10 +96,15 @@ public slots:
private slots: private slots:
void updateDocument(); void updateDocument();
void updateDocumentNow(); void updateDocumentNow();
void jumpToMethod(int index);
void updateMethodBoxIndex();
void updateMethodBoxToolTip();
void updateFileName();
protected: protected:
void contextMenuEvent(QContextMenuEvent *e); void contextMenuEvent(QContextMenuEvent *e);
TextEditor::BaseTextEditorEditable *createEditableInterface() { return new ScriptEditorEditable(this, m_context); } TextEditor::BaseTextEditorEditable *createEditableInterface();
void createToolBar(ScriptEditorEditable *editable);
private: private:
virtual bool isElectricCharacter(const QChar &ch) const; virtual bool isElectricCharacter(const QChar &ch) const;
...@@ -89,6 +113,8 @@ private: ...@@ -89,6 +113,8 @@ private:
const Context m_context; const Context m_context;
QTimer *m_updateDocumentTimer; QTimer *m_updateDocumentTimer;
QComboBox *m_methodCombo;
QList<Declaration> m_declarations;
}; };
} // namespace Internal } // namespace Internal
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment