forked from qt-creator/qt-creator
Merge commit 'origin/0.9.1-beta'
This commit is contained in:
@@ -122,6 +122,7 @@ int qtGhVersion = QT_VERSION;
|
|||||||
# include <QImage>
|
# include <QImage>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <list>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -406,12 +407,13 @@ struct QDumper
|
|||||||
QDumper &operator<<(unsigned int i);
|
QDumper &operator<<(unsigned int i);
|
||||||
QDumper &operator<<(const void *p);
|
QDumper &operator<<(const void *p);
|
||||||
QDumper &operator<<(qulonglong c);
|
QDumper &operator<<(qulonglong c);
|
||||||
void put(char c);
|
|
||||||
void addCommaIfNeeded();
|
|
||||||
void putBase64Encoded(const char *buf, int n);
|
|
||||||
QDumper &operator<<(const char *str);
|
QDumper &operator<<(const char *str);
|
||||||
QDumper &operator<<(const QByteArray &ba);
|
QDumper &operator<<(const QByteArray &ba);
|
||||||
QDumper &operator<<(const QString &str);
|
QDumper &operator<<(const QString &str);
|
||||||
|
void put(char c);
|
||||||
|
void addCommaIfNeeded();
|
||||||
|
void putBase64Encoded(const char *buf, int n);
|
||||||
|
void putEllipsis();
|
||||||
void disarm();
|
void disarm();
|
||||||
|
|
||||||
void beginHash(); // start of data hash output
|
void beginHash(); // start of data hash output
|
||||||
@@ -657,6 +659,11 @@ void QDumper::endHash()
|
|||||||
put('}');
|
put('}');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QDumper::putEllipsis()
|
||||||
|
{
|
||||||
|
addCommaIfNeeded();
|
||||||
|
*this << "{name=\"<incomplete>\",value=\"\",type=\"" << innertype << "\"}";
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Some helpers to keep the dumper code short
|
// Some helpers to keep the dumper code short
|
||||||
@@ -815,6 +822,27 @@ static void qDumpInnerValue(QDumper &d, const char *type, const void *addr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void qDumpInnerValueOrPointer(QDumper &d,
|
||||||
|
const char *type, const char *strippedtype, const void *addr)
|
||||||
|
{
|
||||||
|
if (strippedtype) {
|
||||||
|
if (deref(addr)) {
|
||||||
|
P(d, "addr", deref(addr));
|
||||||
|
P(d, "type", strippedtype);
|
||||||
|
qDumpInnerValueHelper(d, strippedtype, deref(addr));
|
||||||
|
} else {
|
||||||
|
P(d, "addr", addr);
|
||||||
|
P(d, "type", strippedtype);
|
||||||
|
P(d, "value", "<null>");
|
||||||
|
P(d, "numchild", "0");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
P(d, "addr", addr);
|
||||||
|
P(d, "type", type);
|
||||||
|
qDumpInnerValueHelper(d, type, addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static void qDumpQByteArray(QDumper &d)
|
static void qDumpQByteArray(QDumper &d)
|
||||||
@@ -1212,9 +1240,8 @@ static void qDumpQList(QDumper &d)
|
|||||||
bool isInternal = innerSize <= int(sizeof(void*))
|
bool isInternal = innerSize <= int(sizeof(void*))
|
||||||
&& isMovableType(d.innertype);
|
&& isMovableType(d.innertype);
|
||||||
|
|
||||||
P(d, "internal", (int)isInternal);
|
P(d, "internal", (int)isInternal);
|
||||||
|
P(d, "childtype", d.innertype);
|
||||||
P(d, "childtype", d.innertype);
|
|
||||||
if (n > 1000)
|
if (n > 1000)
|
||||||
n = 1000;
|
n = 1000;
|
||||||
d << ",children=[";
|
d << ",children=[";
|
||||||
@@ -1244,11 +1271,8 @@ static void qDumpQList(QDumper &d)
|
|||||||
}
|
}
|
||||||
d.endHash();
|
d.endHash();
|
||||||
}
|
}
|
||||||
if (n < nn) {
|
if (n < nn)
|
||||||
d.beginHash();
|
d.putEllipsis();
|
||||||
P(d, "value", "<incomplete>");
|
|
||||||
d.endHash();
|
|
||||||
}
|
|
||||||
d << "]";
|
d << "]";
|
||||||
}
|
}
|
||||||
d.disarm();
|
d.disarm();
|
||||||
@@ -1490,7 +1514,6 @@ static void qDumpQObject(QDumper &d)
|
|||||||
d.beginHash();
|
d.beginHash();
|
||||||
P(d, "name", "methods");
|
P(d, "name", "methods");
|
||||||
P(d, "exp", "*(class '"NS"QObject'*)" << d.data);
|
P(d, "exp", "*(class '"NS"QObject'*)" << d.data);
|
||||||
P(d, "type", NS"QObjectMethodList");
|
|
||||||
P(d, "value", "<" << mo->methodCount() << " items>");
|
P(d, "value", "<" << mo->methodCount() << " items>");
|
||||||
P(d, "numchild", mo->methodCount());
|
P(d, "numchild", mo->methodCount());
|
||||||
d.endHash();
|
d.endHash();
|
||||||
@@ -1876,11 +1899,7 @@ static void qDumpQSet(QDumper &d)
|
|||||||
d.endHash();
|
d.endHash();
|
||||||
++i;
|
++i;
|
||||||
if (i > 10000) {
|
if (i > 10000) {
|
||||||
d.beginHash();
|
d.putEllipsis();
|
||||||
P(d, "name", "Warning:");
|
|
||||||
P(d, "value", "<incomplete>");
|
|
||||||
P(d, "type", "");
|
|
||||||
d.endHash();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1935,13 +1954,8 @@ static void qDumpQStringList(QDumper &d)
|
|||||||
P(d, "valueencoded", "1");
|
P(d, "valueencoded", "1");
|
||||||
d.endHash();
|
d.endHash();
|
||||||
}
|
}
|
||||||
if (n < list.size()) {
|
if (n < list.size())
|
||||||
d.beginHash();
|
d.putEllipsis();
|
||||||
P(d, "name", "Warning:");
|
|
||||||
P(d, "value", "<incomplete>");
|
|
||||||
P(d, "type", "");
|
|
||||||
d.endHash();
|
|
||||||
}
|
|
||||||
d << "]";
|
d << "]";
|
||||||
}
|
}
|
||||||
d.disarm();
|
d.disarm();
|
||||||
@@ -2065,37 +2079,68 @@ static void qDumpQVector(QDumper &d)
|
|||||||
P(d, "valuedisabled", "true");
|
P(d, "valuedisabled", "true");
|
||||||
P(d, "numchild", n);
|
P(d, "numchild", n);
|
||||||
if (d.dumpChildren) {
|
if (d.dumpChildren) {
|
||||||
bool innerTypeIsPointer = isPointerType(d.innertype);
|
|
||||||
QByteArray strippedInnerType = stripPointerType(d.innertype);
|
QByteArray strippedInnerType = stripPointerType(d.innertype);
|
||||||
|
const char *stripped =
|
||||||
|
isPointerType(d.innertype) ? strippedInnerType.data() : 0;
|
||||||
if (n > 1000)
|
if (n > 1000)
|
||||||
n = 1000;
|
n = 1000;
|
||||||
d << ",children=[";
|
d << ",children=[";
|
||||||
for (int i = 0; i != n; ++i) {
|
for (int i = 0; i != n; ++i) {
|
||||||
d.beginHash();
|
d.beginHash();
|
||||||
P(d, "name", "[" << i << "]");
|
P(d, "name", "[" << i << "]");
|
||||||
const void *p = addOffset(v, i * innersize + typeddatasize);
|
qDumpInnerValueOrPointer(d, d.innertype, stripped,
|
||||||
if (innerTypeIsPointer) {
|
addOffset(v, i * innersize + typeddatasize));
|
||||||
if (deref(p)) {
|
|
||||||
//P(d, "value","@" << p);
|
|
||||||
qDumpInnerValue(d, strippedInnerType.data(), deref(p));
|
|
||||||
} else {
|
|
||||||
P(d, "type", d.innertype);
|
|
||||||
P(d, "value", "<null>");
|
|
||||||
P(d, "numchild", "0");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
qDumpInnerValue(d, d.innertype, p);
|
|
||||||
}
|
|
||||||
d.endHash();
|
d.endHash();
|
||||||
}
|
}
|
||||||
if (n < nn) {
|
if (n < nn)
|
||||||
|
d.putEllipsis();
|
||||||
|
d << "]";
|
||||||
|
}
|
||||||
|
d.disarm();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void qDumpStdList(QDumper &d)
|
||||||
|
{
|
||||||
|
const std::list<int> &list = *reinterpret_cast<const std::list<int> *>(d.data);
|
||||||
|
const void *p = d.data;
|
||||||
|
qCheckAccess(p);
|
||||||
|
p = deref(p);
|
||||||
|
qCheckAccess(p);
|
||||||
|
p = deref(p);
|
||||||
|
qCheckAccess(p);
|
||||||
|
p = deref(addOffset(d.data, sizeof(void*)));
|
||||||
|
qCheckAccess(p);
|
||||||
|
p = deref(addOffset(p, sizeof(void*)));
|
||||||
|
qCheckAccess(p);
|
||||||
|
p = deref(addOffset(p, sizeof(void*)));
|
||||||
|
qCheckAccess(p);
|
||||||
|
|
||||||
|
int nn = 0;
|
||||||
|
std::list<int>::const_iterator it = list.begin();
|
||||||
|
for (; nn < 101 && it != list.end(); ++nn, ++it)
|
||||||
|
qCheckAccess(it.operator->());
|
||||||
|
|
||||||
|
if (nn > 100)
|
||||||
|
P(d, "value", "<more than 100 items>");
|
||||||
|
else
|
||||||
|
P(d, "value", "<" << nn << " items>");
|
||||||
|
P(d, "numchild", nn);
|
||||||
|
|
||||||
|
P(d, "valuedisabled", "true");
|
||||||
|
if (d.dumpChildren) {
|
||||||
|
QByteArray strippedInnerType = stripPointerType(d.innertype);
|
||||||
|
const char *stripped =
|
||||||
|
isPointerType(d.innertype) ? strippedInnerType.data() : 0;
|
||||||
|
d << ",children=[";
|
||||||
|
it = list.begin();
|
||||||
|
for (int i = 0; i < 1000 && it != list.end(); ++i, ++it) {
|
||||||
d.beginHash();
|
d.beginHash();
|
||||||
P(d, "name", "[...]");
|
P(d, "name", "[" << i << "]");
|
||||||
P(d, "value", "<incomplete>");
|
qDumpInnerValueOrPointer(d, d.innertype, stripped, it.operator->());
|
||||||
P(d, "type", d.innertype);
|
|
||||||
d.endHash();
|
d.endHash();
|
||||||
}
|
}
|
||||||
|
if (it != list.end())
|
||||||
|
d.putEllipsis();
|
||||||
d << "]";
|
d << "]";
|
||||||
}
|
}
|
||||||
d.disarm();
|
d.disarm();
|
||||||
@@ -2167,37 +2212,21 @@ static void qDumpStdVector(QDumper &d)
|
|||||||
P(d, "numchild", n);
|
P(d, "numchild", n);
|
||||||
if (d.dumpChildren) {
|
if (d.dumpChildren) {
|
||||||
unsigned innersize = d.extraInt[0];
|
unsigned innersize = d.extraInt[0];
|
||||||
bool innerTypeIsPointer = isPointerType(d.innertype);
|
|
||||||
QByteArray strippedInnerType = stripPointerType(d.innertype);
|
QByteArray strippedInnerType = stripPointerType(d.innertype);
|
||||||
|
const char *stripped =
|
||||||
|
isPointerType(d.innertype) ? strippedInnerType.data() : 0;
|
||||||
if (n > 1000)
|
if (n > 1000)
|
||||||
n = 1000;
|
n = 1000;
|
||||||
d << ",children=[";
|
d << ",children=[";
|
||||||
for (int i = 0; i != n; ++i) {
|
for (int i = 0; i != n; ++i) {
|
||||||
d.beginHash();
|
d.beginHash();
|
||||||
P(d, "name", "[" << i << "]");
|
P(d, "name", "[" << i << "]");
|
||||||
const void *p = addOffset(v->start, i * innersize);
|
qDumpInnerValueOrPointer(d, d.innertype, stripped,
|
||||||
if (innerTypeIsPointer) {
|
addOffset(v->start, i * innersize));
|
||||||
if (deref(p)) {
|
|
||||||
//P(d, "value","@" << p);
|
|
||||||
qDumpInnerValue(d, strippedInnerType.data(), deref(p));
|
|
||||||
} else {
|
|
||||||
P(d, "type", d.innertype);
|
|
||||||
P(d, "value", "<null>");
|
|
||||||
P(d, "numchild", "0");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
qDumpInnerValue(d, d.innertype, p);
|
|
||||||
}
|
|
||||||
d.endHash();
|
|
||||||
}
|
|
||||||
if (n < nn) {
|
|
||||||
d.beginHash();
|
|
||||||
P(d, "name", "[...]");
|
|
||||||
P(d, "value", "<incomplete>");
|
|
||||||
P(d, "type", d.innertype);
|
|
||||||
d.endHash();
|
d.endHash();
|
||||||
}
|
}
|
||||||
|
if (n < nn)
|
||||||
|
d.putEllipsis();
|
||||||
d << "]";
|
d << "]";
|
||||||
}
|
}
|
||||||
d.disarm();
|
d.disarm();
|
||||||
@@ -2325,6 +2354,8 @@ static void handleProtocolVersion2and3(QDumper & d)
|
|||||||
qDumpStdVector(d);
|
qDumpStdVector(d);
|
||||||
else if (isEqual(type, "std::vector::bool"))
|
else if (isEqual(type, "std::vector::bool"))
|
||||||
qDumpStdVectorBool(d);
|
qDumpStdVectorBool(d);
|
||||||
|
else if (isEqual(type, "std::list"))
|
||||||
|
qDumpStdList(d);
|
||||||
else if (isEqual(type, "string"))
|
else if (isEqual(type, "string"))
|
||||||
qDumpStdString(d);
|
qDumpStdString(d);
|
||||||
else if (isEqual(type, "std::string"))
|
else if (isEqual(type, "std::string"))
|
||||||
|
|||||||
246
doc/coding-style.qdoc
Normal file
246
doc/coding-style.qdoc
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
/*!
|
||||||
|
|
||||||
|
\contentpage{index.html}{Qt Creator}
|
||||||
|
\page coding-style.html
|
||||||
|
|
||||||
|
\title Qt Creator Coding Rules
|
||||||
|
|
||||||
|
THIS IS PRELIMINARY.
|
||||||
|
|
||||||
|
\section1 Introduction
|
||||||
|
|
||||||
|
The aim of this section is to serve as a guide for the developers, to aid us
|
||||||
|
to build understandable and maintainable code, to create less confusion and
|
||||||
|
surprises when working on Qt Creator.
|
||||||
|
|
||||||
|
As usual: Rules are not set in stone. If there's a good reason to break one,
|
||||||
|
do it, preferably after making sure that there are others agreeing.
|
||||||
|
|
||||||
|
This document is incomplete.
|
||||||
|
|
||||||
|
In general, if you want to contribute to the main source, we expect at least
|
||||||
|
that you:
|
||||||
|
|
||||||
|
\list 1
|
||||||
|
\o The most important rule first: KISS (keep it simple ...): always
|
||||||
|
use a simple implementation in favor of a more complicated one.
|
||||||
|
This eases maintenance a lot.
|
||||||
|
\o Write good C++ code: Readable, well commented when necessary,
|
||||||
|
and taking advantage of the OO model. Follow the \l{Formatting} guidelines.
|
||||||
|
There are also certain \l{Code Constructs} that we try to follow.
|
||||||
|
\o Adapt the code to the structures already existing in Qt Creator, or in
|
||||||
|
the case that you have better ideas, discuss them with other developers
|
||||||
|
before writing the code.
|
||||||
|
\o Take advantage of Qt. Don't re-invent the wheel. Think about what parts
|
||||||
|
of your code are generic enough that they might be incorporated into
|
||||||
|
Qt proper.
|
||||||
|
\o Document interfaces. Right now we use qdoc, but changing to doxygen
|
||||||
|
is being considered.
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\section1 Submitting Code
|
||||||
|
|
||||||
|
It is implicitly understood that all patches contributed to The Qt Creator
|
||||||
|
Project are made under under the Gnu General Public License, version 2 or later
|
||||||
|
and
|
||||||
|
|
||||||
|
If you have a problem with that, don't contribute code.
|
||||||
|
|
||||||
|
Also please don't just pop up out of the blue with a huge patch (or
|
||||||
|
small) that changes something substantial in Qt Creator. Always discuss your
|
||||||
|
ideas with the other developers on mailing list first.
|
||||||
|
|
||||||
|
When you create the patch, please use git or use "diff -up" since we find
|
||||||
|
that a lot easier to read than the other diff formats. Also please do not
|
||||||
|
send patches that implements or fixes several different things; several
|
||||||
|
patches is a much better option.
|
||||||
|
|
||||||
|
We also require you to provide a commit message entry with every patch,
|
||||||
|
this describes in detail what the patch is doing.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\section1 Code Constructs
|
||||||
|
|
||||||
|
We have several guidelines on code constructs, some of these exist to
|
||||||
|
make the code faster, others to make the code clearer. Yet others
|
||||||
|
exist to allow us to take advantage of the strong type checking
|
||||||
|
in C++.
|
||||||
|
|
||||||
|
\list 1
|
||||||
|
\o Declaration of variables should wait as long as possible. The rule
|
||||||
|
is: "Don't declare it until you need it." In C++ there are a lot of
|
||||||
|
user defined types, and these can very often be expensive to
|
||||||
|
initialize. This rule connects to the next rule too.
|
||||||
|
|
||||||
|
\o Make the scope of a variable as small as possible.
|
||||||
|
|
||||||
|
\o Prefer preincrement to postincrement whenever possible.
|
||||||
|
Preincrement has potential of being faster than postincrement. Just
|
||||||
|
think about the obvious implementations of pre/post-increment. This
|
||||||
|
rule applies to decrement too.
|
||||||
|
|
||||||
|
\code
|
||||||
|
++T;
|
||||||
|
--U;
|
||||||
|
-NOT-
|
||||||
|
T++; // not used in Qt Creator
|
||||||
|
U--; // not used in Qt Creator
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
\o Try to minimize evaluation of the same code over and over. This is
|
||||||
|
aimed especially at loops.
|
||||||
|
|
||||||
|
\code
|
||||||
|
|
||||||
|
Container::iterator end = large.end();
|
||||||
|
for (Container::iterator it = large.begin(); it != end; ++it) {
|
||||||
|
...;
|
||||||
|
}
|
||||||
|
-NOT-
|
||||||
|
for (Container::iterator it = large.begin();
|
||||||
|
it != large.end(); ++it) {
|
||||||
|
...;
|
||||||
|
}
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\section1 Formatting
|
||||||
|
|
||||||
|
\section2 Declarations
|
||||||
|
|
||||||
|
Only one declaration on each line.
|
||||||
|
\code
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
-NOT-
|
||||||
|
int a, b; // not used in Qt Creator
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
This is especially important when initialization is done at the same
|
||||||
|
time.
|
||||||
|
\code
|
||||||
|
QString a = "Joe";
|
||||||
|
QString b = "Foo";
|
||||||
|
-NOT-
|
||||||
|
QString a = "Joe", b = "Foo"; // not used in Qt Creator
|
||||||
|
\endcode
|
||||||
|
[Note that 'QString a = "Joe"' is formally calling a copy constructor
|
||||||
|
on a temporary constructed from a string literal and therefore has the
|
||||||
|
potential of being more expensive then direct construction by
|
||||||
|
'QString a("joe")'. However the compiler is allowed to elide the copy
|
||||||
|
(even if it had side effects), and modern compilers typically do so.
|
||||||
|
Given these equal costs, Qt Creator code favours the '=' idiom as it is in
|
||||||
|
line with the traditional C-style initialization, _and_ cannot be
|
||||||
|
mistaken as function declaration, _and_ reduces the level of nested
|
||||||
|
parantheses in more initializations.]
|
||||||
|
|
||||||
|
|
||||||
|
\section2 Pointers and references
|
||||||
|
|
||||||
|
\code
|
||||||
|
char *p = "flop";
|
||||||
|
char &c = *p;
|
||||||
|
-NOT-
|
||||||
|
char* p = "flop"; // not used in Qt Creator
|
||||||
|
char & c = *p; // not used in Qt Creator
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
This is simply in line with the official Qt guide lines.
|
||||||
|
|
||||||
|
Also note that we will have:
|
||||||
|
\code
|
||||||
|
const char *p;
|
||||||
|
-NOT-
|
||||||
|
char const * p; // not used in Qt Creator
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
|
||||||
|
Using a plain 0 for Null pointer constants is always correct and least effort
|
||||||
|
to type. So:
|
||||||
|
\code
|
||||||
|
void *p = 0;
|
||||||
|
-NOT-
|
||||||
|
void *p = NULL; // not used in Qt Creator
|
||||||
|
-NOT-
|
||||||
|
void *p = '\0'; // not used in Qt Creator
|
||||||
|
-NOT-
|
||||||
|
void *p = 42 - 7 * 6; // also not used in Qt Creator
|
||||||
|
\endcode
|
||||||
|
Note: As an exception, imported third party code as well as code
|
||||||
|
interfacing the "native" APIs (src/support/os_*) can use NULL.
|
||||||
|
|
||||||
|
|
||||||
|
\section2 Operator names and parentheses
|
||||||
|
\code
|
||||||
|
operator==(type)
|
||||||
|
-NOT-
|
||||||
|
operator == (type) // not used in Qt Creator
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
The == is part of the function name, separating it makes the
|
||||||
|
declaration look like an expression.
|
||||||
|
|
||||||
|
|
||||||
|
\section2 Function names and parentheses
|
||||||
|
\code
|
||||||
|
void mangle()
|
||||||
|
-NOT-
|
||||||
|
void mangle () // not used in Qt Creator
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\section2 Naming rules
|
||||||
|
|
||||||
|
Simply follow the style of Qt proper. As examples:
|
||||||
|
\list
|
||||||
|
\o Use descriptive but simple and short names. Do not abbreviate.
|
||||||
|
|
||||||
|
\o Class names are capitalized, and function names lowercased.
|
||||||
|
Enums are named like Classes, values are in lower-case.
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\section2 Formatting
|
||||||
|
|
||||||
|
Adapt the formatting of your code to the one used in the
|
||||||
|
other parts of Qt Creator. In case there is different formatting for
|
||||||
|
the same construct, use the one used more often.
|
||||||
|
|
||||||
|
|
||||||
|
\section2 Declarations
|
||||||
|
|
||||||
|
- Use this order for the access sections of your class: public,
|
||||||
|
protected, private. The public section is interesting for every
|
||||||
|
user of the class. The private section is only of interest for the
|
||||||
|
implementors of the class (you). [Obviously not true since this is
|
||||||
|
for developers, and we do not want one developer only to be able to
|
||||||
|
read and understand the implementation of class internals. Lgb]
|
||||||
|
|
||||||
|
- Avoid declaring global objects in the declaration file of the class.
|
||||||
|
If the same variable is used for all objects, use a static member.
|
||||||
|
|
||||||
|
- Avoid global or static variables.
|
||||||
|
|
||||||
|
|
||||||
|
\section2 File headers
|
||||||
|
|
||||||
|
If you create a new file, the top of the file should include a
|
||||||
|
header comment equal to the one found in other source files of Qt Creator.
|
||||||
|
|
||||||
|
\section2 Documentation
|
||||||
|
|
||||||
|
The documentation is generated from source and header files.
|
||||||
|
You document for the other developers, not for yourself.
|
||||||
|
In the header you should document interfaces, i.e. what the function does,
|
||||||
|
not the implementation.
|
||||||
|
In the .cpp files you document the implementation if the implementation
|
||||||
|
in non-obvious.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
@@ -1208,4 +1208,141 @@ int Lexer::classify(const char *s, int n, bool q) {
|
|||||||
} // switch
|
} // switch
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int classifyOperator2(const char *s) {
|
||||||
|
if (s[0] == 'o') {
|
||||||
|
if (s[1] == 'r') {
|
||||||
|
return T_OR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return T_IDENTIFIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int classifyOperator3(const char *s) {
|
||||||
|
if (s[0] == 'a') {
|
||||||
|
if (s[1] == 'n') {
|
||||||
|
if (s[2] == 'd') {
|
||||||
|
return T_AND;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (s[0] == 'n') {
|
||||||
|
if (s[1] == 'o') {
|
||||||
|
if (s[2] == 't') {
|
||||||
|
return T_NOT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (s[0] == 'x') {
|
||||||
|
if (s[1] == 'o') {
|
||||||
|
if (s[2] == 'r') {
|
||||||
|
return T_XOR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return T_IDENTIFIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int classifyOperator5(const char *s) {
|
||||||
|
if (s[0] == 'b') {
|
||||||
|
if (s[1] == 'i') {
|
||||||
|
if (s[2] == 't') {
|
||||||
|
if (s[3] == 'o') {
|
||||||
|
if (s[4] == 'r') {
|
||||||
|
return T_BITOR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (s[0] == 'c') {
|
||||||
|
if (s[1] == 'o') {
|
||||||
|
if (s[2] == 'm') {
|
||||||
|
if (s[3] == 'p') {
|
||||||
|
if (s[4] == 'l') {
|
||||||
|
return T_COMPL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (s[0] == 'o') {
|
||||||
|
if (s[1] == 'r') {
|
||||||
|
if (s[2] == '_') {
|
||||||
|
if (s[3] == 'e') {
|
||||||
|
if (s[4] == 'q') {
|
||||||
|
return T_OR_EQ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return T_IDENTIFIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int classifyOperator6(const char *s) {
|
||||||
|
if (s[0] == 'a') {
|
||||||
|
if (s[1] == 'n') {
|
||||||
|
if (s[2] == 'd') {
|
||||||
|
if (s[3] == '_') {
|
||||||
|
if (s[4] == 'e') {
|
||||||
|
if (s[5] == 'q') {
|
||||||
|
return T_AND_EQ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (s[0] == 'b') {
|
||||||
|
if (s[1] == 'i') {
|
||||||
|
if (s[2] == 't') {
|
||||||
|
if (s[3] == 'a') {
|
||||||
|
if (s[4] == 'n') {
|
||||||
|
if (s[5] == 'd') {
|
||||||
|
return T_BITAND;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (s[0] == 'n') {
|
||||||
|
if (s[1] == 'o') {
|
||||||
|
if (s[2] == 't') {
|
||||||
|
if (s[3] == '_') {
|
||||||
|
if (s[4] == 'e') {
|
||||||
|
if (s[5] == 'q') {
|
||||||
|
return T_NOT_EQ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (s[0] == 'x') {
|
||||||
|
if (s[1] == 'o') {
|
||||||
|
if (s[2] == 'r') {
|
||||||
|
if (s[3] == '_') {
|
||||||
|
if (s[4] == 'e') {
|
||||||
|
if (s[5] == 'q') {
|
||||||
|
return T_XOR_EQ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return T_IDENTIFIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Lexer::classifyOperator(const char *s, int n) {
|
||||||
|
switch (n) {
|
||||||
|
case 2: return classifyOperator2(s);
|
||||||
|
case 3: return classifyOperator3(s);
|
||||||
|
case 5: return classifyOperator5(s);
|
||||||
|
case 6: return classifyOperator6(s);
|
||||||
|
default: return T_IDENTIFIER;
|
||||||
|
} // switch
|
||||||
|
}
|
||||||
|
|
||||||
CPLUSPLUS_END_NAMESPACE
|
CPLUSPLUS_END_NAMESPACE
|
||||||
|
|||||||
@@ -589,8 +589,13 @@ void Lexer::scan_helper(Token *tok)
|
|||||||
tok->kind = classify(yytext, yylen, _qtMocRunEnabled);
|
tok->kind = classify(yytext, yylen, _qtMocRunEnabled);
|
||||||
else
|
else
|
||||||
tok->kind = T_IDENTIFIER;
|
tok->kind = T_IDENTIFIER;
|
||||||
if (tok->kind == T_IDENTIFIER && control())
|
|
||||||
tok->identifier = control()->findOrInsertIdentifier(yytext, yylen);
|
if (tok->kind == T_IDENTIFIER) {
|
||||||
|
tok->kind = classifyOperator(yytext, yylen);
|
||||||
|
|
||||||
|
if (control())
|
||||||
|
tok->identifier = control()->findOrInsertIdentifier(yytext, yylen);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
} else if (std::isdigit(ch)) {
|
} else if (std::isdigit(ch)) {
|
||||||
const char *yytext = _currentChar - 1;
|
const char *yytext = _currentChar - 1;
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ private:
|
|||||||
void scan_helper(Token *tok);
|
void scan_helper(Token *tok);
|
||||||
void setSource(const char *firstChar, const char *lastChar);
|
void setSource(const char *firstChar, const char *lastChar);
|
||||||
static int classify(const char *string, int length, bool q);
|
static int classify(const char *string, int length, bool q);
|
||||||
|
static int classifyOperator(const char *string, int length);
|
||||||
|
|
||||||
inline void yyinp()
|
inline void yyinp()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -209,7 +209,19 @@ enum Kind {
|
|||||||
|
|
||||||
T_LAST_KEYWORD = T_SLOTS,
|
T_LAST_KEYWORD = T_SLOTS,
|
||||||
|
|
||||||
// ### aliases
|
// aliases
|
||||||
|
T_OR = T_PIPE_PIPE,
|
||||||
|
T_AND = T_AMPER_AMPER,
|
||||||
|
T_NOT = T_EXCLAIM,
|
||||||
|
T_XOR = T_CARET,
|
||||||
|
T_BITOR = T_PIPE,
|
||||||
|
T_COMPL = T_TILDE,
|
||||||
|
T_OR_EQ = T_PIPE_EQUAL,
|
||||||
|
T_AND_EQ = T_AMPER_EQUAL,
|
||||||
|
T_BITAND = T_AMPER,
|
||||||
|
T_NOT_EQ = T_EXCLAIM_EQUAL,
|
||||||
|
T_XOR_EQ = T_CARET_EQUAL,
|
||||||
|
|
||||||
T___ASM = T_ASM,
|
T___ASM = T_ASM,
|
||||||
T___ASM__ = T_ASM,
|
T___ASM__ = T_ASM,
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ static const char *HELP_OPTION4 = "--help";
|
|||||||
static const char *VERSION_OPTION = "-version";
|
static const char *VERSION_OPTION = "-version";
|
||||||
static const char *CLIENT_OPTION = "-client";
|
static const char *CLIENT_OPTION = "-client";
|
||||||
|
|
||||||
typedef QSet<ExtensionSystem::PluginSpec *> PluginSpecSet;
|
typedef QList<ExtensionSystem::PluginSpec *> PluginSpecSet;
|
||||||
|
|
||||||
// Helpers for displaying messages. Note that there is no console on Windows.
|
// Helpers for displaying messages. Note that there is no console on Windows.
|
||||||
#ifdef Q_WS_WIN
|
#ifdef Q_WS_WIN
|
||||||
|
|||||||
@@ -33,8 +33,6 @@
|
|||||||
|
|
||||||
#include "CppDocument.h"
|
#include "CppDocument.h"
|
||||||
|
|
||||||
#include <utils/qtcassert.h>
|
|
||||||
|
|
||||||
#include <Control.h>
|
#include <Control.h>
|
||||||
#include <TranslationUnit.h>
|
#include <TranslationUnit.h>
|
||||||
#include <DiagnosticClient.h>
|
#include <DiagnosticClient.h>
|
||||||
@@ -133,12 +131,16 @@ QString Document::fileName() const
|
|||||||
|
|
||||||
QStringList Document::includedFiles() const
|
QStringList Document::includedFiles() const
|
||||||
{
|
{
|
||||||
return _includedFiles;
|
QStringList files;
|
||||||
|
foreach (const Include &i, _includes)
|
||||||
|
files.append(i.fileName());
|
||||||
|
files.removeDuplicates();
|
||||||
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Document::addIncludeFile(const QString &fileName)
|
void Document::addIncludeFile(const QString &fileName, unsigned line)
|
||||||
{
|
{
|
||||||
_includedFiles.append(fileName);
|
_includes.append(Include(fileName, line));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Document::appendMacro(const Macro ¯o)
|
void Document::appendMacro(const Macro ¯o)
|
||||||
@@ -273,7 +275,7 @@ bool Document::parse(ParseMode mode)
|
|||||||
|
|
||||||
void Document::check()
|
void Document::check()
|
||||||
{
|
{
|
||||||
QTC_ASSERT(!_globalNamespace, return);
|
Q_ASSERT(!_globalNamespace);
|
||||||
|
|
||||||
Semantic semantic(_control);
|
Semantic semantic(_control);
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QSet>
|
#include <QMap>
|
||||||
#include <QSharedPointer>
|
#include <QSharedPointer>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
QString fileName() const;
|
QString fileName() const;
|
||||||
|
|
||||||
QStringList includedFiles() const;
|
QStringList includedFiles() const;
|
||||||
void addIncludeFile(const QString &fileName);
|
void addIncludeFile(const QString &fileName, unsigned line);
|
||||||
|
|
||||||
void appendMacro(const Macro ¯o);
|
void appendMacro(const Macro ¯o);
|
||||||
void addMacroUse(const Macro ¯o, unsigned offset, unsigned length);
|
void addMacroUse(const Macro ¯o, unsigned offset, unsigned length);
|
||||||
@@ -181,6 +181,22 @@ public:
|
|||||||
{ return pos >= _begin && pos < _end; }
|
{ return pos >= _begin && pos < _end; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Include {
|
||||||
|
QString _fileName;
|
||||||
|
unsigned _line;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Include(const QString &fileName, unsigned line)
|
||||||
|
: _fileName(fileName), _line(line)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
QString fileName() const
|
||||||
|
{ return _fileName; }
|
||||||
|
|
||||||
|
unsigned line() const
|
||||||
|
{ return _line; }
|
||||||
|
};
|
||||||
|
|
||||||
class MacroUse: public Block {
|
class MacroUse: public Block {
|
||||||
Macro _macro;
|
Macro _macro;
|
||||||
|
|
||||||
@@ -196,6 +212,9 @@ public:
|
|||||||
{ return _macro; }
|
{ return _macro; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
QList<Include> includes() const
|
||||||
|
{ return _includes; }
|
||||||
|
|
||||||
QList<Block> skippedBlocks() const
|
QList<Block> skippedBlocks() const
|
||||||
{ return _skippedBlocks; }
|
{ return _skippedBlocks; }
|
||||||
|
|
||||||
@@ -207,16 +226,26 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QString _fileName;
|
QString _fileName;
|
||||||
QStringList _includedFiles;
|
|
||||||
Control *_control;
|
Control *_control;
|
||||||
TranslationUnit *_translationUnit;
|
TranslationUnit *_translationUnit;
|
||||||
Namespace *_globalNamespace;
|
Namespace *_globalNamespace;
|
||||||
QList<DiagnosticMessage> _diagnosticMessages;
|
QList<DiagnosticMessage> _diagnosticMessages;
|
||||||
|
QList<Include> _includes;
|
||||||
QList<Macro> _definedMacros;
|
QList<Macro> _definedMacros;
|
||||||
QList<Block> _skippedBlocks;
|
QList<Block> _skippedBlocks;
|
||||||
QList<MacroUse> _macroUses;
|
QList<MacroUse> _macroUses;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CPLUSPLUS_EXPORT Snapshot: public QMap<QString, Document::Ptr>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Snapshot()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
~Snapshot()
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
} // end of namespace CPlusPlus
|
} // end of namespace CPlusPlus
|
||||||
|
|
||||||
#endif // CPPDOCUMENT_H
|
#endif // CPPDOCUMENT_H
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ LookupContext::LookupContext(Control *control)
|
|||||||
LookupContext::LookupContext(Symbol *symbol,
|
LookupContext::LookupContext(Symbol *symbol,
|
||||||
Document::Ptr expressionDocument,
|
Document::Ptr expressionDocument,
|
||||||
Document::Ptr thisDocument,
|
Document::Ptr thisDocument,
|
||||||
const QMap<QString, Document::Ptr> &documents)
|
const Snapshot &documents)
|
||||||
: _symbol(symbol),
|
: _symbol(symbol),
|
||||||
_expressionDocument(expressionDocument),
|
_expressionDocument(expressionDocument),
|
||||||
_thisDocument(thisDocument),
|
_thisDocument(thisDocument),
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public:
|
|||||||
LookupContext(Symbol *symbol,
|
LookupContext(Symbol *symbol,
|
||||||
Document::Ptr expressionDocument,
|
Document::Ptr expressionDocument,
|
||||||
Document::Ptr thisDocument,
|
Document::Ptr thisDocument,
|
||||||
const QMap<QString, Document::Ptr> &documents);
|
const Snapshot &documents);
|
||||||
|
|
||||||
LookupContext(Symbol *symbol,
|
LookupContext(Symbol *symbol,
|
||||||
const LookupContext &context);
|
const LookupContext &context);
|
||||||
@@ -87,7 +87,7 @@ public:
|
|||||||
QList<Symbol *> resolveClassOrNamespace(Name *name) const
|
QList<Symbol *> resolveClassOrNamespace(Name *name) const
|
||||||
{ return resolveClassOrNamespace(name, visibleScopes()); }
|
{ return resolveClassOrNamespace(name, visibleScopes()); }
|
||||||
|
|
||||||
QMap<QString, Document::Ptr> documents() const
|
Snapshot snapshot() const
|
||||||
{ return _documents; }
|
{ return _documents; }
|
||||||
|
|
||||||
enum ResolveMode {
|
enum ResolveMode {
|
||||||
@@ -140,7 +140,7 @@ private:
|
|||||||
Document::Ptr _thisDocument;
|
Document::Ptr _thisDocument;
|
||||||
|
|
||||||
// All documents.
|
// All documents.
|
||||||
QMap<QString, Document::Ptr> _documents;
|
Snapshot _documents;
|
||||||
|
|
||||||
// Visible scopes.
|
// Visible scopes.
|
||||||
QList<Scope *> _visibleScopes;
|
QList<Scope *> _visibleScopes;
|
||||||
|
|||||||
@@ -34,8 +34,6 @@
|
|||||||
#include "OverviewModel.h"
|
#include "OverviewModel.h"
|
||||||
#include "Overview.h"
|
#include "Overview.h"
|
||||||
|
|
||||||
#include <utils/qtcassert.h>
|
|
||||||
|
|
||||||
#include <Scope.h>
|
#include <Scope.h>
|
||||||
#include <Semantic.h>
|
#include <Semantic.h>
|
||||||
#include <Literals.h>
|
#include <Literals.h>
|
||||||
@@ -83,13 +81,13 @@ QModelIndex OverviewModel::index(int row, int column, const QModelIndex &parent)
|
|||||||
return createIndex(row, column, symbol);
|
return createIndex(row, column, symbol);
|
||||||
} else {
|
} else {
|
||||||
Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer());
|
Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer());
|
||||||
QTC_ASSERT(parentSymbol, return QModelIndex());
|
Q_ASSERT(parentSymbol);
|
||||||
|
|
||||||
ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol();
|
ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol();
|
||||||
QTC_ASSERT(scopedSymbol, return QModelIndex());
|
Q_ASSERT(scopedSymbol);
|
||||||
|
|
||||||
Scope *scope = scopedSymbol->members();
|
Scope *scope = scopedSymbol->members();
|
||||||
QTC_ASSERT(scope, return QModelIndex());
|
Q_ASSERT(scope);
|
||||||
|
|
||||||
return createIndex(row, 0, scope->symbolAt(row));
|
return createIndex(row, 0, scope->symbolAt(row));
|
||||||
}
|
}
|
||||||
@@ -126,12 +124,12 @@ int OverviewModel::rowCount(const QModelIndex &parent) const
|
|||||||
if (!parent.parent().isValid() && parent.row() == 0) // account for no symbol item
|
if (!parent.parent().isValid() && parent.row() == 0) // account for no symbol item
|
||||||
return 0;
|
return 0;
|
||||||
Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer());
|
Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer());
|
||||||
QTC_ASSERT(parentSymbol, return 0);
|
Q_ASSERT(parentSymbol);
|
||||||
|
|
||||||
if (ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol()) {
|
if (ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol()) {
|
||||||
if (!scopedSymbol->isFunction()) {
|
if (!scopedSymbol->isFunction()) {
|
||||||
Scope *parentScope = scopedSymbol->members();
|
Scope *parentScope = scopedSymbol->members();
|
||||||
QTC_ASSERT(parentScope, return 0);
|
Q_ASSERT(parentScope);
|
||||||
|
|
||||||
return parentScope->symbolCount();
|
return parentScope->symbolCount();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,8 +45,6 @@
|
|||||||
#include <TypeVisitor.h>
|
#include <TypeVisitor.h>
|
||||||
#include <NameVisitor.h>
|
#include <NameVisitor.h>
|
||||||
|
|
||||||
#include <utils/qtcassert.h>
|
|
||||||
|
|
||||||
#include <QtCore/QList>
|
#include <QtCore/QList>
|
||||||
#include <QtCore/QtDebug>
|
#include <QtCore/QtDebug>
|
||||||
|
|
||||||
@@ -100,7 +98,7 @@ protected:
|
|||||||
// types
|
// types
|
||||||
virtual void visit(PointerToMemberType * /*ty*/)
|
virtual void visit(PointerToMemberType * /*ty*/)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(false, /**/);
|
Q_ASSERT(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void visit(PointerType *ty)
|
virtual void visit(PointerType *ty)
|
||||||
@@ -152,32 +150,32 @@ protected:
|
|||||||
{ /* nothing to do*/ }
|
{ /* nothing to do*/ }
|
||||||
|
|
||||||
virtual void visit(Namespace *)
|
virtual void visit(Namespace *)
|
||||||
{ QTC_ASSERT(false, /**/); }
|
{ Q_ASSERT(false); }
|
||||||
|
|
||||||
virtual void visit(Class *)
|
virtual void visit(Class *)
|
||||||
{ QTC_ASSERT(false, /**/); }
|
{ Q_ASSERT(false); }
|
||||||
|
|
||||||
virtual void visit(Enum *)
|
virtual void visit(Enum *)
|
||||||
{ QTC_ASSERT(false, /**/); }
|
{ Q_ASSERT(false); }
|
||||||
|
|
||||||
// names
|
// names
|
||||||
virtual void visit(NameId *)
|
virtual void visit(NameId *)
|
||||||
{ QTC_ASSERT(false, /**/); }
|
{ Q_ASSERT(false); }
|
||||||
|
|
||||||
virtual void visit(TemplateNameId *)
|
virtual void visit(TemplateNameId *)
|
||||||
{ QTC_ASSERT(false, /**/); }
|
{ Q_ASSERT(false); }
|
||||||
|
|
||||||
virtual void visit(DestructorNameId *)
|
virtual void visit(DestructorNameId *)
|
||||||
{ QTC_ASSERT(false, /**/); }
|
{ Q_ASSERT(false); }
|
||||||
|
|
||||||
virtual void visit(OperatorNameId *)
|
virtual void visit(OperatorNameId *)
|
||||||
{ QTC_ASSERT(false, /**/); }
|
{ Q_ASSERT(false); }
|
||||||
|
|
||||||
virtual void visit(ConversionNameId *)
|
virtual void visit(ConversionNameId *)
|
||||||
{ QTC_ASSERT(false, /**/); }
|
{ Q_ASSERT(false); }
|
||||||
|
|
||||||
virtual void visit(QualifiedNameId *)
|
virtual void visit(QualifiedNameId *)
|
||||||
{ QTC_ASSERT(false, /**/); }
|
{ Q_ASSERT(false); }
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end of anonymous namespace
|
} // end of anonymous namespace
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
#include <TranslationUnit.h>
|
#include <TranslationUnit.h>
|
||||||
#include <cplusplus/LookupContext.h>
|
#include <cplusplus/LookupContext.h>
|
||||||
#include <cplusplus/ResolveExpression.h>
|
#include <cplusplus/ResolveExpression.h>
|
||||||
|
#include <cplusplus/pp.h>
|
||||||
|
|
||||||
using namespace CPlusPlus;
|
using namespace CPlusPlus;
|
||||||
|
|
||||||
@@ -45,21 +46,25 @@ TypeOfExpression::TypeOfExpression():
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeOfExpression::setDocuments(const QMap<QString, Document::Ptr> &documents)
|
void TypeOfExpression::setSnapshot(const Snapshot &documents)
|
||||||
{
|
{
|
||||||
m_documents = documents;
|
m_snapshot = documents;
|
||||||
m_lookupContext = LookupContext();
|
m_lookupContext = LookupContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expression,
|
QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expression,
|
||||||
Document::Ptr document,
|
Document::Ptr document,
|
||||||
Symbol *lastVisibleSymbol)
|
Symbol *lastVisibleSymbol,
|
||||||
|
PreprocessMode mode)
|
||||||
{
|
{
|
||||||
Document::Ptr expressionDoc = documentForExpression(expression);
|
QString code = expression;
|
||||||
|
if (mode == Preprocess)
|
||||||
|
code = preprocessedExpression(expression, m_snapshot, document);
|
||||||
|
Document::Ptr expressionDoc = documentForExpression(code);
|
||||||
m_ast = extractExpressionAST(expressionDoc);
|
m_ast = extractExpressionAST(expressionDoc);
|
||||||
|
|
||||||
m_lookupContext = LookupContext(lastVisibleSymbol, expressionDoc,
|
m_lookupContext = LookupContext(lastVisibleSymbol, expressionDoc,
|
||||||
document, m_documents);
|
document, m_snapshot);
|
||||||
|
|
||||||
ResolveExpression resolveExpression(m_lookupContext);
|
ResolveExpression resolveExpression(m_lookupContext);
|
||||||
return resolveExpression(m_ast);
|
return resolveExpression(m_ast);
|
||||||
@@ -97,3 +102,36 @@ Document::Ptr TypeOfExpression::documentForExpression(const QString &expression)
|
|||||||
doc->parse(Document::ParseExpression);
|
doc->parse(Document::ParseExpression);
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TypeOfExpression::processEnvironment(Snapshot documents,
|
||||||
|
Document::Ptr doc, Environment *env,
|
||||||
|
QSet<QString> *processed) const
|
||||||
|
{
|
||||||
|
if (! doc)
|
||||||
|
return;
|
||||||
|
if (processed->contains(doc->fileName()))
|
||||||
|
return;
|
||||||
|
processed->insert(doc->fileName());
|
||||||
|
foreach (const Document::Include &incl, doc->includes()) {
|
||||||
|
processEnvironment(documents,
|
||||||
|
documents.value(incl.fileName()),
|
||||||
|
env, processed);
|
||||||
|
}
|
||||||
|
foreach (const Macro ¯o, doc->definedMacros())
|
||||||
|
env->bind(macro);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TypeOfExpression::preprocessedExpression(const QString &expression,
|
||||||
|
Snapshot documents,
|
||||||
|
Document::Ptr thisDocument) const
|
||||||
|
{
|
||||||
|
Environment env;
|
||||||
|
QSet<QString> processed;
|
||||||
|
processEnvironment(documents, thisDocument,
|
||||||
|
&env, &processed);
|
||||||
|
const QByteArray code = expression.toUtf8();
|
||||||
|
pp preproc(0, env);
|
||||||
|
QByteArray preprocessedCode;
|
||||||
|
preproc("<expression>", code, &preprocessedCode);
|
||||||
|
return QString::fromUtf8(preprocessedCode);
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,6 +43,9 @@
|
|||||||
|
|
||||||
namespace CPlusPlus {
|
namespace CPlusPlus {
|
||||||
|
|
||||||
|
class Environment;
|
||||||
|
class Macro;
|
||||||
|
|
||||||
class CPLUSPLUS_EXPORT TypeOfExpression
|
class CPLUSPLUS_EXPORT TypeOfExpression
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -58,7 +61,12 @@ public:
|
|||||||
* Also clears the lookup context, so can be used to make sure references
|
* Also clears the lookup context, so can be used to make sure references
|
||||||
* to the documents previously used are removed.
|
* to the documents previously used are removed.
|
||||||
*/
|
*/
|
||||||
void setDocuments(const QMap<QString, Document::Ptr> &documents);
|
void setSnapshot(const Snapshot &documents);
|
||||||
|
|
||||||
|
enum PreprocessMode {
|
||||||
|
NoPreprocess,
|
||||||
|
Preprocess
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of possible fully specified types associated with the
|
* Returns a list of possible fully specified types associated with the
|
||||||
@@ -73,7 +81,8 @@ public:
|
|||||||
* @param lastVisibleSymbol The last visible symbol in the document.
|
* @param lastVisibleSymbol The last visible symbol in the document.
|
||||||
*/
|
*/
|
||||||
QList<Result> operator()(const QString &expression, Document::Ptr document,
|
QList<Result> operator()(const QString &expression, Document::Ptr document,
|
||||||
Symbol *lastVisibleSymbol);
|
Symbol *lastVisibleSymbol,
|
||||||
|
PreprocessMode mode = NoPreprocess);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the AST of the last evaluated expression.
|
* Returns the AST of the last evaluated expression.
|
||||||
@@ -91,7 +100,15 @@ private:
|
|||||||
ExpressionAST *extractExpressionAST(Document::Ptr doc) const;
|
ExpressionAST *extractExpressionAST(Document::Ptr doc) const;
|
||||||
Document::Ptr documentForExpression(const QString &expression) const;
|
Document::Ptr documentForExpression(const QString &expression) const;
|
||||||
|
|
||||||
QMap<QString, Document::Ptr> m_documents;
|
void processEnvironment(CPlusPlus::Snapshot documents,
|
||||||
|
CPlusPlus::Document::Ptr doc, CPlusPlus::Environment *env,
|
||||||
|
QSet<QString> *processed) const;
|
||||||
|
|
||||||
|
QString preprocessedExpression(const QString &expression,
|
||||||
|
CPlusPlus::Snapshot documents,
|
||||||
|
CPlusPlus::Document::Ptr thisDocument) const;
|
||||||
|
|
||||||
|
Snapshot m_snapshot;
|
||||||
ExpressionAST *m_ast;
|
ExpressionAST *m_ast;
|
||||||
LookupContext m_lookupContext;
|
LookupContext m_lookupContext;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ public:
|
|||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual void macroAdded(const Macro ¯o) = 0;
|
virtual void macroAdded(const Macro ¯o) = 0;
|
||||||
virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature.
|
virtual void sourceNeeded(QString &fileName, IncludeType mode,
|
||||||
|
unsigned line) = 0; // ### FIX the signature.
|
||||||
|
|
||||||
virtual void startExpandingMacro(unsigned offset,
|
virtual void startExpandingMacro(unsigned offset,
|
||||||
const Macro ¯o,
|
const Macro ¯o,
|
||||||
|
|||||||
@@ -818,7 +818,7 @@ void pp::processInclude(bool skipCurentPath,
|
|||||||
QString fn = QString::fromUtf8(path.constData(), path.length());
|
QString fn = QString::fromUtf8(path.constData(), path.length());
|
||||||
|
|
||||||
if (client)
|
if (client)
|
||||||
client->sourceNeeded(fn, Client::IncludeGlobal);
|
client->sourceNeeded(fn, Client::IncludeGlobal, firstToken->lineno);
|
||||||
} else if (tk->is(T_ANGLE_STRING_LITERAL) || tk->is(T_STRING_LITERAL)) {
|
} else if (tk->is(T_ANGLE_STRING_LITERAL) || tk->is(T_STRING_LITERAL)) {
|
||||||
const QByteArray spell = tokenSpell(*tk);
|
const QByteArray spell = tokenSpell(*tk);
|
||||||
const char *beginOfPath = spell.constBegin();
|
const char *beginOfPath = spell.constBegin();
|
||||||
@@ -831,7 +831,7 @@ void pp::processInclude(bool skipCurentPath,
|
|||||||
QString fn = QString::fromUtf8(path.constData(), path.length());
|
QString fn = QString::fromUtf8(path.constData(), path.length());
|
||||||
|
|
||||||
if (client)
|
if (client)
|
||||||
client->sourceNeeded(fn, Client::IncludeLocal);
|
client->sourceNeeded(fn, Client::IncludeLocal, firstToken->lineno);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,8 +53,6 @@
|
|||||||
#include "pp-environment.h"
|
#include "pp-environment.h"
|
||||||
#include "pp.h"
|
#include "pp.h"
|
||||||
|
|
||||||
#include <utils/qtcassert.h>
|
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
using namespace CPlusPlus;
|
using namespace CPlusPlus;
|
||||||
@@ -93,7 +91,7 @@ Macro *Environment::macroAt(unsigned index) const
|
|||||||
|
|
||||||
Macro *Environment::bind(const Macro &__macro)
|
Macro *Environment::bind(const Macro &__macro)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(! __macro.name.isEmpty(), return 0);
|
Q_ASSERT(! __macro.name.isEmpty());
|
||||||
|
|
||||||
Macro *m = new Macro (__macro);
|
Macro *m = new Macro (__macro);
|
||||||
m->hashcode = hash_code(m->name);
|
m->hashcode = hash_code(m->name);
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ bool OptionsParser::checkForNoLoadOption()
|
|||||||
"The plugin '%1' does not exist.").arg(m_currentArg);
|
"The plugin '%1' does not exist.").arg(m_currentArg);
|
||||||
m_hasError = true;
|
m_hasError = true;
|
||||||
} else {
|
} else {
|
||||||
m_pmPrivate->pluginSpecs.remove(spec);
|
m_pmPrivate->pluginSpecs.removeAll(spec);
|
||||||
delete spec;
|
delete spec;
|
||||||
m_isDependencyRefreshNeeded = true;
|
m_isDependencyRefreshNeeded = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
#include <QTest>
|
#include <QTest>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef QSet<ExtensionSystem::PluginSpec *> PluginSpecSet;
|
typedef QList<ExtensionSystem::PluginSpec *> PluginSpecSet;
|
||||||
|
|
||||||
enum { debugLeaks = 0 };
|
enum { debugLeaks = 0 };
|
||||||
|
|
||||||
@@ -162,6 +162,11 @@ enum { debugLeaks = 0 };
|
|||||||
using namespace ExtensionSystem;
|
using namespace ExtensionSystem;
|
||||||
using namespace ExtensionSystem::Internal;
|
using namespace ExtensionSystem::Internal;
|
||||||
|
|
||||||
|
static bool lessThanByPluginName(const PluginSpec *one, const PluginSpec *two)
|
||||||
|
{
|
||||||
|
return one->name() < two->name();
|
||||||
|
}
|
||||||
|
|
||||||
PluginManager *PluginManager::m_instance = 0;
|
PluginManager *PluginManager::m_instance = 0;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -306,7 +311,7 @@ QStringList PluginManager::arguments() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn QSet<PluginSpec *> PluginManager::plugins() const
|
\fn QList<PluginSpec *> PluginManager::plugins() const
|
||||||
List of all plugin specifications that have been found in the plugin search paths.
|
List of all plugin specifications that have been found in the plugin search paths.
|
||||||
This list is valid directly after the setPluginPaths() call.
|
This list is valid directly after the setPluginPaths() call.
|
||||||
The plugin specifications contain the information from the plugins' xml description files
|
The plugin specifications contain the information from the plugins' xml description files
|
||||||
@@ -315,7 +320,7 @@ QStringList PluginManager::arguments() const
|
|||||||
|
|
||||||
\sa setPluginPaths()
|
\sa setPluginPaths()
|
||||||
*/
|
*/
|
||||||
QSet<PluginSpec *> PluginManager::plugins() const
|
QList<PluginSpec *> PluginManager::plugins() const
|
||||||
{
|
{
|
||||||
return d->pluginSpecs;
|
return d->pluginSpecs;
|
||||||
}
|
}
|
||||||
@@ -703,9 +708,11 @@ void PluginManagerPrivate::readPluginPaths()
|
|||||||
foreach (const QString &specFile, specFiles) {
|
foreach (const QString &specFile, specFiles) {
|
||||||
PluginSpec *spec = new PluginSpec;
|
PluginSpec *spec = new PluginSpec;
|
||||||
spec->d->read(specFile);
|
spec->d->read(specFile);
|
||||||
pluginSpecs.insert(spec);
|
pluginSpecs.append(spec);
|
||||||
}
|
}
|
||||||
resolveDependencies();
|
resolveDependencies();
|
||||||
|
// ensure deterministic plugin load order by sorting
|
||||||
|
qSort(pluginSpecs.begin(), pluginSpecs.end(), lessThanByPluginName);
|
||||||
emit q->pluginsChanged();
|
emit q->pluginsChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ public:
|
|||||||
void loadPlugins();
|
void loadPlugins();
|
||||||
QStringList pluginPaths() const;
|
QStringList pluginPaths() const;
|
||||||
void setPluginPaths(const QStringList &paths);
|
void setPluginPaths(const QStringList &paths);
|
||||||
QSet<PluginSpec *> plugins() const;
|
QList<PluginSpec *> plugins() const;
|
||||||
void setFileExtension(const QString &extension);
|
void setFileExtension(const QString &extension);
|
||||||
QString fileExtension() const;
|
QString fileExtension() const;
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public:
|
|||||||
void loadPlugin(PluginSpec *spec, PluginSpec::State destState);
|
void loadPlugin(PluginSpec *spec, PluginSpec::State destState);
|
||||||
void resolveDependencies();
|
void resolveDependencies();
|
||||||
|
|
||||||
QSet<PluginSpec *> pluginSpecs;
|
QList<PluginSpec *> pluginSpecs;
|
||||||
QList<PluginSpec *> testSpecs;
|
QList<PluginSpec *> testSpecs;
|
||||||
QStringList pluginPaths;
|
QStringList pluginPaths;
|
||||||
QString extension;
|
QString extension;
|
||||||
|
|||||||
@@ -693,10 +693,10 @@ int PluginSpecPrivate::versionCompare(const QString &version1, const QString &ve
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\fn bool PluginSpecPrivate::resolveDependencies(const QSet<PluginSpec *> &specs)
|
\fn bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs)
|
||||||
\internal
|
\internal
|
||||||
*/
|
*/
|
||||||
bool PluginSpecPrivate::resolveDependencies(const QSet<PluginSpec *> &specs)
|
bool PluginSpecPrivate::resolveDependencies(const QList<PluginSpec *> &specs)
|
||||||
{
|
{
|
||||||
if (hasError)
|
if (hasError)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public:
|
|||||||
|
|
||||||
bool read(const QString &fileName);
|
bool read(const QString &fileName);
|
||||||
bool provides(const QString &pluginName, const QString &version) const;
|
bool provides(const QString &pluginName, const QString &version) const;
|
||||||
bool resolveDependencies(const QSet<PluginSpec *> &specs);
|
bool resolveDependencies(const QList<PluginSpec *> &specs);
|
||||||
bool loadLibrary();
|
bool loadLibrary();
|
||||||
bool initializePlugin();
|
bool initializePlugin();
|
||||||
bool initializeExtensions();
|
bool initializeExtensions();
|
||||||
|
|||||||
@@ -46,11 +46,12 @@
|
|||||||
#include <QtGui/QHBoxLayout>
|
#include <QtGui/QHBoxLayout>
|
||||||
#include <QtGui/QLineEdit>
|
#include <QtGui/QLineEdit>
|
||||||
#include <QtGui/QToolButton>
|
#include <QtGui/QToolButton>
|
||||||
|
#include <QtGui/QPushButton>
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
|
|
||||||
#ifdef Q_OS_OSX
|
#ifdef Q_OS_MAC
|
||||||
/*static*/ const char * const PathChooser::browseButtonLabel = "Choose...";
|
/*static*/ const char * const PathChooser::browseButtonLabel = "Choose...";
|
||||||
#else
|
#else
|
||||||
/*static*/ const char * const PathChooser::browseButtonLabel = "Browse...";
|
/*static*/ const char * const PathChooser::browseButtonLabel = "Browse...";
|
||||||
@@ -112,7 +113,11 @@ PathChooser::PathChooser(QWidget *parent) :
|
|||||||
hLayout->addWidget(m_d->m_lineEdit);
|
hLayout->addWidget(m_d->m_lineEdit);
|
||||||
hLayout->setSizeConstraint(QLayout::SetMinimumSize);
|
hLayout->setSizeConstraint(QLayout::SetMinimumSize);
|
||||||
|
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
QPushButton *browseButton = new QPushButton;
|
||||||
|
#else
|
||||||
QToolButton *browseButton = new QToolButton;
|
QToolButton *browseButton = new QToolButton;
|
||||||
|
#endif
|
||||||
browseButton->setText(tr(browseButtonLabel));
|
browseButton->setText(tr(browseButtonLabel));
|
||||||
connect(browseButton, SIGNAL(clicked()), this, SLOT(slotBrowse()));
|
connect(browseButton, SIGNAL(clicked()), this, SLOT(slotBrowse()));
|
||||||
|
|
||||||
|
|||||||
@@ -201,14 +201,18 @@ void BookmarksPlugin::updateActions(int state)
|
|||||||
|
|
||||||
void BookmarksPlugin::editorOpened(Core::IEditor *editor)
|
void BookmarksPlugin::editorOpened(Core::IEditor *editor)
|
||||||
{
|
{
|
||||||
connect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
|
if (qobject_cast<ITextEditor *>(editor)) {
|
||||||
this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
|
connect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
|
||||||
|
this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BookmarksPlugin::editorAboutToClose(Core::IEditor *editor)
|
void BookmarksPlugin::editorAboutToClose(Core::IEditor *editor)
|
||||||
{
|
{
|
||||||
disconnect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
|
if (qobject_cast<ITextEditor *>(editor)) {
|
||||||
this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
|
disconnect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
|
||||||
|
this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BookmarksPlugin::requestContextMenu(TextEditor::ITextEditor *editor,
|
void BookmarksPlugin::requestContextMenu(TextEditor::ITextEditor *editor,
|
||||||
|
|||||||
@@ -186,6 +186,15 @@ MainWindow::MainWindow() :
|
|||||||
QCoreApplication::setOrganizationName(QLatin1String("Nokia"));
|
QCoreApplication::setOrganizationName(QLatin1String("Nokia"));
|
||||||
QSettings::setDefaultFormat(QSettings::IniFormat);
|
QSettings::setDefaultFormat(QSettings::IniFormat);
|
||||||
QString baseName = qApp->style()->objectName();
|
QString baseName = qApp->style()->objectName();
|
||||||
|
if (baseName == "windows") {
|
||||||
|
// Sometimes we get the standard windows 95 style as a fallback
|
||||||
|
// e.g. if we are running on a KDE4 desktop
|
||||||
|
QByteArray desktopEnvironment = qgetenv("DESKTOP_SESSION");
|
||||||
|
if (desktopEnvironment == "kde")
|
||||||
|
baseName = "plastique";
|
||||||
|
else
|
||||||
|
baseName = "cleanlooks";
|
||||||
|
}
|
||||||
qApp->setStyle(new ManhattanStyle(baseName));
|
qApp->setStyle(new ManhattanStyle(baseName));
|
||||||
statusBar()->setProperty("p_styled", true);
|
statusBar()->setProperty("p_styled", true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -334,6 +334,10 @@ NavigationSubWidget::NavigationSubWidget(NavigationWidget *parentWidget)
|
|||||||
|
|
||||||
m_navigationComboBox = new NavComboBox(this);
|
m_navigationComboBox = new NavComboBox(this);
|
||||||
m_navigationWidget = 0;
|
m_navigationWidget = 0;
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
// this is to avoid ugly tool bar behavior
|
||||||
|
m_navigationComboBox->setMaximumWidth(130);
|
||||||
|
#endif
|
||||||
|
|
||||||
m_toolbar = new QToolBar(this);
|
m_toolbar = new QToolBar(this);
|
||||||
m_toolbar->setContentsMargins(0, 0, 0, 0);
|
m_toolbar->setContentsMargins(0, 0, 0, 0);
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ VersionDialog::VersionDialog(QWidget *parent)
|
|||||||
"<br/>"
|
"<br/>"
|
||||||
"Built on " __DATE__ " at " __TIME__ "<br />"
|
"Built on " __DATE__ " at " __TIME__ "<br />"
|
||||||
#ifdef IDE_REVISION
|
#ifdef IDE_REVISION
|
||||||
"Using revision %5<br/>"
|
"From revision %5<br/>"
|
||||||
#endif
|
#endif
|
||||||
"<br/>"
|
"<br/>"
|
||||||
"<br/>"
|
"<br/>"
|
||||||
|
|||||||
@@ -427,7 +427,9 @@ void CPPEditor::switchDeclarationDefinition()
|
|||||||
if (!m_modelManager)
|
if (!m_modelManager)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Document::Ptr doc = m_modelManager->document(file()->fileName());
|
const Snapshot snapshot = m_modelManager->snapshot();
|
||||||
|
|
||||||
|
Document::Ptr doc = snapshot.value(file()->fileName());
|
||||||
if (!doc)
|
if (!doc)
|
||||||
return;
|
return;
|
||||||
Symbol *lastSymbol = doc->findSymbolAt(line, column);
|
Symbol *lastSymbol = doc->findSymbolAt(line, column);
|
||||||
@@ -445,7 +447,7 @@ void CPPEditor::switchDeclarationDefinition()
|
|||||||
|
|
||||||
if (f) {
|
if (f) {
|
||||||
TypeOfExpression typeOfExpression;
|
TypeOfExpression typeOfExpression;
|
||||||
typeOfExpression.setDocuments(m_modelManager->documents());
|
typeOfExpression.setSnapshot(m_modelManager->snapshot());
|
||||||
QList<TypeOfExpression::Result> resolvedSymbols = typeOfExpression(QString(), doc, lastSymbol);
|
QList<TypeOfExpression::Result> resolvedSymbols = typeOfExpression(QString(), doc, lastSymbol);
|
||||||
const LookupContext &context = typeOfExpression.lookupContext();
|
const LookupContext &context = typeOfExpression.lookupContext();
|
||||||
|
|
||||||
@@ -474,26 +476,38 @@ void CPPEditor::jumpToDefinition()
|
|||||||
if (!m_modelManager)
|
if (!m_modelManager)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
const Snapshot snapshot = m_modelManager->snapshot();
|
||||||
|
|
||||||
// Find the last symbol up to the cursor position
|
// Find the last symbol up to the cursor position
|
||||||
int line = 0, column = 0;
|
int line = 0, column = 0;
|
||||||
convertPosition(position(), &line, &column);
|
convertPosition(position(), &line, &column);
|
||||||
Document::Ptr doc = m_modelManager->document(file()->fileName());
|
Document::Ptr doc = snapshot.value(file()->fileName());
|
||||||
if (!doc)
|
if (!doc)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
QTextCursor tc = textCursor();
|
||||||
|
unsigned lineno = tc.blockNumber() + 1;
|
||||||
|
foreach (const Document::Include &incl, doc->includes()) {
|
||||||
|
if (incl.line() == lineno) {
|
||||||
|
if (openCppEditorAt(incl.fileName(), 0, 0))
|
||||||
|
return; // done
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Symbol *lastSymbol = doc->findSymbolAt(line, column);
|
Symbol *lastSymbol = doc->findSymbolAt(line, column);
|
||||||
if (!lastSymbol)
|
if (!lastSymbol)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Get the expression under the cursor
|
// Get the expression under the cursor
|
||||||
const int endOfName = endOfNameUnderCursor();
|
const int endOfName = endOfNameUnderCursor();
|
||||||
QTextCursor tc = textCursor();
|
|
||||||
tc.setPosition(endOfName);
|
tc.setPosition(endOfName);
|
||||||
ExpressionUnderCursor expressionUnderCursor;
|
ExpressionUnderCursor expressionUnderCursor;
|
||||||
const QString expression = expressionUnderCursor(tc);
|
const QString expression = expressionUnderCursor(tc);
|
||||||
|
|
||||||
// Evaluate the type of the expression
|
// Evaluate the type of the expression
|
||||||
TypeOfExpression typeOfExpression;
|
TypeOfExpression typeOfExpression;
|
||||||
typeOfExpression.setDocuments(m_modelManager->documents());
|
typeOfExpression.setSnapshot(m_modelManager->snapshot());
|
||||||
QList<TypeOfExpression::Result> resolvedSymbols =
|
QList<TypeOfExpression::Result> resolvedSymbols =
|
||||||
typeOfExpression(expression, doc, lastSymbol);
|
typeOfExpression(expression, doc, lastSymbol);
|
||||||
|
|
||||||
@@ -515,7 +529,7 @@ void CPPEditor::jumpToDefinition()
|
|||||||
QList<Symbol *> candidates = context.resolve(namedType->name());
|
QList<Symbol *> candidates = context.resolve(namedType->name());
|
||||||
if (!candidates.isEmpty()) {
|
if (!candidates.isEmpty()) {
|
||||||
Symbol *s = candidates.takeFirst();
|
Symbol *s = candidates.takeFirst();
|
||||||
openEditorAt(s->fileName(), s->line(), s->column());
|
openCppEditorAt(s->fileName(), s->line(), s->column());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -524,7 +538,7 @@ void CPPEditor::jumpToDefinition()
|
|||||||
if (use.contains(endOfName - 1)) {
|
if (use.contains(endOfName - 1)) {
|
||||||
const Macro ¯o = use.macro();
|
const Macro ¯o = use.macro();
|
||||||
const QString fileName = QString::fromUtf8(macro.fileName);
|
const QString fileName = QString::fromUtf8(macro.fileName);
|
||||||
if (TextEditor::BaseTextEditor::openEditorAt(fileName, macro.line, 0))
|
if (openCppEditorAt(fileName, macro.line, 0))
|
||||||
return; // done
|
return; // done
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -562,7 +576,7 @@ Symbol *CPPEditor::findDefinition(Symbol *lastSymbol)
|
|||||||
QualifiedNameId *q = control.qualifiedNameId(&qualifiedName[0], qualifiedName.size());
|
QualifiedNameId *q = control.qualifiedNameId(&qualifiedName[0], qualifiedName.size());
|
||||||
LookupContext context(&control);
|
LookupContext context(&control);
|
||||||
|
|
||||||
const QMap<QString, Document::Ptr> documents = m_modelManager->documents();
|
const Snapshot documents = m_modelManager->snapshot();
|
||||||
foreach (Document::Ptr doc, documents) {
|
foreach (Document::Ptr doc, documents) {
|
||||||
QList<Scope *> visibleScopes;
|
QList<Scope *> visibleScopes;
|
||||||
visibleScopes.append(doc->globalSymbols());
|
visibleScopes.append(doc->globalSymbols());
|
||||||
@@ -734,7 +748,8 @@ void CPPEditor::unCommentSelection()
|
|||||||
|
|
||||||
QString endText = endBlock.text();
|
QString endText = endBlock.text();
|
||||||
int endPos = end - endBlock.position();
|
int endPos = end - endBlock.position();
|
||||||
bool hasTrailingCharacters = !endText.mid(endPos).trimmed().isEmpty();
|
bool hasTrailingCharacters = !endText.left(endPos).remove(QLatin1String("//")).trimmed().isEmpty()
|
||||||
|
&& !endText.mid(endPos).trimmed().isEmpty();
|
||||||
if ((endPos <= endText.length() - 2
|
if ((endPos <= endText.length() - 2
|
||||||
&& endText.at(endPos) == QLatin1Char('*')
|
&& endText.at(endPos) == QLatin1Char('*')
|
||||||
&& endText.at(endPos+1) == QLatin1Char('/'))) {
|
&& endText.at(endPos+1) == QLatin1Char('/'))) {
|
||||||
@@ -826,8 +841,15 @@ int CPPEditor::endOfNameUnderCursor()
|
|||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TextEditor::ITextEditor *CPPEditor::openCppEditorAt(const QString &fileName,
|
||||||
|
int line, int column)
|
||||||
|
{
|
||||||
|
return TextEditor::BaseTextEditor::openEditorAt(fileName, line, column,
|
||||||
|
Constants::C_CPPEDITOR);
|
||||||
|
}
|
||||||
|
|
||||||
bool CPPEditor::openEditorAt(Symbol *s)
|
bool CPPEditor::openEditorAt(Symbol *s)
|
||||||
{
|
{
|
||||||
const QString fileName = QString::fromUtf8(s->fileName(), s->fileNameLength());
|
const QString fileName = QString::fromUtf8(s->fileName(), s->fileNameLength());
|
||||||
return TextEditor::BaseTextEditor::openEditorAt(fileName, s->line(), s->column());
|
return openCppEditorAt(fileName, s->line(), s->column());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,6 +123,9 @@ private:
|
|||||||
CPlusPlus::Symbol *findDefinition(CPlusPlus::Symbol *symbol);
|
CPlusPlus::Symbol *findDefinition(CPlusPlus::Symbol *symbol);
|
||||||
virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar);
|
virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar);
|
||||||
|
|
||||||
|
TextEditor::ITextEditor *openCppEditorAt(const QString &fileName, int line,
|
||||||
|
int column = 0);
|
||||||
|
|
||||||
int previousBlockState(QTextBlock block) const;
|
int previousBlockState(QTextBlock block) const;
|
||||||
QTextCursor moveToPreviousToken(QTextCursor::MoveMode mode) const;
|
QTextCursor moveToPreviousToken(QTextCursor::MoveMode mode) const;
|
||||||
QTextCursor moveToNextToken(QTextCursor::MoveMode mode) const;
|
QTextCursor moveToNextToken(QTextCursor::MoveMode mode) const;
|
||||||
|
|||||||
@@ -434,12 +434,15 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
|
|||||||
//if (! expression.isEmpty())
|
//if (! expression.isEmpty())
|
||||||
//qDebug() << "***** expression:" << expression;
|
//qDebug() << "***** expression:" << expression;
|
||||||
|
|
||||||
if (Document::Ptr thisDocument = m_manager->document(fileName)) {
|
const Snapshot snapshot = m_manager->snapshot();
|
||||||
|
|
||||||
|
if (Document::Ptr thisDocument = snapshot.value(fileName)) {
|
||||||
Symbol *symbol = thisDocument->findSymbolAt(line, column);
|
Symbol *symbol = thisDocument->findSymbolAt(line, column);
|
||||||
|
|
||||||
typeOfExpression.setDocuments(m_manager->documents());
|
typeOfExpression.setSnapshot(m_manager->snapshot());
|
||||||
|
|
||||||
QList<TypeOfExpression::Result> resolvedTypes = typeOfExpression(expression, thisDocument, symbol);
|
QList<TypeOfExpression::Result> resolvedTypes = typeOfExpression(expression, thisDocument, symbol,
|
||||||
|
TypeOfExpression::Preprocess);
|
||||||
LookupContext context = typeOfExpression.lookupContext();
|
LookupContext context = typeOfExpression.lookupContext();
|
||||||
|
|
||||||
if (!typeOfExpression.expressionAST() && (! m_completionOperator ||
|
if (!typeOfExpression.expressionAST() && (! m_completionOperator ||
|
||||||
@@ -963,8 +966,10 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item)
|
|||||||
if (Function *function = symbol->type()->asFunction()) {
|
if (Function *function = symbol->type()->asFunction()) {
|
||||||
// If the member is a function, automatically place the opening parenthesis,
|
// If the member is a function, automatically place the opening parenthesis,
|
||||||
// except when it might take template parameters.
|
// except when it might take template parameters.
|
||||||
if (!function->returnType().isValid()
|
const bool hasReturnType = function->returnType().isValid() ||
|
||||||
&& (function->identity() && !function->identity()->isDestructorNameId())) {
|
function->returnType().isSigned() ||
|
||||||
|
function->returnType().isUnsigned();
|
||||||
|
if (! hasReturnType && (function->identity() && !function->identity()->isDestructorNameId())) {
|
||||||
// Don't insert any magic, since the user might have just wanted to select the class
|
// Don't insert any magic, since the user might have just wanted to select the class
|
||||||
|
|
||||||
} else if (function->templateParameterCount() != 0) {
|
} else if (function->templateParameterCount() != 0) {
|
||||||
@@ -1033,7 +1038,7 @@ void CppCodeCompletion::cleanup()
|
|||||||
|
|
||||||
// Set empty map in order to avoid referencing old versions of the documents
|
// Set empty map in order to avoid referencing old versions of the documents
|
||||||
// until the next completion
|
// until the next completion
|
||||||
typeOfExpression.setDocuments(QMap<QString, Document::Ptr>());
|
typeOfExpression.setSnapshot(Snapshot());
|
||||||
}
|
}
|
||||||
|
|
||||||
int CppCodeCompletion::findStartOfName(const TextEditor::ITextEditor *editor)
|
int CppCodeCompletion::findStartOfName(const TextEditor::ITextEditor *editor)
|
||||||
|
|||||||
@@ -165,9 +165,11 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
|
|||||||
QTextCursor tc(edit->document());
|
QTextCursor tc(edit->document());
|
||||||
tc.setPosition(pos);
|
tc.setPosition(pos);
|
||||||
|
|
||||||
|
const Snapshot documents = m_manager->snapshot();
|
||||||
|
|
||||||
const int lineNumber = tc.block().blockNumber() + 1;
|
const int lineNumber = tc.block().blockNumber() + 1;
|
||||||
const QString fileName = editor->file()->fileName();
|
const QString fileName = editor->file()->fileName();
|
||||||
Document::Ptr doc = m_manager->document(fileName);
|
Document::Ptr doc = documents.value(fileName);
|
||||||
if (doc) {
|
if (doc) {
|
||||||
foreach (Document::DiagnosticMessage m, doc->diagnosticMessages()) {
|
foreach (Document::DiagnosticMessage m, doc->diagnosticMessages()) {
|
||||||
if (m.line() == lineNumber) {
|
if (m.line() == lineNumber) {
|
||||||
@@ -177,6 +179,16 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_toolTip.isEmpty()) {
|
||||||
|
unsigned lineno = tc.blockNumber() + 1;
|
||||||
|
foreach (const Document::Include &incl, doc->includes()) {
|
||||||
|
if (lineno == incl.line()) {
|
||||||
|
m_toolTip = incl.fileName();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (m_toolTip.isEmpty()) {
|
if (m_toolTip.isEmpty()) {
|
||||||
// Move to the end of a qualified name
|
// Move to the end of a qualified name
|
||||||
bool stop = false;
|
bool stop = false;
|
||||||
@@ -202,7 +214,7 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
|
|||||||
Symbol *lastSymbol = doc->findSymbolAt(line, column);
|
Symbol *lastSymbol = doc->findSymbolAt(line, column);
|
||||||
|
|
||||||
TypeOfExpression typeOfExpression;
|
TypeOfExpression typeOfExpression;
|
||||||
typeOfExpression.setDocuments(m_manager->documents());
|
typeOfExpression.setSnapshot(documents);
|
||||||
QList<TypeOfExpression::Result> types = typeOfExpression(expression, doc, lastSymbol);
|
QList<TypeOfExpression::Result> types = typeOfExpression(expression, doc, lastSymbol);
|
||||||
|
|
||||||
if (!types.isEmpty()) {
|
if (!types.isEmpty()) {
|
||||||
|
|||||||
@@ -138,11 +138,12 @@ protected:
|
|||||||
virtual void stopExpandingMacro(unsigned offset, const Macro ¯o);
|
virtual void stopExpandingMacro(unsigned offset, const Macro ¯o);
|
||||||
virtual void startSkippingBlocks(unsigned offset);
|
virtual void startSkippingBlocks(unsigned offset);
|
||||||
virtual void stopSkippingBlocks(unsigned offset);
|
virtual void stopSkippingBlocks(unsigned offset);
|
||||||
virtual void sourceNeeded(QString &fileName, IncludeType type);
|
virtual void sourceNeeded(QString &fileName, IncludeType type,
|
||||||
|
unsigned line);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QPointer<CppModelManager> m_modelManager;
|
QPointer<CppModelManager> m_modelManager;
|
||||||
CppModelManager::DocumentTable m_documents;
|
Snapshot m_snapshot;
|
||||||
Environment env;
|
Environment env;
|
||||||
pp m_proc;
|
pp m_proc;
|
||||||
QStringList m_includePaths;
|
QStringList m_includePaths;
|
||||||
@@ -159,7 +160,7 @@ private:
|
|||||||
|
|
||||||
CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager)
|
CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager)
|
||||||
: m_modelManager(modelManager),
|
: m_modelManager(modelManager),
|
||||||
m_documents(modelManager->documents()),
|
m_snapshot(modelManager->snapshot()),
|
||||||
m_proc(this, env)
|
m_proc(this, env)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@@ -176,7 +177,7 @@ void CppPreprocessor::setProjectFiles(const QStringList &files)
|
|||||||
{ m_projectFiles = files; }
|
{ m_projectFiles = files; }
|
||||||
|
|
||||||
void CppPreprocessor::run(QString &fileName)
|
void CppPreprocessor::run(QString &fileName)
|
||||||
{ sourceNeeded(fileName, IncludeGlobal); }
|
{ sourceNeeded(fileName, IncludeGlobal, /*line = */ 0); }
|
||||||
|
|
||||||
void CppPreprocessor::operator()(QString &fileName)
|
void CppPreprocessor::operator()(QString &fileName)
|
||||||
{ run(fileName); }
|
{ run(fileName); }
|
||||||
@@ -339,7 +340,7 @@ void CppPreprocessor::mergeEnvironment(Document::Ptr doc, QSet<QString> *process
|
|||||||
processed->insert(fn);
|
processed->insert(fn);
|
||||||
|
|
||||||
foreach (QString includedFile, doc->includedFiles()) {
|
foreach (QString includedFile, doc->includedFiles()) {
|
||||||
mergeEnvironment(m_documents.value(includedFile), processed);
|
mergeEnvironment(m_snapshot.value(includedFile), processed);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (const Macro macro, doc->definedMacros()) {
|
foreach (const Macro macro, doc->definedMacros()) {
|
||||||
@@ -361,7 +362,8 @@ void CppPreprocessor::stopSkippingBlocks(unsigned offset)
|
|||||||
m_currentDoc->stopSkippingBlocks(offset);
|
m_currentDoc->stopSkippingBlocks(offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type)
|
void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
|
||||||
|
unsigned line)
|
||||||
{
|
{
|
||||||
if (fileName.isEmpty())
|
if (fileName.isEmpty())
|
||||||
return;
|
return;
|
||||||
@@ -369,7 +371,7 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type)
|
|||||||
QByteArray contents = tryIncludeFile(fileName, type);
|
QByteArray contents = tryIncludeFile(fileName, type);
|
||||||
|
|
||||||
if (m_currentDoc) {
|
if (m_currentDoc) {
|
||||||
m_currentDoc->addIncludeFile(fileName);
|
m_currentDoc->addIncludeFile(fileName, line);
|
||||||
if (contents.isEmpty() && ! QFileInfo(fileName).isAbsolute()) {
|
if (contents.isEmpty() && ! QFileInfo(fileName).isAbsolute()) {
|
||||||
QString msg;
|
QString msg;
|
||||||
msg += fileName;
|
msg += fileName;
|
||||||
@@ -384,7 +386,7 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (! contents.isEmpty()) {
|
if (! contents.isEmpty()) {
|
||||||
Document::Ptr cachedDoc = m_documents.value(fileName);
|
Document::Ptr cachedDoc = m_snapshot.value(fileName);
|
||||||
if (cachedDoc && m_currentDoc) {
|
if (cachedDoc && m_currentDoc) {
|
||||||
mergeEnvironment(cachedDoc);
|
mergeEnvironment(cachedDoc);
|
||||||
} else {
|
} else {
|
||||||
@@ -475,11 +477,8 @@ CppModelManager::CppModelManager(QObject *parent) :
|
|||||||
CppModelManager::~CppModelManager()
|
CppModelManager::~CppModelManager()
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
Document::Ptr CppModelManager::document(const QString &fileName) const
|
Snapshot CppModelManager::snapshot() const
|
||||||
{ return m_documents.value(fileName); }
|
{ return m_snapshot; }
|
||||||
|
|
||||||
CppModelManager::DocumentTable CppModelManager::documents() const
|
|
||||||
{ return m_documents; }
|
|
||||||
|
|
||||||
void CppModelManager::ensureUpdated()
|
void CppModelManager::ensureUpdated()
|
||||||
{
|
{
|
||||||
@@ -670,7 +669,7 @@ void CppModelManager::emitDocumentUpdated(Document::Ptr doc)
|
|||||||
void CppModelManager::onDocumentUpdated(Document::Ptr doc)
|
void CppModelManager::onDocumentUpdated(Document::Ptr doc)
|
||||||
{
|
{
|
||||||
const QString fileName = doc->fileName();
|
const QString fileName = doc->fileName();
|
||||||
m_documents[fileName] = doc;
|
m_snapshot[fileName] = doc;
|
||||||
QList<Core::IEditor *> openedEditors = m_core->editorManager()->openedEditors();
|
QList<Core::IEditor *> openedEditors = m_core->editorManager()->openedEditors();
|
||||||
foreach (Core::IEditor *editor, openedEditors) {
|
foreach (Core::IEditor *editor, openedEditors) {
|
||||||
if (editor->file()->fileName() == fileName) {
|
if (editor->file()->fileName() == fileName) {
|
||||||
@@ -835,7 +834,7 @@ void CppModelManager::parse(QFutureInterface<void> &future,
|
|||||||
|
|
||||||
void CppModelManager::GC()
|
void CppModelManager::GC()
|
||||||
{
|
{
|
||||||
DocumentTable documents = m_documents;
|
Snapshot documents = m_snapshot;
|
||||||
|
|
||||||
QSet<QString> processed;
|
QSet<QString> processed;
|
||||||
QStringList todo = projectFiles();
|
QStringList todo = projectFiles();
|
||||||
@@ -866,7 +865,7 @@ void CppModelManager::GC()
|
|||||||
}
|
}
|
||||||
|
|
||||||
emit aboutToRemoveFiles(removedFiles);
|
emit aboutToRemoveFiles(removedFiles);
|
||||||
m_documents = documents;
|
m_snapshot = documents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -76,8 +76,7 @@ public:
|
|||||||
virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
|
virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
|
||||||
virtual void updateProjectInfo(const ProjectInfo &pinfo);
|
virtual void updateProjectInfo(const ProjectInfo &pinfo);
|
||||||
|
|
||||||
virtual CPlusPlus::Document::Ptr document(const QString &fileName) const;
|
virtual CPlusPlus::Snapshot snapshot() const;
|
||||||
virtual DocumentTable documents() const;
|
|
||||||
virtual void GC();
|
virtual void GC();
|
||||||
|
|
||||||
QFuture<void> refreshSourceFiles(const QStringList &sourceFiles);
|
QFuture<void> refreshSourceFiles(const QStringList &sourceFiles);
|
||||||
@@ -146,7 +145,7 @@ private:
|
|||||||
Core::ICore *m_core;
|
Core::ICore *m_core;
|
||||||
ProjectExplorer::ProjectExplorerPlugin *m_projectExplorer;
|
ProjectExplorer::ProjectExplorerPlugin *m_projectExplorer;
|
||||||
CppHoverHandler *m_hoverHandler;
|
CppHoverHandler *m_hoverHandler;
|
||||||
DocumentTable m_documents;
|
CPlusPlus::Snapshot m_snapshot;
|
||||||
|
|
||||||
// cache
|
// cache
|
||||||
bool m_dirty;
|
bool m_dirty;
|
||||||
|
|||||||
@@ -46,14 +46,11 @@ namespace ProjectExplorer {
|
|||||||
|
|
||||||
namespace CppTools {
|
namespace CppTools {
|
||||||
|
|
||||||
class CPPTOOLS_EXPORT CppModelManagerInterface
|
class CPPTOOLS_EXPORT CppModelManagerInterface: public QObject
|
||||||
: public QObject
|
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef QMap<QString, CPlusPlus::Document::Ptr> DocumentTable; // ### remove me
|
|
||||||
|
|
||||||
class ProjectInfo
|
class ProjectInfo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -89,8 +86,7 @@ public:
|
|||||||
virtual void GC() = 0;
|
virtual void GC() = 0;
|
||||||
virtual void updateSourceFiles(const QStringList &sourceFiles) = 0;
|
virtual void updateSourceFiles(const QStringList &sourceFiles) = 0;
|
||||||
|
|
||||||
virtual CPlusPlus::Document::Ptr document(const QString &fileName) const = 0;
|
virtual CPlusPlus::Snapshot snapshot() const = 0;
|
||||||
virtual DocumentTable documents() const = 0;
|
|
||||||
|
|
||||||
virtual QList<ProjectInfo> projectInfos() const = 0;
|
virtual QList<ProjectInfo> projectInfos() const = 0;
|
||||||
virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const = 0;
|
virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const = 0;
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ include(cpptools_dependencies.pri)
|
|||||||
|
|
||||||
# DEFINES += QT_NO_CAST_FROM_ASCII
|
# DEFINES += QT_NO_CAST_FROM_ASCII
|
||||||
DEFINES += QT_NO_CAST_TO_ASCII
|
DEFINES += QT_NO_CAST_TO_ASCII
|
||||||
unix:QMAKE_CXXFLAGS_DEBUG += -O3
|
|
||||||
INCLUDEPATH += .
|
INCLUDEPATH += .
|
||||||
DEFINES += CPPTOOLS_LIBRARY
|
DEFINES += CPPTOOLS_LIBRARY
|
||||||
CONFIG += help
|
CONFIG += help
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
#include <QSet>
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ SOURCES += attachexternaldialog.cpp \
|
|||||||
gdbengine.cpp \
|
gdbengine.cpp \
|
||||||
gdbmi.cpp \
|
gdbmi.cpp \
|
||||||
gdboptionpage.cpp \
|
gdboptionpage.cpp \
|
||||||
gdbtypemacros.cpp \
|
|
||||||
gdbengine.h \
|
gdbengine.h \
|
||||||
moduleshandler.cpp \
|
moduleshandler.cpp \
|
||||||
moduleswindow.cpp \
|
moduleswindow.cpp \
|
||||||
@@ -79,7 +78,6 @@ FORMS += attachexternaldialog.ui \
|
|||||||
breakcondition.ui \
|
breakcondition.ui \
|
||||||
mode.ui \
|
mode.ui \
|
||||||
gdboptionpage.ui \
|
gdboptionpage.ui \
|
||||||
gdbtypemacros.ui \
|
|
||||||
startexternaldialog.ui \
|
startexternaldialog.ui \
|
||||||
|
|
||||||
RESOURCES += debugger.qrc
|
RESOURCES += debugger.qrc
|
||||||
|
|||||||
@@ -1033,7 +1033,6 @@ void DebuggerManager::addToWatchWindow()
|
|||||||
void DebuggerManager::watchExpression(const QString &expression)
|
void DebuggerManager::watchExpression(const QString &expression)
|
||||||
{
|
{
|
||||||
watchHandler()->watchExpression(expression);
|
watchHandler()->watchExpression(expression);
|
||||||
//engine()->updateWatchModel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerManager::setBreakpoint(const QString &fileName, int lineNumber)
|
void DebuggerManager::setBreakpoint(const QString &fileName, int lineNumber)
|
||||||
|
|||||||
@@ -183,7 +183,6 @@ DebuggerPlugin::DebuggerPlugin()
|
|||||||
{
|
{
|
||||||
m_pm = 0;
|
m_pm = 0;
|
||||||
m_generalOptionPage = 0;
|
m_generalOptionPage = 0;
|
||||||
m_typeMacroPage = 0;
|
|
||||||
m_locationMark = 0;
|
m_locationMark = 0;
|
||||||
m_manager = 0;
|
m_manager = 0;
|
||||||
}
|
}
|
||||||
@@ -202,7 +201,6 @@ void DebuggerPlugin::shutdown()
|
|||||||
//qDebug() << "DebuggerPlugin::~DebuggerPlugin";
|
//qDebug() << "DebuggerPlugin::~DebuggerPlugin";
|
||||||
removeObject(m_debugMode);
|
removeObject(m_debugMode);
|
||||||
removeObject(m_generalOptionPage);
|
removeObject(m_generalOptionPage);
|
||||||
removeObject(m_typeMacroPage);
|
|
||||||
|
|
||||||
// FIXME: when using the line below, BreakWindow etc gets deleted twice.
|
// FIXME: when using the line below, BreakWindow etc gets deleted twice.
|
||||||
// so better leak for now...
|
// so better leak for now...
|
||||||
@@ -212,9 +210,6 @@ void DebuggerPlugin::shutdown()
|
|||||||
delete m_generalOptionPage;
|
delete m_generalOptionPage;
|
||||||
m_generalOptionPage = 0;
|
m_generalOptionPage = 0;
|
||||||
|
|
||||||
delete m_typeMacroPage;
|
|
||||||
m_typeMacroPage = 0;
|
|
||||||
|
|
||||||
delete m_locationMark;
|
delete m_locationMark;
|
||||||
m_locationMark = 0;
|
m_locationMark = 0;
|
||||||
|
|
||||||
@@ -409,13 +404,10 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *error_mes
|
|||||||
mdebug->addAction(cmd);
|
mdebug->addAction(cmd);
|
||||||
|
|
||||||
m_generalOptionPage = 0;
|
m_generalOptionPage = 0;
|
||||||
m_typeMacroPage = 0;
|
|
||||||
|
|
||||||
// FIXME:
|
// FIXME:
|
||||||
m_generalOptionPage = new GdbOptionPage(&theGdbSettings());
|
m_generalOptionPage = new GdbOptionPage(&theGdbSettings());
|
||||||
addObject(m_generalOptionPage);
|
addObject(m_generalOptionPage);
|
||||||
m_typeMacroPage = new TypeMacroPage(&theGdbSettings());
|
|
||||||
addObject(m_typeMacroPage);
|
|
||||||
|
|
||||||
m_locationMark = 0;
|
m_locationMark = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ namespace Internal {
|
|||||||
class DebuggerManager;
|
class DebuggerManager;
|
||||||
class DebugMode;
|
class DebugMode;
|
||||||
class GdbOptionPage;
|
class GdbOptionPage;
|
||||||
class TypeMacroPage;
|
|
||||||
class LocationMark;
|
class LocationMark;
|
||||||
|
|
||||||
class DebuggerPlugin : public ExtensionSystem::IPlugin
|
class DebuggerPlugin : public ExtensionSystem::IPlugin
|
||||||
@@ -103,7 +102,6 @@ private:
|
|||||||
|
|
||||||
ExtensionSystem::PluginManager *m_pm;
|
ExtensionSystem::PluginManager *m_pm;
|
||||||
GdbOptionPage *m_generalOptionPage;
|
GdbOptionPage *m_generalOptionPage;
|
||||||
TypeMacroPage *m_typeMacroPage;
|
|
||||||
|
|
||||||
QString m_previousMode;
|
QString m_previousMode;
|
||||||
LocationMark *m_locationMark;
|
LocationMark *m_locationMark;
|
||||||
|
|||||||
@@ -2939,6 +2939,8 @@ bool GdbEngine::isCustomValueDumperAvailable(const QString &type) const
|
|||||||
if (tmplate == "QSet")
|
if (tmplate == "QSet")
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (tmplate == "std::list")
|
||||||
|
return true;
|
||||||
if (tmplate == "std::vector" && inner != "bool")
|
if (tmplate == "std::vector" && inner != "bool")
|
||||||
return true;
|
return true;
|
||||||
if (tmplate == "std::basic_string") {
|
if (tmplate == "std::basic_string") {
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ enum DataDumperState
|
|||||||
DataDumperUnavailable,
|
DataDumperUnavailable,
|
||||||
};
|
};
|
||||||
|
|
||||||
// FIXME: Move to extra file?
|
|
||||||
class GdbSettings
|
class GdbSettings
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -58,7 +58,11 @@ GdbOptionPage::GdbOptionPage(GdbSettings *settings)
|
|||||||
#if defined(Q_OS_WIN32)
|
#if defined(Q_OS_WIN32)
|
||||||
defaultCommand.append(".exe");
|
defaultCommand.append(".exe");
|
||||||
#endif
|
#endif
|
||||||
|
QString defaultScript = coreIFace->resourcePath() +
|
||||||
|
QLatin1String("/gdb/qt4macros");
|
||||||
|
|
||||||
m_settings->m_gdbCmd = s->value("Location", defaultCommand).toString();
|
m_settings->m_gdbCmd = s->value("Location", defaultCommand).toString();
|
||||||
|
m_settings->m_scriptFile= s->value("ScriptFile", defaultScript).toString();
|
||||||
m_settings->m_gdbEnv = s->value("Environment", "").toString();
|
m_settings->m_gdbEnv = s->value("Environment", "").toString();
|
||||||
m_settings->m_autoRun = s->value("AutoRun", true).toBool();
|
m_settings->m_autoRun = s->value("AutoRun", true).toBool();
|
||||||
m_settings->m_autoQuit = s->value("AutoQuit", true).toBool();
|
m_settings->m_autoQuit = s->value("AutoQuit", true).toBool();
|
||||||
@@ -72,36 +76,50 @@ QString GdbOptionPage::name() const
|
|||||||
|
|
||||||
QString GdbOptionPage::category() const
|
QString GdbOptionPage::category() const
|
||||||
{
|
{
|
||||||
return "Debugger|Gdb";
|
return "Debugger";
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GdbOptionPage::trCategory() const
|
QString GdbOptionPage::trCategory() const
|
||||||
{
|
{
|
||||||
return tr("Debugger|Gdb");
|
return tr("Debugger");
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget *GdbOptionPage::createPage(QWidget *parent)
|
QWidget *GdbOptionPage::createPage(QWidget *parent)
|
||||||
{
|
{
|
||||||
QWidget *w = new QWidget(parent);
|
QWidget *w = new QWidget(parent);
|
||||||
m_ui.setupUi(w);
|
m_ui.setupUi(w);
|
||||||
m_ui.gdbEdit->setText(m_settings->m_gdbCmd);
|
m_ui.gdbLocationChooser->setExpectedKind(Core::Utils::PathChooser::Command);
|
||||||
m_ui.envEdit->setText(m_settings->m_gdbEnv);
|
m_ui.gdbLocationChooser->setPromptDialogTitle(tr("Choose Gdb Location"));
|
||||||
|
m_ui.gdbLocationChooser->setPath(m_settings->m_gdbCmd);
|
||||||
|
m_ui.scriptFileChooser->setExpectedKind(Core::Utils::PathChooser::File);
|
||||||
|
m_ui.scriptFileChooser->setPromptDialogTitle(tr("Choose Location of Startup Script File"));
|
||||||
|
m_ui.scriptFileChooser->setPath(m_settings->m_scriptFile);
|
||||||
|
m_ui.environmentEdit->setText(m_settings->m_gdbEnv);
|
||||||
m_ui.autoStartBox->setChecked(m_settings->m_autoRun);
|
m_ui.autoStartBox->setChecked(m_settings->m_autoRun);
|
||||||
m_ui.autoQuitBox->setChecked(m_settings->m_autoQuit);
|
m_ui.autoQuitBox->setChecked(m_settings->m_autoQuit);
|
||||||
connect(m_ui.pushButtonBrowse, SIGNAL(clicked()),
|
|
||||||
this, SLOT(browse()));
|
// FIXME
|
||||||
|
m_ui.autoStartBox->hide();
|
||||||
|
m_ui.autoQuitBox->hide();
|
||||||
|
m_ui.environmentEdit->hide();
|
||||||
|
m_ui.labelEnvironment->hide();
|
||||||
|
|
||||||
|
connect(m_ui.gdbLocationChooser, SIGNAL(changed()),
|
||||||
|
this, SLOT(onGdbLocationChanged()));
|
||||||
|
connect(m_ui.scriptFileChooser, SIGNAL(changed()),
|
||||||
|
this, SLOT(onScriptFileChanged()));
|
||||||
|
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GdbOptionPage::browse()
|
void GdbOptionPage::onGdbLocationChanged()
|
||||||
{
|
{
|
||||||
QString fileName = QFileDialog::getOpenFileName(m_ui.pushButtonBrowse,
|
m_settings->m_gdbCmd = m_ui.gdbLocationChooser->path();
|
||||||
"Browse for gdb executable");
|
}
|
||||||
if (fileName.isEmpty())
|
|
||||||
return;
|
void GdbOptionPage::onScriptFileChanged()
|
||||||
m_settings->m_gdbCmd = fileName;
|
{
|
||||||
m_ui.gdbEdit->setText(fileName);
|
m_settings->m_scriptFile = m_ui.scriptFileChooser->path();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GdbOptionPage::finished(bool accepted)
|
void GdbOptionPage::finished(bool accepted)
|
||||||
@@ -109,10 +127,11 @@ void GdbOptionPage::finished(bool accepted)
|
|||||||
if (!accepted)
|
if (!accepted)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_settings->m_gdbCmd = m_ui.gdbEdit->text();
|
m_settings->m_gdbCmd = m_ui.gdbLocationChooser->path();
|
||||||
m_settings->m_gdbEnv = m_ui.envEdit->text();
|
m_settings->m_gdbEnv = m_ui.environmentEdit->text();
|
||||||
m_settings->m_autoRun = m_ui.autoStartBox->isChecked();
|
m_settings->m_autoRun = m_ui.autoStartBox->isChecked();
|
||||||
m_settings->m_autoQuit = m_ui.autoQuitBox->isChecked();
|
m_settings->m_autoQuit = m_ui.autoQuitBox->isChecked();
|
||||||
|
m_settings->m_scriptFile = m_ui.scriptFileChooser->path();
|
||||||
|
|
||||||
Core::ICore *coreIFace = m_pm->getObject<Core::ICore>();
|
Core::ICore *coreIFace = m_pm->getObject<Core::ICore>();
|
||||||
if (!coreIFace || !coreIFace->settings())
|
if (!coreIFace || !coreIFace->settings())
|
||||||
|
|||||||
@@ -35,7 +35,6 @@
|
|||||||
#define GDBOPTIONPAGE_H
|
#define GDBOPTIONPAGE_H
|
||||||
|
|
||||||
#include "ui_gdboptionpage.h"
|
#include "ui_gdboptionpage.h"
|
||||||
#include "ui_gdbtypemacros.h"
|
|
||||||
|
|
||||||
#include <coreplugin/dialogs/ioptionspage.h>
|
#include <coreplugin/dialogs/ioptionspage.h>
|
||||||
|
|
||||||
@@ -63,7 +62,8 @@ public:
|
|||||||
void finished(bool accepted);
|
void finished(bool accepted);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void browse();
|
void onGdbLocationChanged();
|
||||||
|
void onScriptFileChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ExtensionSystem::PluginManager *m_pm;
|
ExtensionSystem::PluginManager *m_pm;
|
||||||
@@ -72,6 +72,7 @@ private:
|
|||||||
GdbSettings *m_settings;
|
GdbSettings *m_settings;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if 0
|
||||||
class TypeMacroPage : public Core::IOptionsPage
|
class TypeMacroPage : public Core::IOptionsPage
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -87,7 +88,6 @@ public:
|
|||||||
void finished(bool accepted);
|
void finished(bool accepted);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onScriptButton();
|
|
||||||
void onAddButton();
|
void onAddButton();
|
||||||
void onDelButton();
|
void onDelButton();
|
||||||
void currentItemChanged(QTreeWidgetItem *item);
|
void currentItemChanged(QTreeWidgetItem *item);
|
||||||
@@ -100,6 +100,7 @@ private:
|
|||||||
GdbSettings *m_settings;
|
GdbSettings *m_settings;
|
||||||
QWidget *m_widget;
|
QWidget *m_widget;
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace Debugger
|
} // namespace Debugger
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>433</width>
|
<width>433</width>
|
||||||
<height>216</height>
|
<height>233</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox">
|
<widget class="QGroupBox" name="groupBox">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Gdb Debug Options</string>
|
<string>Locations</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout">
|
<layout class="QGridLayout">
|
||||||
<property name="margin">
|
<property name="margin">
|
||||||
@@ -32,46 +32,45 @@
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="0" column="1">
|
<item row="1" column="1">
|
||||||
<widget class="QLineEdit" name="gdbEdit"/>
|
<widget class="QLineEdit" name="environmentEdit"/>
|
||||||
</item>
|
|
||||||
<item row="1" column="1" colspan="2">
|
|
||||||
<widget class="QLineEdit" name="envEdit"/>
|
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="label">
|
<widget class="QLabel" name="labelGdbLocaltion">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>This is either a full abolute path leading to the gdb binary you intend to use or the name of a gdb binary that wiull be searched in your PATH.</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Gdb Location:</string>
|
<string>Gdb Location:</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="buddy">
|
|
||||||
<cstring>gdbEdit</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="labelEnvironment">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Environment:</string>
|
<string>Environment:</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="buddy">
|
<property name="buddy">
|
||||||
<cstring>envEdit</cstring>
|
<cstring>environmentEdit</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="2">
|
<item row="2" column="0">
|
||||||
<widget class="QPushButton" name="pushButtonBrowse">
|
<widget class="QLabel" name="labelGdbStartupScript">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>This is either empty or points to a file containing gdb commands that will be executed immediately after gdb starts up.</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string>Gdb Startup Script:</string>
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../coreplugin/core.qrc">
|
|
||||||
<normaloff>:/qworkbench/images/fileopen.png</normaloff>:/qworkbench/images/fileopen.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="Core::Utils::PathChooser" name="scriptFileChooser" native="true"/>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="Core::Utils::PathChooser" name="gdbLocationChooser" native="true"/>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -104,6 +103,14 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>Core::Utils::PathChooser</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header location="global">utils/pathchooser.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../coreplugin/core.qrc"/>
|
<include location="../coreplugin/core.qrc"/>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -109,6 +109,8 @@ QWidget *TypeMacroPage::createPage(QWidget *parent)
|
|||||||
|
|
||||||
m_widget = new QWidget(parent);
|
m_widget = new QWidget(parent);
|
||||||
m_ui.setupUi(m_widget);
|
m_ui.setupUi(m_widget);
|
||||||
|
m_ui.scriptFile->setPromptDialogTitle(tr("Select Gdb Script"));
|
||||||
|
m_ui.scriptFile->setExpectedKind(Core::Utils::PathChooser::File);
|
||||||
|
|
||||||
connect(m_ui.addButton, SIGNAL(clicked()),
|
connect(m_ui.addButton, SIGNAL(clicked()),
|
||||||
this, SLOT(onAddButton()));
|
this, SLOT(onAddButton()));
|
||||||
@@ -116,8 +118,8 @@ QWidget *TypeMacroPage::createPage(QWidget *parent)
|
|||||||
connect(m_ui.delButton, SIGNAL(clicked()),
|
connect(m_ui.delButton, SIGNAL(clicked()),
|
||||||
this, SLOT(onDelButton()));
|
this, SLOT(onDelButton()));
|
||||||
|
|
||||||
connect(m_ui.scriptButton, SIGNAL(clicked()),
|
connect(m_ui.scriptFile, SIGNAL(validChanged()),
|
||||||
this, SLOT(onScriptButton()));
|
this, SLOT(updateButtonState()));
|
||||||
|
|
||||||
connect(m_ui.treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
|
connect(m_ui.treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
|
||||||
this, SLOT(currentItemChanged(QTreeWidgetItem *)));
|
this, SLOT(currentItemChanged(QTreeWidgetItem *)));
|
||||||
@@ -139,7 +141,7 @@ QWidget *TypeMacroPage::createPage(QWidget *parent)
|
|||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_ui.scriptEdit->setText(m_settings->m_scriptFile);
|
m_ui.scriptFile->setPath(m_settings->m_scriptFile);
|
||||||
|
|
||||||
updateButtonState();
|
updateButtonState();
|
||||||
|
|
||||||
@@ -152,7 +154,7 @@ void TypeMacroPage::finished(bool accepted)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
m_settings->m_typeMacros.clear();
|
m_settings->m_typeMacros.clear();
|
||||||
m_settings->m_scriptFile = m_ui.scriptEdit->text();
|
m_settings->m_scriptFile = m_ui.scriptFile->path();
|
||||||
|
|
||||||
for (int i = 0; i < m_ui.treeWidget->topLevelItemCount(); ++i) {
|
for (int i = 0; i < m_ui.treeWidget->topLevelItemCount(); ++i) {
|
||||||
QTreeWidgetItem *item = m_ui.treeWidget->topLevelItem(i);
|
QTreeWidgetItem *item = m_ui.treeWidget->topLevelItem(i);
|
||||||
@@ -172,13 +174,6 @@ void TypeMacroPage::finished(bool accepted)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TypeMacroPage::onScriptButton()
|
|
||||||
{
|
|
||||||
QString fileName = QFileDialog::getOpenFileName(m_widget, tr("Select Gdb Script"));
|
|
||||||
m_ui.scriptEdit->setText(fileName);
|
|
||||||
updateButtonState();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TypeMacroPage::onAddButton()
|
void TypeMacroPage::onAddButton()
|
||||||
{
|
{
|
||||||
if (m_ui.typeEdit->text().isEmpty() || m_ui.macroEdit->text().isEmpty())
|
if (m_ui.typeEdit->text().isEmpty() || m_ui.macroEdit->text().isEmpty())
|
||||||
|
|||||||
@@ -1,146 +1,115 @@
|
|||||||
<ui version="4.0" >
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<author></author>
|
<ui version="4.0">
|
||||||
<comment></comment>
|
|
||||||
<exportmacro></exportmacro>
|
|
||||||
<class>TypeMacroPage</class>
|
<class>TypeMacroPage</class>
|
||||||
<widget class="QWidget" name="TypeMacroPage" >
|
<widget class="QWidget" name="TypeMacroPage">
|
||||||
<property name="geometry" >
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>519</width>
|
<width>519</width>
|
||||||
<height>238</height>
|
<height>263</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle" >
|
<property name="windowTitle">
|
||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout">
|
||||||
<property name="margin" >
|
<property name="spacing">
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="spacing" >
|
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>9</number>
|
||||||
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox" >
|
<layout class="QGridLayout">
|
||||||
<property name="title" >
|
<property name="margin">
|
||||||
<string>Script File</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QHBoxLayout" >
|
|
||||||
<property name="margin" >
|
|
||||||
<number>9</number>
|
|
||||||
</property>
|
|
||||||
<property name="spacing" >
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="scriptEdit" />
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="scriptButton" >
|
|
||||||
<property name="minimumSize" >
|
|
||||||
<size>
|
|
||||||
<width>21</width>
|
|
||||||
<height>23</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text" >
|
|
||||||
<string>...</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QGridLayout" >
|
|
||||||
<property name="margin" >
|
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="0" column="0" colspan="2" >
|
<item row="0" column="0" colspan="2">
|
||||||
<widget class="QTreeWidget" name="treeWidget" >
|
<widget class="QTreeWidget" name="treeWidget">
|
||||||
<property name="rootIsDecorated" >
|
<property name="rootIsDecorated">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<column>
|
<column>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Type</string>
|
<string>Type</string>
|
||||||
</property>
|
</property>
|
||||||
</column>
|
</column>
|
||||||
<column>
|
<column>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Macro</string>
|
<string>Macro</string>
|
||||||
</property>
|
</property>
|
||||||
</column>
|
</column>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="2" >
|
<item row="1" column="2">
|
||||||
<widget class="QToolButton" name="addButton" >
|
<widget class="QToolButton" name="addButton">
|
||||||
<property name="minimumSize" >
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>21</width>
|
<width>21</width>
|
||||||
<height>23</height>
|
<height>23</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>+</string>
|
<string>+</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="gdbdebugger.qrc" >:/gdbdebugger/images/newitem.png</iconset>
|
<iconset>
|
||||||
|
<normaloff>:/gdbdebugger/images/newitem.png</normaloff>:/gdbdebugger/images/newitem.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0" >
|
<item row="2" column="0">
|
||||||
<widget class="QLabel" name="label_2" >
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Macro Name:</string>
|
<string>Macro Name:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0" >
|
<item row="3" column="0">
|
||||||
<widget class="QLabel" name="label_3" >
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Parse as:</string>
|
<string>Parse as:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1" >
|
<item row="2" column="1">
|
||||||
<widget class="QLineEdit" name="macroEdit" />
|
<widget class="QLineEdit" name="macroEdit"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="2" >
|
<item row="0" column="2">
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout">
|
||||||
<property name="margin" >
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="spacing" >
|
<property name="margin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="delButton" >
|
<widget class="QToolButton" name="delButton">
|
||||||
<property name="minimumSize" >
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>21</width>
|
<width>21</width>
|
||||||
<height>23</height>
|
<height>23</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>-</string>
|
<string>-</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="gdbdebugger.qrc" >:/gdbdebugger/images/delete.png</iconset>
|
<iconset>
|
||||||
|
<normaloff>:/gdbdebugger/images/delete.png</normaloff>:/gdbdebugger/images/delete.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation" >
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" >
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>40</height>
|
<height>40</height>
|
||||||
@@ -150,25 +119,25 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1" >
|
<item row="1" column="1">
|
||||||
<widget class="QLineEdit" name="typeEdit" />
|
<widget class="QLineEdit" name="typeEdit"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0" >
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="label" >
|
<widget class="QLabel" name="label">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Type:</string>
|
<string>Type:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1" >
|
<item row="3" column="1">
|
||||||
<widget class="QComboBox" name="parseAsBox" >
|
<widget class="QComboBox" name="parseAsBox">
|
||||||
<item>
|
<item>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>ASCII (char *)</string>
|
<string>ASCII (char *)</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Unicode (short)</string>
|
<string>Unicode (short)</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
@@ -178,9 +147,8 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<pixmapfunction></pixmapfunction>
|
|
||||||
<resources>
|
<resources>
|
||||||
<include location="gdbdebugger.qrc" />
|
<include location="gdbdebugger.qrc"/>
|
||||||
</resources>
|
</resources>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|||||||
@@ -402,18 +402,41 @@ bool WatchHandler::setData(const QModelIndex &idx,
|
|||||||
static QString niceType(QString type)
|
static QString niceType(QString type)
|
||||||
{
|
{
|
||||||
if (type.contains("std::")) {
|
if (type.contains("std::")) {
|
||||||
static QRegExp re("std::vector<(.*)\\s*,std::allocator<(.*)>\\s*>");
|
// std::string
|
||||||
re.setMinimal(true);
|
|
||||||
|
|
||||||
type.replace("std::basic_string<char, std::char_traits<char>, "
|
type.replace("std::basic_string<char, std::char_traits<char>, "
|
||||||
"std::allocator<char> >", "std::string");
|
"std::allocator<char> >", "std::string");
|
||||||
|
|
||||||
|
// std::wstring
|
||||||
type.replace("std::basic_string<wchar_t, std::char_traits<wchar_t>, "
|
type.replace("std::basic_string<wchar_t, std::char_traits<wchar_t>, "
|
||||||
"std::allocator<wchar_t> >", "std::wstring");
|
"std::allocator<wchar_t> >", "std::wstring");
|
||||||
|
|
||||||
|
// std::vector
|
||||||
|
static QRegExp re1("std::vector<(.*), std::allocator<(.*)>\\s*>");
|
||||||
|
re1.setMinimal(true);
|
||||||
for (int i = 0; i != 10; ++i) {
|
for (int i = 0; i != 10; ++i) {
|
||||||
if (re.indexIn(type) == -1 || re.cap(1) != re.cap(2))
|
if (re1.indexIn(type) == -1 || re1.cap(1) != re1.cap(2))
|
||||||
break;
|
break;
|
||||||
type.replace(re.cap(0), "std::vector<" + re.cap(1) + ">");
|
type.replace(re1.cap(0), "std::vector<" + re1.cap(1) + ">");
|
||||||
|
}
|
||||||
|
|
||||||
|
// std::list
|
||||||
|
static QRegExp re2("std::list<(.*), std::allocator<(.*)>\\s*>");
|
||||||
|
re2.setMinimal(true);
|
||||||
|
for (int i = 0; i != 10; ++i) {
|
||||||
|
if (re2.indexIn(type) == -1 || re2.cap(1) != re2.cap(2))
|
||||||
|
break;
|
||||||
|
type.replace(re2.cap(0), "std::list<" + re2.cap(1) + ">");
|
||||||
|
}
|
||||||
|
|
||||||
|
// std::map
|
||||||
|
static QRegExp re3("std::map<(.*), (.*), std::less<(.*)\\s*>, "
|
||||||
|
"std::allocator<std::pair<const (.*), (.*)\\s*> > >");
|
||||||
|
re3.setMinimal(true);
|
||||||
|
for (int i = 0; i != 10; ++i) {
|
||||||
|
if (re3.indexIn(type) == -1 || re3.cap(1) != re3.cap(3)
|
||||||
|
|| re3.cap(1) != re3.cap(4) || re3.cap(2) != re3.cap(5))
|
||||||
|
break;
|
||||||
|
type.replace(re3.cap(0), "std::map<" + re3.cap(1) + ", " + re3.cap(2) + ">");
|
||||||
}
|
}
|
||||||
|
|
||||||
type.replace(" >", ">");
|
type.replace(" >", ">");
|
||||||
@@ -865,9 +888,9 @@ void WatchHandler::watchExpression(const QString &exp)
|
|||||||
data.name = exp;
|
data.name = exp;
|
||||||
data.iname = "watch." + exp;
|
data.iname = "watch." + exp;
|
||||||
insertData(data);
|
insertData(data);
|
||||||
|
emit watchModelUpdateRequested();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void WatchHandler::setDisplayedIName(const QString &iname, bool on)
|
void WatchHandler::setDisplayedIName(const QString &iname, bool on)
|
||||||
{
|
{
|
||||||
WatchData *d = findData(iname);
|
WatchData *d = findData(iname);
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ static QList<Document::Ptr> findDocumentsIncluding(const QString &fileName, bool
|
|||||||
|
|
||||||
QList<Document::Ptr> docList;
|
QList<Document::Ptr> docList;
|
||||||
// take all docs
|
// take all docs
|
||||||
CppTools::CppModelManagerInterface::DocumentTable docTable = cppModelManager->documents();
|
CPlusPlus::Snapshot docTable = cppModelManager->snapshot();
|
||||||
foreach (Document::Ptr doc, docTable) { // we go through all documents
|
foreach (Document::Ptr doc, docTable) { // we go through all documents
|
||||||
QStringList includes = doc->includedFiles();
|
QStringList includes = doc->includedFiles();
|
||||||
foreach (QString include, includes) {
|
foreach (QString include, includes) {
|
||||||
@@ -286,7 +286,7 @@ static Document::Ptr findDefinition(Function *functionDeclaration, int *line)
|
|||||||
QualifiedNameId *q = control.qualifiedNameId(&qualifiedName[0], qualifiedName.size());
|
QualifiedNameId *q = control.qualifiedNameId(&qualifiedName[0], qualifiedName.size());
|
||||||
LookupContext context(&control);
|
LookupContext context(&control);
|
||||||
|
|
||||||
const QMap<QString, Document::Ptr> documents = cppModelManager->documents();
|
const Snapshot documents = cppModelManager->snapshot();
|
||||||
foreach (Document::Ptr doc, documents) {
|
foreach (Document::Ptr doc, documents) {
|
||||||
QList<Scope *> visibleScopes;
|
QList<Scope *> visibleScopes;
|
||||||
visibleScopes.append(doc->globalSymbols());
|
visibleScopes.append(doc->globalSymbols());
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ void GitClient::diff(const QString &workingDirectory, const QStringList &fileNam
|
|||||||
const QString title = tr("Git Diff");
|
const QString title = tr("Git Diff");
|
||||||
|
|
||||||
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, workingDirectory, true, "originalFileName", workingDirectory);
|
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, workingDirectory, true, "originalFileName", workingDirectory);
|
||||||
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
|
executeGit(workingDirectory, arguments, editor);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,14 +215,14 @@ void GitClient::diff(const QString &workingDirectory, const QString &fileName)
|
|||||||
const QString sourceFile = source(workingDirectory, fileName);
|
const QString sourceFile = source(workingDirectory, fileName);
|
||||||
|
|
||||||
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, true, "originalFileName", sourceFile);
|
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, true, "originalFileName", sourceFile);
|
||||||
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
|
executeGit(workingDirectory, arguments, editor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::status(const QString &workingDirectory)
|
void GitClient::status(const QString &workingDirectory)
|
||||||
{
|
{
|
||||||
QStringList statusArgs(QLatin1String("status"));
|
QStringList statusArgs(QLatin1String("status"));
|
||||||
statusArgs << QLatin1String("-u");
|
statusArgs << QLatin1String("-u");
|
||||||
executeGit(workingDirectory, statusArgs, m_plugin->outputWindow(), 0,true);
|
executeGit(workingDirectory, statusArgs, 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::log(const QString &workingDirectory, const QString &fileName)
|
void GitClient::log(const QString &workingDirectory, const QString &fileName)
|
||||||
@@ -242,7 +242,7 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName)
|
|||||||
const QString kind = QLatin1String(Git::Constants::GIT_LOG_EDITOR_KIND);
|
const QString kind = QLatin1String(Git::Constants::GIT_LOG_EDITOR_KIND);
|
||||||
const QString sourceFile = source(workingDirectory, fileName);
|
const QString sourceFile = source(workingDirectory, fileName);
|
||||||
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, false, "logFileName", sourceFile);
|
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, false, "logFileName", sourceFile);
|
||||||
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
|
executeGit(workingDirectory, arguments, editor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::show(const QString &source, const QString &id)
|
void GitClient::show(const QString &source, const QString &id)
|
||||||
@@ -258,7 +258,7 @@ void GitClient::show(const QString &source, const QString &id)
|
|||||||
|
|
||||||
const QFileInfo sourceFi(source);
|
const QFileInfo sourceFi(source);
|
||||||
const QString workDir = sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath();
|
const QString workDir = sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath();
|
||||||
executeGit(workDir, arguments, m_plugin->outputWindow(), editor);
|
executeGit(workDir, arguments, editor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::blame(const QString &workingDirectory, const QString &fileName)
|
void GitClient::blame(const QString &workingDirectory, const QString &fileName)
|
||||||
@@ -273,7 +273,7 @@ void GitClient::blame(const QString &workingDirectory, const QString &fileName)
|
|||||||
const QString sourceFile = source(workingDirectory, fileName);
|
const QString sourceFile = source(workingDirectory, fileName);
|
||||||
|
|
||||||
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, true, "blameFileName", sourceFile);
|
VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, true, "blameFileName", sourceFile);
|
||||||
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
|
executeGit(workingDirectory, arguments, editor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::checkout(const QString &workingDirectory, const QString &fileName)
|
void GitClient::checkout(const QString &workingDirectory, const QString &fileName)
|
||||||
@@ -287,7 +287,7 @@ void GitClient::checkout(const QString &workingDirectory, const QString &fileNam
|
|||||||
arguments << QLatin1String("checkout") << QLatin1String("HEAD") << QLatin1String("--")
|
arguments << QLatin1String("checkout") << QLatin1String("HEAD") << QLatin1String("--")
|
||||||
<< fileName;
|
<< fileName;
|
||||||
|
|
||||||
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0,true);
|
executeGit(workingDirectory, arguments, 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::hardReset(const QString &workingDirectory, const QString &commit)
|
void GitClient::hardReset(const QString &workingDirectory, const QString &commit)
|
||||||
@@ -297,7 +297,7 @@ void GitClient::hardReset(const QString &workingDirectory, const QString &commit
|
|||||||
if (!commit.isEmpty())
|
if (!commit.isEmpty())
|
||||||
arguments << commit;
|
arguments << commit;
|
||||||
|
|
||||||
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0,true);
|
executeGit(workingDirectory, arguments, 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::addFile(const QString &workingDirectory, const QString &fileName)
|
void GitClient::addFile(const QString &workingDirectory, const QString &fileName)
|
||||||
@@ -305,7 +305,7 @@ void GitClient::addFile(const QString &workingDirectory, const QString &fileName
|
|||||||
QStringList arguments;
|
QStringList arguments;
|
||||||
arguments << QLatin1String("add") << fileName;
|
arguments << QLatin1String("add") << fileName;
|
||||||
|
|
||||||
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0,true);
|
executeGit(workingDirectory, arguments, 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GitClient::synchronousAdd(const QString &workingDirectory, const QStringList &files)
|
bool GitClient::synchronousAdd(const QString &workingDirectory, const QStringList &files)
|
||||||
@@ -380,13 +380,14 @@ bool GitClient::synchronousCheckout(const QString &workingDirectory,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::executeGit(const QString &workingDirectory, const QStringList &arguments,
|
void GitClient::executeGit(const QString &workingDirectory, const QStringList &arguments,
|
||||||
GitOutputWindow *outputWindow, VCSBase::VCSBaseEditor* editor,
|
VCSBase::VCSBaseEditor* editor,
|
||||||
bool outputToWindow)
|
bool outputToWindow)
|
||||||
{
|
{
|
||||||
if (Git::Constants::debug)
|
if (Git::Constants::debug)
|
||||||
qDebug() << "executeGit" << workingDirectory << arguments << editor;
|
qDebug() << "executeGit" << workingDirectory << arguments << editor;
|
||||||
|
|
||||||
m_plugin->outputWindow()->append(formatCommand(QLatin1String(kGitCommand), arguments));
|
GitOutputWindow *outputWindow = m_plugin->outputWindow();
|
||||||
|
outputWindow->append(formatCommand(QLatin1String(kGitCommand), arguments));
|
||||||
|
|
||||||
QProcess process;
|
QProcess process;
|
||||||
ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment();
|
ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment();
|
||||||
@@ -396,8 +397,13 @@ void GitClient::executeGit(const QString &workingDirectory, const QStringList &a
|
|||||||
|
|
||||||
GitCommand* command = new GitCommand();
|
GitCommand* command = new GitCommand();
|
||||||
if (outputToWindow) {
|
if (outputToWindow) {
|
||||||
connect(command, SIGNAL(outputText(QString)), outputWindow, SLOT(append(QString)));
|
if (!editor) { // assume that the commands output is the important thing
|
||||||
connect(command, SIGNAL(outputData(QByteArray)), outputWindow, SLOT(appendData(QByteArray)));
|
connect(command, SIGNAL(outputText(QString)), this, SLOT(appendAndPopup(QString)));
|
||||||
|
connect(command, SIGNAL(outputData(QByteArray)), this, SLOT(appendDataAndPopup(QByteArray)));
|
||||||
|
} else {
|
||||||
|
connect(command, SIGNAL(outputText(QString)), outputWindow, SLOT(append(QString)));
|
||||||
|
connect(command, SIGNAL(outputData(QByteArray)), outputWindow, SLOT(appendData(QByteArray)));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
QTC_ASSERT(editor, /**/);
|
QTC_ASSERT(editor, /**/);
|
||||||
connect(command, SIGNAL(outputText(QString)), editor, SLOT(setPlainText(QString)));
|
connect(command, SIGNAL(outputText(QString)), editor, SLOT(setPlainText(QString)));
|
||||||
@@ -405,11 +411,23 @@ void GitClient::executeGit(const QString &workingDirectory, const QStringList &a
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (outputWindow)
|
if (outputWindow)
|
||||||
connect(command, SIGNAL(errorText(QString)), outputWindow, SLOT(append(QString)));
|
connect(command, SIGNAL(errorText(QString)), this, SLOT(appendAndPopup(QString)));
|
||||||
|
|
||||||
command->execute(arguments, workingDirectory, environment);
|
command->execute(arguments, workingDirectory, environment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GitClient::appendDataAndPopup(const QByteArray &data)
|
||||||
|
{
|
||||||
|
m_plugin->outputWindow()->appendData(data);
|
||||||
|
m_plugin->outputWindow()->popup(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GitClient::appendAndPopup(const QString &text)
|
||||||
|
{
|
||||||
|
m_plugin->outputWindow()->append(text);
|
||||||
|
m_plugin->outputWindow()->popup(false);
|
||||||
|
}
|
||||||
|
|
||||||
bool GitClient::synchronousGit(const QString &workingDirectory,
|
bool GitClient::synchronousGit(const QString &workingDirectory,
|
||||||
const QStringList &arguments,
|
const QStringList &arguments,
|
||||||
QByteArray* outputText,
|
QByteArray* outputText,
|
||||||
@@ -810,12 +828,12 @@ void GitClient::revert(const QStringList &files)
|
|||||||
|
|
||||||
void GitClient::pull(const QString &workingDirectory)
|
void GitClient::pull(const QString &workingDirectory)
|
||||||
{
|
{
|
||||||
executeGit(workingDirectory, QStringList(QLatin1String("pull")), m_plugin->outputWindow(), 0, true);
|
executeGit(workingDirectory, QStringList(QLatin1String("pull")), 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::push(const QString &workingDirectory)
|
void GitClient::push(const QString &workingDirectory)
|
||||||
{
|
{
|
||||||
executeGit(workingDirectory, QStringList(QLatin1String("push")), m_plugin->outputWindow(), 0, true);
|
executeGit(workingDirectory, QStringList(QLatin1String("push")), 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GitClient::msgNoChangedFiles()
|
QString GitClient::msgNoChangedFiles()
|
||||||
@@ -829,7 +847,7 @@ void GitClient::stash(const QString &workingDirectory)
|
|||||||
QString errorMessage;
|
QString errorMessage;
|
||||||
switch (gitStatus(workingDirectory, false, 0, &errorMessage)) {
|
switch (gitStatus(workingDirectory, false, 0, &errorMessage)) {
|
||||||
case StatusChanged:
|
case StatusChanged:
|
||||||
executeGit(workingDirectory, QStringList(QLatin1String("stash")), m_plugin->outputWindow(), 0, true);
|
executeGit(workingDirectory, QStringList(QLatin1String("stash")), 0, true);
|
||||||
break;
|
break;
|
||||||
case StatusUnchanged:
|
case StatusUnchanged:
|
||||||
m_plugin->outputWindow()->append(msgNoChangedFiles());
|
m_plugin->outputWindow()->append(msgNoChangedFiles());
|
||||||
@@ -846,21 +864,21 @@ void GitClient::stashPop(const QString &workingDirectory)
|
|||||||
{
|
{
|
||||||
QStringList arguments(QLatin1String("stash"));
|
QStringList arguments(QLatin1String("stash"));
|
||||||
arguments << QLatin1String("pop");
|
arguments << QLatin1String("pop");
|
||||||
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0, true);
|
executeGit(workingDirectory, arguments, 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::branchList(const QString &workingDirectory)
|
void GitClient::branchList(const QString &workingDirectory)
|
||||||
{
|
{
|
||||||
QStringList arguments(QLatin1String("branch"));
|
QStringList arguments(QLatin1String("branch"));
|
||||||
arguments << QLatin1String("-r");
|
arguments << QLatin1String("-r");
|
||||||
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0, true);
|
executeGit(workingDirectory, arguments, 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitClient::stashList(const QString &workingDirectory)
|
void GitClient::stashList(const QString &workingDirectory)
|
||||||
{
|
{
|
||||||
QStringList arguments(QLatin1String("stash"));
|
QStringList arguments(QLatin1String("stash"));
|
||||||
arguments << QLatin1String("list");
|
arguments << QLatin1String("list");
|
||||||
executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0, true);
|
executeGit(workingDirectory, arguments, 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GitClient::readConfig(const QString &workingDirectory, const QStringList &configVar)
|
QString GitClient::readConfig(const QString &workingDirectory, const QStringList &configVar)
|
||||||
|
|||||||
@@ -130,6 +130,10 @@ public:
|
|||||||
public slots:
|
public slots:
|
||||||
void show(const QString &source, const QString &id);
|
void show(const QString &source, const QString &id);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void appendAndPopup(const QString &text);
|
||||||
|
void appendDataAndPopup(const QByteArray &data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
VCSBase::VCSBaseEditor *createVCSEditor(const QString &kind,
|
VCSBase::VCSBaseEditor *createVCSEditor(const QString &kind,
|
||||||
QString title,
|
QString title,
|
||||||
@@ -141,7 +145,6 @@ private:
|
|||||||
|
|
||||||
void executeGit(const QString &workingDirectory,
|
void executeGit(const QString &workingDirectory,
|
||||||
const QStringList &arguments,
|
const QStringList &arguments,
|
||||||
GitOutputWindow *outputWindow,
|
|
||||||
VCSBase::VCSBaseEditor* editor = 0,
|
VCSBase::VCSBaseEditor* editor = 0,
|
||||||
bool outputToWindow = false);
|
bool outputToWindow = false);
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,6 @@ void GitOutputWindow::append(const QString &text)
|
|||||||
foreach (const QString &s, lines)
|
foreach (const QString &s, lines)
|
||||||
m_outputListWidget->addItem(s);
|
m_outputListWidget->addItem(s);
|
||||||
m_outputListWidget->scrollToBottom();
|
m_outputListWidget->scrollToBottom();
|
||||||
popup();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GitOutputWindow::setData(const QByteArray &data)
|
void GitOutputWindow::setData(const QByteArray &data)
|
||||||
|
|||||||
@@ -496,7 +496,7 @@ QString GitPlugin::getWorkingDirectory()
|
|||||||
if (workingDirectory.isEmpty()) {
|
if (workingDirectory.isEmpty()) {
|
||||||
m_outputWindow->clearContents();
|
m_outputWindow->clearContents();
|
||||||
m_outputWindow->append(tr("Could not find working directory"));
|
m_outputWindow->append(tr("Could not find working directory"));
|
||||||
m_outputWindow->popup();
|
m_outputWindow->popup(false);
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
return workingDirectory;
|
return workingDirectory;
|
||||||
@@ -612,6 +612,7 @@ void GitPlugin::startCommit()
|
|||||||
changeTmpFile->setAutoRemove(true);
|
changeTmpFile->setAutoRemove(true);
|
||||||
if (!changeTmpFile->open()) {
|
if (!changeTmpFile->open()) {
|
||||||
m_outputWindow->append(tr("Cannot create temporary file: %1").arg(changeTmpFile->errorString()));
|
m_outputWindow->append(tr("Cannot create temporary file: %1").arg(changeTmpFile->errorString()));
|
||||||
|
m_outputWindow->popup(false);
|
||||||
delete changeTmpFile;
|
delete changeTmpFile;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ QString SettingsPage::name() const
|
|||||||
return tr("General");
|
return tr("General");
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SettingsPage::category() const
|
QString SettingsPage::category() const
|
||||||
{
|
{
|
||||||
return QLatin1String("Git");
|
return QLatin1String("Git");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,114 +6,97 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>436</width>
|
<width>389</width>
|
||||||
<height>186</height>
|
<height>183</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<widget class="QGroupBox" name="environmentGroupBox">
|
||||||
<item>
|
<property name="enabled">
|
||||||
<widget class="QGroupBox" name="environmentGroupBox">
|
<bool>true</bool>
|
||||||
<property name="enabled">
|
</property>
|
||||||
<bool>true</bool>
|
<property name="title">
|
||||||
</property>
|
<string>Environment variables</string>
|
||||||
<property name="title">
|
</property>
|
||||||
<string>Environment variables</string>
|
<property name="checkable">
|
||||||
</property>
|
<bool>true</bool>
|
||||||
<property name="checkable">
|
</property>
|
||||||
<bool>true</bool>
|
<layout class="QFormLayout" name="formLayout">
|
||||||
</property>
|
<item row="0" column="0">
|
||||||
<layout class="QFormLayout" name="formLayout">
|
<widget class="QLabel" name="pathlabel">
|
||||||
<item row="0" column="0">
|
<property name="text">
|
||||||
<widget class="QLabel" name="pathlabel">
|
<string>PATH:</string>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>PATH:</string>
|
</widget>
|
||||||
</property>
|
</item>
|
||||||
</widget>
|
<item row="0" column="1">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="pathLineEdit"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<widget class="QPushButton" name="adoptButton">
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="pathLineEdit"/>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="adoptButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>From system</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QLabel" name="noteLabel">
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><b>Note:</b></string>
|
<string>From system</string>
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLabel" name="noteFieldlabel">
|
|
||||||
<property name="text">
|
|
||||||
<string>Git needs to find Perl in the environment as well.</string>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="noteLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string><b>Note:</b></string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="noteFieldlabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Git needs to find Perl in the environment as well.</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QFormLayout" name="logFormLayout">
|
||||||
|
<property name="fieldGrowthPolicy">
|
||||||
|
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||||
|
</property>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QSpinBox" name="logCountSpinBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Note that huge amount of commits might take some time.</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>1000</number>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item row="0" column="0">
|
||||||
<layout class="QFormLayout" name="logFormLayout">
|
<widget class="QLabel" name="logCountLabel">
|
||||||
<property name="fieldGrowthPolicy">
|
<property name="text">
|
||||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
<string>Log commit display count:</string>
|
||||||
</property>
|
</property>
|
||||||
<item row="0" column="1">
|
</widget>
|
||||||
<widget class="QSpinBox" name="logCountSpinBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Note that huge amount of commits might take some time.</string>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>1000</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="logCountLabel">
|
|
||||||
<property name="text">
|
|
||||||
<string>Log commit display count:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer name="horizontalSpacer">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>20</width>
|
||||||
<height>20</height>
|
<height>40</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
|
|||||||
@@ -626,7 +626,7 @@ QList<FolderNode*> DetailedModel::recursiveSubFolders(FolderNode *parentFolder)
|
|||||||
|
|
||||||
FlatModel::FlatModel(SessionNode *rootNode, QObject *parent)
|
FlatModel::FlatModel(SessionNode *rootNode, QObject *parent)
|
||||||
: QAbstractItemModel(parent),
|
: QAbstractItemModel(parent),
|
||||||
m_filterProjects(true),
|
m_filterProjects(false),
|
||||||
m_filterGeneratedFiles(true),
|
m_filterGeneratedFiles(true),
|
||||||
m_rootNode(rootNode),
|
m_rootNode(rootNode),
|
||||||
m_startupProject(0),
|
m_startupProject(0),
|
||||||
@@ -914,6 +914,8 @@ QModelIndex FlatModel::indexForNode(const Node *node_)
|
|||||||
|
|
||||||
void FlatModel::setProjectFilterEnabled(bool filter)
|
void FlatModel::setProjectFilterEnabled(bool filter)
|
||||||
{
|
{
|
||||||
|
if (filter == m_filterProjects)
|
||||||
|
return;
|
||||||
m_filterProjects = filter;
|
m_filterProjects = filter;
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,6 +90,20 @@ protected:
|
|||||||
if (event->reason() != Qt::PopupFocusReason)
|
if (event->reason() != Qt::PopupFocusReason)
|
||||||
QTreeView::focusOutEvent(event);
|
QTreeView::focusOutEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
void keyPressEvent(QKeyEvent *event)
|
||||||
|
{
|
||||||
|
if ((event->key() == Qt::Key_Return
|
||||||
|
|| event->key() == Qt::Key_Enter)
|
||||||
|
&& event->modifiers() == 0
|
||||||
|
&& currentIndex().isValid()) {
|
||||||
|
emit activated(currentIndex());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QTreeView::keyPressEvent(event);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
|
|
||||||
#include <QtCore/QDebug>
|
#include <QtCore/QDebug>
|
||||||
|
#include <QtGui/QApplication>
|
||||||
#include <QtGui/QBoxLayout>
|
#include <QtGui/QBoxLayout>
|
||||||
#include <QtGui/QComboBox>
|
#include <QtGui/QComboBox>
|
||||||
#include <QtGui/QTabWidget>
|
#include <QtGui/QTabWidget>
|
||||||
@@ -190,7 +191,14 @@ void ProjectWindow::updateTreeWidget()
|
|||||||
// That one runs fully thorough and deletes all widgets, even that one that we are currently removing
|
// That one runs fully thorough and deletes all widgets, even that one that we are currently removing
|
||||||
// from m_panelsTabWidget.
|
// from m_panelsTabWidget.
|
||||||
// To prevent that, we simply prevent the focus switching....
|
// To prevent that, we simply prevent the focus switching....
|
||||||
m_treeWidget->setFocus();
|
QWidget *focusWidget = qApp->focusWidget();
|
||||||
|
while (focusWidget) {
|
||||||
|
if (focusWidget == this) {
|
||||||
|
m_treeWidget->setFocus();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
focusWidget = focusWidget->parentWidget();
|
||||||
|
}
|
||||||
m_treeWidget->clear();
|
m_treeWidget->clear();
|
||||||
|
|
||||||
foreach(Project *project, m_session->projects()) {
|
foreach(Project *project, m_session->projects()) {
|
||||||
|
|||||||
@@ -628,8 +628,10 @@ bool SessionManager::loadImpl(const QString &fileName)
|
|||||||
if (success) {
|
if (success) {
|
||||||
// restore the active mode
|
// restore the active mode
|
||||||
const QString &modeIdentifier = value(QLatin1String("ActiveMode")).toString();
|
const QString &modeIdentifier = value(QLatin1String("ActiveMode")).toString();
|
||||||
if (!modeIdentifier.isEmpty())
|
if (!modeIdentifier.isEmpty()) {
|
||||||
m_core->modeManager()->activateMode(modeIdentifier);
|
m_core->modeManager()->activateMode(modeIdentifier);
|
||||||
|
m_core->modeManager()->setFocusToCurrentMode();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
|
|||||||
@@ -498,12 +498,8 @@ void Qt4Project::updateCodeModel()
|
|||||||
pinfo.sourceFiles = files;
|
pinfo.sourceFiles = files;
|
||||||
|
|
||||||
modelmanager->updateProjectInfo(pinfo);
|
modelmanager->updateProjectInfo(pinfo);
|
||||||
|
|
||||||
modelmanager->GC();
|
|
||||||
modelmanager->updateSourceFiles(pinfo.sourceFiles);
|
modelmanager->updateSourceFiles(pinfo.sourceFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
// update info
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -54,14 +54,7 @@ QList<FilterEntry> FileSystemFilter::matchesFor(const QString &entry)
|
|||||||
QString name = entryInfo.fileName();
|
QString name = entryInfo.fileName();
|
||||||
QString directory = entryInfo.path();
|
QString directory = entryInfo.path();
|
||||||
QString filePath = entryInfo.filePath();
|
QString filePath = entryInfo.filePath();
|
||||||
bool isDrive = false;
|
if (entryInfo.isRelative()) {
|
||||||
foreach (const QFileInfo &drive, QDir::drives()) {
|
|
||||||
if (filePath.startsWith(drive.path())) {
|
|
||||||
isDrive = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!isDrive) {
|
|
||||||
if (filePath.startsWith("~/")) {
|
if (filePath.startsWith("~/")) {
|
||||||
directory.replace(0, 1, QDir::homePath());
|
directory.replace(0, 1, QDir::homePath());
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ class OpenDocumentsFilter : public QuickOpen::IQuickOpenFilter
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
OpenDocumentsFilter(Core::EditorManager *editorManager);
|
OpenDocumentsFilter(Core::EditorManager *editorManager);
|
||||||
QString trName() const { return tr("Open document"); }
|
QString trName() const { return tr("Open documents"); }
|
||||||
QString name() const { return "Open document"; }
|
QString name() const { return "Open documents"; }
|
||||||
QuickOpen::IQuickOpenFilter::Priority priority() const { return QuickOpen::IQuickOpenFilter::Medium; }
|
QuickOpen::IQuickOpenFilter::Priority priority() const { return QuickOpen::IQuickOpenFilter::Medium; }
|
||||||
QList<QuickOpen::FilterEntry> matchesFor(const QString &entry);
|
QList<QuickOpen::FilterEntry> matchesFor(const QString &entry);
|
||||||
void accept(QuickOpen::FilterEntry selection) const;
|
void accept(QuickOpen::FilterEntry selection) const;
|
||||||
|
|||||||
@@ -128,12 +128,13 @@ protected:
|
|||||||
|
|
||||||
ITextEditor *BaseTextEditor::openEditorAt(const QString &fileName,
|
ITextEditor *BaseTextEditor::openEditorAt(const QString &fileName,
|
||||||
int line,
|
int line,
|
||||||
int column)
|
int column,
|
||||||
|
const QString &editorKind)
|
||||||
{
|
{
|
||||||
Core::EditorManager *editorManager =
|
Core::EditorManager *editorManager =
|
||||||
ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>()->editorManager();
|
ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>()->editorManager();
|
||||||
editorManager->addCurrentPositionToNavigationHistory(true);
|
editorManager->addCurrentPositionToNavigationHistory(true);
|
||||||
Core::IEditor *editor = editorManager->openEditor(fileName, QString(), true);
|
Core::IEditor *editor = editorManager->openEditor(fileName, editorKind, true);
|
||||||
TextEditor::ITextEditor *texteditor = qobject_cast<TextEditor::ITextEditor *>(editor);
|
TextEditor::ITextEditor *texteditor = qobject_cast<TextEditor::ITextEditor *>(editor);
|
||||||
if (texteditor) {
|
if (texteditor) {
|
||||||
texteditor->gotoLine(line, column);
|
texteditor->gotoLine(line, column);
|
||||||
@@ -684,6 +685,67 @@ void BaseTextEditor::selectBlockDown()
|
|||||||
_q_matchParentheses();
|
_q_matchParentheses();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BaseTextEditor::moveLineUp()
|
||||||
|
{
|
||||||
|
moveLineUpDown(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseTextEditor::moveLineDown()
|
||||||
|
{
|
||||||
|
moveLineUpDown(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseTextEditor::moveLineUpDown(bool up)
|
||||||
|
{
|
||||||
|
QTextCursor cursor = textCursor();
|
||||||
|
QTextCursor move = cursor;
|
||||||
|
move.beginEditBlock();
|
||||||
|
|
||||||
|
bool hasSelection = cursor.hasSelection();
|
||||||
|
|
||||||
|
if (cursor.hasSelection()) {
|
||||||
|
move.setPosition(cursor.selectionStart());
|
||||||
|
move.movePosition(QTextCursor::StartOfBlock);
|
||||||
|
move.setPosition(cursor.selectionEnd(), QTextCursor::KeepAnchor);
|
||||||
|
move.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
|
||||||
|
} else {
|
||||||
|
move.movePosition(QTextCursor::StartOfBlock);
|
||||||
|
move.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
|
||||||
|
}
|
||||||
|
QString text = move.selectedText();
|
||||||
|
move.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor);
|
||||||
|
move.removeSelectedText();
|
||||||
|
|
||||||
|
if (up) {
|
||||||
|
move.movePosition(QTextCursor::PreviousBlock);
|
||||||
|
move.insertBlock();
|
||||||
|
move.movePosition(QTextCursor::Left);
|
||||||
|
} else {
|
||||||
|
move.movePosition(QTextCursor::EndOfBlock);
|
||||||
|
if (move.atBlockStart()) { // empty block
|
||||||
|
move.movePosition(QTextCursor::NextBlock);
|
||||||
|
move.insertBlock();
|
||||||
|
move.movePosition(QTextCursor::Left);
|
||||||
|
} else {
|
||||||
|
move.insertBlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int start = move.position();
|
||||||
|
move.clearSelection();
|
||||||
|
move.insertText(text);
|
||||||
|
int end = move.position();
|
||||||
|
|
||||||
|
if (hasSelection) {
|
||||||
|
move.setPosition(start);
|
||||||
|
move.setPosition(end, QTextCursor::KeepAnchor);
|
||||||
|
}
|
||||||
|
|
||||||
|
indent(document(), move, QChar::Null);
|
||||||
|
move.endEditBlock();
|
||||||
|
|
||||||
|
setTextCursor(move);
|
||||||
|
}
|
||||||
|
|
||||||
void BaseTextEditor::cleanWhitespace()
|
void BaseTextEditor::cleanWhitespace()
|
||||||
{
|
{
|
||||||
@@ -740,9 +802,13 @@ void BaseTextEditor::keyPressEvent(QKeyEvent *e)
|
|||||||
QTextCursor cursor = textCursor();
|
QTextCursor cursor = textCursor();
|
||||||
if (d->m_inBlockSelectionMode)
|
if (d->m_inBlockSelectionMode)
|
||||||
cursor.clearSelection();
|
cursor.clearSelection();
|
||||||
cursor.insertBlock();
|
|
||||||
if (d->m_document->tabSettings().m_autoIndent) {
|
if (d->m_document->tabSettings().m_autoIndent) {
|
||||||
|
cursor.beginEditBlock();
|
||||||
|
cursor.insertBlock();
|
||||||
indent(document(), cursor, QChar::Null);
|
indent(document(), cursor, QChar::Null);
|
||||||
|
cursor.endEditBlock();
|
||||||
|
} else {
|
||||||
|
cursor.insertBlock();
|
||||||
}
|
}
|
||||||
e->accept();
|
e->accept();
|
||||||
setTextCursor(cursor);
|
setTextCursor(cursor);
|
||||||
@@ -2451,7 +2517,7 @@ void BaseTextEditor::extraAreaMouseEvent(QMouseEvent *e)
|
|||||||
}
|
}
|
||||||
} else if (e->button() == Qt::RightButton) {
|
} else if (e->button() == Qt::RightButton) {
|
||||||
QMenu * contextMenu = new QMenu(this);
|
QMenu * contextMenu = new QMenu(this);
|
||||||
emit d->m_editable->markContextMenuRequested(editableInterface(), cursor.blockNumber(), contextMenu);
|
emit d->m_editable->markContextMenuRequested(editableInterface(), cursor.blockNumber() + 1, contextMenu);
|
||||||
if (!contextMenu->isEmpty())
|
if (!contextMenu->isEmpty())
|
||||||
contextMenu->exec(e->globalPos());
|
contextMenu->exec(e->globalPos());
|
||||||
delete contextMenu;
|
delete contextMenu;
|
||||||
@@ -2702,6 +2768,8 @@ void BaseTextEditor::handleHomeKey(bool anchor)
|
|||||||
|
|
||||||
while (character == tab || character.category() == QChar::Separator_Space) {
|
while (character == tab || character.category() == QChar::Separator_Space) {
|
||||||
++pos;
|
++pos;
|
||||||
|
if (pos == initpos)
|
||||||
|
break;
|
||||||
character = characterAt(pos);
|
character = characterAt(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2889,12 +2957,13 @@ void BaseTextEditor::markBlocksAsChanged(QList<int> blockNumbers) {
|
|||||||
|
|
||||||
TextBlockUserData::MatchType TextBlockUserData::checkOpenParenthesis(QTextCursor *cursor, QChar c)
|
TextBlockUserData::MatchType TextBlockUserData::checkOpenParenthesis(QTextCursor *cursor, QChar c)
|
||||||
{
|
{
|
||||||
if (!TextEditDocumentLayout::hasParentheses(cursor->block()))
|
QTextBlock block = cursor->block();
|
||||||
|
if (!TextEditDocumentLayout::hasParentheses(block) || TextEditDocumentLayout::ifdefedOut(block))
|
||||||
return NoMatch;
|
return NoMatch;
|
||||||
|
|
||||||
Parentheses parenList = TextEditDocumentLayout::parentheses(cursor->block());
|
Parentheses parenList = TextEditDocumentLayout::parentheses(block);
|
||||||
Parenthesis openParen, closedParen;
|
Parenthesis openParen, closedParen;
|
||||||
QTextBlock closedParenParag = cursor->block();
|
QTextBlock closedParenParag = block;
|
||||||
|
|
||||||
const int cursorPos = cursor->position() - closedParenParag.position();
|
const int cursorPos = cursor->position() - closedParenParag.position();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -2919,7 +2988,8 @@ TextBlockUserData::MatchType TextBlockUserData::checkOpenParenthesis(QTextCursor
|
|||||||
closedParenParag = closedParenParag.next();
|
closedParenParag = closedParenParag.next();
|
||||||
if (!closedParenParag.isValid())
|
if (!closedParenParag.isValid())
|
||||||
return NoMatch;
|
return NoMatch;
|
||||||
if (TextEditDocumentLayout::hasParentheses(closedParenParag)) {
|
if (TextEditDocumentLayout::hasParentheses(closedParenParag)
|
||||||
|
&& !TextEditDocumentLayout::ifdefedOut(closedParenParag)) {
|
||||||
parenList = TextEditDocumentLayout::parentheses(closedParenParag);
|
parenList = TextEditDocumentLayout::parentheses(closedParenParag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2956,12 +3026,13 @@ TextBlockUserData::MatchType TextBlockUserData::checkOpenParenthesis(QTextCursor
|
|||||||
|
|
||||||
TextBlockUserData::MatchType TextBlockUserData::checkClosedParenthesis(QTextCursor *cursor, QChar c)
|
TextBlockUserData::MatchType TextBlockUserData::checkClosedParenthesis(QTextCursor *cursor, QChar c)
|
||||||
{
|
{
|
||||||
if (!TextEditDocumentLayout::hasParentheses(cursor->block()))
|
QTextBlock block = cursor->block();
|
||||||
|
if (!TextEditDocumentLayout::hasParentheses(block) || TextEditDocumentLayout::ifdefedOut(block))
|
||||||
return NoMatch;
|
return NoMatch;
|
||||||
|
|
||||||
Parentheses parenList = TextEditDocumentLayout::parentheses(cursor->block());
|
Parentheses parenList = TextEditDocumentLayout::parentheses(block);
|
||||||
Parenthesis openParen, closedParen;
|
Parenthesis openParen, closedParen;
|
||||||
QTextBlock openParenParag = cursor->block();
|
QTextBlock openParenParag = block;
|
||||||
|
|
||||||
const int cursorPos = cursor->position() - openParenParag.position();
|
const int cursorPos = cursor->position() - openParenParag.position();
|
||||||
int i = parenList.count() - 1;
|
int i = parenList.count() - 1;
|
||||||
@@ -2987,7 +3058,8 @@ TextBlockUserData::MatchType TextBlockUserData::checkClosedParenthesis(QTextCurs
|
|||||||
if (!openParenParag.isValid())
|
if (!openParenParag.isValid())
|
||||||
return NoMatch;
|
return NoMatch;
|
||||||
|
|
||||||
if (TextEditDocumentLayout::hasParentheses(openParenParag)) {
|
if (TextEditDocumentLayout::hasParentheses(openParenParag)
|
||||||
|
&& !TextEditDocumentLayout::ifdefedOut(openParenParag)) {
|
||||||
parenList = TextEditDocumentLayout::parentheses(openParenParag);
|
parenList = TextEditDocumentLayout::parentheses(openParenParag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -3029,7 +3101,7 @@ bool TextBlockUserData::findPreviousOpenParenthesis(QTextCursor *cursor, bool se
|
|||||||
int ignore = 0;
|
int ignore = 0;
|
||||||
while (block.isValid()) {
|
while (block.isValid()) {
|
||||||
Parentheses parenList = TextEditDocumentLayout::parentheses(block);
|
Parentheses parenList = TextEditDocumentLayout::parentheses(block);
|
||||||
if (!parenList.isEmpty()) {
|
if (!parenList.isEmpty() && !TextEditDocumentLayout::ifdefedOut(block)) {
|
||||||
for (int i = parenList.count()-1; i >= 0; --i) {
|
for (int i = parenList.count()-1; i >= 0; --i) {
|
||||||
Parenthesis paren = parenList.at(i);
|
Parenthesis paren = parenList.at(i);
|
||||||
if (block == cursor->block() && position - block.position() <= paren.pos + 1)
|
if (block == cursor->block() && position - block.position() <= paren.pos + 1)
|
||||||
@@ -3056,7 +3128,7 @@ bool TextBlockUserData::findNextClosingParenthesis(QTextCursor *cursor, bool sel
|
|||||||
int ignore = 0;
|
int ignore = 0;
|
||||||
while (block.isValid()) {
|
while (block.isValid()) {
|
||||||
Parentheses parenList = TextEditDocumentLayout::parentheses(block);
|
Parentheses parenList = TextEditDocumentLayout::parentheses(block);
|
||||||
if (!parenList.isEmpty()) {
|
if (!parenList.isEmpty() && !TextEditDocumentLayout::ifdefedOut(block)) {
|
||||||
for (int i = 0; i < parenList.count(); ++i) {
|
for (int i = 0; i < parenList.count(); ++i) {
|
||||||
Parenthesis paren = parenList.at(i);
|
Parenthesis paren = parenList.at(i);
|
||||||
if (block == cursor->block() && position - block.position() >= paren.pos)
|
if (block == cursor->block() && position - block.position() >= paren.pos)
|
||||||
@@ -3081,7 +3153,7 @@ TextBlockUserData::MatchType TextBlockUserData::matchCursorBackward(QTextCursor
|
|||||||
cursor->clearSelection();
|
cursor->clearSelection();
|
||||||
const QTextBlock block = cursor->block();
|
const QTextBlock block = cursor->block();
|
||||||
|
|
||||||
if (!TextEditDocumentLayout::hasParentheses(block))
|
if (!TextEditDocumentLayout::hasParentheses(block) || TextEditDocumentLayout::ifdefedOut(block))
|
||||||
return NoMatch;
|
return NoMatch;
|
||||||
|
|
||||||
const int relPos = cursor->position() - block.position();
|
const int relPos = cursor->position() - block.position();
|
||||||
@@ -3103,7 +3175,7 @@ TextBlockUserData::MatchType TextBlockUserData::matchCursorForward(QTextCursor *
|
|||||||
cursor->clearSelection();
|
cursor->clearSelection();
|
||||||
const QTextBlock block = cursor->block();
|
const QTextBlock block = cursor->block();
|
||||||
|
|
||||||
if (!TextEditDocumentLayout::hasParentheses(block))
|
if (!TextEditDocumentLayout::hasParentheses(block) || TextEditDocumentLayout::ifdefedOut(block))
|
||||||
return NoMatch;
|
return NoMatch;
|
||||||
|
|
||||||
const int relPos = cursor->position() - block.position();
|
const int relPos = cursor->position() - block.position();
|
||||||
|
|||||||
@@ -230,7 +230,8 @@ public:
|
|||||||
BaseTextEditor(QWidget *parent);
|
BaseTextEditor(QWidget *parent);
|
||||||
~BaseTextEditor();
|
~BaseTextEditor();
|
||||||
|
|
||||||
static ITextEditor *openEditorAt(const QString &fileName, int line, int column = 0);
|
static ITextEditor *openEditorAt(const QString &fileName, int line, int column = 0,
|
||||||
|
const QString &editorKind = QString());
|
||||||
|
|
||||||
// EditorInterface
|
// EditorInterface
|
||||||
Core::IFile * file();
|
Core::IFile * file();
|
||||||
@@ -329,6 +330,9 @@ public slots:
|
|||||||
void selectBlockUp();
|
void selectBlockUp();
|
||||||
void selectBlockDown();
|
void selectBlockDown();
|
||||||
|
|
||||||
|
void moveLineUp();
|
||||||
|
void moveLineDown();
|
||||||
|
|
||||||
void cleanWhitespace();
|
void cleanWhitespace();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@@ -447,6 +451,7 @@ private:
|
|||||||
void indentOrUnindent(bool doIndent);
|
void indentOrUnindent(bool doIndent);
|
||||||
void handleHomeKey(bool anchor);
|
void handleHomeKey(bool anchor);
|
||||||
void handleBackspaceKey();
|
void handleBackspaceKey();
|
||||||
|
void moveLineUpDown(bool up);
|
||||||
|
|
||||||
void toggleBlockVisible(const QTextBlock &block);
|
void toggleBlockVisible(const QTextBlock &block);
|
||||||
QRect collapseBox(const QTextBlock &block);
|
QRect collapseBox(const QTextBlock &block);
|
||||||
|
|||||||
@@ -66,6 +66,9 @@
|
|||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>20</number>
|
<number>20</number>
|
||||||
</property>
|
</property>
|
||||||
@@ -132,6 +135,9 @@
|
|||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>20</number>
|
<number>20</number>
|
||||||
</property>
|
</property>
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ TextEditorActionHandler::TextEditorActionHandler(Core::ICore *core,
|
|||||||
= m_gotoBlockStartAction = m_gotoBlockStartWithSelectionAction
|
= m_gotoBlockStartAction = m_gotoBlockStartWithSelectionAction
|
||||||
= m_gotoBlockEndAction = m_gotoBlockEndWithSelectionAction
|
= m_gotoBlockEndAction = m_gotoBlockEndWithSelectionAction
|
||||||
= m_selectBlockUpAction = m_selectBlockDownAction
|
= m_selectBlockUpAction = m_selectBlockDownAction
|
||||||
|
= m_moveLineUpAction = m_moveLineDownAction
|
||||||
= 0;
|
= 0;
|
||||||
|
|
||||||
m_contextId << m_core->uniqueIDManager()->uniqueIdentifier(context);
|
m_contextId << m_core->uniqueIDManager()->uniqueIdentifier(context);
|
||||||
@@ -223,6 +224,16 @@ void TextEditorActionHandler::createActions()
|
|||||||
command = am->registerAction(m_selectBlockDownAction, Constants::SELECT_BLOCK_DOWN, m_contextId);
|
command = am->registerAction(m_selectBlockDownAction, Constants::SELECT_BLOCK_DOWN, m_contextId);
|
||||||
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U")));
|
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U")));
|
||||||
connect(m_selectBlockDownAction, SIGNAL(triggered()), this, SLOT(selectBlockDown()));
|
connect(m_selectBlockDownAction, SIGNAL(triggered()), this, SLOT(selectBlockDown()));
|
||||||
|
|
||||||
|
m_moveLineUpAction= new QAction(tr("Move Line Up"), this);
|
||||||
|
command = am->registerAction(m_moveLineUpAction, Constants::MOVE_LINE_UP, m_contextId);
|
||||||
|
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+Up")));
|
||||||
|
connect(m_moveLineUpAction, SIGNAL(triggered()), this, SLOT(moveLineUp()));
|
||||||
|
|
||||||
|
m_moveLineDownAction= new QAction(tr("Move Line Down"), this);
|
||||||
|
command = am->registerAction(m_moveLineDownAction, Constants::MOVE_LINE_DOWN, m_contextId);
|
||||||
|
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+Down")));
|
||||||
|
connect(m_moveLineDownAction, SIGNAL(triggered()), this, SLOT(moveLineDown()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TextEditorActionHandler::supportsAction(const QString & /*id */) const
|
bool TextEditorActionHandler::supportsAction(const QString & /*id */) const
|
||||||
@@ -287,6 +298,8 @@ void TextEditorActionHandler::updateActions(UpdateMode um)
|
|||||||
m_gotoBlockEndWithSelectionAction->setEnabled(um != NoEditor);
|
m_gotoBlockEndWithSelectionAction->setEnabled(um != NoEditor);
|
||||||
m_selectBlockUpAction->setEnabled(um != NoEditor);
|
m_selectBlockUpAction->setEnabled(um != NoEditor);
|
||||||
m_selectBlockDownAction->setEnabled(um != NoEditor);
|
m_selectBlockDownAction->setEnabled(um != NoEditor);
|
||||||
|
m_moveLineUpAction->setEnabled(um != NoEditor);
|
||||||
|
m_moveLineDownAction->setEnabled(um != NoEditor);
|
||||||
|
|
||||||
m_visualizeWhitespaceAction->setEnabled(um != NoEditor);
|
m_visualizeWhitespaceAction->setEnabled(um != NoEditor);
|
||||||
if (m_currentEditor)
|
if (m_currentEditor)
|
||||||
@@ -390,6 +403,8 @@ FUNCTION(gotoBlockStartWithSelection)
|
|||||||
FUNCTION(gotoBlockEndWithSelection)
|
FUNCTION(gotoBlockEndWithSelection)
|
||||||
FUNCTION(selectBlockUp)
|
FUNCTION(selectBlockUp)
|
||||||
FUNCTION(selectBlockDown)
|
FUNCTION(selectBlockDown)
|
||||||
|
FUNCTION(moveLineUp)
|
||||||
|
FUNCTION(moveLineDown)
|
||||||
|
|
||||||
void TextEditorActionHandler::updateCurrentEditor(Core::IContext *object)
|
void TextEditorActionHandler::updateCurrentEditor(Core::IContext *object)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -116,6 +116,8 @@ private slots:
|
|||||||
void gotoBlockEndWithSelection();
|
void gotoBlockEndWithSelection();
|
||||||
void selectBlockUp();
|
void selectBlockUp();
|
||||||
void selectBlockDown();
|
void selectBlockDown();
|
||||||
|
void moveLineUp();
|
||||||
|
void moveLineDown();
|
||||||
void updateCurrentEditor(Core::IContext *object);
|
void updateCurrentEditor(Core::IContext *object);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -145,6 +147,8 @@ private:
|
|||||||
QAction *m_gotoBlockEndWithSelectionAction;
|
QAction *m_gotoBlockEndWithSelectionAction;
|
||||||
QAction *m_selectBlockUpAction;
|
QAction *m_selectBlockUpAction;
|
||||||
QAction *m_selectBlockDownAction;
|
QAction *m_selectBlockDownAction;
|
||||||
|
QAction *m_moveLineUpAction;
|
||||||
|
QAction *m_moveLineDownAction;
|
||||||
|
|
||||||
uint m_optionalActions;
|
uint m_optionalActions;
|
||||||
QPointer<BaseTextEditor> m_currentEditor;
|
QPointer<BaseTextEditor> m_currentEditor;
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ const char * const GOTO_BLOCK_END = "TextEditor.GotoBlockEnd";
|
|||||||
const char * const GOTO_BLOCK_END_WITH_SELECTION = "TextEditor.GotoBlockEndWithSelection";
|
const char * const GOTO_BLOCK_END_WITH_SELECTION = "TextEditor.GotoBlockEndWithSelection";
|
||||||
const char * const SELECT_BLOCK_UP = "TextEditor.SelectBlockUp";
|
const char * const SELECT_BLOCK_UP = "TextEditor.SelectBlockUp";
|
||||||
const char * const SELECT_BLOCK_DOWN = "TextEditor.SelectBlockDown";
|
const char * const SELECT_BLOCK_DOWN = "TextEditor.SelectBlockDown";
|
||||||
|
const char * const MOVE_LINE_UP = "TextEditor.MoveLineUp";
|
||||||
|
const char * const MOVE_LINE_DOWN = "TextEditor.MoveLineDown";
|
||||||
const char * const DELETE_LINE = "TextEditor.DeleteLine";
|
const char * const DELETE_LINE = "TextEditor.DeleteLine";
|
||||||
const char * const DELETE_WORD = "TextEditor.DeleteWord";
|
const char * const DELETE_WORD = "TextEditor.DeleteWord";
|
||||||
const char * const SELECT_ENCODING = "TextEditor.SelectEncoding";
|
const char * const SELECT_ENCODING = "TextEditor.SelectEncoding";
|
||||||
|
|||||||
@@ -53,6 +53,9 @@
|
|||||||
#include <QtNetwork/QHostAddress>
|
#include <QtNetwork/QHostAddress>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
#include <list>
|
||||||
|
#include <stack>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -71,6 +74,9 @@ uint qHash(const double & f)
|
|||||||
return int(f);
|
return int(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define X myns
|
||||||
|
X::QString str;
|
||||||
|
|
||||||
class Foo
|
class Foo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -126,8 +132,7 @@ void testArray()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testQByteArray()
|
||||||
void testByteArray()
|
|
||||||
{
|
{
|
||||||
QByteArray ba = "Hello";
|
QByteArray ba = "Hello";
|
||||||
ba += '"';
|
ba += '"';
|
||||||
@@ -137,8 +142,7 @@ void testByteArray()
|
|||||||
ba += 2;
|
ba += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testQHash()
|
||||||
void testHash()
|
|
||||||
{
|
{
|
||||||
QHash<int, float> hgg0;
|
QHash<int, float> hgg0;
|
||||||
hgg0[11] = 11.0;
|
hgg0[11] = 11.0;
|
||||||
@@ -162,7 +166,7 @@ void testHash()
|
|||||||
hash.insert(".", QPointer<QObject>(&ob));
|
hash.insert(".", QPointer<QObject>(&ob));
|
||||||
}
|
}
|
||||||
|
|
||||||
void testImage()
|
void testQImage()
|
||||||
{
|
{
|
||||||
QImage im(QSize(200, 200), QImage::Format_RGB32);
|
QImage im(QSize(200, 200), QImage::Format_RGB32);
|
||||||
im.fill(QColor(200, 100, 130).rgba());
|
im.fill(QColor(200, 100, 130).rgba());
|
||||||
@@ -190,7 +194,7 @@ void testIO()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void testList()
|
void testQList()
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
QList<int> li;
|
QList<int> li;
|
||||||
@@ -252,7 +256,7 @@ void testList()
|
|||||||
v.push_back("dd");
|
v.push_back("dd");
|
||||||
}
|
}
|
||||||
|
|
||||||
void testMap()
|
void testQMap()
|
||||||
{
|
{
|
||||||
QMap<uint, QStringList> ggl;
|
QMap<uint, QStringList> ggl;
|
||||||
ggl[11] = QStringList() << "11";
|
ggl[11] = QStringList() << "11";
|
||||||
@@ -287,7 +291,7 @@ void testMap()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void testObject(int &argc, char *argv[])
|
void testQObject(int &argc, char *argv[])
|
||||||
{
|
{
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
QAction act("xxx", &app);
|
QAction act("xxx", &app);
|
||||||
@@ -315,7 +319,7 @@ void testObject(int &argc, char *argv[])
|
|||||||
app.exec();
|
app.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
void testPixmap()
|
void testQPixmap()
|
||||||
{
|
{
|
||||||
QImage im(QSize(200, 200), QImage::Format_RGB32);
|
QImage im(QSize(200, 200), QImage::Format_RGB32);
|
||||||
im.fill(QColor(200, 100, 130).rgba());
|
im.fill(QColor(200, 100, 130).rgba());
|
||||||
@@ -351,7 +355,7 @@ void testPlugin()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testSet()
|
void testQSet()
|
||||||
{
|
{
|
||||||
QSet<int> hgg0;
|
QSet<int> hgg0;
|
||||||
hgg0.insert(11);
|
hgg0.insert(11);
|
||||||
@@ -373,65 +377,98 @@ void stringRefTest(const QString &refstring)
|
|||||||
Q_UNUSED(refstring);
|
Q_UNUSED(refstring);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testStdList()
|
||||||
int F(int a, int b)
|
|
||||||
{
|
{
|
||||||
return a + b;
|
std::list<int *> plist1;
|
||||||
}
|
|
||||||
|
|
||||||
int add(int i) { return i + 2; }
|
|
||||||
|
|
||||||
int mul(int i) { return i * 2; }
|
|
||||||
|
|
||||||
|
|
||||||
void testStdVector()
|
|
||||||
{
|
|
||||||
int x = F(add(1), mul(2));
|
|
||||||
Q_UNUSED(x);
|
|
||||||
std::vector<int *> plist1;
|
|
||||||
plist1.push_back(new int(1));
|
plist1.push_back(new int(1));
|
||||||
plist1.push_back(0);
|
plist1.push_back(0);
|
||||||
plist1.push_back(new int(2));
|
plist1.push_back(new int(2));
|
||||||
|
|
||||||
std::vector<int> flist2;
|
std::list<int> flist2;
|
||||||
flist2.push_back(1);
|
flist2.push_back(1);
|
||||||
flist2.push_back(2);
|
flist2.push_back(2);
|
||||||
flist2.push_back(3);
|
flist2.push_back(3);
|
||||||
flist2.push_back(4);
|
flist2.push_back(4);
|
||||||
|
|
||||||
int a = 1;
|
|
||||||
int b = 0;
|
|
||||||
|
|
||||||
while (0) {
|
|
||||||
a += 1;
|
|
||||||
if (b)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
flist2.push_back(1);
|
flist2.push_back(1);
|
||||||
flist2.push_back(2);
|
flist2.push_back(2);
|
||||||
flist2.push_back(3);
|
flist2.push_back(3);
|
||||||
flist2.push_back(4);
|
flist2.push_back(4);
|
||||||
|
|
||||||
std::vector<Foo *> plist;
|
std::list<Foo *> plist;
|
||||||
plist.push_back(new Foo(1));
|
plist.push_back(new Foo(1));
|
||||||
plist.push_back(0);
|
plist.push_back(0);
|
||||||
plist.push_back(new Foo(2));
|
plist.push_back(new Foo(2));
|
||||||
|
|
||||||
std::vector<Foo> flist;
|
std::list<Foo> flist;
|
||||||
flist.push_back(1);
|
flist.push_back(1);
|
||||||
|
|
||||||
flist.push_back(2);
|
flist.push_back(2);
|
||||||
flist.push_back(3);
|
flist.push_back(3);
|
||||||
flist.push_back(4);
|
flist.push_back(4);
|
||||||
//flist.takeFirst();
|
|
||||||
//flist.takeFirst();
|
|
||||||
|
|
||||||
std::vector<bool> vec;
|
std::list<bool> vec;
|
||||||
vec.push_back(true);
|
vec.push_back(true);
|
||||||
vec.push_back(false);
|
vec.push_back(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testStdMap()
|
||||||
|
{
|
||||||
|
std::map<uint, QStringList> ggl;
|
||||||
|
ggl[11] = QStringList() << "11";
|
||||||
|
ggl[22] = QStringList() << "22";
|
||||||
|
|
||||||
|
typedef std::map<uint, QStringList> T;
|
||||||
|
T ggt;
|
||||||
|
ggt[11] = QStringList() << "11";
|
||||||
|
ggt[22] = QStringList() << "22";
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
std::map<uint, float> gg0;
|
||||||
|
gg0[11] = 11.0;
|
||||||
|
gg0[22] = 22.0;
|
||||||
|
|
||||||
|
|
||||||
|
std::map<QString, float> gg1;
|
||||||
|
gg1["22.0"] = 22.0;
|
||||||
|
|
||||||
|
std::map<int, QString> gg2;
|
||||||
|
gg2[22] = "22.0";
|
||||||
|
|
||||||
|
std::map<QString, Foo> gg3;
|
||||||
|
gg3["22.0"] = Foo(22);
|
||||||
|
gg3["33.0"] = Foo(33);
|
||||||
|
|
||||||
|
QObject ob;
|
||||||
|
std::map<QString, QPointer<QObject> > map;
|
||||||
|
map.insert("Hallo", QPointer<QObject>(&ob));
|
||||||
|
map.insert("Welt", QPointer<QObject>(&ob));
|
||||||
|
map.insert(".", QPointer<QObject>(&ob));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void testStdStack()
|
||||||
|
{
|
||||||
|
std::stack<int *> plist1;
|
||||||
|
plist1.push(new int(1));
|
||||||
|
plist1.push(0);
|
||||||
|
plist1.push(new int(2));
|
||||||
|
plist1.pop();
|
||||||
|
plist1.pop();
|
||||||
|
plist1.pop();
|
||||||
|
|
||||||
|
std::stack<int> flist2;
|
||||||
|
flist2.push(1);
|
||||||
|
flist2.push(2);
|
||||||
|
|
||||||
|
std::stack<Foo *> plist;
|
||||||
|
plist.push(new Foo(1));
|
||||||
|
plist.push(new Foo(2));
|
||||||
|
|
||||||
|
std::stack<Foo> flist;
|
||||||
|
flist.push(1);
|
||||||
|
flist.push(2);
|
||||||
|
}
|
||||||
|
|
||||||
void testStdString()
|
void testStdString()
|
||||||
{
|
{
|
||||||
QString foo;
|
QString foo;
|
||||||
@@ -470,7 +507,43 @@ void testStdString()
|
|||||||
v.push_back(str);
|
v.push_back(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testString()
|
void testStdVector()
|
||||||
|
{
|
||||||
|
std::vector<int *> plist1;
|
||||||
|
plist1.push_back(new int(1));
|
||||||
|
plist1.push_back(0);
|
||||||
|
plist1.push_back(new int(2));
|
||||||
|
|
||||||
|
std::vector<int> flist2;
|
||||||
|
flist2.push_back(1);
|
||||||
|
flist2.push_back(2);
|
||||||
|
flist2.push_back(3);
|
||||||
|
flist2.push_back(4);
|
||||||
|
|
||||||
|
flist2.push_back(1);
|
||||||
|
flist2.push_back(2);
|
||||||
|
flist2.push_back(3);
|
||||||
|
flist2.push_back(4);
|
||||||
|
|
||||||
|
std::vector<Foo *> plist;
|
||||||
|
plist.push_back(new Foo(1));
|
||||||
|
plist.push_back(0);
|
||||||
|
plist.push_back(new Foo(2));
|
||||||
|
|
||||||
|
std::vector<Foo> flist;
|
||||||
|
flist.push_back(1);
|
||||||
|
flist.push_back(2);
|
||||||
|
flist.push_back(3);
|
||||||
|
flist.push_back(4);
|
||||||
|
//flist.takeFirst();
|
||||||
|
//flist.takeFirst();
|
||||||
|
|
||||||
|
std::vector<bool> vec;
|
||||||
|
vec.push_back(true);
|
||||||
|
vec.push_back(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testQString()
|
||||||
{
|
{
|
||||||
QString str = "Hello ";
|
QString str = "Hello ";
|
||||||
str += " big, ";
|
str += " big, ";
|
||||||
@@ -480,19 +553,9 @@ void testString()
|
|||||||
str += " World ";
|
str += " World ";
|
||||||
str += " World ";
|
str += " World ";
|
||||||
str += " World ";
|
str += " World ";
|
||||||
str += " World ";
|
|
||||||
str += " World ";
|
|
||||||
str += " World ";
|
|
||||||
str += " World ";
|
|
||||||
str += " World ";
|
|
||||||
str += " World ";
|
|
||||||
str += " World ";
|
|
||||||
str += " World ";
|
|
||||||
str += " World ";
|
|
||||||
str += " World ";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void testString3()
|
void testQString3()
|
||||||
{
|
{
|
||||||
QString str = "Hello ";
|
QString str = "Hello ";
|
||||||
str += " big, ";
|
str += " big, ";
|
||||||
@@ -508,7 +571,7 @@ void testString3()
|
|||||||
delete pstring;
|
delete pstring;
|
||||||
}
|
}
|
||||||
|
|
||||||
void testStringList()
|
void testQStringList()
|
||||||
{
|
{
|
||||||
QStringList l;
|
QStringList l;
|
||||||
l << "Hello ";
|
l << "Hello ";
|
||||||
@@ -542,7 +605,7 @@ private:
|
|||||||
int m_id;
|
int m_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
void testThreads()
|
void testQThread()
|
||||||
{
|
{
|
||||||
Thread thread1(1);
|
Thread thread1(1);
|
||||||
Thread thread2(2);
|
Thread thread2(2);
|
||||||
@@ -552,7 +615,7 @@ void testThreads()
|
|||||||
thread2.wait();
|
thread2.wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
void testVariant1()
|
void testQVariant1()
|
||||||
{
|
{
|
||||||
QVariant v;
|
QVariant v;
|
||||||
v = 1;
|
v = 1;
|
||||||
@@ -561,7 +624,7 @@ void testVariant1()
|
|||||||
v = 1;
|
v = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void testVariant2()
|
void testQVariant2()
|
||||||
{
|
{
|
||||||
QVariant var;
|
QVariant var;
|
||||||
#if 0
|
#if 0
|
||||||
@@ -586,7 +649,7 @@ void testVariant2()
|
|||||||
var.setValue(my);
|
var.setValue(my);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testVariant3()
|
void testQVariant3()
|
||||||
{
|
{
|
||||||
QList<int> list;
|
QList<int> list;
|
||||||
list << 1 << 2 << 3;
|
list << 1 << 2 << 3;
|
||||||
@@ -595,8 +658,10 @@ void testVariant3()
|
|||||||
list = qVariantValue<QList<int> >(variant);
|
list = qVariantValue<QList<int> >(variant);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testVector()
|
void testQVector()
|
||||||
{
|
{
|
||||||
|
QVector<int> big(10000);
|
||||||
|
|
||||||
QVector<Foo *> plist;
|
QVector<Foo *> plist;
|
||||||
plist.append(new Foo(1));
|
plist.append(new Foo(1));
|
||||||
plist.append(0);
|
plist.append(0);
|
||||||
@@ -616,7 +681,7 @@ void testVector()
|
|||||||
vec.append(false);
|
vec.append(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testVectorOfList()
|
void testQVectorOfQList()
|
||||||
{
|
{
|
||||||
QVector<QList<int> > v;
|
QVector<QList<int> > v;
|
||||||
QVector<QList<int> > *pv = &v;
|
QVector<QList<int> > *pv = &v;
|
||||||
@@ -729,16 +794,9 @@ void testNamespace()
|
|||||||
bar.doit(1);
|
bar.doit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
|
void testHidden()
|
||||||
{
|
{
|
||||||
testIO();
|
|
||||||
//QString s;
|
|
||||||
//s = "hallo";
|
|
||||||
//QList<QVector<int> *> vi;
|
|
||||||
//QList<QVector<double> *> vd;
|
|
||||||
//int n = A::barz();
|
|
||||||
|
|
||||||
|
|
||||||
int n = 1;
|
int n = 1;
|
||||||
n = 2;
|
n = 2;
|
||||||
n = 3;
|
n = 3;
|
||||||
@@ -762,34 +820,43 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
++n;
|
++n;
|
||||||
++n;
|
++n;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
//testIO();
|
||||||
|
testHidden();
|
||||||
testArray();
|
testArray();
|
||||||
testStdVector();
|
|
||||||
|
testStdList();
|
||||||
|
testStdMap();
|
||||||
|
testStdStack();
|
||||||
testStdString();
|
testStdString();
|
||||||
|
testStdVector();
|
||||||
|
|
||||||
testPlugin();
|
testPlugin();
|
||||||
testList();
|
testQList();
|
||||||
testNamespace();
|
testNamespace();
|
||||||
//return 0;
|
//return 0;
|
||||||
testByteArray();
|
testQByteArray();
|
||||||
testHash();
|
testQHash();
|
||||||
testImage();
|
testQImage();
|
||||||
testMap();
|
testQMap();
|
||||||
testString();
|
testQString();
|
||||||
testSet();
|
testQSet();
|
||||||
testStringList();
|
testQStringList();
|
||||||
testStruct();
|
testStruct();
|
||||||
//testThreads();
|
//testThreads();
|
||||||
testVariant1();
|
testQVariant1();
|
||||||
testVariant2();
|
testQVariant2();
|
||||||
testVariant3();
|
testQVariant3();
|
||||||
testVector();
|
testQVector();
|
||||||
testVectorOfList();
|
testQVectorOfQList();
|
||||||
|
|
||||||
|
|
||||||
*(int *)0 = 0;
|
*(int *)0 = 0;
|
||||||
|
|
||||||
testObject(argc, argv);
|
testQObject(argc, argv);
|
||||||
|
|
||||||
|
|
||||||
//QColor color(255,128,10);
|
//QColor color(255,128,10);
|
||||||
|
|||||||
Reference in New Issue
Block a user