Merge commit 'origin/1.3'
9
dist/changes-1.3.0
vendored
@@ -36,6 +36,7 @@ Editing
|
||||
* Handle block selection in fakevim
|
||||
* Added Copy full path to the editors combobox
|
||||
* Added left/right arrow buttons for "Go back/forward" in navigation history
|
||||
* Added smart indentation for pasted text blocks
|
||||
|
||||
Project support
|
||||
* Added support for adding and removing files from a generic Makefile-based
|
||||
@@ -63,18 +64,24 @@ Debugging
|
||||
* CDB: Added more types to the dumpers (QSharedPointer, QVector, common
|
||||
QMap/QSet types), dereference reference and pointer parameters
|
||||
* CDB: Simplified display of STL types in the locals window
|
||||
* CDB: Fixed thread handling
|
||||
* CDB: Fixed thread handling, display thread position
|
||||
* CDB: Added internal dumpers for string types for debuggee crashes
|
||||
* CDB: Set symbol paths correctly
|
||||
* Improved QObject dumping, print out QRect/QSize, enumerations and flags
|
||||
* Made it possible to use the BinEditor plugin for displaying raw memory
|
||||
* Replace disassembler window by a real text editor enabling "mixed" output
|
||||
* Improved dumper building on options page, run in background
|
||||
|
||||
Designer
|
||||
* Added support for rearranging and floating form editor tools
|
||||
|
||||
Version control plugins
|
||||
* Added CVS support
|
||||
* Display diff/annotation with correct encoding
|
||||
* Added "sync" menu item to the Perforce plugin
|
||||
* Fixed locking of temporary submit message files on Windows
|
||||
* Use a single, colored output pane for all version control systems
|
||||
* Position annotation view of file at current line of editor
|
||||
|
||||
Wizards
|
||||
* Fixed GUI project and form class wizards to use the same settings.
|
||||
|
||||
BIN
doc/images/qtcreator-qt4-qtversions-win-mingw.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
doc/images/qtcreator-qt4-qtversions-win-msvc.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
doc/images/qtcreator-qt4-qtversions-win-symbian.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
doc/images/qtcreator-qt4-qtversions.png
Normal file
|
After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 153 KiB |
@@ -171,7 +171,8 @@
|
||||
to the \gui{Help} mode. To obtain context sensitive help, move your text
|
||||
cursor to a Qt class or function and press \key{F1}. The documentation
|
||||
will be displayed within a panel on the right, as shown in the screenshot
|
||||
below.
|
||||
below. If there is enough vertical space, it will be shown in the
|
||||
fullscreen help mode.
|
||||
|
||||
External Documentation provided by the user can be used to augment or
|
||||
replace the documentation shipped with Qt Creator and Qt.
|
||||
@@ -417,13 +418,57 @@
|
||||
not need to manually configure your Qt version.
|
||||
|
||||
Otherwise, you can add your Qt version in
|
||||
\gui{Tools -> Options... -> Qt Versions}. If you are on the Windows
|
||||
platform and use MinGW to compile Qt, you need to tell Qt Creator where
|
||||
MinGW is installed. This is done by setting the \gui{MinGW Directory}
|
||||
under \gui{Tools -> Options... -> Qt4 -> Qt Versions -> MinGw Directory}.
|
||||
If your Qt version is compiled with Microsoft Visual C++'s compiler, Qt
|
||||
Creator will automatically set the correct environment variables for
|
||||
compilation.
|
||||
\gui{Tools -> Options... -> Qt Versions} on Windows and Linux or
|
||||
in \gui{Qt Creator -> Preferences... -> Qt Versions} on Mac OS X.
|
||||
|
||||
The detailed settings depend on your Operating system and on the targeted
|
||||
tool chain
|
||||
|
||||
\table
|
||||
\row
|
||||
\i \image qtcreator-qt4-qtversions.png
|
||||
On Linux and Mac OS X, simply set the \gui{Path to QMake}
|
||||
to the \c qmake binary of the Qt installation. If a Qt is
|
||||
found in the \c PATH environment variable, it will show up.
|
||||
|
||||
On both platforms, the platforms Gnu Compiler Collection (GCC)
|
||||
is used to compile Qt. On Mac OS, the GCC compiler is part of XCode.
|
||||
On Linux, the Intel Compiler (ICC) is supported as a drop-in replacement
|
||||
for GCC.
|
||||
|
||||
\row
|
||||
\i \image qtcreator-qt4-qtversions-win-mingw.png
|
||||
If you are on the Windows platform and used MinGW
|
||||
to compile Qt, you need to additionally tell Qt Creator
|
||||
where MinGW is installed. This is done by setting the
|
||||
\gui{MinGW Directory}.
|
||||
\row
|
||||
\i \image qtcreator-qt4-qtversions-win-msvc.png
|
||||
If your Qt version is compiled with Microsoft Visual C++'s
|
||||
compiler, Qt Creator will automatically set the correct
|
||||
environment variables for compilation. The \gui{MSVC}
|
||||
dropdown box indicates the internal Version Number of the
|
||||
installed Microsoft Visual C++ tool chains:
|
||||
|
||||
\list
|
||||
\o \bold{7.1}: Visual Studio 2003
|
||||
\o \bold{8.0}: Visual Studio 2005
|
||||
\o \bold{9.0}: Visual Studio 2008
|
||||
\endlist
|
||||
|
||||
If you are using the \c{Windows SDK for Windows Server 2008}
|
||||
instead of Visual Studio, it will identify as version 9.0.
|
||||
\row
|
||||
\i \image qtcreator-qt4-qtversions-win-symbian.png
|
||||
If you are using Qt for Symbian and your S60 SDK is registered
|
||||
with \c devices.exe, Qt Creator will detect the Qt version automatically.
|
||||
If this does not work, point Creator to \c qmake.exe of Qt for Symbian.
|
||||
You can add the path to the Metrowerks Compiler (\gui {MWC Directory})
|
||||
if you want to use to build for the emulator. This requires Carbide 2.0
|
||||
to be installed. the MWC directory should then point to the directory
|
||||
of your Carbide installation. However, this not needed for compiling for
|
||||
the device.
|
||||
\endtable
|
||||
|
||||
\note By default projects are compiled with the
|
||||
\l{glossary-default-qt}{default Qt version}. You can override this in the
|
||||
@@ -700,6 +745,10 @@
|
||||
\i \bold{Perforce}
|
||||
\i \l{http://www.perforce.com}
|
||||
\i Server version 2006.1 and later
|
||||
\row
|
||||
\i \bold{CVS}
|
||||
\i \l{http://www.cvshome.org}
|
||||
\i
|
||||
\endtable
|
||||
|
||||
|
||||
@@ -867,11 +916,11 @@
|
||||
\image qtcreator-locator.png
|
||||
|
||||
Suppose you would like to open your project's \c{main.cpp} file, click on
|
||||
\gui Locator or use \key{Ctrl+K}, type in the file name and then press
|
||||
\key Return. The file will be opened in the editor. You can also type
|
||||
part of a file name and use the wildcard characters \c{*} and \c{?} to
|
||||
match \e{any} number of \e{any} characters. A list of all files matching
|
||||
your criteria will be displayed.
|
||||
\gui Locator or use \key{Ctrl+K} (Mac OS X: \key{Cmd+K}), type in the file
|
||||
name and then press \key Return. The file will be opened in the editor.
|
||||
You can also type part of a file name and use the wildcard characters
|
||||
\c{*} and \c{?} to match \e{any} number of \e{any} characters. A list
|
||||
of all files matching your criteria will be displayed.
|
||||
|
||||
\gui Locator not only allows you to navigate files on disk but also other
|
||||
"locations", which are organized with \bold{Filters}. Currently there are
|
||||
@@ -894,8 +943,8 @@
|
||||
\e prefix. This prefix is usually a single character followed by
|
||||
\key{Space}. For example, to jump to the definition of the class
|
||||
\l{http://doc.trolltech.com/qdatastream.html}{QDataStream}, type:
|
||||
\key{Ctrl+K} to activate \gui Locator. Then type colon (\key{:}) followed
|
||||
by \key{Space} and the class name.
|
||||
\key{Ctrl+K} (Mac OS X: \key{Cmd+K}) to activate \gui Locator.
|
||||
Then type colon (\key{:}) followed by \key{Space} and the class name.
|
||||
|
||||
|
||||
Below is a full list of \l{http://doc.trolltech.com/qdatastream.html}
|
||||
@@ -973,6 +1022,8 @@
|
||||
\note By default, if you press \key{Ctrl+K} and do not use a prefix to
|
||||
specify a filter, three filters will be enabled: \c{o}, \c{l}, and \c{a}.
|
||||
|
||||
\note On Mac OS X, use \key{Cmd+K} instead of \key{Ctrl+K}.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
@@ -1588,7 +1639,8 @@
|
||||
\bold{Show and Hide the Sidebar}
|
||||
|
||||
You can show and hide the the sidebar in \gui Edit and \gui Debug mode by
|
||||
clicking on the corresponding icon, or by pressing \key{Alt+0}.
|
||||
clicking on the corresponding icon, or by pressing \key{Alt+0} (Mac OS X:
|
||||
\key{Cmd+0}).
|
||||
|
||||
\bold{Display Signals and Slots}
|
||||
|
||||
@@ -1676,19 +1728,19 @@
|
||||
\o F4
|
||||
\row
|
||||
\o Toggle Side Bar
|
||||
\o Alt + 0
|
||||
\o Alt + 0 / Cmd + 0
|
||||
\row
|
||||
\o Toggle \gui{Build Issues} pane
|
||||
\o Alt + 1
|
||||
\o Alt + 1 / Cmd + 1
|
||||
\row
|
||||
\o Toggle \gui{Search Results} pane
|
||||
\o Alt + 2
|
||||
\o Alt + 2 / Cmd + 2
|
||||
\row
|
||||
\o Toggle \gui{Application Output} pane
|
||||
\o Alt + 3
|
||||
\o Alt + 3 / Cmd + 3
|
||||
\row
|
||||
\o Toggle \gui{Compile Output} pane
|
||||
\o Alt + 4
|
||||
\o Alt + 4 / Cmd + 4
|
||||
\endtable
|
||||
*/
|
||||
|
||||
|
||||
@@ -34,55 +34,6 @@
|
||||
|
||||
using namespace CPlusPlus;
|
||||
|
||||
FastMacroResolver::FastMacroResolver(TranslationUnit *unit, const Snapshot &snapshot)
|
||||
: _unit(unit), _snapshot(snapshot)
|
||||
{
|
||||
const QString fileName = QString::fromUtf8(unit->fileName(), unit->fileNameLength());
|
||||
|
||||
QSet<QString> processed;
|
||||
updateCache(fileName, &processed);
|
||||
}
|
||||
|
||||
bool FastMacroResolver::isMacro(TranslationUnit *unit, unsigned tokenIndex) const
|
||||
{
|
||||
if (unit != _unit){
|
||||
qWarning() << Q_FUNC_INFO << "unexpected translation unit:" << unit->fileName();
|
||||
return false;
|
||||
}
|
||||
|
||||
const Token &tk = unit->tokenAt(tokenIndex);
|
||||
if (tk.isNot(T_IDENTIFIER))
|
||||
return false;
|
||||
|
||||
Identifier *id = tk.identifier;
|
||||
const QByteArray macroName = QByteArray::fromRawData(id->chars(), id->size());
|
||||
return _cachedMacros.contains(macroName);
|
||||
}
|
||||
|
||||
void FastMacroResolver::updateCache(const QString &fileName, QSet<QString> *processed)
|
||||
{
|
||||
if (processed->contains(fileName))
|
||||
return;
|
||||
|
||||
processed->insert(fileName);
|
||||
|
||||
if (Document::Ptr doc = _snapshot.value(fileName)) {
|
||||
const QList<Macro> definedMacros = doc->definedMacros();
|
||||
|
||||
for (int i = definedMacros.size() - 1; i != -1; --i) {
|
||||
const Macro ¯o = definedMacros.at(i);
|
||||
|
||||
if (macro.isHidden())
|
||||
_cachedMacros.remove(macro.name());
|
||||
else
|
||||
_cachedMacros.insert(macro.name());
|
||||
}
|
||||
|
||||
foreach (const Document::Include &incl, doc->includes())
|
||||
updateCache(incl.fileName(), processed);
|
||||
}
|
||||
}
|
||||
|
||||
FastPreprocessor::FastPreprocessor(const Snapshot &snapshot)
|
||||
: _snapshot(snapshot),
|
||||
_preproc(this, &_env)
|
||||
|
||||
@@ -41,22 +41,6 @@
|
||||
|
||||
namespace CPlusPlus {
|
||||
|
||||
class CPLUSPLUS_EXPORT FastMacroResolver: public MacroResolver
|
||||
{
|
||||
public:
|
||||
FastMacroResolver(TranslationUnit *unit, const Snapshot &snapshot);
|
||||
|
||||
virtual bool isMacro(TranslationUnit *unit, unsigned tokenIndex) const;
|
||||
|
||||
private:
|
||||
void updateCache(const QString &fileName, QSet<QString> *processed);
|
||||
|
||||
private:
|
||||
TranslationUnit *_unit;
|
||||
Snapshot _snapshot;
|
||||
QSet<QByteArray> _cachedMacros;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT FastPreprocessor: public Client
|
||||
{
|
||||
Environment _env;
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "LookupContext.h"
|
||||
#include "ResolveExpression.h"
|
||||
#include "Overview.h"
|
||||
#include "CppBindings.h"
|
||||
|
||||
#include <CoreTypes.h>
|
||||
#include <Symbols.h>
|
||||
@@ -501,6 +502,97 @@ void LookupContext::expand(Scope *scope,
|
||||
}
|
||||
}
|
||||
|
||||
static void visibleClassBindings_helper(ClassBinding *classBinding,
|
||||
QList<ClassBinding *> *allClassBindings,
|
||||
QSet<ClassBinding *> *processed)
|
||||
{
|
||||
if (! classBinding)
|
||||
return;
|
||||
|
||||
else if (processed->contains(classBinding))
|
||||
return;
|
||||
|
||||
processed->insert(classBinding);
|
||||
|
||||
foreach (ClassBinding *baseClassBinding, classBinding->baseClassBindings)
|
||||
visibleClassBindings_helper(baseClassBinding, allClassBindings, processed);
|
||||
|
||||
allClassBindings->append(classBinding);
|
||||
}
|
||||
|
||||
static QList<ClassBinding *> visibleClassBindings(Symbol *symbol, NamespaceBinding *globalNamespace)
|
||||
{
|
||||
QList<ClassBinding *> classBindings;
|
||||
|
||||
if (! symbol)
|
||||
return classBindings;
|
||||
|
||||
else if (Class *klass = symbol->asClass()) {
|
||||
QSet<ClassBinding *> processed;
|
||||
|
||||
visibleClassBindings_helper(NamespaceBinding::find(klass, globalNamespace),
|
||||
&classBindings, &processed);
|
||||
}
|
||||
|
||||
return classBindings;
|
||||
}
|
||||
|
||||
Symbol *LookupContext::canonicalSymbol(Symbol *symbol,
|
||||
NamespaceBinding *globalNamespace)
|
||||
{
|
||||
Symbol *canonicalSymbol = LookupContext::canonicalSymbol(symbol);
|
||||
|
||||
if (Identifier *symbolId = canonicalSymbol->identifier()) {
|
||||
if (symbolId && canonicalSymbol->type()->isFunctionType()) {
|
||||
Class *enclosingClass = canonicalSymbol->scope()->owner()->asClass();
|
||||
const QList<ClassBinding *> classBindings = visibleClassBindings(enclosingClass, globalNamespace);
|
||||
|
||||
foreach (ClassBinding *baseClassBinding, classBindings) {
|
||||
if (! baseClassBinding)
|
||||
continue;
|
||||
|
||||
foreach (Class *baseClass, baseClassBinding->symbols) {
|
||||
if (! baseClass)
|
||||
continue;
|
||||
|
||||
for (Symbol *c = baseClass->members()->lookat(symbolId); c; c = c->next()) {
|
||||
if (! symbolId->isEqualTo(c->identifier()))
|
||||
continue;
|
||||
else if (Function *f = c->type()->asFunctionType()) {
|
||||
if (f->isVirtual())
|
||||
return LookupContext::canonicalSymbol(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return canonicalSymbol;
|
||||
}
|
||||
|
||||
Symbol *LookupContext::canonicalSymbol(const QList<Symbol *> &candidates,
|
||||
NamespaceBinding *globalNamespaceBinding)
|
||||
{
|
||||
if (candidates.isEmpty())
|
||||
return 0;
|
||||
|
||||
return canonicalSymbol(candidates.first(), globalNamespaceBinding);
|
||||
}
|
||||
|
||||
Symbol *LookupContext::canonicalSymbol(const QList<QPair<FullySpecifiedType, Symbol *> > &results,
|
||||
NamespaceBinding *globalNamespaceBinding)
|
||||
{
|
||||
QList<Symbol *> candidates;
|
||||
QPair<FullySpecifiedType, Symbol *> result;
|
||||
|
||||
foreach (result, results)
|
||||
candidates.append(result.second); // ### not exacly.
|
||||
|
||||
return canonicalSymbol(candidates, globalNamespaceBinding);
|
||||
}
|
||||
|
||||
|
||||
Symbol *LookupContext::canonicalSymbol(Symbol *symbol)
|
||||
{
|
||||
Symbol *canonical = symbol;
|
||||
@@ -531,22 +623,3 @@ Symbol *LookupContext::canonicalSymbol(Symbol *symbol)
|
||||
|
||||
return canonical;
|
||||
}
|
||||
|
||||
Symbol *LookupContext::canonicalSymbol(const QList<Symbol *> &candidates)
|
||||
{
|
||||
if (candidates.isEmpty())
|
||||
return 0;
|
||||
|
||||
return canonicalSymbol(candidates.first());
|
||||
}
|
||||
|
||||
Symbol *LookupContext::canonicalSymbol(const QList<QPair<FullySpecifiedType, Symbol *> > &results)
|
||||
{
|
||||
QList<Symbol *> candidates;
|
||||
QPair<FullySpecifiedType, Symbol *> result;
|
||||
|
||||
foreach (result, results)
|
||||
candidates.append(result.second); // ### not exacly.
|
||||
|
||||
return canonicalSymbol(candidates);
|
||||
}
|
||||
|
||||
@@ -54,9 +54,14 @@ public:
|
||||
Document::Ptr document(const QString &fileName) const;
|
||||
Snapshot snapshot() const;
|
||||
|
||||
static Symbol *canonicalSymbol(Symbol *symbol);
|
||||
static Symbol *canonicalSymbol(const QList<Symbol *> &candidates);
|
||||
static Symbol *canonicalSymbol(const QList<QPair<FullySpecifiedType, Symbol *> > &candidates); // ### FIXME
|
||||
static Symbol *canonicalSymbol(const QList<Symbol *> &candidates,
|
||||
NamespaceBinding *globalNamespaceBinding);
|
||||
|
||||
static Symbol *canonicalSymbol(Symbol *symbol,
|
||||
NamespaceBinding *globalNamespaceBinding);
|
||||
|
||||
static Symbol *canonicalSymbol(const QList<QPair<FullySpecifiedType, Symbol *> > &candidates,
|
||||
NamespaceBinding *globalNamespaceBinding);
|
||||
|
||||
QList<Symbol *> resolve(Name *name) const
|
||||
{ return resolve(name, visibleScopes()); }
|
||||
@@ -126,6 +131,8 @@ public:
|
||||
QList<Scope *> *expandedScopes) const;
|
||||
|
||||
private:
|
||||
static Symbol *canonicalSymbol(Symbol *symbol);
|
||||
|
||||
QList<Symbol *> resolveQualifiedNameId(QualifiedNameId *q,
|
||||
const QList<Scope *> &visibleScopes,
|
||||
ResolveMode mode) const;
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
#include <cplusplus/MatchingText.h>
|
||||
#include <cplusplus/BackwardsScanner.h>
|
||||
#include <cplusplus/FastPreprocessor.h>
|
||||
#include <cplusplus/CppBindings.h>
|
||||
|
||||
#include <cpptools/cppmodelmanagerinterface.h>
|
||||
|
||||
@@ -838,8 +839,6 @@ CPlusPlus::Symbol *CPPEditor::findCanonicalSymbol(const QTextCursor &cursor,
|
||||
const QString code = expressionUnderCursor(tc);
|
||||
// qDebug() << "code:" << code;
|
||||
|
||||
const QString fileName = const_cast<CPPEditor *>(this)->file()->fileName();
|
||||
|
||||
TypeOfExpression typeOfExpression;
|
||||
typeOfExpression.setSnapshot(snapshot);
|
||||
|
||||
@@ -849,7 +848,8 @@ CPlusPlus::Symbol *CPPEditor::findCanonicalSymbol(const QTextCursor &cursor,
|
||||
lastVisibleSymbol,
|
||||
TypeOfExpression::Preprocess);
|
||||
|
||||
Symbol *canonicalSymbol = LookupContext::canonicalSymbol(results);
|
||||
NamespaceBindingPtr glo = bind(doc, snapshot);
|
||||
Symbol *canonicalSymbol = LookupContext::canonicalSymbol(results, glo.data());
|
||||
return canonicalSymbol;
|
||||
}
|
||||
|
||||
@@ -2090,11 +2090,7 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source)
|
||||
|
||||
snapshot = source.snapshot;
|
||||
doc = source.snapshot.documentFromSource(preprocessedCode, source.fileName);
|
||||
|
||||
FastMacroResolver fastMacroResolver(doc->translationUnit(), snapshot);
|
||||
doc->control()->setMacroResolver(&fastMacroResolver);
|
||||
doc->check();
|
||||
doc->control()->setMacroResolver(0);
|
||||
}
|
||||
|
||||
Control *control = doc->control();
|
||||
|
||||
@@ -214,6 +214,7 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess
|
||||
|
||||
QAction *findUsagesAction = new QAction(tr("Find Usages"), this);
|
||||
cmd = am->registerAction(findUsagesAction, Constants::FIND_USAGES, context);
|
||||
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U")));
|
||||
connect(findUsagesAction, SIGNAL(triggered()), this, SLOT(findUsages()));
|
||||
contextMenu->addAction(cmd);
|
||||
am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd);
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
#include <Scope.h>
|
||||
|
||||
#include <cplusplus/CppDocument.h>
|
||||
#include <cplusplus/CppBindings.h>
|
||||
#include <cplusplus/ExpressionUnderCursor.h>
|
||||
#include <cplusplus/ResolveExpression.h>
|
||||
#include <cplusplus/Overview.h>
|
||||
@@ -81,6 +82,11 @@ public:
|
||||
_snapshot.insert(_doc);
|
||||
}
|
||||
|
||||
void setGlobalNamespaceBinding(NamespaceBindingPtr globalNamespaceBinding)
|
||||
{
|
||||
_globalNamespaceBinding = globalNamespaceBinding;
|
||||
}
|
||||
|
||||
QList<int> operator()(Symbol *symbol, Identifier *id, AST *ast)
|
||||
{
|
||||
_references.clear();
|
||||
@@ -146,7 +152,8 @@ protected:
|
||||
|
||||
bool checkCandidates(const QList<Symbol *> &candidates) const
|
||||
{
|
||||
if (Symbol *canonicalSymbol = LookupContext::canonicalSymbol(candidates)) {
|
||||
if (Symbol *canonicalSymbol = LookupContext::canonicalSymbol(candidates, _globalNamespaceBinding.data())) {
|
||||
|
||||
#if 0
|
||||
qDebug() << "*** canonical symbol:" << canonicalSymbol->fileName()
|
||||
<< canonicalSymbol->line() << canonicalSymbol->column()
|
||||
@@ -419,6 +426,7 @@ private:
|
||||
QByteArray _source;
|
||||
Document::Ptr _exprDoc;
|
||||
Semantic _sem;
|
||||
NamespaceBindingPtr _globalNamespaceBinding;
|
||||
QList<PostfixExpressionAST *> _postfixExpressionStack;
|
||||
QList<QualifiedNameAST *> _qualifiedNameStack;
|
||||
QList<int> _references;
|
||||
@@ -456,6 +464,7 @@ QList<int> CppFindReferences::references(Symbol *symbol,
|
||||
Q_ASSERT(translationUnit != 0);
|
||||
|
||||
Process process(doc, snapshot, /*future = */ 0);
|
||||
process.setGlobalNamespaceBinding(bind(doc, snapshot));
|
||||
references = process(symbol, id, translationUnit->ast());
|
||||
|
||||
return references;
|
||||
@@ -490,7 +499,7 @@ static void find_helper(QFutureInterface<Utils::FileSearchResult> &future,
|
||||
files += snapshot.dependsOn(sourceFile);
|
||||
}
|
||||
|
||||
qDebug() << "done in:" << tm.elapsed() << "number of files to parse:" << files.size();
|
||||
//qDebug() << "done in:" << tm.elapsed() << "number of files to parse:" << files.size();
|
||||
|
||||
future.setProgressRange(0, files.size());
|
||||
|
||||
@@ -531,13 +540,7 @@ static void find_helper(QFutureInterface<Utils::FileSearchResult> &future,
|
||||
if (Identifier *id = control->findIdentifier(symbolId->chars(), symbolId->size())) {
|
||||
QTime tm;
|
||||
tm.start();
|
||||
TranslationUnit *unit = doc->translationUnit();
|
||||
Control *control = doc->control();
|
||||
|
||||
FastMacroResolver fastMacroResolver(unit, snapshot);
|
||||
control->setMacroResolver(&fastMacroResolver);
|
||||
doc->parse();
|
||||
control->setMacroResolver(0);
|
||||
|
||||
//qDebug() << "***" << unit->fileName() << "parsed in:" << tm.elapsed();
|
||||
|
||||
@@ -548,6 +551,9 @@ static void find_helper(QFutureInterface<Utils::FileSearchResult> &future,
|
||||
tm.start();
|
||||
|
||||
Process process(doc, snapshot, &future);
|
||||
process.setGlobalNamespaceBinding(bind(doc, snapshot));
|
||||
|
||||
TranslationUnit *unit = doc->translationUnit();
|
||||
process(symbol, id, unit->ast());
|
||||
|
||||
//qDebug() << "***" << unit->fileName() << "processed in:" << tm.elapsed();
|
||||
|
||||
@@ -752,7 +752,8 @@ QList<int> CppModelManager::references(CPlusPlus::Symbol *symbol,
|
||||
CPlusPlus::Document::Ptr doc,
|
||||
const CPlusPlus::Snapshot &snapshot)
|
||||
{
|
||||
return m_findReferences->references(LookupContext::canonicalSymbol(symbol), doc, snapshot);
|
||||
NamespaceBindingPtr glo = bind(doc, snapshot);
|
||||
return m_findReferences->references(LookupContext::canonicalSymbol(symbol, glo.data()), doc, snapshot);
|
||||
}
|
||||
|
||||
void CppModelManager::findUsages(CPlusPlus::Symbol *symbol)
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "breakwindow.h"
|
||||
|
||||
#include "debuggeractions.h"
|
||||
#include "debuggermanager.h"
|
||||
#include "ui_breakcondition.h"
|
||||
#include "ui_breakbyfunction.h"
|
||||
|
||||
@@ -179,6 +180,7 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev)
|
||||
editConditionAction->setEnabled(si.size() > 0);
|
||||
|
||||
QAction *synchronizeAction = new QAction(tr("Synchronize breakpoints"), &menu);
|
||||
synchronizeAction->setEnabled(Debugger::DebuggerManager::instance()->debuggerActionsEnabled());
|
||||
|
||||
QModelIndex idx0 = (si.size() ? si.front() : QModelIndex());
|
||||
QModelIndex idx2 = idx0.sibling(idx0.row(), 2);
|
||||
|
||||
@@ -662,13 +662,15 @@ void DebuggerManager::setSimpleDockWidgetArrangement()
|
||||
}
|
||||
|
||||
foreach (QDockWidget *dockWidget, dockWidgets) {
|
||||
if (dockWidget == d->m_outputDock)
|
||||
d->m_mainWindow->addDockWidget(Qt::TopDockWidgetArea, dockWidget);
|
||||
else
|
||||
d->m_mainWindow->addDockWidget(Qt::BottomDockWidgetArea, dockWidget);
|
||||
dockWidget->show();
|
||||
}
|
||||
|
||||
d->m_mainWindow->tabifyDockWidget(d->m_watchDock, d->m_breakDock);
|
||||
d->m_mainWindow->tabifyDockWidget(d->m_watchDock, d->m_modulesDock);
|
||||
d->m_mainWindow->tabifyDockWidget(d->m_watchDock, d->m_outputDock);
|
||||
d->m_mainWindow->tabifyDockWidget(d->m_watchDock, d->m_registerDock);
|
||||
d->m_mainWindow->tabifyDockWidget(d->m_watchDock, d->m_threadsDock);
|
||||
d->m_mainWindow->tabifyDockWidget(d->m_watchDock, d->m_sourceFilesDock);
|
||||
@@ -1684,11 +1686,51 @@ void DebuggerManager::setState(DebuggerState state)
|
||||
d->m_actions.runToFunctionAction->setEnabled(stopped);
|
||||
d->m_actions.jumpToLineAction->setEnabled(stopped);
|
||||
d->m_actions.nextAction->setEnabled(stopped);
|
||||
|
||||
const bool actionsEnabled = debuggerActionsEnabled();
|
||||
theDebuggerAction(RecheckDebuggingHelpers)->setEnabled(actionsEnabled);
|
||||
theDebuggerAction(AutoDerefPointers)->setEnabled(actionsEnabled && d->m_engine->isGdbEngine());
|
||||
theDebuggerAction(ExpandStack)->setEnabled(actionsEnabled);
|
||||
theDebuggerAction(ExecuteCommand)->setEnabled(d->m_state != DebuggerNotReady);
|
||||
|
||||
emit stateChanged(d->m_state);
|
||||
const bool notbusy = state == InferiorStopped
|
||||
|| state == DebuggerNotReady
|
||||
|| state == InferiorUnrunnable;
|
||||
setBusyCursor(!notbusy);
|
||||
|
||||
}
|
||||
|
||||
bool DebuggerManager::debuggerActionsEnabled() const
|
||||
{
|
||||
if (!d->m_engine)
|
||||
return false;
|
||||
switch (state()) {
|
||||
case InferiorPrepared:
|
||||
case InferiorStarting:
|
||||
case InferiorRunningRequested:
|
||||
case InferiorRunning:
|
||||
case InferiorUnrunnable:
|
||||
case InferiorStopping:
|
||||
case InferiorStopped:
|
||||
return true;
|
||||
case DebuggerNotReady:
|
||||
case EngineStarting:
|
||||
case AdapterStarting:
|
||||
case AdapterStarted:
|
||||
case AdapterStartFailed:
|
||||
case InferiorPreparing:
|
||||
case InferiorPreparationFailed:
|
||||
case InferiorStartFailed:
|
||||
case InferiorStopFailed:
|
||||
case InferiorShuttingDown:
|
||||
case InferiorShutDown:
|
||||
case InferiorShutdownFailed:
|
||||
case AdapterShuttingDown:
|
||||
case AdapterShutdownFailed:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QDebug operator<<(QDebug d, DebuggerState state)
|
||||
|
||||
@@ -175,6 +175,8 @@ public:
|
||||
|
||||
void showMessageBox(int icon, const QString &title, const QString &text);
|
||||
|
||||
bool debuggerActionsEnabled() const;
|
||||
|
||||
static DebuggerManager *instance();
|
||||
|
||||
public slots:
|
||||
|
||||
@@ -155,7 +155,6 @@ public:
|
||||
m_clearContentsAction = new QAction(this);
|
||||
m_clearContentsAction->setText(tr("Clear contents"));
|
||||
m_clearContentsAction->setEnabled(true);
|
||||
m_clearContentsAction->setShortcut(Qt::ControlModifier + Qt::Key_R);
|
||||
connect(m_clearContentsAction, SIGNAL(triggered(bool)),
|
||||
parent, SLOT(clearContents()));
|
||||
|
||||
|
||||
@@ -257,6 +257,11 @@ void PlainGdbAdapter::shutdown()
|
||||
m_engine->postCommand(_("kill"), CB(handleKill));
|
||||
return;
|
||||
|
||||
case InferiorShuttingDown:
|
||||
// FIXME: How can we end up here?
|
||||
QTC_ASSERT(false, qDebug() << state());
|
||||
// Fall through.
|
||||
|
||||
case InferiorShutDown:
|
||||
setState(AdapterShuttingDown);
|
||||
m_engine->postCommand(_("-gdb-exit"), CB(handleExit));
|
||||
|
||||
@@ -105,11 +105,15 @@ void ModulesWindow::contextMenuEvent(QContextMenuEvent *ev)
|
||||
if (index.isValid())
|
||||
name = model()->data(index).toString();
|
||||
|
||||
|
||||
QMenu menu;
|
||||
const bool enabled = Debugger::DebuggerManager::instance()->debuggerActionsEnabled();
|
||||
QAction *act0 = new QAction(tr("Update module list"), &menu);
|
||||
QAction *act3 = new QAction(tr("Show source files for module \"%1\"").arg(name),
|
||||
&menu);
|
||||
act0->setEnabled(enabled);
|
||||
QAction *act3 = new QAction(tr("Show source files for module \"%1\"").arg(name), &menu);
|
||||
act3->setEnabled(enabled);
|
||||
QAction *act4 = new QAction(tr("Load symbols for all modules"), &menu);
|
||||
act4->setEnabled(enabled);
|
||||
QAction *act5 = 0;
|
||||
QAction *act6 = 0;
|
||||
QAction *act7 = 0;
|
||||
|
||||
@@ -177,6 +177,7 @@ void RegisterWindow::contextMenuEvent(QContextMenuEvent *ev)
|
||||
} else {
|
||||
actShowMemory->setText(tr("Open memory editor at %1").arg(address));
|
||||
}
|
||||
actShowMemory->setEnabled(m_manager->debuggerActionsEnabled());
|
||||
menu.addSeparator();
|
||||
|
||||
int base = model()->data(QModelIndex(), RegisterNumberBaseRole).toInt();
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
#include "sourcefileswindow.h"
|
||||
#include "debuggeractions.h"
|
||||
#include "debuggermanager.h"
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QFileInfo>
|
||||
@@ -199,6 +200,7 @@ void SourceFilesWindow::contextMenuEvent(QContextMenuEvent *ev)
|
||||
|
||||
QMenu menu;
|
||||
QAction *act1 = new QAction(tr("Reload data"), &menu);
|
||||
act1->setEnabled(Debugger::DebuggerManager::instance()->debuggerActionsEnabled());
|
||||
//act1->setCheckable(true);
|
||||
QAction *act2 = 0;
|
||||
if (name.isEmpty()) {
|
||||
|
||||
@@ -240,6 +240,7 @@ bool StackHandler::isDebuggingDebuggingHelpers() const
|
||||
|
||||
ThreadData::ThreadData(int threadId) :
|
||||
id(threadId),
|
||||
address(0),
|
||||
line(-1)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -113,8 +113,9 @@ void StackWindow::contextMenuEvent(QContextMenuEvent *ev)
|
||||
}
|
||||
|
||||
menu.addSeparator();
|
||||
|
||||
#if 0 // @TODO: not implemented
|
||||
menu.addAction(theDebuggerAction(UseToolTipsInStackView));
|
||||
#endif
|
||||
menu.addAction(theDebuggerAction(UseAddressInStackView));
|
||||
|
||||
QAction *actAdjust = menu.addAction(tr("Adjust column widths to contents"));
|
||||
|
||||
@@ -237,6 +237,10 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
|
||||
individualFormatMenu.addAction(act);
|
||||
individualFormatActions.append(act);
|
||||
}
|
||||
if (alternativeFormats.isEmpty()) {
|
||||
typeFormatMenu.setEnabled(false);
|
||||
individualFormatMenu.setEnabled(false);
|
||||
}
|
||||
} else {
|
||||
typeFormatMenu.setTitle(tr("Change format for type"));
|
||||
typeFormatMenu.setEnabled(false);
|
||||
@@ -245,16 +249,15 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
|
||||
}
|
||||
|
||||
QMenu menu;
|
||||
//QAction *actWatchExpressionInWindow
|
||||
// = theDebuggerAction(WatchExpressionInWindow);
|
||||
//menu.addAction(actWatchExpressionInWindow);
|
||||
|
||||
QAction *actInsertNewWatchItem = menu.addAction(tr("Insert new watch item"));
|
||||
QAction *actSelectWidgetToWatch = menu.addAction(tr("Select widget to watch"));
|
||||
|
||||
const QString address = model()->data(mi0, AddressRole).toString();
|
||||
QAction *actWatchKnownMemory = 0;
|
||||
QAction *actWatchUnknownMemory = new QAction(tr("Open memory editor..."), &menu);;
|
||||
QAction *actWatchUnknownMemory = new QAction(tr("Open memory editor..."), &menu);
|
||||
actWatchUnknownMemory->setEnabled(m_manager->debuggerActionsEnabled());
|
||||
|
||||
if (!address.isEmpty())
|
||||
actWatchKnownMemory = new QAction(tr("Open memory editor at %1").arg(address), &menu);
|
||||
menu.addSeparator();
|
||||
@@ -270,6 +273,7 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
|
||||
menu.addAction(actWatchKnownMemory);
|
||||
menu.addAction(actWatchUnknownMemory);
|
||||
menu.addSeparator();
|
||||
|
||||
menu.addAction(theDebuggerAction(RecheckDebuggingHelpers));
|
||||
menu.addAction(theDebuggerAction(UseDebuggingHelpers));
|
||||
|
||||
@@ -277,8 +281,7 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
|
||||
menu.addAction(theDebuggerAction(UseToolTipsInLocalsView));
|
||||
|
||||
menu.addAction(theDebuggerAction(AutoDerefPointers));
|
||||
theDebuggerAction(AutoDerefPointers)->
|
||||
setEnabled(m_manager->currentEngine()->isGdbEngine());
|
||||
|
||||
QAction *actAdjustColumnWidths =
|
||||
menu.addAction(tr("Adjust column widths to contents"));
|
||||
QAction *actAlwaysAdjustColumnWidth =
|
||||
|
||||
@@ -240,6 +240,11 @@ QString quoteUnprintable(const QString &ba)
|
||||
return res;
|
||||
}
|
||||
|
||||
inline QString msgE20MarkNotSet(const QString &text)
|
||||
{
|
||||
return FakeVimHandler::tr("E20: Mark '%1' not set").arg(text);
|
||||
}
|
||||
|
||||
class FakeVimHandler::Private
|
||||
{
|
||||
public:
|
||||
@@ -905,14 +910,12 @@ void FakeVimHandler::Private::updateMiniBuffer()
|
||||
int linesInDoc = linesInDocument();
|
||||
int l = cursorLineInDocument();
|
||||
QString status;
|
||||
QString pos = tr("%1,%2").arg(l + 1).arg(cursorColumnInDocument() + 1);
|
||||
status += tr("%1").arg(pos, -10);
|
||||
const QString pos = QString::fromLatin1("%1,%2").arg(l + 1).arg(cursorColumnInDocument() + 1);
|
||||
// FIXME: physical "-" logical
|
||||
if (linesInDoc != 0) {
|
||||
status += tr("%1").arg(l * 100 / linesInDoc, 4);
|
||||
status += "%";
|
||||
status = FakeVimHandler::tr("%1%2%").arg(pos, -10).arg(l * 100 / linesInDoc, 4);
|
||||
} else {
|
||||
status += "All";
|
||||
status = FakeVimHandler::tr("%1All").arg(pos, -10);
|
||||
}
|
||||
emit q->statusDataChanged(status);
|
||||
}
|
||||
@@ -934,7 +937,7 @@ void FakeVimHandler::Private::showBlackMessage(const QString &msg)
|
||||
void FakeVimHandler::Private::notImplementedYet()
|
||||
{
|
||||
qDebug() << "Not implemented in FakeVim";
|
||||
showRedMessage(tr("Not implemented in FakeVim"));
|
||||
showRedMessage(FakeVimHandler::tr("Not implemented in FakeVim"));
|
||||
updateMiniBuffer();
|
||||
}
|
||||
|
||||
@@ -1060,7 +1063,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
moveToFirstNonBlankOnLine();
|
||||
finishMovement();
|
||||
} else {
|
||||
showRedMessage(tr("E20: Mark '%1' not set").arg(text));
|
||||
showRedMessage(msgE20MarkNotSet(text));
|
||||
}
|
||||
m_subsubmode = NoSubSubMode;
|
||||
} else if (key >= '0' && key <= '9') {
|
||||
@@ -1802,7 +1805,7 @@ int FakeVimHandler::Private::readLineCode(QString &cmd)
|
||||
if (c == '\'' && !cmd.isEmpty()) {
|
||||
int mark = m_marks.value(cmd.at(0).unicode());
|
||||
if (!mark) {
|
||||
showRedMessage(tr("E20: Mark '%1' not set").arg(cmd.at(0)));
|
||||
showRedMessage(msgE20MarkNotSet(cmd.at(0)));
|
||||
cmd = cmd.mid(1);
|
||||
return -1;
|
||||
}
|
||||
@@ -1821,7 +1824,7 @@ int FakeVimHandler::Private::readLineCode(QString &cmd)
|
||||
int pos = m_marks.value(cmd.at(0).unicode(), -1);
|
||||
//qDebug() << " MARK: " << cmd.at(0) << pos << lineForPosition(pos);
|
||||
if (pos == -1) {
|
||||
showRedMessage(tr("E20: Mark '%1' not set").arg(cmd.at(0)));
|
||||
showRedMessage(msgE20MarkNotSet(cmd.at(0)));
|
||||
cmd = cmd.mid(1);
|
||||
return -1;
|
||||
}
|
||||
@@ -1935,7 +1938,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
|
||||
QFile file1(fileName);
|
||||
bool exists = file1.exists();
|
||||
if (exists && !forced && !noArgs) {
|
||||
showRedMessage(tr("File '%1' exists (add ! to override)").arg(fileName));
|
||||
showRedMessage(FakeVimHandler::tr("File '%1' exists (add ! to override)").arg(fileName));
|
||||
} else if (file1.open(QIODevice::ReadWrite)) {
|
||||
file1.close();
|
||||
QTextCursor tc = m_tc;
|
||||
@@ -1955,14 +1958,14 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
|
||||
QTextStream ts(&file2);
|
||||
ts << contents;
|
||||
} else {
|
||||
showRedMessage(tr("Cannot open file '%1' for writing").arg(fileName));
|
||||
showRedMessage(FakeVimHandler::tr("Cannot open file '%1' for writing").arg(fileName));
|
||||
}
|
||||
}
|
||||
// check result by reading back
|
||||
QFile file3(fileName);
|
||||
file3.open(QIODevice::ReadOnly);
|
||||
QByteArray ba = file3.readAll();
|
||||
showBlackMessage(tr("\"%1\" %2 %3L, %4C written")
|
||||
showBlackMessage(FakeVimHandler::tr("\"%1\" %2 %3L, %4C written")
|
||||
.arg(fileName).arg(exists ? " " : " [New] ")
|
||||
.arg(ba.count('\n')).arg(ba.size()));
|
||||
if (quitAll)
|
||||
@@ -1970,7 +1973,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
|
||||
else if (quit)
|
||||
passUnknownExCommand(forced ? "q!" : "q");
|
||||
} else {
|
||||
showRedMessage(tr("Cannot open file '%1' for reading").arg(fileName));
|
||||
showRedMessage(FakeVimHandler::tr("Cannot open file '%1' for reading").arg(fileName));
|
||||
}
|
||||
} else if (cmd.startsWith("r ")) { // :r
|
||||
m_currentFileName = cmd.mid(2);
|
||||
@@ -1979,7 +1982,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
|
||||
QTextStream ts(&file);
|
||||
QString data = ts.readAll();
|
||||
EDITOR(setPlainText(data));
|
||||
showBlackMessage(tr("\"%1\" %2L, %3C")
|
||||
showBlackMessage(FakeVimHandler::tr("\"%1\" %2L, %3C")
|
||||
.arg(m_currentFileName).arg(data.count('\n')).arg(data.size()));
|
||||
} else if (cmd.startsWith(QLatin1Char('!'))) {
|
||||
selectRange(beginLine, endLine);
|
||||
@@ -1997,13 +2000,13 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
|
||||
leaveVisualMode();
|
||||
setPosition(firstPositionInLine(beginLine));
|
||||
//qDebug() << "FILTER: " << command;
|
||||
showBlackMessage(tr("%n lines filtered", 0, text.count('\n')));
|
||||
showBlackMessage(FakeVimHandler::tr("%n lines filtered", 0, text.count('\n')));
|
||||
} else if (cmd.startsWith(QLatin1Char('>'))) {
|
||||
m_anchor = firstPositionInLine(beginLine);
|
||||
setPosition(firstPositionInLine(endLine));
|
||||
shiftRegionRight(1);
|
||||
leaveVisualMode();
|
||||
showBlackMessage(tr("%n lines >ed %1 time", 0, (endLine - beginLine + 1)).arg(1));
|
||||
showBlackMessage(FakeVimHandler::tr("%n lines >ed %1 time", 0, (endLine - beginLine + 1)).arg(1));
|
||||
} else if (cmd == "red" || cmd == "redo") { // :redo
|
||||
redo();
|
||||
updateMiniBuffer();
|
||||
@@ -2081,7 +2084,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
|
||||
if (act)
|
||||
act->setValue(arg.mid(p + 1));
|
||||
} else {
|
||||
showRedMessage(tr("E512: Unknown option: ") + arg);
|
||||
showRedMessage(FakeVimHandler::tr("E512: Unknown option: ") + arg);
|
||||
}
|
||||
updateMiniBuffer();
|
||||
} else if (reHistory.indexIn(cmd) != -1) { // :history
|
||||
@@ -2152,14 +2155,14 @@ void FakeVimHandler::Private::search(const QString &needle0, bool forward)
|
||||
if (oldLine != cursorLineInDocument() - cursorLineOnScreen())
|
||||
scrollToLineInDocument(cursorLineInDocument() - linesOnScreen() / 2);
|
||||
if (forward)
|
||||
showRedMessage(tr("search hit BOTTOM, continuing at TOP"));
|
||||
showRedMessage(FakeVimHandler::tr("search hit BOTTOM, continuing at TOP"));
|
||||
else
|
||||
showRedMessage(tr("search hit TOP, continuing at BOTTOM"));
|
||||
showRedMessage(FakeVimHandler::tr("search hit TOP, continuing at BOTTOM"));
|
||||
highlightMatches(needle);
|
||||
} else {
|
||||
highlightMatches(QString());
|
||||
setCursorPosition(origPosition);
|
||||
showRedMessage(tr("Pattern not found: ") + needle);
|
||||
showRedMessage(FakeVimHandler::tr("Pattern not found: ") + needle);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2729,7 +2732,7 @@ void FakeVimHandler::Private::undo()
|
||||
//beginEditBlock();
|
||||
int rev = m_tc.document()->revision();
|
||||
if (current == rev)
|
||||
showBlackMessage(tr("Already at oldest change"));
|
||||
showBlackMessage(FakeVimHandler::tr("Already at oldest change"));
|
||||
else
|
||||
showBlackMessage(QString());
|
||||
if (m_undoCursorPosition.contains(rev))
|
||||
@@ -2744,7 +2747,7 @@ void FakeVimHandler::Private::redo()
|
||||
//beginEditBlock();
|
||||
int rev = m_tc.document()->revision();
|
||||
if (rev == current)
|
||||
showBlackMessage(tr("Already at newest change"));
|
||||
showBlackMessage(FakeVimHandler::tr("Already at newest change"));
|
||||
else
|
||||
showBlackMessage(QString());
|
||||
if (m_undoCursorPosition.contains(rev))
|
||||
|
||||
@@ -59,6 +59,7 @@ public:
|
||||
|
||||
QMap<QString, QVariant> toMap() const;
|
||||
void setValuesFromMap(QMap<QString, QVariant> map);
|
||||
|
||||
private:
|
||||
void setName(const QString &name);
|
||||
|
||||
|
||||
@@ -104,6 +104,18 @@ void Project::moveCleanStepUp(int position)
|
||||
m_cleanSteps.insert(position - 1, bs);
|
||||
}
|
||||
|
||||
QString Project::makeUnique(const QString &preferedName, const QStringList &usedNames)
|
||||
{
|
||||
if (!usedNames.contains(preferedName))
|
||||
return preferedName;
|
||||
int i = 2;
|
||||
QString tryName = preferedName + QString::number(i);
|
||||
while (usedNames.contains(tryName))
|
||||
tryName = preferedName + QString::number(++i);
|
||||
return tryName;
|
||||
}
|
||||
|
||||
|
||||
void Project::addBuildConfiguration(BuildConfiguration *configuration)
|
||||
{
|
||||
QStringList buildConfigurationNames;
|
||||
@@ -112,12 +124,7 @@ void Project::addBuildConfiguration(BuildConfiguration *configuration)
|
||||
|
||||
// Check that the internal name is not taken and use a different one otherwise
|
||||
QString configurationName = configuration->name();
|
||||
if (buildConfigurationNames.contains(configurationName)) {
|
||||
int i = 2;
|
||||
while (buildConfigurationNames.contains(configurationName + QString::number(i)))
|
||||
++i;
|
||||
configurationName += QString::number(i);
|
||||
}
|
||||
configurationName = makeUnique(configurationName, buildConfigurationNames);
|
||||
configuration->setName(configurationName);
|
||||
|
||||
// Check that we don't have a configuration with the same displayName
|
||||
@@ -125,12 +132,7 @@ void Project::addBuildConfiguration(BuildConfiguration *configuration)
|
||||
QStringList displayNames;
|
||||
foreach (const BuildConfiguration *bc, m_buildConfigurationValues)
|
||||
displayNames << bc->displayName();
|
||||
if (displayNames.contains(configurationDisplayName)) {
|
||||
int i = 2;
|
||||
while (displayNames.contains(configurationDisplayName + QString::number(i)))
|
||||
++i;
|
||||
configurationDisplayName += QString::number(i);
|
||||
}
|
||||
configurationDisplayName = makeUnique(configurationDisplayName, displayNames);
|
||||
configuration->setDisplayName(configurationDisplayName);
|
||||
|
||||
// add it
|
||||
@@ -511,19 +513,18 @@ EditorConfiguration *Project::editorConfiguration() const
|
||||
|
||||
void Project::setDisplayNameFor(BuildConfiguration *configuration, const QString &displayName)
|
||||
{
|
||||
if (configuration->displayName() == displayName)
|
||||
return;
|
||||
QString dn = displayName;
|
||||
QStringList displayNames;
|
||||
foreach (BuildConfiguration *bc, m_buildConfigurationValues) {
|
||||
if (bc != configuration)
|
||||
displayNames << bc->displayName();
|
||||
}
|
||||
if (displayNames.contains(displayName)) {
|
||||
int i = 2;
|
||||
while (displayNames.contains(displayName + QString::number(i)))
|
||||
++i;
|
||||
configuration->setDisplayName(displayName + QString::number(i));
|
||||
} else {
|
||||
dn = makeUnique(displayName, displayNames);
|
||||
|
||||
configuration->setDisplayName(displayName);
|
||||
}
|
||||
|
||||
emit buildConfigurationDisplayNameChanged(configuration->name());
|
||||
}
|
||||
|
||||
|
||||
@@ -183,6 +183,7 @@ protected:
|
||||
virtual bool restoreSettingsImpl(PersistentSettingsReader &reader);
|
||||
|
||||
private:
|
||||
static QString makeUnique(const QString &preferedName, const QStringList &usedNames);
|
||||
QList<BuildStep *> m_buildSteps;
|
||||
QList<BuildStep *> m_cleanSteps;
|
||||
QMap<QString, QVariant> m_values;
|
||||
|
||||
@@ -662,15 +662,26 @@ public:
|
||||
///
|
||||
|
||||
ProjectWindow::ProjectWindow(QWidget *parent)
|
||||
: QWidget(parent), m_currentItemChanged(false)
|
||||
: QWidget(parent)
|
||||
{
|
||||
m_projectExplorer = ProjectExplorerPlugin::instance();
|
||||
m_session = m_projectExplorer->session();
|
||||
ProjectExplorer::SessionManager *session = ProjectExplorerPlugin::instance()->session();
|
||||
|
||||
m_panelsWidget = new PanelsWidget(this);
|
||||
|
||||
m_activeConfigurationWidget = new ActiveConfigurationWidget(m_panelsWidget);
|
||||
|
||||
m_panelsWidget->addWidget(tr("Active Build and Run Configurations"), m_activeConfigurationWidget);
|
||||
|
||||
m_spacerBetween = new QWidget(this);
|
||||
QVBoxLayout *vbox = new QVBoxLayout(m_spacerBetween);
|
||||
vbox->setMargin(0);
|
||||
m_spacerBetween->setLayout(vbox);
|
||||
vbox->addSpacerItem(new QSpacerItem(10, 15, QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
vbox->addWidget(new OnePixelBlackLine(m_spacerBetween));
|
||||
vbox->addSpacerItem(new QSpacerItem(10, 15, QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
|
||||
m_panelsWidget->addWidget(m_spacerBetween);
|
||||
|
||||
m_projectChooser = new QWidget(m_panelsWidget);
|
||||
QHBoxLayout *hbox = new QHBoxLayout(m_projectChooser);
|
||||
hbox->setMargin(0);
|
||||
@@ -687,18 +698,6 @@ ProjectWindow::ProjectWindow(QWidget *parent)
|
||||
label, SLOT(setProject(ProjectExplorer::Project*)));
|
||||
hbox->addWidget(changeProject);
|
||||
|
||||
m_panelsWidget->addWidget(tr("Active Build and Run Configurations"), m_activeConfigurationWidget);
|
||||
|
||||
m_spacerBetween = new QWidget(this);
|
||||
QVBoxLayout *vbox = new QVBoxLayout(m_spacerBetween);
|
||||
vbox->setMargin(0);
|
||||
m_spacerBetween->setLayout(vbox);
|
||||
vbox->addSpacerItem(new QSpacerItem(10, 15, QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
vbox->addWidget(new OnePixelBlackLine(m_spacerBetween));
|
||||
vbox->addSpacerItem(new QSpacerItem(10, 15, QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||
|
||||
m_panelsWidget->addWidget(m_spacerBetween);
|
||||
|
||||
m_panelsWidget->addWidget(m_projectChooser);
|
||||
|
||||
QVBoxLayout *topLevelLayout = new QVBoxLayout(this);
|
||||
@@ -708,17 +707,52 @@ ProjectWindow::ProjectWindow(QWidget *parent)
|
||||
|
||||
topLevelLayout->addWidget(m_panelsWidget);
|
||||
|
||||
m_noprojectLabel = new QLabel(this);
|
||||
m_noprojectLabel->setText(tr("No project loaded."));
|
||||
{
|
||||
QFont f = m_noprojectLabel->font();
|
||||
f.setPointSizeF(f.pointSizeF() * 1.4);
|
||||
f.setBold(true);
|
||||
m_noprojectLabel->setFont(f);
|
||||
}
|
||||
m_noprojectLabel->setMargin(10);
|
||||
m_noprojectLabel->setAlignment(Qt::AlignTop);
|
||||
topLevelLayout->addWidget(m_noprojectLabel);
|
||||
|
||||
bool noProjects = session->projects().isEmpty();
|
||||
m_panelsWidget->setVisible(!noProjects);
|
||||
m_noprojectLabel->setVisible(noProjects);
|
||||
|
||||
connect(changeProject, SIGNAL(projectChanged(ProjectExplorer::Project*)),
|
||||
this, SLOT(showProperties(ProjectExplorer::Project*)));
|
||||
|
||||
connect(m_session, SIGNAL(sessionLoaded()), this, SLOT(restoreStatus()));
|
||||
connect(m_session, SIGNAL(aboutToSaveSession()), this, SLOT(saveStatus()));
|
||||
connect(session, SIGNAL(sessionLoaded()), this, SLOT(restoreStatus()));
|
||||
connect(session, SIGNAL(aboutToSaveSession()), this, SLOT(saveStatus()));
|
||||
|
||||
connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)),
|
||||
this, SLOT(projectAdded()));
|
||||
connect(session, SIGNAL(projectRemoved(ProjectExplorer::Project*)),
|
||||
this, SLOT(projectRemoved()));
|
||||
}
|
||||
|
||||
ProjectWindow::~ProjectWindow()
|
||||
{
|
||||
}
|
||||
|
||||
void ProjectWindow::projectAdded()
|
||||
{
|
||||
m_panelsWidget->setVisible(true);
|
||||
m_noprojectLabel->setVisible(false);
|
||||
}
|
||||
|
||||
void ProjectWindow::projectRemoved()
|
||||
{
|
||||
if (ProjectExplorerPlugin::instance()->session()->projects().isEmpty()) {
|
||||
m_panelsWidget->setVisible(false);
|
||||
m_noprojectLabel->setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
void ProjectWindow::restoreStatus()
|
||||
{
|
||||
// TODO
|
||||
@@ -758,12 +792,3 @@ void ProjectWindow::showProperties(Project *project)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Project *ProjectWindow::findProject(const QString &path) const
|
||||
{
|
||||
QList<Project*> projects = m_session->projects();
|
||||
foreach (Project* project, projects)
|
||||
if (QFileInfo(project->file()->fileName()).filePath() == path)
|
||||
return project;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -180,19 +180,17 @@ private slots:
|
||||
void showProperties(ProjectExplorer::Project *project);
|
||||
void restoreStatus();
|
||||
void saveStatus();
|
||||
void projectAdded();
|
||||
void projectRemoved();
|
||||
|
||||
private:
|
||||
void updateRunConfigurationsComboBox();
|
||||
SessionManager *m_session;
|
||||
ProjectExplorerPlugin *m_projectExplorer;
|
||||
|
||||
ActiveConfigurationWidget *m_activeConfigurationWidget;
|
||||
QWidget *m_spacerBetween;
|
||||
QWidget *m_projectChooser;
|
||||
QLabel *m_noprojectLabel;
|
||||
PanelsWidget *m_panelsWidget;
|
||||
|
||||
Project *findProject(const QString &path) const;
|
||||
bool m_currentItemChanged;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -215,6 +215,15 @@ QStringList GettingStartedWelcomePageWidget::tipsOfTheDay()
|
||||
#else
|
||||
tr("Alt", "Shortcut key");
|
||||
#endif
|
||||
|
||||
QString ctrlShortcut =
|
||||
#ifdef Q_WS_MAC
|
||||
tr("Cmd", "Shortcut key");
|
||||
#else
|
||||
tr("Ctrl", "Shortcut key");
|
||||
#endif
|
||||
|
||||
|
||||
tips.append(tr("You can switch between Qt Creator's modes using <tt>Ctrl+number</tt>:<ul>"
|
||||
"<li>1 - Welcome</li><li>2 - Edit</li><li>3 - Debug</li><li>4 - Projects</li><li>5 - Help</li>"
|
||||
"<li></li><li>6 - Output</li></ul>"));
|
||||
@@ -236,7 +245,7 @@ QStringList GettingStartedWelcomePageWidget::tipsOfTheDay()
|
||||
"<ul><li>1 - Build Issues</li><li>2 - Search Results</li><li>3 - Application Output</li>"
|
||||
"<li>4 - Compile Output</li></ul>").arg(altShortcut));
|
||||
tips.append(tr("You can quickly search methods, classes, help and more using the "
|
||||
"<a href=\"qthelp://com.nokia.qtcreator/doc/creator-navigation.html\">Locator bar</a> (<tt>Ctrl+K</tt>)."));
|
||||
"<a href=\"qthelp://com.nokia.qtcreator/doc/creator-navigation.html\">Locator bar</a> (<tt>%1+K</tt>).").arg(ctrlShortcut));
|
||||
tips.append(tr("You can add custom build steps in the "
|
||||
"<a href=\"qthelp://com.nokia.qtcreator/doc/creator-build-settings.html\">build settings</a>."));
|
||||
tips.append(tr("Within a session, you can add "
|
||||
|
||||
@@ -156,6 +156,24 @@ QString S60DeviceRunConfiguration::basePackageFilePath() const
|
||||
return m_baseFileName;
|
||||
}
|
||||
|
||||
QString S60DeviceRunConfiguration::symbianPlatform() const
|
||||
{
|
||||
const_cast<S60DeviceRunConfiguration *>(this)->updateTarget();
|
||||
return m_platform;
|
||||
}
|
||||
|
||||
QString S60DeviceRunConfiguration::symbianTarget() const
|
||||
{
|
||||
const_cast<S60DeviceRunConfiguration *>(this)->updateTarget();
|
||||
return m_target;
|
||||
}
|
||||
|
||||
QString S60DeviceRunConfiguration::packageTemplateFileName() const
|
||||
{
|
||||
const_cast<S60DeviceRunConfiguration *>(this)->updateTarget();
|
||||
return m_packageTemplateFileName;
|
||||
}
|
||||
|
||||
S60DeviceRunConfiguration::SigningMode S60DeviceRunConfiguration::signingMode() const
|
||||
{
|
||||
return m_signingMode;
|
||||
@@ -194,48 +212,17 @@ QString S60DeviceRunConfiguration::packageFileName() const
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Grep the pkg file for \code
|
||||
; Executable and default resource files
|
||||
"/S60/devices/S60_3rd_FP2_SDK_v1.1/epoc32/release/gcce/udeb/foo.exe" - "!:\sys\bin\foo.exe"
|
||||
\endcode */
|
||||
|
||||
static QString localExecutableFromPkgFile(const QString &pkgFileName, QString *errorMessage)
|
||||
{
|
||||
QFile pkgFile(pkgFileName);
|
||||
if (!pkgFile.open(QIODevice::ReadOnly|QIODevice::Text)) {
|
||||
*errorMessage = S60DeviceRunConfiguration::tr("Cannot open %1: %2").arg(pkgFileName, pkgFile.errorString());
|
||||
return QString();
|
||||
}
|
||||
// "<SDK>/foo.exe" - "!:\device_bin\foo.exe"
|
||||
const QRegExp exePattern = QRegExp(QLatin1String("^\"([^\"]+\\.exe)\" +-.*$"));
|
||||
Q_ASSERT(exePattern.isValid());
|
||||
|
||||
foreach(const QString &line, QString::fromLocal8Bit(pkgFile.readAll()).split(QLatin1Char('\n'))) {
|
||||
if (exePattern.exactMatch(line)) {
|
||||
QString rc = exePattern.cap(1);
|
||||
#ifdef Q_OS_WIN
|
||||
// Sometimes, the drive letter is missing. Use that of the pkg file
|
||||
if (rc.at(0) == QLatin1Char('/'))
|
||||
rc.insert(0, pkgFileName.left(2));
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
*errorMessage = S60DeviceRunConfiguration::tr("Unable to find the executable in the package file %1.").arg(pkgFileName);
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString S60DeviceRunConfiguration::localExecutableFileName() const
|
||||
{
|
||||
const QString pkg = packageFileName();
|
||||
if (!pkg.isEmpty()) {
|
||||
QString errorMessage;
|
||||
const QString rc = localExecutableFromPkgFile(pkg, &errorMessage);
|
||||
if (rc.isEmpty())
|
||||
qWarning("%s\n", qPrintable(errorMessage));
|
||||
return rc;
|
||||
}
|
||||
return QString();
|
||||
Qt4Project *qt4project = qobject_cast<Qt4Project *>(project());
|
||||
S60Devices::Device device = S60Manager::instance()->deviceForQtVersion(
|
||||
qt4project->qtVersion(qt4project->activeBuildConfiguration()));
|
||||
|
||||
QString localExecutable = device.epocRoot;
|
||||
localExecutable += QString::fromLatin1("/epoc32/release/%1/%2/%3.exe")
|
||||
.arg(symbianPlatform()).arg(symbianTarget()).arg(targetName());
|
||||
qDebug() << localExecutable;
|
||||
return QDir::toNativeSeparators(localExecutable);
|
||||
}
|
||||
|
||||
void S60DeviceRunConfiguration::updateTarget()
|
||||
@@ -300,16 +287,21 @@ void S60DeviceRunConfiguration::updateTarget()
|
||||
m_targetName = QFileInfo(m_proFilePath).baseName();
|
||||
|
||||
m_baseFileName = QDir::cleanPath(m_workingDir + QLatin1Char('/') + m_targetName);
|
||||
m_packageTemplateFileName = QDir::cleanPath(
|
||||
m_workingDir + QLatin1Char('/') + m_targetName + QLatin1String("_template.pkg"));
|
||||
|
||||
if (pro->toolChainType(pro->activeBuildConfiguration()) == ToolChain::GCCE)
|
||||
m_baseFileName += "_gcce";
|
||||
ToolChain::ToolChainType toolchain = pro->toolChainType(pro->activeBuildConfiguration());
|
||||
if (toolchain == ToolChain::GCCE)
|
||||
m_platform = QLatin1String("gcce");
|
||||
else if (toolchain == ToolChain::RVCT_ARMV5)
|
||||
m_platform = QLatin1String("armv5");
|
||||
else
|
||||
m_baseFileName += "_armv5";
|
||||
m_platform = QLatin1String("armv6");
|
||||
if (projectBuildConfiguration & QtVersion::DebugBuild)
|
||||
m_baseFileName += "_udeb";
|
||||
m_target = QLatin1String("udeb");
|
||||
else
|
||||
m_baseFileName += "_urel";
|
||||
|
||||
m_target = QLatin1String("urel");
|
||||
m_baseFileName += QLatin1Char('_') + m_platform + QLatin1Char('_') + m_target;
|
||||
delete reader;
|
||||
m_cachedTargetInformationValid = true;
|
||||
emit targetInformationChanged();
|
||||
@@ -323,7 +315,8 @@ void S60DeviceRunConfiguration::invalidateCachedTargetInformation()
|
||||
|
||||
// ======== S60DeviceRunConfigurationWidget
|
||||
|
||||
S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(S60DeviceRunConfiguration *runConfiguration,
|
||||
S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(
|
||||
S60DeviceRunConfiguration *runConfiguration,
|
||||
QWidget *parent)
|
||||
: QWidget(parent),
|
||||
m_runConfiguration(runConfiguration)
|
||||
@@ -345,7 +338,8 @@ S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(S60DeviceRunCon
|
||||
|
||||
m_serialPorts = new QComboBox;
|
||||
updateSerialDevices();
|
||||
connect(S60Manager::instance()->serialDeviceLister(), SIGNAL(updated()), this, SLOT(updateSerialDevices()));
|
||||
connect(S60Manager::instance()->serialDeviceLister(), SIGNAL(updated()),
|
||||
this, SLOT(updateSerialDevices()));
|
||||
connect(m_serialPorts, SIGNAL(activated(int)), this, SLOT(setSerialPort(int)));
|
||||
formLayout->addRow(tr("Device on Serial Port:"), m_serialPorts);
|
||||
|
||||
@@ -540,6 +534,9 @@ S60DeviceRunControlBase::S60DeviceRunControlBase(const QSharedPointer<RunConfigu
|
||||
m_serialPortFriendlyName = S60Manager::instance()->serialDeviceLister()->friendlyNameForPort(m_serialPortName);
|
||||
m_targetName = s60runConfig->targetName();
|
||||
m_baseFileName = s60runConfig->basePackageFilePath();
|
||||
m_symbianPlatform = s60runConfig->symbianPlatform();
|
||||
m_symbianTarget = s60runConfig->symbianTarget();
|
||||
m_packageTemplateFile = s60runConfig->packageTemplateFileName();
|
||||
m_workingDirectory = QFileInfo(m_baseFileName).absolutePath();
|
||||
m_qtDir = project->qtVersion(project->activeBuildConfiguration())->versionInfo().value("QT_INSTALL_DATA");
|
||||
m_useCustomSignature = (s60runConfig->signingMode() == S60DeviceRunConfiguration::SignCustom);
|
||||
@@ -550,7 +547,8 @@ S60DeviceRunControlBase::S60DeviceRunControlBase(const QSharedPointer<RunConfigu
|
||||
+ "/epoc32/tools";
|
||||
m_executableFileName = lsFile(s60runConfig->localExecutableFileName());
|
||||
m_makesisTool = m_toolsDirectory + "/makesis.exe";
|
||||
m_packageFile = QFileInfo(s60runConfig->packageFileName()).fileName();
|
||||
m_packageFilePath = s60runConfig->packageFileName();
|
||||
m_packageFile = QFileInfo(m_packageFilePath).fileName();
|
||||
}
|
||||
|
||||
void S60DeviceRunControlBase::start()
|
||||
@@ -560,7 +558,8 @@ void S60DeviceRunControlBase::start()
|
||||
emit addToOutputWindow(this, tr("Creating %1.sisx ...").arg(QDir::toNativeSeparators(m_baseFileName)));
|
||||
emit addToOutputWindow(this, tr("Executable file: %1").arg(m_executableFileName));
|
||||
|
||||
|
||||
if (!createPackageFileFromTemplate())
|
||||
return;
|
||||
m_makesis->setWorkingDirectory(m_workingDirectory);
|
||||
emit addToOutputWindow(this, tr("%1 %2").arg(QDir::toNativeSeparators(m_makesisTool), m_packageFile));
|
||||
m_makesis->start(m_makesisTool, QStringList(m_packageFile), QIODevice::ReadOnly);
|
||||
@@ -593,6 +592,29 @@ void S60DeviceRunControlBase::readStandardOutput()
|
||||
emit addToOutputWindowInline(this, QString::fromLocal8Bit(data.constData(), data.length()));
|
||||
}
|
||||
|
||||
bool S60DeviceRunControlBase::createPackageFileFromTemplate()
|
||||
{
|
||||
QFile packageTemplate(m_packageTemplateFile);
|
||||
if (!packageTemplate.open(QIODevice::ReadOnly)) {
|
||||
error(this, tr("Could not read template package file '%1'").arg(QDir::toNativeSeparators(m_packageTemplateFile)));
|
||||
emit finished();
|
||||
return false;
|
||||
}
|
||||
QString contents = packageTemplate.readAll();
|
||||
packageTemplate.close();
|
||||
contents.replace(QLatin1String("$(PLATFORM)"), m_symbianPlatform);
|
||||
contents.replace(QLatin1String("$(TARGET)"), m_symbianTarget);
|
||||
QFile packageFile(m_packageFilePath);
|
||||
if (!packageFile.open(QIODevice::WriteOnly)) {
|
||||
error(this, tr("Could not write package file '%1'").arg(QDir::toNativeSeparators(m_packageFilePath)));
|
||||
emit finished();
|
||||
return false;
|
||||
}
|
||||
packageFile.write(contents.toLocal8Bit());
|
||||
packageFile.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
void S60DeviceRunControlBase::makesisProcessFailed()
|
||||
{
|
||||
processFailed("makesis.exe", m_makesis->error());
|
||||
@@ -605,13 +627,13 @@ void S60DeviceRunControlBase::makesisProcessFinished()
|
||||
emit finished();
|
||||
return;
|
||||
}
|
||||
QString signsisTool = m_toolsDirectory + "/signsis.exe";
|
||||
QString sisFile = QFileInfo(m_baseFileName + ".sis").fileName();
|
||||
QString sisxFile = QFileInfo(m_baseFileName + ".sisx").fileName();
|
||||
QString signsisTool = m_toolsDirectory + QLatin1String("/signsis.exe");
|
||||
QString sisFile = QFileInfo(m_baseFileName + QLatin1String(".sis")).fileName();
|
||||
QString sisxFile = QFileInfo(m_baseFileName + QLatin1String(".sisx")).fileName();
|
||||
QString signature = (m_useCustomSignature ? m_customSignaturePath
|
||||
: m_qtDir + "/selfsigned.cer");
|
||||
: m_qtDir + QLatin1String("/src/s60installs/selfsigned.cer"));
|
||||
QString key = (m_useCustomSignature ? m_customKeyPath
|
||||
: m_qtDir + "/selfsigned.key");
|
||||
: m_qtDir + QLatin1String("/src/s60installs/selfsigned.key"));
|
||||
QStringList arguments;
|
||||
arguments << sisFile
|
||||
<< sisxFile << QDir::toNativeSeparators(signature)
|
||||
|
||||
@@ -74,6 +74,9 @@ public:
|
||||
void setSerialPortName(const QString &name);
|
||||
QString targetName() const;
|
||||
QString basePackageFilePath() const;
|
||||
QString symbianPlatform() const;
|
||||
QString symbianTarget() const;
|
||||
QString packageTemplateFileName() const;
|
||||
SigningMode signingMode() const;
|
||||
void setSigningMode(SigningMode mode);
|
||||
QString customSignaturePath() const;
|
||||
@@ -97,7 +100,10 @@ private:
|
||||
|
||||
QString m_proFilePath;
|
||||
QString m_targetName;
|
||||
QString m_platform;
|
||||
QString m_target;
|
||||
QString m_baseFileName;
|
||||
QString m_packageTemplateFileName;
|
||||
bool m_cachedTargetInformationValid;
|
||||
QString m_serialPortName;
|
||||
SigningMode m_signingMode;
|
||||
@@ -180,10 +186,16 @@ private slots:
|
||||
void launcherFinished();
|
||||
|
||||
private:
|
||||
bool createPackageFileFromTemplate();
|
||||
|
||||
QString m_serialPortName;
|
||||
QString m_serialPortFriendlyName;
|
||||
QString m_targetName;
|
||||
QString m_baseFileName;
|
||||
QString m_symbianPlatform;
|
||||
QString m_symbianTarget;
|
||||
QString m_packageTemplateFile;
|
||||
QString m_packageFilePath;
|
||||
QString m_workingDirectory;
|
||||
QString m_toolsDirectory;
|
||||
QString m_executableFileName;
|
||||
|
||||
@@ -300,6 +300,11 @@ void QtOptionsPageWidget::addQtDir()
|
||||
m_ui->defaultCombo->addItem(newVersion->name());
|
||||
m_ui->nameEdit->setFocus();
|
||||
m_ui->nameEdit->selectAll();
|
||||
|
||||
if (!m_versions.at(m_defaultVersion)->isValid()) {
|
||||
m_defaultVersion = m_versions.count() - 1;
|
||||
m_ui->defaultCombo->setCurrentIndex(m_versions.count() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
void QtOptionsPageWidget::removeQtDir()
|
||||
|
||||
@@ -169,7 +169,7 @@ p, li { white-space: pre-wrap; }
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="pathLabel">
|
||||
<property name="text">
|
||||
<string>Path to QMake:</string>
|
||||
<string>QMake Location:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
s/#include "qscriptcontext_p.h"//g
|
||||
s/#include "qscriptcontext.h"//g
|
||||
s/#include "qscriptengine.h"//g
|
||||
s/#include "qscriptmember_p.h"//g
|
||||
s/#include "qscriptobject_p.h"//g
|
||||
s/#include "qscriptvalueimpl_p.h"//g
|
||||
|
||||
s/#ifndef QT_NO_SCRIPT//g
|
||||
s,#endif // QT_NO_SCRIPT,,g
|
||||
|
||||
s/QScript/JavaScript/g
|
||||
s/QSCRIPT/JAVASCRIPT/g
|
||||
s/qscript/javascript/g
|
||||
s/Q_SCRIPT/J_SCRIPT/g
|
||||
|
||||
s/qsreal/qjsreal/g
|
||||
@@ -1,49 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
me=$(dirname $0)
|
||||
|
||||
rm -f javascript.g
|
||||
rm -f javascriptast.cpp
|
||||
rm -f javascriptast_p.h
|
||||
rm -f javascriptastfwd_p.h
|
||||
rm -f javascriptastvisitor.cpp
|
||||
rm -f javascriptastvisitor_p.h
|
||||
rm -f javascriptlexer.cpp
|
||||
rm -f javascriptlexer_p.h
|
||||
rm -f javascriptmemorypool_p.h
|
||||
rm -f javascriptnodepool_p.h
|
||||
|
||||
rm -f javascriptgrammar_p.h
|
||||
rm -f javascriptgrammar.cpp
|
||||
rm -f javascriptparser_p.h
|
||||
rm -f javascriptparser.cpp
|
||||
|
||||
sed -f $me/cmd.sed $QTDIR/src/script/qscript.g > javascript.g
|
||||
|
||||
sed -f $me/cmd.sed $QTDIR/src/script/qscriptast.cpp > javascriptast.cpp
|
||||
sed -f $me/cmd.sed $QTDIR/src/script/qscriptast_p.h > javascriptast_p.h
|
||||
sed -f $me/cmd.sed $QTDIR/src/script/qscriptastfwd_p.h > javascriptastfwd_p.h
|
||||
sed -f $me/cmd.sed $QTDIR/src/script/qscriptastvisitor.cpp > javascriptastvisitor.cpp
|
||||
sed -f $me/cmd.sed $QTDIR/src/script/qscriptastvisitor_p.h > javascriptastvisitor_p.h
|
||||
sed -f $me/cmd.sed $QTDIR/src/script/qscriptlexer_p.h > javascriptlexer_p.h
|
||||
sed -f $me/cmd.sed $QTDIR/src/script/qscriptlexer.cpp > javascriptlexer.cpp
|
||||
sed -f $me/cmd.sed $QTDIR/src/script/qscriptmemorypool_p.h > javascriptmemorypool_p.h
|
||||
sed -f $me/cmd.sed $QTDIR/src/script/qscriptnodepool_p.h > javascriptnodepool_p.h
|
||||
|
||||
qlalr --troll --no-lines --no-debug $me/javascript.g
|
||||
|
||||
chmod ugo-w javascript.g
|
||||
chmod ugo-w javascriptast.cpp
|
||||
chmod ugo-w javascriptast_p.h
|
||||
chmod ugo-w javascriptastfwd_p.h
|
||||
chmod ugo-w javascriptastvisitor.cpp
|
||||
chmod ugo-w javascriptastvisitor_p.h
|
||||
chmod ugo-w javascriptlexer_p.h
|
||||
chmod ugo-w javascriptlexer.cpp
|
||||
chmod ugo-w javascriptmemorypool_p.h
|
||||
chmod ugo-w javascriptnodepool_p.h
|
||||
|
||||
chmod ugo-w javascriptgrammar_p.h
|
||||
chmod ugo-w javascriptgrammar.cpp
|
||||
chmod ugo-w javascriptparser_p.h
|
||||
chmod ugo-w javascriptparser.cpp
|
||||
@@ -1,4 +1,45 @@
|
||||
// This file was generated by qlalr - DO NOT EDIT!
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** No Commercial Usage
|
||||
** This file contains pre-release code and may not be distributed.
|
||||
** You may use this file in accordance with the terms and conditions
|
||||
** contained in the Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "javascriptgrammar_p.h"
|
||||
|
||||
const char *const JavaScriptGrammar::spell [] = {
|
||||
|
||||
@@ -2,13 +2,41 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** All rights reserved.
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** This file is part of the $MODULE$ of the Qt Toolkit.
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $TROLLTECH_DUAL_LICENSE$
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** No Commercial Usage
|
||||
** This file contains pre-release code and may not be distributed.
|
||||
** You may use this file in accordance with the terms and conditions
|
||||
** contained in the Technology Preview License Agreement accompanying
|
||||
** this package.
|
||||
**
|
||||
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** If you have questions regarding the use of this file, please contact
|
||||
** Nokia at qt-info@nokia.com.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
@@ -1122,7 +1122,7 @@ case 266: {
|
||||
token_buffer[1].dval = yylval = lexer->dval();
|
||||
token_buffer[1].loc = yylloc = location(lexer);
|
||||
|
||||
if (t_action(errorState, yytoken)) {
|
||||
if (token_buffer[0].token != -1 && t_action(errorState, yytoken)) {
|
||||
QString msg = QString::fromUtf8("Removed token");
|
||||
if (const char *tokenSpell = spell[token_buffer[0].token]) {
|
||||
msg += QLatin1String(": `");
|
||||
|
||||
@@ -40,7 +40,7 @@ static const char * const showWrapColumnKey = "ShowWrapColumn";
|
||||
static const char * const wrapColumnKey = "WrapColumn";
|
||||
static const char * const visualizeWhitespaceKey = "VisualizeWhitespace";
|
||||
static const char * const displayFoldingMarkersKey = "DisplayFoldingMarkers";
|
||||
static const char * const highlightCurrentLineKey = "HighlightCurrentLineKeyV2";
|
||||
static const char * const highlightCurrentLineKey = "HighlightCurrentLineKey";
|
||||
static const char * const highlightBlocksKey = "HighlightBlocksKey";
|
||||
static const char * const animateMatchingParenthesesKey= "AnimateMatchingParenthesesKey";
|
||||
static const char * const mouseNavigationKey = "MouseNavigation";
|
||||
@@ -56,7 +56,7 @@ DisplaySettings::DisplaySettings() :
|
||||
m_wrapColumn(80),
|
||||
m_visualizeWhitespace(false),
|
||||
m_displayFoldingMarkers(true),
|
||||
m_highlightCurrentLine(false),
|
||||
m_highlightCurrentLine(true),
|
||||
m_highlightBlocks(false),
|
||||
m_animateMatchingParentheses(true),
|
||||
m_mouseNavigation(true),
|
||||
|
||||
@@ -251,7 +251,6 @@ void TextEditorActionHandler::createActions()
|
||||
|
||||
m_selectBlockDownAction= new QAction(tr("Select Block Down"), this);
|
||||
command = am->registerAction(m_selectBlockDownAction, Constants::SELECT_BLOCK_DOWN, m_contextId);
|
||||
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U")));
|
||||
connect(m_selectBlockDownAction, SIGNAL(triggered()), this, SLOT(selectBlockDown()));
|
||||
advancedMenu->addAction(command, Core::Constants::G_EDIT_BLOCKS);
|
||||
|
||||
|
||||
@@ -83,7 +83,6 @@ class Semantic;
|
||||
class Control;
|
||||
class MemoryPool;
|
||||
class DiagnosticClient;
|
||||
class MacroResolver;
|
||||
|
||||
class Identifier;
|
||||
class Literal;
|
||||
|
||||
@@ -59,11 +59,6 @@
|
||||
|
||||
CPLUSPLUS_BEGIN_NAMESPACE
|
||||
|
||||
MacroResolver::MacroResolver()
|
||||
{ }
|
||||
|
||||
MacroResolver::~MacroResolver()
|
||||
{ }
|
||||
|
||||
template <typename _Iterator>
|
||||
static void delete_map_entries(_Iterator first, _Iterator last)
|
||||
@@ -93,8 +88,7 @@ public:
|
||||
Data(Control *control)
|
||||
: control(control),
|
||||
translationUnit(0),
|
||||
diagnosticClient(0),
|
||||
macroResolver(0)
|
||||
diagnosticClient(0)
|
||||
{ }
|
||||
|
||||
~Data()
|
||||
@@ -539,7 +533,6 @@ public:
|
||||
Control *control;
|
||||
TranslationUnit *translationUnit;
|
||||
DiagnosticClient *diagnosticClient;
|
||||
MacroResolver *macroResolver;
|
||||
LiteralTable<Identifier> identifiers;
|
||||
LiteralTable<StringLiteral> stringLiterals;
|
||||
LiteralTable<NumericLiteral> numericLiterals;
|
||||
@@ -602,12 +595,6 @@ TranslationUnit *Control::switchTranslationUnit(TranslationUnit *unit)
|
||||
return previousTranslationUnit;
|
||||
}
|
||||
|
||||
MacroResolver *Control::macroResolver() const
|
||||
{ return d->macroResolver; }
|
||||
|
||||
void Control::setMacroResolver(MacroResolver *macroResolver)
|
||||
{ d->macroResolver = macroResolver; }
|
||||
|
||||
DiagnosticClient *Control::diagnosticClient() const
|
||||
{ return d->diagnosticClient; }
|
||||
|
||||
|
||||
@@ -55,18 +55,6 @@
|
||||
CPLUSPLUS_BEGIN_HEADER
|
||||
CPLUSPLUS_BEGIN_NAMESPACE
|
||||
|
||||
class CPLUSPLUS_EXPORT MacroResolver
|
||||
{
|
||||
MacroResolver(const MacroResolver &other);
|
||||
void operator = (const MacroResolver &other);
|
||||
|
||||
public:
|
||||
MacroResolver();
|
||||
virtual ~MacroResolver();
|
||||
|
||||
virtual bool isMacro(TranslationUnit *unit, unsigned tokenIndex) const = 0;
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT Control
|
||||
{
|
||||
public:
|
||||
@@ -76,9 +64,6 @@ public:
|
||||
TranslationUnit *translationUnit() const;
|
||||
TranslationUnit *switchTranslationUnit(TranslationUnit *unit);
|
||||
|
||||
MacroResolver *macroResolver() const;
|
||||
void setMacroResolver(MacroResolver *macroResolver);
|
||||
|
||||
DiagnosticClient *diagnosticClient() const;
|
||||
void setDiagnosticClient(DiagnosticClient *diagnosticClient);
|
||||
|
||||
|
||||
@@ -244,14 +244,6 @@ void Parser::match(int kind, unsigned *token)
|
||||
}
|
||||
}
|
||||
|
||||
bool Parser::isMacro(unsigned tokenIndex) const
|
||||
{
|
||||
if (MacroResolver *r = _control->macroResolver())
|
||||
return r->isMacro(_translationUnit, tokenIndex);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Parser::parseClassOrNamespaceName(NameAST *&node)
|
||||
{
|
||||
if (LA() == T_IDENTIFIER) {
|
||||
@@ -2561,10 +2553,6 @@ bool Parser::parseBuiltinTypeSpecifier(SpecifierAST *&node)
|
||||
bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
|
||||
bool acceptStructDeclarator)
|
||||
{
|
||||
if (LA() == T_IDENTIFIER && isMacro(cursor())) {
|
||||
// printf("***** found macro reference `%s'\n", tok().identifier->chars());
|
||||
}
|
||||
|
||||
unsigned qt_invokable_token = 0;
|
||||
if (acceptStructDeclarator && (LA() == T_Q_SIGNAL || LA() == T_Q_SLOT))
|
||||
qt_invokable_token = consumeToken();
|
||||
|
||||
@@ -286,8 +286,6 @@ private:
|
||||
inline void rewind(unsigned cursor)
|
||||
{ _tokenIndex = cursor; }
|
||||
|
||||
bool isMacro(unsigned tokenIndex) const;
|
||||
|
||||
private:
|
||||
TranslationUnit *_translationUnit;
|
||||
Control *_control;
|
||||
|
||||