Merge branch 'master' of git@scm.dev.nokia.troll.no:creator/mainline

This commit is contained in:
dt
2009-01-12 18:26:52 +01:00
76 changed files with 1591 additions and 1076 deletions

View File

@@ -4,6 +4,10 @@
Qt Creator is Qt Software's crossplatform IDE. The core of Qt Creator is
basically only a \l{ExtensionSystem}{plugin loader}.
All functionality is implemented in plugins, the basis of Qt Creator is
implemented in the \l{Core} {Core} Plugin. The plugin manager provides
simple means for plugin cooperation that allow plugins to provide
hooks for other plugin's extensions.
\section1 Core Libraries

View File

@@ -6,14 +6,14 @@ language = Cpp
headerdirs = . \
../../src/libs/aggregation \
../../src/libs/extensionsystem \
../../src/plugins/core \
../../src/plugins/core/actionmanager
../../src/plugins/coreplugin \
../../src/plugins/coreplugin/actionmanager
sourcedirs = . \
../../src/libs/aggregation \
../../src/libs/extensionsystem \
../../src/plugins/core \
../../src/plugins/core/actionmanager
../../src/plugins/coreplugin \
../../src/plugins/coreplugin/actionmanager
headers.fileextesnions = "*.h"
sources.fileextensions = "*.cpp *.qdoc"

View File

@@ -54,6 +54,7 @@
\o \l{Navigating Quickly Around Your Code with Locator}
\o \l{Debugging with Qt Creator}
\o \l{Tips and Tricks}
\o \l{Keyboard Shortcuts}
\o \l{Glossary}
\o \l{Known Issues of Version 0.9.1 (Beta)}
\endlist
@@ -150,6 +151,26 @@
\image qtcreator-compile-pane.png
\section1 Session Management in Qt Creator
### screenshot
In Qt Creator, a session is a collection of loaded projects, opened files,
editor settings, and so on. When you run Qt Creator, you have a default
session. You can create a new session using the \gui{Session Manager...},
available in the \gui{File -> Session} menu.
To switch between sessions, select \gui{File -> Session}. If you do not
create and select any session, Qt Creator will always use the default
session.
\omit
session management can also store project dependencies, thorbjorn is
currently working on it
\endomit
\section1 Qt Help Integration
Qt Creator comes fully integrated with all of Qt's documentation and
@@ -380,9 +401,11 @@
We begin with a Qt4 Gui Application project generated by Qt Creator. The
\l{Creating a Project in Qt Creator} document describes this process in
detail. Remember to select QWidget as the Text Finder's base class.
detail. Remember to select QWidget as the Text Finder's base class. If
your project is not yet loaded, you can load it by selecting \gui{Open}
from the \gui{File} menu.
Once your project is generated, you will have the following files:
In your project you will have the following files:
\list
\o \c{textfinder.h}

View File

@@ -3898,6 +3898,8 @@ void IdentifierListAST::accept0(ASTVisitor *visitor)
unsigned ObjCClassDeclarationAST::firstToken() const
{
if (attributes)
return attributes->firstToken();
return class_token;
}
@@ -3911,12 +3913,19 @@ unsigned ObjCClassDeclarationAST::lastToken() const
return it->identifier_token + 1;
}
for (SpecifierAST *it = attributes; it; it = it->next) {
if (! it->next)
return it->lastToken();
}
return class_token + 1;
}
ObjCClassDeclarationAST *ObjCClassDeclarationAST::clone(MemoryPool *pool) const
{
ObjCClassDeclarationAST *ast = new (pool) ObjCClassDeclarationAST;
if (attributes)
ast->attributes = attributes->clone(pool);
ast->class_token = class_token;
if (identifier_list)
ast->identifier_list = identifier_list->clone(pool);
@@ -3927,6 +3936,9 @@ ObjCClassDeclarationAST *ObjCClassDeclarationAST::clone(MemoryPool *pool) const
void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
for (SpecifierAST *it = attributes; it; it = it->next) {
accept(it, visitor);
}
}
}

View File

@@ -1949,6 +1949,7 @@ protected:
class CPLUSPLUS_EXPORT ObjCClassDeclarationAST: public DeclarationAST
{
public:
SpecifierAST *attributes;
unsigned class_token;
IdentifierListAST *identifier_list;
unsigned semicolon_token;

View File

@@ -403,39 +403,48 @@ bool Parser::parseDeclaration(DeclarationAST *&node)
case T_EXPORT:
return parseTemplateDeclaration(node);
// objc++
case T_AT_IMPLEMENTATION:
return parseObjCClassImplementation(node);
// ObjcC++
case T_AT_CLASS:
return parseObjCClassDeclaration(node);
case T_AT_INTERFACE:
return parseObjCInterfaceDeclaration(node);
return parseObjCInterface(node);
case T_AT_PROTOCOL:
return parseObjCProtocolDeclaration(node);
return parseObjCProtocol(node);
case T_AT_IMPLEMENTATION:
return parseObjCImplementation(node);
case T_AT_END:
return parseObjCEndDeclaration(node);
return parseObjCEnd(node);
case T_AT_COMPATIBILITY_ALIAS:
return parseObjCAliasDeclaration(node);
default: {
if (_objCEnabled && LA() == T___ATTRIBUTE__) {
const unsigned start = cursor();
SpecifierAST *attributes = 0, **attr = &attributes;
while (parseAttributeSpecifier(*attr))
attr = &(*attr)->next;
if (LA() == T_AT_INTERFACE)
return parseObjCInterface(node, attributes);
else if (LA() == T_AT_PROTOCOL)
return parseObjCProtocol(node, attributes);
else if (LA() == T_AT_PROPERTY)
return parseObjCPropertyDeclaration(node, attributes);
rewind(start);
}
case T_AT_SYNTHESIZE:
return parseObjCPropertySynthesize(node);
case T_AT_DYNAMIC:
return parseObjCPropertyDynamic(node);
default:
if (LA() == T_EXTERN && LA(2) == T_TEMPLATE)
return parseTemplateDeclaration(node);
else if (LA() == T_EXTERN && LA(2) == T_STRING_LITERAL)
return parseLinkageSpecification(node);
else
return parseSimpleDeclaration(node);
} break; // default
} // end switch
return false;
}
bool Parser::parseLinkageSpecification(DeclarationAST *&node)
@@ -2543,16 +2552,7 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node)
case T_SLOT:
return parseQtMethod(node);
case T_AT_ENCODE:
case T_AT_PROTOCOL:
case T_AT_SELECTOR:
case T_AT_STRING_LITERAL:
return parseObjCExpression(node);
default: {
if (_objCEnabled && LA() == T_LBRACKET)
return parseObjCExpression(node);
unsigned startOfName = cursor();
NameAST *name = 0;
if (parseName(name)) {
@@ -3303,491 +3303,6 @@ bool Parser::parseThrowExpression(ExpressionAST *&node)
return false;
}
bool Parser::parseObjCClassImplementation(DeclarationAST *&)
{
if (LA() != T_AT_IMPLEMENTATION)
return false;
/*unsigned implementation_token = */ consumeToken();
unsigned identifier_token = 0;
match(T_IDENTIFIER, &identifier_token);
if (LA() == T_COLON) {
/*unsigned colon_token = */ consumeToken();
unsigned superclass_name_token = 0;
match(T_IDENTIFIER, &superclass_name_token);
} else if (LA() == T_LPAREN) {
/*unsigned lparen_token = */ consumeToken();
unsigned category_name_token = 0;
if (LA() == T_IDENTIFIER)
category_name_token = consumeToken();
unsigned rparen_token = 0;
match(T_RPAREN, &rparen_token);
}
_inObjCImplementationContext = true;
parseObjCMethodDefinitionList();
return true;
}
bool Parser::parseObjCClassDeclaration(DeclarationAST *&node)
{
if (LA() != T_AT_CLASS)
return false;
ObjCClassDeclarationAST *ast = new (_pool) ObjCClassDeclarationAST;
ast->class_token = consumeToken();
parseObjCIdentifierList(ast->identifier_list);
match(T_SEMICOLON, &ast->semicolon_token);
node = ast;
return true;
}
bool Parser::parseObjCInterfaceDeclaration(DeclarationAST *&)
{
if (LA() != T_AT_INTERFACE)
return false;
/*unsigned interface_token = */ consumeToken();
unsigned interface_name_token = 0;
match(T_IDENTIFIER, &interface_name_token);
if (LA() == T_LPAREN) {
// category interface
/*unsigned lparen_token = */ consumeToken();
unsigned catagory_name_token = 0;
if (LA() == T_IDENTIFIER)
catagory_name_token = consumeToken();
unsigned rparen_token = 0;
match(T_RPAREN, &rparen_token);
parseObjCProtocolRefs();
parseObjCClassInstanceVariables();
parseObjCInterfaceDeclList();
unsigned end_token = 0;
match(T_AT_END, &end_token);
return true;
} else {
// class interface
unsigned colon_token = 0;
unsigned super_class_token = 0;
if (LA() == T_COLON) {
colon_token = consumeToken();
match(T_IDENTIFIER, &super_class_token);
}
parseObjCProtocolRefs();
parseObjCInterfaceDeclList();
unsigned end_token = 0;
match(T_AT_END, &end_token);
return true;
}
return false;
}
bool Parser::parseObjCProtocolDeclaration(DeclarationAST *&)
{
return false;
}
bool Parser::parseObjCEndDeclaration(DeclarationAST *&)
{
if (LA() != T_AT_END)
return false;
unsigned end_token = consumeToken();
if (! _inObjCImplementationContext) {
_translationUnit->warning(end_token,
"@end must appear in an @implementation context");
}
_inObjCImplementationContext = false;
return true;
}
bool Parser::parseObjCAliasDeclaration(DeclarationAST *&)
{
return false;
}
bool Parser::parseObjCPropertySynthesize(DeclarationAST *&)
{
return false;
}
bool Parser::parseObjCPropertyDynamic(DeclarationAST *&)
{
return false;
}
bool Parser::parseObjCIdentifierList(IdentifierListAST *&node)
{
if (LA() == T_IDENTIFIER) {
IdentifierListAST **it = &node;
IdentifierListAST *id = new (_pool) IdentifierListAST;
id->identifier_token = consumeToken();
*it = id;
while (LA() == T_COMMA) {
consumeToken();
if (LA() == T_IDENTIFIER) {
it = &(*it)->next;
IdentifierListAST *id = new (_pool) IdentifierListAST;
id->identifier_token = consumeToken();
*it = id;
}
}
return true;
}
return false;
}
bool Parser::parseObjCProtocolRefs()
{
return false;
}
bool Parser::parseObjCClassInstanceVariables()
{
return false;
}
bool Parser::parseObjCInterfaceDeclList()
{
unsigned saved = cursor();
while (LA() != T_AT_END && parseObjCInterfaceMemberDeclaration()) {
if (saved == cursor())
consumeToken(); // skip a token
}
return true;
}
bool Parser::parseObjCInterfaceMemberDeclaration()
{
switch (LA()) {
case T_SEMICOLON:
consumeToken();
return true;
case T_AT_REQUIRED:
case T_AT_OPTIONAL:
consumeToken();
return true;
case T_PLUS:
case T_MINUS:
return parseObjCMethodPrototype();
default: {
DeclarationAST *declaration = 0;
if (parseDeclaration(declaration))
return true;
} // default
} // switch
return false;
}
bool Parser::parseObjCPropertyDeclaration(DeclarationAST *&)
{
return false;
}
bool Parser::parseObjCMethodPrototype()
{
if (LA() != T_PLUS && LA() != T_MINUS)
return false;
// instance or class method?
/*unsigned method_type_token = */ consumeToken();
SpecifierAST *attributes = 0, **attr = &attributes;
while (parseAttributeSpecifier(*attr))
attr = &(*attr)->next;
return false;
}
bool Parser::parseObjCExpression(ExpressionAST *&node)
{
switch (LA()) {
case T_LBRACKET:
return parseObjCMessageExpression(node);
case T_AT_STRING_LITERAL:
return parseObjCStringLiteral(node);
case T_AT_ENCODE:
return parseObjCEncodeExpression(node);
case T_AT_PROTOCOL:
return parseObjCProtocolExpression(node);
case T_AT_SELECTOR:
return parseObjCSelectorExpression(node);
}
return false;
}
bool Parser::parseObjCMessageExpression(ExpressionAST *&)
{
if (LA() != T_LBRACKET)
return false;
/*unsigned lbracket_token = */ consumeToken();
ExpressionAST *receiver = 0;
parseObjCMessageReceiver(receiver);
parseObjCMessageArguments();
unsigned rbracket_token = 0;
match(T_RBRACKET, &rbracket_token);
return true;
}
bool Parser::parseObjCStringLiteral(ExpressionAST *&)
{
if (LA() != T_AT_STRING_LITERAL)
return false;
do {
consumeToken();
} while (LA() == T_AT_STRING_LITERAL);
return true;
}
bool Parser::parseObjCEncodeExpression(ExpressionAST *&)
{
if (LA() != T_AT_ENCODE)
return false;
/*unsigned encode_token = */ consumeToken();
unsigned lparen_token = 0, rparen_token = 0;
match(T_LPAREN, &lparen_token);
SpecifierAST *type_specifier = 0;
parseSimpleTypeSpecifier(type_specifier);
match(T_RPAREN, &rparen_token);
return true;
}
bool Parser::parseObjCProtocolExpression(ExpressionAST *&)
{
if (LA() != T_AT_PROTOCOL)
return false;
/*unsigned protocol_token = */ consumeToken();
unsigned protocol_name_token = 0, lparen_token = 0, rparen_token = 0;
match(T_LPAREN, &lparen_token);
match(T_IDENTIFIER, &protocol_name_token);
match(T_RPAREN, &rparen_token);
return true;
}
bool Parser::parseObjCSelectorExpression(ExpressionAST *&)
{
if (LA() != T_AT_SELECTOR)
return false;
/*unsigned selector_token = */ consumeToken();
unsigned lparen_token = 0, rparen_token = 0;
match(T_LPAREN, &lparen_token);
while (LA(1) == T_IDENTIFIER && LA(2) == T_COLON) {
/*unsigned identifier_token = */ consumeToken();
/*unsigned colon_token = */ consumeToken();
}
match(T_RPAREN, &rparen_token);
return true;
}
bool Parser::parseObjCMessageReceiver(ExpressionAST *&node)
{
// ### expression or simple-type-specifier.
return parseExpression(node);
}
bool Parser::parseObjCMessageArguments()
{
if (LA() != T_IDENTIFIER && LA() != T_COLON)
return false;
unsigned selector_name_token = 0;
if (LA() == T_IDENTIFIER)
selector_name_token = consumeToken();
if (LA() == T_COLON) {
/*unsigned colon_token = */ consumeToken();
ExpressionAST *expr = 0;
parseAssignmentExpression(expr);
while ((LA() == T_IDENTIFIER && LA(2) == T_COLON) || LA() == T_COLON) {
if (LA() == T_IDENTIFIER)
consumeToken();
if (LA() == T_COLON)
consumeToken();
parseAssignmentExpression(expr);
}
while (LA() == T_COMMA) {
consumeToken();
parseAssignmentExpression(expr);
}
}
return true;
}
bool Parser::parseObjCMethodDefinitionList()
{
bool done = false;
while (! done) {
switch (LA()) {
case T_EOF_SYMBOL:
case T_AT_END:
done = true;
break;
case T_PLUS:
case T_MINUS:
parseObjCMethodSignature();
if (LA() == T_SEMICOLON)
consumeToken();
break;
case T_AT_PROPERTY:
parseObjCAtProperty();
break;
case T_SEMICOLON:
consumeToken();
break;
case T_AT_OPTIONAL:
consumeToken();
break;
case T_AT_REQUIRED:
consumeToken();
break;
case T_TEMPLATE:
case T_NAMESPACE: {
DeclarationAST *declaration = 0;
parseDeclaration(declaration);
} break;
default: {
unsigned start = cursor();
DeclarationAST *declaration = 0;
if (LA(1) == T_EXTERN && LA(2) == T_STRING_LITERAL) {
parseLinkageSpecification(declaration);
} else if (parseBlockDeclaration(declaration)) {
// ### accept the declaration.
} else {
if (cursor() == start) {
_translationUnit->error(cursor(),
"stray `%s' between Objective-C++ methods",
tok().spell());
consumeToken();
}
}
} break; // default
} // switch
}
return true;
}
bool Parser::parseObjCMethodSignature()
{
if (LA() != T_PLUS && LA() != T_MINUS)
return false;
/*unsigned method_type_token = */ consumeToken();
parseObjCTypeName();
bool first = true;
while (lookAtObjCSelector() || LA() == T_COLON) {
if (LA() != T_COLON)
/*selector_name_token = */ consumeToken();
SpecifierAST *attributes = 0, **attr = &attributes;
while (parseAttributeSpecifier(*attr))
attr = &(*attr)->next;
if (first) {
first = false;
if (LA() != T_COLON)
break;
}
unsigned colon_token = 0;
match(T_COLON, &colon_token);
parseObjCTypeName();
unsigned identifier_token = 0;
match(T_IDENTIFIER, &identifier_token);
while (parseAttributeSpecifier(*attr))
attr = &(*attr)->next;
}
// parse the method tail parameters.
while (LA() == T_COMMA) {
consumeToken();
if (LA() == T_DOT_DOT_DOT) {
consumeToken();
break;
}
DeclarationAST *parameter_declaration = 0;
parseParameterDeclaration(parameter_declaration);
}
return true;
}
bool Parser::parseObjCTypeName()
{
if (LA() != T_LPAREN)
return false;
/*unsigned lparen_token = */ consumeToken();
parseObjCProtocolQualifiers();
ExpressionAST *type_id = 0;
if (LA() != T_RPAREN)
parseTypeId(type_id);
SpecifierAST *attributes = 0, **attr = &attributes;
while (parseAttributeSpecifier(*attr))
attr = &(*attr)->next;
unsigned rparen_token = 0;
match(T_RPAREN, &rparen_token);
return true;
}
bool Parser::parseObjCAtProperty()
{
if (LA() != T_AT_PROPERTY)
return false;
/*unsigned property_token = */ consumeToken();
return true;
}
bool Parser::parseObjCProtocolQualifiers()
{
return false;
}
bool Parser::lookAtObjCSelector() const
{
switch (LA()) {
@@ -3812,4 +3327,427 @@ bool Parser::lookAtObjCSelector() const
return false;
}
// objc-class-declaraton ::= T_AT_CLASS (T_IDENTIFIER @ T_COMMA) T_SEMICOLON
//
bool Parser::parseObjCClassDeclaration(DeclarationAST *&)
{
if (LA() != T_AT_CLASS)
return false;
/*unsigned objc_class_token = */ consumeToken();
unsigned identifier_token = 0;
match(T_IDENTIFIER, &identifier_token);
while (LA() == T_COMMA) {
consumeToken(); // skip T_COMMA
match(T_IDENTIFIER, &identifier_token);
}
unsigned semicolon_token = 0;
match(T_SEMICOLON, &semicolon_token);
return true;
}
// objc-interface ::= attribute-specifier-list-opt objc-class-interface
// objc-interface ::= objc-category-interface
//
// objc-class-interface ::= T_AT_INTERFACE T_IDENTIFIER (T_COLON T_IDENTIFIER)?
// objc-protocol-refs-opt
// objc-class-instance-variables-opt
// objc-interface-declaration-list
// T_AT_END
//
// objc-category-interface ::= T_AT_INTERFACE T_IDENTIFIER
// T_LPAREN T_IDENTIFIER? T_RPAREN
// objc-protocol-refs-opt
// objc-interface-declaration-list
// T_AT_END
//
bool Parser::parseObjCInterface(DeclarationAST *&,
SpecifierAST *attributes)
{
if (! attributes && LA() == T___ATTRIBUTE__) {
SpecifierAST **attr = &attributes;
while (parseAttributeSpecifier(*attr))
attr = &(*attr)->next;
}
if (LA() != T_AT_INTERFACE)
return false;
/*unsigned objc_interface_token = */ consumeToken();
unsigned identifier_token = 0;
match(T_IDENTIFIER, &identifier_token);
if (LA() == T_LPAREN) {
// a category interface
if (attributes)
_translationUnit->error(attributes->firstToken(),
"invalid attributes for category interface declaration");
unsigned lparen_token = 0, rparen_token = 0;
match(T_LPAREN, &lparen_token);
if (LA() == T_IDENTIFIER)
consumeToken();
match(T_RPAREN, &rparen_token);
parseObjCProtocolRefs();
while (parseObjCInterfaceMemberDeclaration()) {
}
unsigned objc_end_token = 0;
match(T_AT_END, &objc_end_token);
return true;
}
// a class interface declaration
if (LA() == T_COLON) {
consumeToken();
unsigned identifier_token = 0;
match(T_IDENTIFIER, &identifier_token);
}
parseObjCProtocolRefs();
parseObjClassInstanceVariables();
while (parseObjCInterfaceMemberDeclaration()) {
}
unsigned objc_end_token = 0;
match(T_AT_END, &objc_end_token);
return true;
}
// objc-protocol ::= T_AT_PROTOCOL (T_IDENTIFIER @ T_COMMA) T_SEMICOLON
//
bool Parser::parseObjCProtocol(DeclarationAST *&,
SpecifierAST *attributes)
{
if (! attributes && LA() == T___ATTRIBUTE__) {
SpecifierAST **attr = &attributes;
while (parseAttributeSpecifier(*attr))
attr = &(*attr)->next;
}
if (LA() != T_AT_PROTOCOL)
return false;
/*unsigned objc_protocol_token = */ consumeToken();
unsigned identifier_token = 0;
match(T_IDENTIFIER, &identifier_token);
if (LA() == T_COMMA || LA() == T_SEMICOLON) {
// a protocol forward declaration
while (LA() == T_COMMA) {
consumeToken();
match(T_IDENTIFIER, &identifier_token);
}
unsigned semicolon_token = 0;
match(T_SEMICOLON, &semicolon_token);
return true;
}
// a protocol definition
parseObjCProtocolRefs();
while (parseObjCInterfaceMemberDeclaration()) {
}
unsigned objc_end_token = 0;
match(T_AT_END, &objc_end_token);
return true;
}
// objc-implementation ::= T_AT_IMPLEMENTAION T_IDENTIFIER (T_COLON T_IDENTIFIER)?
// objc-class-instance-variables-opt
// objc-implementation ::= T_AT_IMPLEMENTAION T_IDENTIFIER T_LPAREN T_IDENTIFIER T_RPAREN
//
bool Parser::parseObjCImplementation(DeclarationAST *&)
{
if (LA() != T_AT_IMPLEMENTATION)
return false;
consumeToken();
unsigned identifier_token = 0;
match(T_IDENTIFIER, &identifier_token);
if (LA() == T_LPAREN) {
// a category implementation
unsigned lparen_token = 0, rparen_token = 0;
unsigned category_name_token = 0;
match(T_LPAREN, &lparen_token);
match(T_IDENTIFIER, &category_name_token);
match(T_RPAREN, &rparen_token);
return true;
}
// a class implementation
if (LA() == T_COLON) {
consumeToken();
unsigned super_class_name_token = 0;
match(T_IDENTIFIER, &super_class_name_token);
}
parseObjClassInstanceVariables();
return true;
}
// objc-protocol-refs ::= T_LESS (T_IDENTIFIER @ T_COMMA) T_GREATER
//
bool Parser::parseObjCProtocolRefs()
{
if (LA() != T_LESS)
return false;
unsigned less_token = 0, greater_token = 0;
unsigned identifier_token = 0;
match(T_LESS, &less_token);
match(T_IDENTIFIER, &identifier_token);
while (LA() == T_COMMA) {
consumeToken();
match(T_IDENTIFIER, &identifier_token);
}
match(T_GREATER, &greater_token);
return true;
}
// objc-class-instance-variables ::= T_LBRACE
// objc-instance-variable-decl-list-opt
// T_RBRACE
//
bool Parser::parseObjClassInstanceVariables()
{
if (LA() != T_LBRACE)
return false;
unsigned lbrace_token = 0, rbrace_token = 0;
match(T_LBRACE, &lbrace_token);
while (LA()) {
if (LA() == T_RBRACE)
break;
const unsigned start = cursor();
DeclarationAST *declaration = 0;
parseObjCInstanceVariableDeclaration(declaration);
if (start == cursor()) {
// skip stray token.
_translationUnit->error(cursor(), "skip stray token `%s'", tok().spell());
consumeToken();
}
}
match(T_RBRACE, &rbrace_token);
return true;
}
// objc-interface-declaration ::= T_AT_REQUIRED
// objc-interface-declaration ::= T_AT_OPTIONAL
// objc-interface-declaration ::= T_SEMICOLON
// objc-interface-declaration ::= objc-property-declaration
// objc-interface-declaration ::= objc-method-prototype
bool Parser::parseObjCInterfaceMemberDeclaration()
{
switch (LA()) {
case T_AT_REQUIRED:
case T_AT_OPTIONAL:
consumeToken();
return true;
case T_SEMICOLON:
consumeToken();
return true;
case T_AT_PROPERTY: {
DeclarationAST *declaration = 0;
return parseObjCPropertyDeclaration(declaration);
}
case T_PLUS:
case T_MINUS:
return parseObjCMethodPrototype();
default:
return false;
}
}
// objc-instance-variable-declaration ::= objc-visibility-specifier
// objc-instance-variable-declaration ::= block-declaration
//
bool Parser::parseObjCInstanceVariableDeclaration(DeclarationAST *&node)
{
switch (LA()) {
case T_AT_PRIVATE:
case T_AT_PROTECTED:
case T_AT_PUBLIC:
case T_AT_PACKAGE:
consumeToken();
return true;
default:
return parseBlockDeclaration(node);
}
}
// objc-property-declaration ::=
// T_AT_PROPERTY T_LPAREN (property-attribute @ T_COMMA) T_RPAREN simple-declaration
//
bool Parser::parseObjCPropertyDeclaration(DeclarationAST *&, SpecifierAST *)
{
if (LA() != T_AT_PROPERTY)
return false;
/*unsigned objc_property_token = */ consumeToken();
if (LA() == T_LPAREN) {
unsigned lparen_token = 0, rparen_token = 0;
match(T_LPAREN, &lparen_token);
while (parseObjCPropertyAttribute()) {
}
match(T_RPAREN, &rparen_token);
}
DeclarationAST *simple_declaration = 0;
parseSimpleDeclaration(simple_declaration, /*accept-struct-declarators = */ false);
return true;
}
// objc-method-prototype ::= (T_PLUS | T_MINUS) objc-method-decl objc-method-attrs-opt
//
// objc-method-decl ::= objc-type-name? objc-selector
// objc-method-decl ::= objc-type-name? objc-keyword-decl-list objc-parmlist-opt
//
bool Parser::parseObjCMethodPrototype()
{
if (LA() != T_PLUS && LA() != T_MINUS)
return false;
/*unsigned method_type_token = */ consumeToken();
parseObjCTypeName();
if ((lookAtObjCSelector() && LA(2) == T_COLON) || LA() == T_COLON) {
while (parseObjCKeywordDeclaration()) {
}
while (LA() == T_COMMA) {
consumeToken();
if (LA() == T_DOT_DOT_DOT) {
consumeToken();
break;
}
DeclarationAST *parameter_declaration = 0;
parseParameterDeclaration(parameter_declaration);
}
} else if (lookAtObjCSelector()) {
parseObjCSelector();
} else {
_translationUnit->error(cursor(), "expected a selector");
}
SpecifierAST *attributes = 0, **attr = &attributes;
while (parseAttributeSpecifier(*attr))
attr = &(*attr)->next;
return true;
}
// objc-property-attribute ::= getter '=' identifier
// objc-property-attribute ::= setter '=' identifier ':'
// objc-property-attribute ::= readonly
// objc-property-attribute ::= readwrite
// objc-property-attribute ::= assign
// objc-property-attribute ::= retain
// objc-property-attribute ::= copy
// objc-property-attribute ::= nonatomic
bool Parser::parseObjCPropertyAttribute()
{
if (LA() != T_IDENTIFIER)
return false;
unsigned identifier_token = 0;
match(T_IDENTIFIER, &identifier_token);
if (LA() == T_EQUAL) {
consumeToken();
match(T_IDENTIFIER, &identifier_token);
if (LA() == T_COLON)
consumeToken();
}
return true;
}
// objc-type-name ::= T_LPAREN objc-type-qualifiers-opt type-id T_RPAREN
//
bool Parser::parseObjCTypeName()
{
if (LA() != T_LPAREN)
return false;
unsigned lparen_token = 0, rparen_token = 0;
match(T_LPAREN, &lparen_token);
parseObjCTypeQualifiers();
ExpressionAST *type_id = 0;
parseTypeId(type_id);
match(T_RPAREN, &rparen_token);
return true;
}
// objc-selector ::= T_IDENTIFIER | keyword
//
bool Parser::parseObjCSelector()
{
if (! lookAtObjCSelector())
return false;
consumeToken();
return true;
}
// objc-keyword-decl ::= objc-selector? T_COLON objc-type-name? objc-keyword-attributes-opt T_IDENTIFIER
//
bool Parser::parseObjCKeywordDeclaration()
{
if (! (LA() == T_COLON || (lookAtObjCSelector() && LA(2) == T_COLON)))
return false;
parseObjCSelector();
unsigned colon_token = 0;
match(T_COLON, &colon_token);
parseObjCTypeName();
SpecifierAST *attributes = 0, **attr = &attributes;
while (parseAttributeSpecifier(*attr))
attr = &(*attr)->next;
unsigned identifier_token = 0;
match(T_IDENTIFIER, &identifier_token);
return true;
}
bool Parser::parseObjCTypeQualifiers()
{
return false;
}
// objc-end: T_AT_END
bool Parser::parseObjCEnd(DeclarationAST *&)
{
if (LA() != T_AT_END)
return false;
consumeToken();
return true;
}
CPLUSPLUS_END_NAMESPACE

View File

@@ -206,46 +206,33 @@ public:
bool parseUsingDirective(DeclarationAST *&node);
bool parseWhileStatement(StatementAST *&node);
// ObjC++
bool parseObjCClassImplementation(DeclarationAST *&node);
bool parseObjCClassDeclaration(DeclarationAST *&node);
bool parseObjCInterfaceDeclaration(DeclarationAST *&node);
bool parseObjCProtocolDeclaration(DeclarationAST *&node);
bool parseObjCEndDeclaration(DeclarationAST *&node);
bool parseObjCAliasDeclaration(DeclarationAST *&node);
bool parseObjCPropertySynthesize(DeclarationAST *&node);
bool parseObjCPropertyDynamic(DeclarationAST *&node);
bool parseObjCIdentifierList(IdentifierListAST *&node);
bool parseObjCPropertyDeclaration(DeclarationAST *&node);
bool parseObjCProtocolRefs();
bool parseObjCClassInstanceVariables();
bool parseObjCInterfaceMemberDeclaration();
bool parseObjCInterfaceDeclList();
bool parseObjCMethodPrototype();
bool parseObjCExpression(ExpressionAST *&node);
bool parseObjCMessageExpression(ExpressionAST *&node);
bool parseObjCStringLiteral(ExpressionAST *&node);
bool parseObjCEncodeExpression(ExpressionAST *&node);
bool parseObjCProtocolExpression(ExpressionAST *&node);
bool parseObjCSelectorExpression(ExpressionAST *&node);
bool parseObjCMessageReceiver(ExpressionAST *&node);
bool parseObjCMessageArguments();
bool parseObjCMethodSignature();
bool parseObjCMethodDefinitionList();
bool parseObjCAtProperty();
bool parseObjCTypeName();
bool parseObjCProtocolQualifiers();
bool lookAtObjCSelector() const;
// Qt MOC run
bool parseQtMethod(ExpressionAST *&node);
// ObjC++
bool parseObjCClassDeclaration(DeclarationAST *&node);
bool parseObjCInterface(DeclarationAST *&node,
SpecifierAST *attributes = 0);
bool parseObjCProtocol(DeclarationAST *&node,
SpecifierAST *attributes = 0);
bool parseObjCProtocolRefs();
bool parseObjClassInstanceVariables();
bool parseObjCInterfaceMemberDeclaration();
bool parseObjCInstanceVariableDeclaration(DeclarationAST *&node);
bool parseObjCPropertyDeclaration(DeclarationAST *&node,
SpecifierAST *attributes = 0);
bool parseObjCImplementation(DeclarationAST *&node);
bool parseObjCMethodPrototype();
bool parseObjCPropertyAttribute();
bool parseObjCTypeName();
bool parseObjCSelector();
bool parseObjCKeywordDeclaration();
bool parseObjCTypeQualifiers();
bool parseObjCEnd(DeclarationAST *&node);
bool lookAtObjCSelector() const;
bool skipUntil(int token);
bool skipUntilDeclaration();
bool skipUntilStatement();

View File

@@ -201,9 +201,9 @@ enum Kind {
T___TYPEOF__,
// obj c++ @ keywords
T_FIRST_OBJC_KEYWORD,
T_FIRST_OBJC_AT_KEYWORD,
T_AT_CATCH = T_FIRST_OBJC_KEYWORD,
T_AT_CATCH = T_FIRST_OBJC_AT_KEYWORD,
T_AT_CLASS,
T_AT_COMPATIBILITY_ALIAS,
T_AT_DEFS,
@@ -228,7 +228,9 @@ enum Kind {
T_AT_THROW,
T_AT_TRY,
T_FIRST_QT_KEYWORD,
T_LAST_OBJC_AT_KEYWORD,
T_FIRST_QT_KEYWORD = T_LAST_OBJC_AT_KEYWORD,
// Qt keywords
T_SIGNAL = T_FIRST_QT_KEYWORD,
@@ -295,6 +297,9 @@ public:
inline bool isKeyword() const
{ return kind >= T_FIRST_KEYWORD && kind < T_FIRST_QT_KEYWORD; }
inline bool isObjCAtKeyword() const
{ return kind >= T_FIRST_OBJC_AT_KEYWORD && kind < T_LAST_OBJC_AT_KEYWORD; }
static const char *name(int kind);
public:

View File

@@ -54,8 +54,7 @@ enum { debugLeaks = 0 };
/*!
\namespace ExtensionSystem
\brief The ExtensionSystem namespace provides
classes that belong to the core plugin system.
\brief The ExtensionSystem namespace provides classes that belong to the core plugin system.
The basic extension system contains of the plugin manager and its supporting classes,
and the IPlugin interface that must be implemented by plugin providers.

View File

@@ -46,7 +46,7 @@ FileWizardDialog::FileWizardDialog(QWidget *parent) :
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
setOption(QWizard::NoCancelButton, false);
setOption(QWizard::NoDefaultButton, false);
setPixmap(QWizard::WatermarkPixmap, QPixmap(QLatin1String(":/qworkbench/images/qtwatermark.png")));
setPixmap(QWizard::WatermarkPixmap, QPixmap(QLatin1String(":/core/images/qtwatermark.png")));
addPage(m_filePage);
connect(m_filePage, SIGNAL(activated()), button(QWizard::FinishButton), SLOT(animateClick()));
}

View File

@@ -36,6 +36,7 @@
#include <QtCore/QDebug>
#include <QtCore/QPointer>
#include <QtCore/QTimer>
#include <QtGui/QPushButton>
@@ -70,6 +71,42 @@ void QActionPushButton::actionChanged()
setEnabled(a->isEnabled());
}
// Helpers to retrieve model data
static inline bool listModelChecked(const QAbstractItemModel *model, int row, int column = 0)
{
const QModelIndex checkableIndex = model->index(row, column, QModelIndex());
return model->data(checkableIndex, Qt::CheckStateRole).toInt() == Qt::Checked;
}
static inline QString listModelText(const QAbstractItemModel *model, int row, int column)
{
const QModelIndex index = model->index(row, column, QModelIndex());
return model->data(index, Qt::DisplayRole).toString();
}
// Find a check item in a model
static bool listModelContainsCheckedItem(const QAbstractItemModel *model)
{
const int count = model->rowCount();
for (int i = 0; i < count; i++)
if (listModelChecked(model, i, 0))
return true;
return false;
}
// Convenience to extract a list of selected indexes
QList<int> selectedRows(const QAbstractItemView *view)
{
const QModelIndexList indexList = view->selectionModel()->selectedRows(0);
if (indexList.empty())
return QList<int>();
QList<int> rc;
const QModelIndexList::const_iterator cend = indexList.constEnd();
for (QModelIndexList::const_iterator it = indexList.constBegin(); it != cend; ++it)
rc.push_back(it->row());
return rc;
}
// ----------- SubmitEditorWidgetPrivate
struct SubmitEditorWidgetPrivate
{
@@ -78,11 +115,15 @@ struct SubmitEditorWidgetPrivate
Ui::SubmitEditorWidget m_ui;
bool m_filesSelected;
bool m_filesChecked;
int m_fileNameColumn;
int m_activatedRow;
};
SubmitEditorWidgetPrivate::SubmitEditorWidgetPrivate() :
m_filesSelected(false),
m_filesChecked(false)
m_filesChecked(false),
m_fileNameColumn(1),
m_activatedRow(-1)
{
}
@@ -92,10 +133,10 @@ SubmitEditorWidget::SubmitEditorWidget(QWidget *parent) :
{
m_d->m_ui.setupUi(this);
// File List
m_d->m_ui.fileList->setSelectionMode(QAbstractItemView::ExtendedSelection);
connect(m_d->m_ui.fileList, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(triggerDiffSelected()));
connect(m_d->m_ui.fileList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(fileItemChanged(QListWidgetItem*)));
connect(m_d->m_ui.fileList, SIGNAL(itemSelectionChanged()), this, SLOT(fileSelectionChanged()));
m_d->m_ui.fileView->setSelectionMode(QAbstractItemView::ExtendedSelection);
m_d->m_ui.fileView->setRootIsDecorated(false);
connect(m_d->m_ui.fileView, SIGNAL(doubleClicked(QModelIndex)),
this, SLOT(diffActivated(QModelIndex)));
// Text
m_d->m_ui.description->setFont(QFont(QLatin1String("Courier")));
@@ -124,8 +165,12 @@ void SubmitEditorWidget::registerActions(QAction *editorUndoAction, QAction *ed
}
if (submitAction) {
if (debug)
qDebug() << submitAction << m_d->m_ui.fileList->count() << "items" << m_d->m_filesChecked;
if (debug) {
int count = 0;
if (const QAbstractItemModel *model = m_d->m_ui.fileView->model())
count = model->rowCount();
qDebug() << submitAction << count << "items" << m_d->m_filesChecked;
}
submitAction->setEnabled(m_d->m_filesChecked);
connect(this, SIGNAL(fileCheckStateChanged(bool)), submitAction, SLOT(setEnabled(bool)));
m_d->m_ui.buttonLayout->addWidget(new QActionPushButton(submitAction));
@@ -161,7 +206,6 @@ void SubmitEditorWidget::unregisterActions(QAction *editorUndoAction, QAction *
}
}
QString SubmitEditorWidget::trimmedDescriptionText() const
{
// Make sure we have one terminating NL
@@ -180,91 +224,70 @@ void SubmitEditorWidget::setDescriptionText(const QString &text)
m_d->m_ui.description->setPlainText(text);
}
QStringList SubmitEditorWidget::fileList() const
int SubmitEditorWidget::fileNameColumn() const
{
QStringList rc;
const int count = m_d->m_ui.fileList->count();
for (int i = 0; i < count; i++)
rc.push_back(m_d->m_ui.fileList->item(i)->text());
return rc;
return m_d->m_fileNameColumn;
}
void SubmitEditorWidget::addFilesUnblocked(const QStringList &list, bool checked, bool userCheckable)
void SubmitEditorWidget::setFileNameColumn(int c)
{
if (debug)
qDebug() << Q_FUNC_INFO << list << checked << userCheckable;
foreach (const QString &f, list) {
QListWidgetItem *item = new QListWidgetItem(f);
item->setCheckState(checked ? Qt::Checked : Qt::Unchecked);
if (!userCheckable)
item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);
m_d->m_ui.fileList->addItem(item);
}
m_d->m_fileNameColumn = c;
}
void SubmitEditorWidget::addFiles(const QStringList &list, bool checked, bool userCheckable)
void SubmitEditorWidget::setFileModel(QAbstractItemModel *model)
{
if (list.empty())
return;
m_d->m_ui.fileView->clearSelection(); // trigger the change signals
const bool blocked = m_d->m_ui.fileList->blockSignals(true);
addFilesUnblocked(list, checked, userCheckable);
m_d->m_ui.fileList->blockSignals(blocked);
// Did we gain any checked files..update action accordingly
if (!m_d->m_filesChecked && checked) {
m_d->m_filesChecked = true;
emit fileCheckStateChanged(m_d->m_filesChecked);
m_d->m_ui.fileView->setModel(model);
if (model->rowCount()) {
const int columnCount = model->columnCount();
for (int c = 0; c < columnCount; c++)
m_d->m_ui.fileView->resizeColumnToContents(c);
}
connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
this, SLOT(updateSubmitAction()));
connect(model, SIGNAL(modelReset()),
this, SLOT(updateSubmitAction()));
connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(updateSubmitAction()));
connect(model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
this, SLOT(updateSubmitAction()));
connect(m_d->m_ui.fileView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
this, SLOT(updateDiffAction()));
updateActions();
}
void SubmitEditorWidget::setFileList(const QStringList &list)
QAbstractItemModel *SubmitEditorWidget::fileModel() const
{
// Trigger enabling of menu action
m_d->m_ui.fileList->clearSelection();
const bool blocked = m_d->m_ui.fileList->blockSignals(true);
m_d->m_ui.fileList->clear();
if (!list.empty()) {
addFilesUnblocked(list, true, true);
// Checked files added?
if (!m_d->m_filesChecked) {
m_d->m_filesChecked = true;
emit fileCheckStateChanged(m_d->m_filesChecked);
}
}
m_d->m_ui.fileList->blockSignals(blocked);
}
static bool containsCheckState(const QListWidget *lw, Qt::CheckState cs)
{
const int count = lw->count();
for (int i = 0; i < count; i++)
if (lw->item(i)->checkState() == cs)
return true;
return false;
return m_d->m_ui.fileView->model();
}
QStringList SubmitEditorWidget::selectedFiles() const
{
const QList<int> selection = selectedRows(m_d->m_ui.fileView);
if (selection.empty())
return QStringList();
QStringList rc;
const int count = m_d->m_ui.fileList->count();
for (int i = 0; i < count; i++) {
const QListWidgetItem *item = m_d->m_ui.fileList->item(i);
if (item->isSelected())
rc.push_back(item->text());
}
const QAbstractItemModel *model = m_d->m_ui.fileView->model();
const int count = selection.size();
for (int i = 0; i < count; i++)
rc.push_back(listModelText(model, selection.at(i), fileNameColumn()));
return rc;
}
QStringList SubmitEditorWidget::checkedFiles() const
{
QStringList rc;
const int count = m_d->m_ui.fileList->count();
for (int i = 0; i < count; i++) {
const QListWidgetItem *item = m_d->m_ui.fileList->item(i);
if (item->checkState() == Qt::Checked)
rc.push_back(item->text());
}
const QAbstractItemModel *model = m_d->m_ui.fileView->model();
if (!model)
return rc;
const int count = model->rowCount();
for (int i = 0; i < count; i++)
if (listModelChecked(model, i, 0))
rc.push_back(listModelText(model, i, fileNameColumn()));
return rc;
}
@@ -280,44 +303,61 @@ void SubmitEditorWidget::triggerDiffSelected()
emit diffSelected(sel);
}
void SubmitEditorWidget::fileItemChanged(QListWidgetItem *item)
void SubmitEditorWidget::diffActivatedDelayed()
{
const Qt::CheckState st = item->checkState();
if (debug)
qDebug() << Q_FUNC_INFO << st << item->text() << m_d->m_filesChecked;
// Enable the actions according to check state
switch (st) {
case Qt::Unchecked: // Item was unchecked: Any checked items left?
if (m_d->m_filesChecked && !containsCheckState(m_d->m_ui.fileList, Qt::Checked)) {
m_d->m_filesChecked = false;
const QStringList files = QStringList(listModelText(m_d->m_ui.fileView->model(), m_d->m_activatedRow, fileNameColumn()));
emit diffSelected(files);
}
void SubmitEditorWidget::diffActivated(const QModelIndex &index)
{
// We need to delay the signal, otherwise, the diff editor will not
// be in the foreground.
m_d->m_activatedRow = index.row();
QTimer::singleShot(0, this, SLOT(diffActivatedDelayed()));
}
void SubmitEditorWidget::updateActions()
{
updateSubmitAction();
updateDiffAction();
}
// Enable submit depending on having checked files
void SubmitEditorWidget::updateSubmitAction()
{
const bool newFilesCheckedState = hasCheckedFiles();
if (m_d->m_filesChecked != newFilesCheckedState) {
m_d->m_filesChecked = newFilesCheckedState;
emit fileCheckStateChanged(m_d->m_filesChecked);
}
break;
case Qt::Checked:
// Item was Checked. First one?
if (!m_d->m_filesChecked) {
m_d->m_filesChecked = true;
emit fileCheckStateChanged(m_d->m_filesChecked);
}
break;
case Qt::PartiallyChecked: // Errm?
break;
}
}
void SubmitEditorWidget::fileSelectionChanged()
// Enable diff depending on selected files
void SubmitEditorWidget::updateDiffAction()
{
const bool newFilesSelected = !m_d->m_ui.fileList->selectedItems().empty();
if (debug)
qDebug() << Q_FUNC_INFO << newFilesSelected;
if (m_d->m_filesSelected != newFilesSelected) {
m_d->m_filesSelected = newFilesSelected;
const bool filesSelected = hasSelection();
if (m_d->m_filesSelected != filesSelected) {
m_d->m_filesSelected = filesSelected;
emit fileSelectionChanged(m_d->m_filesSelected);
if (debug)
qDebug() << Q_FUNC_INFO << m_d->m_filesSelected;
}
}
bool SubmitEditorWidget::hasSelection() const
{
// Not present until model is set
if (const QItemSelectionModel *sm = m_d->m_ui.fileView->selectionModel())
return sm->hasSelection();
return false;
}
bool SubmitEditorWidget::hasCheckedFiles() const
{
if (const QAbstractItemModel *model = m_d->m_ui.fileView->model())
return listModelContainsCheckedItem(model);
return false;
}
void SubmitEditorWidget::changeEvent(QEvent *e)
{
switch (e->type()) {

View File

@@ -42,6 +42,8 @@ QT_BEGIN_NAMESPACE
class QPlainTextEdit;
class QListWidgetItem;
class QAction;
class QAbstractItemModel;
class QModelIndex;
QT_END_NAMESPACE
namespace Core {
@@ -51,8 +53,9 @@ struct SubmitEditorWidgetPrivate;
/* The submit editor presents the commit message in a text editor and an
* checkable list of modified files in a list window. The user can delete
* files from the list by pressing unchecking them or diff the selection
* by doubleclicking.
* files from the list by unchecking them or diff the selection
* by doubleclicking. A list model which contains the file in a column
* specified by fileNameColumn should be set using setFileModel().
*
* Additionally, standard creator actions can be registered:
* Undo/redo will be set up to work with the description editor.
@@ -71,7 +74,7 @@ class QWORKBENCH_UTILS_EXPORT SubmitEditorWidget : public QWidget
Q_OBJECT
Q_DISABLE_COPY(SubmitEditorWidget)
Q_PROPERTY(QString descriptionText READ descriptionText WRITE setDescriptionText DESIGNABLE true)
Q_PROPERTY(QStringList fileList READ fileList WRITE setFileList DESIGNABLE true)
Q_PROPERTY(int fileNameColumn READ fileNameColumn WRITE setFileNameColumn DESIGNABLE false)
public:
explicit SubmitEditorWidget(QWidget *parent = 0);
virtual ~SubmitEditorWidget();
@@ -86,10 +89,11 @@ public:
// Should be used to normalize newlines.
QString trimmedDescriptionText() const;
// The raw file list
QStringList fileList() const;
void addFiles(const QStringList&, bool checked = true, bool userCheckable = true);
void setFileList(const QStringList&);
int fileNameColumn() const;
void setFileNameColumn(int c);
void setFileModel(QAbstractItemModel *model);
QAbstractItemModel *fileModel() const;
// Files to be included in submit
QStringList checkedFiles() const;
@@ -110,11 +114,15 @@ protected:
private slots:
void triggerDiffSelected();
void fileItemChanged(QListWidgetItem *);
void fileSelectionChanged();
void diffActivated(const QModelIndex &index);
void diffActivatedDelayed();
void updateActions();
void updateSubmitAction();
void updateDiffAction();
private:
void addFilesUnblocked(const QStringList &list, bool checked, bool userCheckable);
bool hasSelection() const;
bool hasCheckedFiles() const;
SubmitEditorWidgetPrivate *m_d;
};

View File

@@ -39,14 +39,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QListWidget" name="fileList">
<property name="font">
<font/>
</property>
<property name="textElideMode">
<enum>Qt::ElideNone</enum>
</property>
</widget>
<widget class="QTreeView" name="fileView"/>
</item>
</layout>
</widget>

View File

@@ -503,7 +503,7 @@ QStringList BaseFileWizard::runWizard(const QString &path, QWidget *parent)
QPixmap BaseFileWizard::watermark()
{
return QPixmap(QLatin1String(":/qworkbench/images/qtwatermark.png"));
return QPixmap(QLatin1String(":/core/images/qtwatermark.png"));
}
void BaseFileWizard::setupWizard(QWizard *w)

View File

@@ -1,5 +1,5 @@
<RCC>
<qresource prefix="/qworkbench" >
<qresource prefix="/core" >
<file>html/images/bg_site_header_dark_grey.png</file>
<file>html/images/body_bg_circles_bottom_right.png</file>
<file>html/images/body_bg_gradient.png</file>

View File

@@ -194,27 +194,27 @@ const char * const G_WINDOW_LIST = "QtCreator.Group.Window.List";
const char * const G_HELP_HELP = "QtCreator.Group.Help.Help";
const char * const G_HELP_ABOUT = "QtCreator.Group.Help.About";
const char * const ICON_MINUS = ":/qworkbench/images/minus.png";
const char * const ICON_PLUS = ":/qworkbench/images/plus.png";
const char * const ICON_NEWFILE = ":/qworkbench/images/filenew.png";
const char * const ICON_OPENFILE = ":/qworkbench/images/fileopen.png";
const char * const ICON_SAVEFILE = ":/qworkbench/images/filesave.png";
const char * const ICON_UNDO = ":/qworkbench/images/undo.png";
const char * const ICON_REDO = ":/qworkbench/images/redo.png";
const char * const ICON_COPY = ":/qworkbench/images/editcopy.png";
const char * const ICON_PASTE = ":/qworkbench/images/editpaste.png";
const char * const ICON_CUT = ":/qworkbench/images/editcut.png";
const char * const ICON_NEXT = ":/qworkbench/images/next.png";
const char * const ICON_PREV = ":/qworkbench/images/prev.png";
const char * const ICON_DIR = ":/qworkbench/images/dir.png";
const char * const ICON_CLEAN_PANE = ":/qworkbench/images/clean_pane_small.png";
const char * const ICON_CLEAR = ":/qworkbench/images/clear.png";
const char * const ICON_FIND = ":/qworkbench/images/find.png";
const char * const ICON_FINDNEXT = ":/qworkbench/images/findnext.png";
const char * const ICON_REPLACE = ":/qworkbench/images/replace.png";
const char * const ICON_RESET = ":/qworkbench/images/reset.png";
const char * const ICON_MAGNIFIER = ":/qworkbench/images/magnifier.png";
const char * const ICON_TOGGLE_SIDEBAR = ":/qworkbench/images/sidebaricon.png";
const char * const ICON_MINUS = ":/core/images/minus.png";
const char * const ICON_PLUS = ":/core/images/plus.png";
const char * const ICON_NEWFILE = ":/core/images/filenew.png";
const char * const ICON_OPENFILE = ":/core/images/fileopen.png";
const char * const ICON_SAVEFILE = ":/core/images/filesave.png";
const char * const ICON_UNDO = ":/core/images/undo.png";
const char * const ICON_REDO = ":/core/images/redo.png";
const char * const ICON_COPY = ":/core/images/editcopy.png";
const char * const ICON_PASTE = ":/core/images/editpaste.png";
const char * const ICON_CUT = ":/core/images/editcut.png";
const char * const ICON_NEXT = ":/core/images/next.png";
const char * const ICON_PREV = ":/core/images/prev.png";
const char * const ICON_DIR = ":/core/images/dir.png";
const char * const ICON_CLEAN_PANE = ":/core/images/clean_pane_small.png";
const char * const ICON_CLEAR = ":/core/images/clear.png";
const char * const ICON_FIND = ":/core/images/find.png";
const char * const ICON_FINDNEXT = ":/core/images/findnext.png";
const char * const ICON_REPLACE = ":/core/images/replace.png";
const char * const ICON_RESET = ":/core/images/reset.png";
const char * const ICON_MAGNIFIER = ":/core/images/magnifier.png";
const char * const ICON_TOGGLE_SIDEBAR = ":/core/images/sidebaricon.png";
// wizard kind
const char * const WIZARD_TYPE_FILE = "QtCreator::WizardType::File";

View File

@@ -84,11 +84,6 @@ MessageManager *CoreImpl::messageManager() const
return m_mainwindow->messageManager();
}
ViewManagerInterface *CoreImpl::viewManager() const
{
return m_mainwindow->viewManager();
}
ExtensionSystem::PluginManager *CoreImpl::pluginManager() const
{
return m_mainwindow->pluginManager();
@@ -148,15 +143,6 @@ QString CoreImpl::resourcePath() const
#endif
}
QString CoreImpl::libraryPath() const
{
#if defined(Q_OS_MAC)
return QDir::cleanPath(QCoreApplication::applicationDirPath()+QLatin1String("/../PlugIns"));
#else
return QDir::cleanPath(QCoreApplication::applicationDirPath()+QLatin1String("/../lib"));
#endif
}
IContext *CoreImpl::currentContextObject() const
{
return m_mainwindow->currentContextObject();
@@ -168,12 +154,6 @@ QMainWindow *CoreImpl::mainWindow() const
return m_mainwindow;
}
QStatusBar *CoreImpl::statusBar() const
{
return m_mainwindow->statusBar();
}
// adds and removes additional active contexts, this context is appended to the
// currently active contexts. call updateContext after changing
void CoreImpl::addAdditionalContext(int context)

View File

@@ -60,7 +60,6 @@ public:
FileManager *fileManager() const ;
UniqueIDManager *uniqueIDManager() const;
MessageManager *messageManager() const;
ViewManagerInterface *viewManager() const;
ExtensionSystem::PluginManager *pluginManager() const;
EditorManager *editorManager() const;
ProgressManagerInterface *progressManager() const;
@@ -74,12 +73,10 @@ public:
QPrinter *printer() const;
QString resourcePath() const;
QString libraryPath() const;
IContext *currentContextObject() const;
QMainWindow *mainWindow() const;
QStatusBar *statusBar() const;
// adds and removes additional active contexts, this context is appended to the
// currently active contexts. call updateContext after changing

View File

@@ -37,7 +37,6 @@
#include "editormanager.h"
#include "mainwindow.h"
#include "modemanager.h"
#include "viewmanager.h"
#include "fileiconprovider.h"
#include <QtCore/qplugin.h>

View File

@@ -31,8 +31,8 @@
**
***************************************************************************/
#ifndef QWORKBENCHPLUGIN_H
#define QWORKBENCHPLUGIN_H
#ifndef COREPLUGIN_H
#define COREPLUGIN_H
#include <extensionsystem/iplugin.h>
@@ -68,4 +68,4 @@ private:
} // namespace Internal
} // namespace Core
#endif // QWORKBENCHPLUGIN_H
#endif // COREPLUGIN_H

View File

@@ -1,3 +1,2 @@
include(coreplugin_dependencies.pri)
LIBS *= -l$$qtLibraryTarget(Core)

View File

@@ -73,7 +73,8 @@ SOURCES += mainwindow.cpp \
rightpane.cpp \
sidebar.cpp \
fileiconprovider.cpp \
mimedatabase.cpp
mimedatabase.cpp \
icore.cpp
HEADERS += mainwindow.h \
welcomemode.h \
editmode.h \

View File

@@ -131,7 +131,7 @@
</property>
<property name="icon">
<iconset resource="../core.qrc">
<normaloff>:/qworkbench/images/reset.png</normaloff>:/qworkbench/images/reset.png</iconset>
<normaloff>:/core/images/reset.png</normaloff>:/core/images/reset.png</iconset>
</property>
</widget>
</item>
@@ -145,7 +145,7 @@
</property>
<property name="icon">
<iconset resource="../core.qrc">
<normaloff>:/qworkbench/images/clear.png</normaloff>:/qworkbench/images/clear.png</iconset>
<normaloff>:/core/images/clear.png</normaloff>:/core/images/clear.png</iconset>
</property>
</widget>
</item>

View File

@@ -118,7 +118,7 @@ QVariant EditorModel::data(const QModelIndex &index, int role) const
: editor->displayName();
case Qt::DecorationRole:
return editor->file()->isReadOnly()
? QIcon(QLatin1String(":/qworkbench/images/locked.png"))
? QIcon(QLatin1String(":/core/images/locked.png"))
: QIcon();
case Qt::ToolTipRole:
return editor->file()->fileName().isEmpty()

View File

@@ -172,8 +172,8 @@ void OpenEditorsWidget::updateCurrentItem(QTreeWidgetItem *currentItem)
//todo: this is almost duplicated in openeditorswindow
void OpenEditorsWidget::updateItem(QTreeWidgetItem *item, IEditor *editor)
{
static const QIcon lockedIcon(QLatin1String(":/qworkbench/images/locked.png"));
static const QIcon emptyIcon(QLatin1String(":/qworkbench/images/empty14.png"));
static const QIcon lockedIcon(QLatin1String(":/core/images/locked.png"));
static const QIcon emptyIcon(QLatin1String(":/core/images/empty14.png"));
QString title = editor->displayName();
if (editor->file()->isModified())
title += tr("*");

View File

@@ -300,8 +300,8 @@ void OpenEditorsWindow::centerOnItem(int selectedIndex)
void OpenEditorsWindow::updateItem(QTreeWidgetItem *item, IEditor *editor)
{
static const QIcon lockedIcon(QLatin1String(":/qworkbench/images/locked.png"));
static const QIcon emptyIcon(QLatin1String(":/qworkbench/images/empty14.png"));
static const QIcon lockedIcon(QLatin1String(":/core/images/locked.png"));
static const QIcon emptyIcon(QLatin1String(":/core/images/empty14.png"));
QString title = editor->displayName();
if (editor->file()->isModified())

View File

@@ -103,7 +103,7 @@ StackedEditorGroup::StackedEditorGroup(QWidget *parent) :
m_lockButton->setProperty("type", QLatin1String("dockbutton"));
m_closeButton->setAutoRaise(true);
m_closeButton->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
m_closeButton->setIcon(QIcon(":/core/images/closebutton.png"));
m_closeButton->setProperty("type", QLatin1String("dockbutton"));
QToolBar *rightToolBar = new QToolBar;
@@ -150,7 +150,7 @@ StackedEditorGroup::StackedEditorGroup(QWidget *parent) :
QToolButton *closeButton = new QToolButton;
closeButton->setAutoRaise(true);
closeButton->setIcon(QIcon(":/qworkbench/images/clear.png"));
closeButton->setIcon(QIcon(":/core/images/clear.png"));
closeButton->setToolTip(tr("Close"));
connect(closeButton, SIGNAL(clicked()), m_infoWidget, SLOT(hide()));
@@ -303,8 +303,8 @@ void StackedEditorGroup::checkEditorStatus()
void StackedEditorGroup::updateEditorStatus(IEditor *editor)
{
static const QIcon lockedIcon(QLatin1String(":/qworkbench/images/locked.png"));
static const QIcon unlockedIcon(QLatin1String(":/qworkbench/images/unlocked.png"));
static const QIcon lockedIcon(QLatin1String(":/core/images/locked.png"));
static const QIcon unlockedIcon(QLatin1String(":/core/images/unlocked.png"));
if (editor->file()->isReadOnly()) {
m_lockButton->setIcon(lockedIcon);

View File

@@ -48,7 +48,7 @@ using namespace Core;
FileIconProvider *FileIconProvider::m_instance = 0;
FileIconProvider::FileIconProvider()
: m_unknownFileIcon(QLatin1String(":/qworkbench/images/unknownfile.png"))
: m_unknownFileIcon(QLatin1String(":/core/images/unknownfile.png"))
{
}

View File

@@ -42,7 +42,8 @@
using namespace Core::Internal;
GeneralSettings::GeneralSettings()
GeneralSettings::GeneralSettings():
m_dialog(0)
{
}
@@ -61,7 +62,7 @@ QString GeneralSettings::trCategory() const
return tr("Environment");
}
QWidget* GeneralSettings::createPage(QWidget *parent)
QWidget *GeneralSettings::createPage(QWidget *parent)
{
m_page = new Ui_GeneralSettings;
QWidget *w = new QWidget(parent);

View File

@@ -77,7 +77,7 @@
</property>
<property name="icon">
<iconset resource="core.qrc">
<normaloff>:/qworkbench/images/reset.png</normaloff>:/qworkbench/images/reset.png</iconset>
<normaloff>:/core/images/reset.png</normaloff>:/core/images/reset.png</iconset>
</property>
</widget>
</item>
@@ -118,7 +118,7 @@
</property>
<property name="icon">
<iconset resource="core.qrc">
<normaloff>:/qworkbench/images/reset.png</normaloff>:/qworkbench/images/reset.png</iconset>
<normaloff>:/core/images/reset.png</normaloff>:/core/images/reset.png</iconset>
</property>
</widget>
</item>

View File

@@ -0,0 +1,308 @@
#include "icore.h"
/*!
\namespace Core
\brief The Core namespace contains all classes that make up the Core plugin
which constitute the basic functionality of Qt Creator.
*/
/*!
\namespace Core::Internal
\internal
*/
/*!
\class Core::ICore
\brief The ICore class allows access to the different part that make up
the basic functionality of Qt Creator.
You should never create a subclass of this interface. The one and only
instance is created by the Core plugin. You can access this instance
from your plugin via the plugin manager, e.g.
\code
ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>();
\endcode
\mainclass
*/
/*!
\fn QStringList ICore::showNewItemDialog(const QString &title,
const QList<IWizard *> &wizards,
const QString &defaultLocation = QString())
\brief Opens a dialog where the user can choose from a set of \a wizards that
create new files/classes/projects.
The \a title argument is shown as the dialogs title. The path where the
files will be created (if the user doesn't change it) is set
in \a defaultLocation. It defaults to the path of the file manager's
current file.
\sa Core::FileManager
*/
/*!
\fn void ICore::showOptionsDialog(const QString &group = QString(),
const QString &page = QString())
\brief Opens the application options/preferences dialog with preselected
\a page in a specified \a group.
The arguments refer to the string IDs of the corresponding IOptionsPage.
*/
/*!
\fn ActionManagerInterface *ICore::actionManager() const
\brief Returns the application's action manager.
The action manager is responsible for registration of menus and
menu items and keyboard shortcuts.
*/
/*!
\fn FileManager *ICore::fileManager() const
\brief Returns the application's file manager.
The file manager keeps track of files for changes outside the application.
*/
/*!
\fn UniqueIDManager *ICore::uniqueIDManager() const
\brief Returns the application's id manager.
The unique ID manager transforms strings in unique integers and the other way round.
*/
/*!
\fn MessageManager *ICore::messageManager() const
\brief Returns the application's message manager.
The message manager is the interface to the "General" output pane for
general application debug messages.
*/
/*!
\fn ExtensionSystem::PluginManager *ICore::pluginManager() const
\brief Returns the application's plugin manager.
The plugin manager handles the plugin life cycles and manages
the common object pool.
*/
/*!
\fn EditorManager *ICore::editorManager() const
\brief Returns the application's editor manager.
The editor manager handles all editor related tasks like opening
documents, the stack of currently open documents and the currently
active document.
*/
/*!
\fn ProgressManagerInterface *ICore::progressManager() const
\brief Returns the application's progress manager.
Use the progress manager to register a concurrent task to
show a progress bar the way Qt Creator does it.
*/
/*!
\fn ScriptManagerInterface *ICore::scriptManager() const
\internal
*/
/*!
\fn VariableManager *ICore::variableManager() const
\brief Returns the application's variable manager.
The variable manager is used to register application wide string variables
like \c MY_PROJECT_DIR such that strings like \c{somecommand ${MY_PROJECT_DIR}/sub}
can be resolved/expanded from anywhere in the application.
*/
/*!
\fn VCSManager *ICore::vcsManager() const
\brief Returns the application's vcs manager.
The vcs manager can be used to e.g. retrieve information about
the version control system used for a directory on hard disk.
The actual functionality for a specific version control system
must be implemented in a IVersionControl object and registered in
the plugin manager's object pool.
*/
/*!
\fn ModeManager *ICore::modeManager() const
\brief Returns the application's mode manager.
The mode manager handles everything related to the instances of IMode
that were added to the plugin manager's object pool as well as their
buttons and the tool bar with the round buttons in the lower left
corner of Qt Creator.
*/
/*!
\fn MimeDatabase *ICore::mimeDatabase() const
\brief Returns the application's mime database.
Use the mime database to manage mime types.
*/
/*!
\fn QSettings *ICore::settings() const
\brief Returns the application's main settings object.
You can use it to retrieve or set application wide settings
(in contrast to session or project specific settings).
*/
/*!
\fn QPrinter *ICore::printer() const
\brief Returns the application's printer object.
Always use this printer object for printing, so the different parts of the
application re-use it's settings.
*/
/*!
\fn QString ICore::resourcePath() const
\brief Returns the absolute path that is used for resources like
project templates and the debugger macros.
This abstraction is needed to avoid platform-specific code all over
the place, since e.g. on Mac the resources are part of the application bundle.
*/
/*!
\fn QMainWindow *ICore::mainWindow() const
\brief Returns the main application window.
For use as dialog parent etc.
*/
/*!
\fn IContext *ICore::currentContextObject() const
\brief Returns the context object of the current main context.
\sa ICore::addAdditionalContext()
\sa ICore::addContextObject()
*/
/*!
\fn void ICore::addAdditionalContext(int context)
\brief Register additional context to be currently active.
Appends the additional \a context to the list of currently active
contexts. You need to call ICore::updateContext to make that change
take effect.
\sa ICore::removeAdditionalContext()
\sa ICore::hasContext()
\sa ICore::updateContext()
*/
/*!
\fn void ICore::removeAdditionalContext(int context)
\brief Removes the given \a context from the list of currently active contexts.
You need to call ICore::updateContext to make that change
take effect.
\sa ICore::addAdditionalContext()
\sa ICore::hasContext()
\sa ICore::updateContext()
*/
/*!
\fn bool ICore::hasContext(int context) const
\brief Returns if the given \a context is currently one of the active contexts.
\sa ICore::addAdditionalContext()
\sa ICore::addContextObject()
*/
/*!
\fn void ICore::addContextObject(IContext *context)
\brief Registers an additional \a context object.
After registration this context object gets automatically the
current context object whenever it's widget gets focus.
\sa ICore::removeContextObject()
\sa ICore::addAdditionalContext()
\sa ICore::currentContextObject()
*/
/*!
\fn void ICore::removeContextObject(IContext *context)
\brief Unregisters a \a context object from the list of know contexts.
\sa ICore::addContextObject()
\sa ICore::addAdditionalContext()
\sa ICore::currentContextObject()
}
*/
/*!
\fn void ICore::updateContext()
\brief Update the list of active contexts after adding or removing additional ones.
\sa ICore::addAdditionalContext()
\sa ICore::removeAdditionalContext()
*/
/*!
\fn void ICore::openFiles(const QStringList &fileNames)
\brief Open all files from a list of \a fileNames like it would be
done if they were given to Qt Creator on the command line, or
they were opened via \gui{File|Open}.
*/
/*!
\fn ICore::ICore()
\internal
*/
/*!
\fn ICore::~ICore()
\internal
*/
/*!
\fn void ICore::coreOpened()
\brief Emitted after all plugins have been loaded and the main window shown.
*/
/*!
\fn void ICore::saveSettingsRequested()
\brief Emitted to signal that the user has requested that the global settings
should be saved to disk.
At the moment that happens when the application is closed, and on \gui{Save All}.
*/
/*!
\fn void ICore::optionsDialogRequested()
\brief Signal that allows plugins to perform actions just before the \gui{Tools|Options}
dialog is shown.
*/
/*!
\fn void ICore::coreAboutToClose()
\brief Plugins can do some pre-end-of-life actions when they get this signal.
The application is guaranteed to shut down after this signal is emitted.
It's there as an addition to the usual plugin lifecycle methods, namely
IPlugin::shutdown(), just for convenience.
*/
/*!
\fn void ICore::contextAboutToChange(Core::IContext *context)
\brief Sent just before a new \a context becomes the current context
(meaning that it's widget got focus).
*/
/*!
\fn void ICore::contextChanged(Core::IContext *context)
\brief Sent just after a new \a context became the current context
(meaning that it's widget got focus).
*/

View File

@@ -56,7 +56,6 @@ class FileManager;
class MessageManager;
class IEditor;
class UniqueIDManager;
class ViewManagerInterface;
class EditorManager;
class ProgressManagerInterface;
class ScriptManagerInterface;
@@ -86,7 +85,6 @@ public:
virtual FileManager *fileManager() const = 0;
virtual UniqueIDManager *uniqueIDManager() const = 0;
virtual MessageManager *messageManager() const = 0;
virtual ViewManagerInterface *viewManager() const = 0;
virtual ExtensionSystem::PluginManager *pluginManager() const = 0;
virtual EditorManager *editorManager() const = 0;
virtual ProgressManagerInterface *progressManager() const = 0;
@@ -100,20 +98,17 @@ public:
virtual QPrinter *printer() const = 0;
virtual QString resourcePath() const = 0;
virtual QString libraryPath() const = 0;
virtual IContext *currentContextObject() const = 0;
virtual QMainWindow *mainWindow() const = 0;
virtual QStatusBar *statusBar() const = 0;
// adds and removes additional active contexts, this context is appended to the
// currently active contexts. call updateContext after changing
virtual IContext *currentContextObject() const = 0;
virtual void addAdditionalContext(int context) = 0;
virtual void removeAdditionalContext(int context) = 0;
virtual bool hasContext(int context) const = 0;
virtual void addContextObject(IContext *contex) = 0;
virtual void removeContextObject(IContext *contex) = 0;
virtual void addContextObject(IContext *context) = 0;
virtual void removeContextObject(IContext *context) = 0;
virtual void updateContext() = 0;
@@ -122,7 +117,7 @@ public:
signals:
void coreOpened();
void saveSettingsRequested();
void settingsDialogRequested();
void optionsDialogRequested();
void coreAboutToClose();
void contextAboutToChange(Core::IContext *context);
void contextChanged(Core::IContext *context);

View File

@@ -149,7 +149,7 @@ MainWindow::MainWindow() :
m_toggleSideBarButton(new QToolButton)
{
setWindowTitle(tr("Qt Creator"));
qApp->setWindowIcon(QIcon(":/qworkbench/images/qtcreator_logo_128.png"));
qApp->setWindowIcon(QIcon(":/core/images/qtcreator_logo_128.png"));
setDockNestingEnabled(true);
setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
@@ -783,7 +783,7 @@ QStringList MainWindow::showNewItemDialog(const QString &title,
void MainWindow::showOptionsDialog(const QString &category, const QString &page)
{
emit m_coreImpl->settingsDialogRequested();
emit m_coreImpl->optionsDialogRequested();
SettingsDialog dlg(this, category, page);
dlg.exec();
}
@@ -840,11 +840,6 @@ VCSManager *MainWindow::vcsManager() const
return m_vcsManager;
}
ViewManagerInterface *MainWindow::viewManager() const
{
return m_viewManager;
}
EditorManager *MainWindow::editorManager() const
{
return m_editorManager;

View File

@@ -109,7 +109,6 @@ public:
Core::FileManager *fileManager() const;
Core::UniqueIDManager *uniqueIDManager() const;
Core::MessageManager *messageManager() const;
Core::ViewManagerInterface *viewManager() const;
ExtensionSystem::PluginManager *pluginManager() const;
Core::EditorManager *editorManager() const;
Core::ProgressManagerInterface *progressManager() const;

View File

@@ -102,11 +102,11 @@ public:
{
style = QStyleFactory::create(baseStyleName);
QTC_ASSERT(style, /**/);
buttonImage_pressed = QImage(":/qworkbench/images/pushbutton_pressed.png");
buttonImage = QImage(":/qworkbench/images/pushbutton.png");
buttonImage_pressed = QImage(":/core/images/pushbutton_pressed.png");
buttonImage = QImage(":/core/images/pushbutton.png");
lineeditImage = QImage(":/qworkbench/images/inputfield.png");
lineeditImage_disabled = QImage(":/qworkbench/images/inputfield_disabled.png");
lineeditImage = QImage(":/core/images/inputfield.png");
lineeditImage_disabled = QImage(":/core/images/inputfield_disabled.png");
}
~ManhattanStylePrivate()
@@ -345,7 +345,7 @@ void ManhattanStyle::polish(QPalette &pal)
QIcon ManhattanStyle::standardIconImplementation(StandardPixmap standardIcon, const QStyleOption *option,
const QWidget *widget) const
{
static const QIcon closeButton(":/qworkbench/images/closebutton.png");
static const QIcon closeButton(":/core/images/closebutton.png");
QIcon icon;
switch (standardIcon) {
case QStyle::SP_TitleBarCloseButton:
@@ -360,7 +360,7 @@ QIcon ManhattanStyle::standardIconImplementation(StandardPixmap standardIcon, co
QPixmap ManhattanStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt,
const QWidget *widget) const
{
static const QPixmap closeButton(":/qworkbench/images/closebutton.png");
static const QPixmap closeButton(":/core/images/closebutton.png");
QPixmap pixmap;
switch (standardPixmap) {
case QStyle::SP_TitleBarCloseButton:

View File

@@ -358,13 +358,13 @@ NavigationSubWidget::NavigationSubWidget(NavigationWidget *parentWidget)
QToolButton *split = new QToolButton;
split->setProperty("type", QLatin1String("dockbutton"));
split->setIcon(QIcon(":/qworkbench/images/splitbutton_horizontal.png"));
split->setIcon(QIcon(":/core/images/splitbutton_horizontal.png"));
split->setToolTip(tr("Split"));
connect(split, SIGNAL(clicked(bool)), this, SIGNAL(split()));
QToolButton *close = new QToolButton;
close->setProperty("type", QLatin1String("dockbutton"));
close->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
close->setIcon(QIcon(":/core/images/closebutton.png"));
close->setToolTip(tr("Close"));
connect(close, SIGNAL(clicked(bool)), this, SIGNAL(close()));

View File

@@ -167,7 +167,7 @@ OutputPane::OutputPane(const QList<int> &context, QWidget *parent) :
m_clearButton->setToolTip(tr("Clear"));
connect(m_clearButton, SIGNAL(clicked()), this, SLOT(clearPage()));
m_closeButton->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
m_closeButton->setIcon(QIcon(":/core/images/closebutton.png"));
m_closeButton->setProperty("type", QLatin1String("dockbutton"));
connect(m_closeButton, SIGNAL(clicked()), this, SLOT(slotHide()));
@@ -488,13 +488,13 @@ OutputPaneToggleButton::OutputPaneToggleButton(int number, const QString &text,
setFocusPolicy(Qt::NoFocus);
setCheckable(true);
setStyleSheet(
"QPushButton { border-image: url(:/qworkbench/images/panel_button.png) 2 2 2 19;"
"QPushButton { border-image: url(:/core/images/panel_button.png) 2 2 2 19;"
" border-width: 2px 2px 2px 19px; padding-left: -17; padding-right: 4 } "
"QPushButton:checked { border-image: url(:/qworkbench/images/panel_button_checked.png) 2 2 2 19 } "
"QPushButton:checked { border-image: url(:/core/images/panel_button_checked.png) 2 2 2 19 } "
#ifndef Q_WS_MAC // Mac UI's dont usually do hover
"QPushButton:checked:hover { border-image: url(:/qworkbench/images/panel_button_checked_hover.png) 2 2 2 19 } "
"QPushButton:pressed:hover { border-image: url(:/qworkbench/images/panel_button_pressed.png) 2 2 2 19 } "
"QPushButton:hover { border-image: url(:/qworkbench/images/panel_button_hover.png) 2 2 2 19 } "
"QPushButton:checked:hover { border-image: url(:/core/images/panel_button_checked_hover.png) 2 2 2 19 } "
"QPushButton:pressed:hover { border-image: url(:/core/images/panel_button_pressed.png) 2 2 2 19 } "
"QPushButton:hover { border-image: url(:/core/images/panel_button_hover.png) 2 2 2 19 } "
#endif
);
}

View File

@@ -38,7 +38,6 @@
#include "coreconstants.h"
#include "uniqueidmanager.h"
#include "viewmanagerinterface.h"
#include <utils/qtcassert.h>

View File

@@ -44,7 +44,6 @@
#include <QtCore/QSettings>
#include <QtGui/QMainWindow>
#include <QtGui/QStatusBar>
#include <QtGui/QToolBar>
#include <QtScript/QScriptEngine>
@@ -82,11 +81,6 @@ QMainWindow *CorePrototype::mainWindow() const
return callee()->mainWindow();
}
QStatusBar *CorePrototype::statusBar() const
{
return callee()->statusBar();
}
QSettings *CorePrototype::settings() const
{
return callee()->settings();

View File

@@ -55,7 +55,6 @@ class CorePrototype : public QObject, public QScriptable
Q_PROPERTY(Core::EditorManager* editorManager READ editorManager DESIGNABLE false SCRIPTABLE true STORED false)
Q_PROPERTY(QMainWindow* mainWindow READ mainWindow DESIGNABLE false SCRIPTABLE true STORED false)
Q_PROPERTY(QStatusBar* statusBar READ statusBar DESIGNABLE false SCRIPTABLE true STORED false)
Q_PROPERTY(QSettings* settings READ settings DESIGNABLE false SCRIPTABLE true STORED false)
public:
@@ -68,7 +67,6 @@ public:
Core::EditorManager *editorManager() const;
QMainWindow *mainWindow() const;
QStatusBar *statusBar() const;
QSettings *settings() const;
public slots:

View File

@@ -44,7 +44,7 @@ namespace Core {
/* Script Manager.
* Provides a script engine that is initialized with
* QWorkBenchs interfaces and allows for running scripts.
* Qt Creator's interfaces and allows for running scripts.
* @{todo} Should it actually manage script files, too? */
class CORE_EXPORT ScriptManagerInterface : public QObject

View File

@@ -231,13 +231,13 @@ SideBarWidget::SideBarWidget(SideBar *sideBar, const QString &title)
m_splitButton = new QToolButton;
m_splitButton->setProperty("type", QLatin1String("dockbutton"));
m_splitButton->setIcon(QIcon(":/qworkbench/images/splitbutton_horizontal.png"));
m_splitButton->setIcon(QIcon(":/core/images/splitbutton_horizontal.png"));
m_splitButton->setToolTip(tr("Split"));
connect(m_splitButton, SIGNAL(clicked(bool)), this, SIGNAL(split()));
m_closeButton = new QToolButton;
m_closeButton->setProperty("type", QLatin1String("dockbutton"));
m_closeButton->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
m_closeButton->setIcon(QIcon(":/core/images/closebutton.png"));
m_closeButton->setToolTip(tr("Close"));
connect(m_closeButton, SIGNAL(clicked(bool)), this, SIGNAL(close()));

View File

@@ -56,7 +56,7 @@ VersionDialog::VersionDialog(QWidget *parent)
{
// We need to set the window icon explicitly here since for some reason the
// application icon isn't used when the size of the dialog is fixed (at least not on X11/GNOME)
setWindowIcon(QIcon(":/qworkbench/images/qtcreator_logo_128.png"));
setWindowIcon(QIcon(":/core/images/qtcreator_logo_128.png"));
setWindowTitle(tr("About Qt Creator"));
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
@@ -102,7 +102,7 @@ VersionDialog::VersionDialog(QWidget *parent)
connect(buttonBox , SIGNAL(helpRequested()), this, SLOT(popupLicense()));
QLabel *logoLabel = new QLabel;
logoLabel->setPixmap(QPixmap(QLatin1String(":/qworkbench/images/qtcreator_logo_128.png")));
logoLabel->setPixmap(QPixmap(QLatin1String(":/core/images/qtcreator_logo_128.png")));
layout->addWidget(logoLabel , 0, 0, 1, 1);
layout->addWidget(copyRightLabel, 0, 1, 4, 4);
layout->addWidget(buttonBox, 4, 0, 1, 5);

View File

@@ -92,16 +92,16 @@ WelcomeModePrivate::WelcomeModePrivate() :
#else
m_label(new QLabel),
#endif
m_htmlTemplate(readFile(QLatin1String(":/qworkbench/html/welcome.html"))),
m_sessionHtmlTemplate(readFile(QLatin1String(":/qworkbench/html/recent_sessions.html"))),
m_projectHtmlTemplate(readFile(QLatin1String(":/qworkbench/html/recent_projects.html"))),
m_baseUrl(QUrl(QLatin1String("qrc:/qworkbench/html/welcome.html")))
m_htmlTemplate(readFile(QLatin1String(":/core/html/welcome.html"))),
m_sessionHtmlTemplate(readFile(QLatin1String(":/core/html/recent_sessions.html"))),
m_projectHtmlTemplate(readFile(QLatin1String(":/core/html/recent_projects.html"))),
m_baseUrl(QUrl(QLatin1String("qrc:/core/html/welcome.html")))
{
}
#if defined(QT_NO_WEBKIT)
const char *LABEL = "<center><table><tr><td><img src=\":/qworkbench/html/images/product_logo.png\"/></td><td width=300>"
const char *LABEL = "<center><table><tr><td><img src=\":/core/html/images/product_logo.png\"/></td><td width=300>"
"<h2><br/><br/>Welcome</h2><p> Qt Creator is an intuitive, modern cross platform IDE that enables "
"developers to create graphically appealing applications for desktop, "
"embedded, and mobile devices. "
@@ -172,7 +172,7 @@ QString WelcomeMode::name() const
QIcon WelcomeMode::icon() const
{
return QIcon(QLatin1String(":/qworkbench/images/qtcreator_logo_32.png"));
return QIcon(QLatin1String(":/core/images/qtcreator_logo_32.png"));
}
int WelcomeMode::priority() const

View File

@@ -715,7 +715,7 @@ void FormEditorW::print()
painter.drawPixmap(0, 0, pixmap);
m_core->mainWindow()->setCursor(oldCursor);
m_core->statusBar()->showMessage(tr("Printed %1...").arg(QFileInfo(fw->fileName()).fileName()));
// m_core->statusBar()->showMessage(tr("Printed %1...").arg(QFileInfo(fw->fileName()).fileName()));
} while (false);
m_core->printer()->setFullPage(oldFullPage);
m_core->printer()->setOrientation(oldOrientation);

View File

@@ -89,7 +89,7 @@ class SettingsPage;
* Requesting an editor via instance() will fully initialize the class.
* This is based on the assumption that the Designer settings work with
* no plugins loaded. If that does not work, full initialization can be
* triggered by connection to the ICore::settingsDialogRequested() signal.
* triggered by connection to the ICore::optionsDialogRequested() signal.
*/
class FormEditorW : public QObject
{

View File

@@ -81,7 +81,7 @@ FindToolBar::FindToolBar(FindPlugin *plugin, CurrentDocumentFind *currentDocumen
addWidget(spacerItem);
QToolButton *close = new QToolButton;
close->setProperty("type", QLatin1String("dockbutton"));
close->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
close->setIcon(QIcon(":/core/images/closebutton.png"));
connect(close, SIGNAL(clicked()), this, SLOT(hideAndResetFocus()));
addWidget(close);

View File

@@ -32,8 +32,12 @@
***************************************************************************/
#include "commitdata.h"
#include <utils/qtcassert.h>
#include <QtCore/QDebug>
#include <QtCore/QRegExp>
const char *const kBranchIndicatorC = "# On branch";
namespace Git {
namespace Internal {
@@ -85,6 +89,130 @@ void CommitData::clear()
untrackedFiles.clear();
}
// Split a state/file spec from git status output
// '#<tab>modified:<blanks>git .pro'
// into state and file ('modified', 'git .pro').
CommitData::StateFilePair splitStateFileSpecification(const QString &line)
{
QPair<QString, QString> rc;
const int statePos = 2;
const int colonIndex = line.indexOf(QLatin1Char(':'), statePos);
if (colonIndex == -1)
return rc;
rc.first = line.mid(statePos, colonIndex - statePos);
int filePos = colonIndex + 1;
const QChar blank = QLatin1Char(' ');
while (line.at(filePos) == blank)
filePos++;
if (filePos < line.size())
rc.second = line.mid(filePos, line.size() - filePos);
return rc;
}
// Convenience to add a state/file spec to a list
static inline bool addStateFileSpecification(const QString &line, QList<CommitData::StateFilePair> *list)
{
const CommitData::StateFilePair sf = splitStateFileSpecification(line);
if (sf.first.isEmpty() || sf.second.isEmpty())
return false;
list->push_back(sf);
return true;
}
/* Parse a git status file list:
* \code
# Changes to be committed:
#<tab>modified:<blanks>git.pro
# Changed but not updated:
#<tab>modified:<blanks>git.pro
# Untracked files:
#<tab>git.pro
\endcode
*/
bool CommitData::parseFilesFromStatus(const QString &output)
{
enum State { None, CommitFiles, NotUpdatedFiles, UntrackedFiles };
const QStringList lines = output.split(QLatin1Char('\n'));
const QString branchIndicator = QLatin1String(kBranchIndicatorC);
const QString commitIndicator = QLatin1String("# Changes to be committed:");
const QString notUpdatedIndicator = QLatin1String("# Changed but not updated:");
const QString untrackedIndicator = QLatin1String("# Untracked files:");
State s = None;
// Match added/changed-not-updated files: "#<tab>modified: foo.cpp"
QRegExp filesPattern(QLatin1String("#\\t[^:]+:\\s+.+"));
QTC_ASSERT(filesPattern.isValid(), return false);
const QStringList::const_iterator cend = lines.constEnd();
for (QStringList::const_iterator it = lines.constBegin(); it != cend; ++it) {
const QString line = *it;
if (line.startsWith(branchIndicator)) {
panelInfo.branch = line.mid(branchIndicator.size() + 1);
} else {
if (line.startsWith(commitIndicator)) {
s = CommitFiles;
} else {
if (line.startsWith(notUpdatedIndicator)) {
s = NotUpdatedFiles;
} else {
if (line.startsWith(untrackedIndicator)) {
// Now match untracked: "#<tab>foo.cpp"
s = UntrackedFiles;
filesPattern = QRegExp(QLatin1String("#\\t.+"));
QTC_ASSERT(filesPattern.isValid(), return false);
} else {
if (filesPattern.exactMatch(line)) {
switch (s) {
case CommitFiles:
addStateFileSpecification(line, &stagedFiles);
break;
case NotUpdatedFiles:
addStateFileSpecification(line, &unstagedFiles);
break;
case UntrackedFiles:
untrackedFiles.push_back(line.mid(2).trimmed());
break;
case None:
break;
}
}
}
}
}
}
}
return !stagedFiles.empty() || !unstagedFiles.empty() || !untrackedFiles.empty();
}
// Convert a spec pair list to a list of file names, optionally
// filter for a state
static QStringList specToFileNames(const QList<CommitData::StateFilePair> &files,
const QString &stateFilter)
{
typedef QList<CommitData::StateFilePair>::const_iterator ConstIterator;
if (files.empty())
return QStringList();
const bool emptyFilter = stateFilter.isEmpty();
QStringList rc;
const ConstIterator cend = files.constEnd();
for (ConstIterator it = files.constBegin(); it != cend; ++it)
if (emptyFilter || stateFilter == it->first)
rc.push_back(it->second);
return rc;
}
QStringList CommitData::stagedFileNames(const QString &stateFilter) const
{
return specToFileNames(stagedFiles, stateFilter);
}
QStringList CommitData::unstagedFileNames(const QString &stateFilter) const
{
return specToFileNames(unstagedFiles, stateFilter);
}
QDebug operator<<(QDebug d, const CommitData &data)
{
d << data.panelInfo << data.panelData;

View File

@@ -35,6 +35,7 @@
#define COMMITDATA_H
#include <QtCore/QStringList>
#include <QtCore/QPair>
QT_BEGIN_NAMESPACE
class QDebug;
@@ -68,11 +69,24 @@ QDebug operator<<(QDebug d, const GitSubmitEditorPanelData &);
struct CommitData
{
// A pair of state string/file name ('modified', 'file.cpp').
typedef QPair<QString, QString> StateFilePair;
void clear();
// Parse the files and the branch of panelInfo
// from a git status output
bool parseFilesFromStatus(const QString &output);
// Convenience to retrieve the file names from
// the specification list. Optionally filter for a certain state
QStringList stagedFileNames(const QString &stateFilter = QString()) const;
QStringList unstagedFileNames(const QString &stateFilter = QString()) const;
GitSubmitEditorPanelInfo panelInfo;
GitSubmitEditorPanelData panelData;
QStringList stagedFiles;
QStringList unstagedFiles;
QList<StateFilePair> stagedFiles;
QList<StateFilePair> unstagedFiles;
QStringList untrackedFiles;
};

View File

@@ -622,73 +622,6 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory,
return StatusChanged;
}
/* Parse a git status file list:
* \code
# Changes to be committed:
#<tab>modified:<blanks>git.pro
# Changed but not updated:
#<tab>modified:<blanks>git.pro
# Untracked files:
#<tab>git.pro
\endcode
*/
static bool parseFiles(const QString &output, CommitData *d)
{
enum State { None, CommitFiles, NotUpdatedFiles, UntrackedFiles };
const QStringList lines = output.split(QLatin1Char('\n'));
const QString branchIndicator = QLatin1String(kBranchIndicatorC);
const QString commitIndicator = QLatin1String("# Changes to be committed:");
const QString notUpdatedIndicator = QLatin1String("# Changed but not updated:");
const QString untrackedIndicator = QLatin1String("# Untracked files:");
State s = None;
// Match added/changed-not-updated files: "#<tab>modified: foo.cpp"
QRegExp filesPattern(QLatin1String("#\\t[^:]+:\\s+.+"));
QTC_ASSERT(filesPattern.isValid(), return false);
const QStringList::const_iterator cend = lines.constEnd();
for (QStringList::const_iterator it = lines.constBegin(); it != cend; ++it) {
const QString line = *it;
if (line.startsWith(branchIndicator)) {
d->panelInfo.branch = line.mid(branchIndicator.size() + 1);
} else {
if (line.startsWith(commitIndicator)) {
s = CommitFiles;
} else {
if (line.startsWith(notUpdatedIndicator)) {
s = NotUpdatedFiles;
} else {
if (line.startsWith(untrackedIndicator)) {
// Now match untracked: "#<tab>foo.cpp"
s = UntrackedFiles;
filesPattern = QRegExp(QLatin1String("#\\t.+"));
QTC_ASSERT(filesPattern.isValid(), return false);
} else {
if (filesPattern.exactMatch(line)) {
const QString fileSpec = line.mid(2).trimmed();
switch (s) {
case CommitFiles:
d->stagedFiles.push_back(trimFileSpecification(fileSpec));
break;
case NotUpdatedFiles:
d->unstagedFiles.push_back(trimFileSpecification(fileSpec));
break;
case UntrackedFiles:
d->untrackedFiles.push_back(fileSpec);
break;
case None:
break;
}
}
}
}
}
}
}
return !d->stagedFiles.empty() || !d->unstagedFiles.empty() || !d->untrackedFiles.empty();
}
// Filter out untracked files that are not part of the project
static void filterUntrackedFilesOfProject(const QString &repoDir, QStringList *l)
{
@@ -771,20 +704,12 @@ bool GitClient::getCommitData(const QString &workingDirectory,
// #
// # list of files...
if (!parseFiles(output, d)) {
if (!d->parseFilesFromStatus(output)) {
*errorMessage = msgParseFilesFailed();
return false;
}
// Filter out untracked files that are not part of the project and,
// for symmetry, insert the prefix "untracked:" (as "added:" or ":modified"
// for staged files).
// Filter out untracked files that are not part of the project
filterUntrackedFilesOfProject(repoDirectory, &d->untrackedFiles);
if (!d->untrackedFiles.empty()) {
const QString untrackedPrefix = QLatin1String("untracked: ");
const QStringList::iterator pend = d->untrackedFiles.end();
for (QStringList::iterator it = d->untrackedFiles.begin(); it != pend; ++it)
it->insert(0, untrackedPrefix);
}
d->panelData.author = readConfigValue(workingDirectory, QLatin1String("user.name"));
d->panelData.email = readConfigValue(workingDirectory, QLatin1String("user.email"));
@@ -881,7 +806,7 @@ GitClient::RevertResult GitClient::revertI(QStringList files, bool *ptrToIsDirec
return RevertFailed;
}
CommitData data;
if (!parseFiles(output, &data)) {
if (!data.parseFilesFromStatus(output)) {
*errorMessage = msgParseFilesFailed();
return RevertFailed;
}
@@ -896,9 +821,9 @@ GitClient::RevertResult GitClient::revertI(QStringList files, bool *ptrToIsDirec
}
// From the status output, determine all modified [un]staged files.
const QString modifiedPattern = QLatin1String("modified: ");
const QStringList allStagedFiles = GitSubmitEditor::statusListToFileList(data.stagedFiles.filter(modifiedPattern));
const QStringList allUnstagedFiles = GitSubmitEditor::statusListToFileList(data.unstagedFiles.filter(modifiedPattern));
const QString modifiedState = QLatin1String("modified");
const QStringList allStagedFiles = data.stagedFileNames(modifiedState);
const QStringList allUnstagedFiles = data.unstagedFileNames(modifiedState);
// Unless a directory was passed, filter all modified files for the
// argument file list.
QStringList stagedFiles = allStagedFiles;

View File

@@ -602,7 +602,7 @@ void GitPlugin::startCommit()
// Store repository for diff and the original list of
// files to be able to unstage files the user unchecks
m_submitRepository = data.panelInfo.repository;
m_submitOrigCommitFiles = GitSubmitEditor::statusListToFileList(data.stagedFiles);
m_submitOrigCommitFiles = data.stagedFileNames();
if (Git::Constants::debug)
qDebug() << Q_FUNC_INFO << data << commitTemplate;

View File

@@ -36,6 +36,8 @@
#include "gitconstants.h"
#include "commitdata.h"
#include <vcsbase/submitfilemodel.h>
#include <QtCore/QDebug>
namespace Git {
@@ -52,14 +54,14 @@ GitSubmitEditorWidget *GitSubmitEditor::submitEditorWidget()
return static_cast<GitSubmitEditorWidget *>(widget());
}
QStringList GitSubmitEditor::statusListToFileList(const QStringList &rawList)
static void addStateFileListToModel(const QList<CommitData::StateFilePair> &l,
VCSBase::SubmitFileModel *model,
bool checked)
{
if (rawList.empty())
return rawList;
QStringList rc;
foreach (const QString &rf, rawList)
rc.push_back(fileFromStatusLine(rf));
return rc;
typedef QList<CommitData::StateFilePair>::const_iterator ConstIterator;
const ConstIterator cend = l.constEnd();
for (ConstIterator it = l.constBegin(); it != cend; ++it)
model->addFile(it->second, it->first, checked);
}
void GitSubmitEditor::setCommitData(const CommitData &d)
@@ -67,10 +69,16 @@ void GitSubmitEditor::setCommitData(const CommitData &d)
submitEditorWidget()->setPanelData(d.panelData);
submitEditorWidget()->setPanelInfo(d.panelInfo);
addFiles(d.stagedFiles, true, true);
// Not Updated: Initially unchecked
addFiles(d.unstagedFiles, false, true);
addFiles(d.untrackedFiles, false, true);
VCSBase::SubmitFileModel *model = new VCSBase::SubmitFileModel(this);
addStateFileListToModel(d.stagedFiles, model, true);
addStateFileListToModel(d.unstagedFiles, model, false);
if (!d.untrackedFiles.empty()) {
const QString untrackedSpec = QLatin1String("untracked");
const QStringList::const_iterator cend = d.untrackedFiles.constEnd();
for (QStringList::const_iterator it = d.untrackedFiles.constBegin(); it != cend; ++it)
model->addFile(*it, untrackedSpec, false);
}
setFileModel(model);
}
GitSubmitEditorPanelData GitSubmitEditor::panelData() const
@@ -78,18 +86,5 @@ GitSubmitEditorPanelData GitSubmitEditor::panelData() const
return const_cast<GitSubmitEditor*>(this)->submitEditorWidget()->panelData();
}
QString GitSubmitEditor::fileFromStatusLine(const QString &line)
{
QString rc = line;
// "modified: mainwindow.cpp"
const int index = rc.indexOf(QLatin1Char(':'));
if (index != -1)
rc.remove(0, index + 1);
const QChar blank(' ');
while (rc.startsWith(blank))
rc.remove(0, 1);
return rc;
}
} // namespace Internal
} // namespace Git

View File

@@ -54,13 +54,6 @@ public:
void setCommitData(const CommitData &);
GitSubmitEditorPanelData panelData() const;
static QString fileFromStatusLine(const QString &line);
static QStringList statusListToFileList(const QStringList &);
protected:
virtual QStringList vcsFileListToFileList(const QStringList &l) const
{ return statusListToFileList(l); }
private:
inline GitSubmitEditorWidget *submitEditorWidget();
};

View File

@@ -355,7 +355,7 @@ void HelpPlugin::createRightPaneSideBar()
QToolButton *closeButton = new QToolButton();
closeButton->setProperty("type", QLatin1String("dockbutton"));
closeButton->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
closeButton->setIcon(QIcon(":/core/images/closebutton.png"));
// Dummy layout to align the close button to the right
QHBoxLayout *hboxLayout = new QHBoxLayout();

View File

@@ -494,19 +494,19 @@ void PerforcePlugin::submit()
QTC_ASSERT(m_coreInstance, return);
if (!checkP4Command()) {
showOutput(tr("No p4 executable specified!"));
showOutput(tr("No p4 executable specified!"), true);
return;
}
if (m_changeTmpFile) {
showOutput(tr("Another submit is currently executed."));
showOutput(tr("Another submit is currently executed."), true);
m_perforceOutputWindow->popup(false);
return;
}
m_changeTmpFile = new QTemporaryFile(this);
if (!m_changeTmpFile->open()) {
showOutput(tr("Cannot create temporary file."));
showOutput(tr("Cannot create temporary file."), true);
delete m_changeTmpFile;
m_changeTmpFile = 0;
return;
@@ -970,7 +970,7 @@ bool PerforcePlugin::editorAboutToClose(Core::IEditor *editor)
QByteArray change = m_changeTmpFile->readAll();
m_changeTmpFile->close();
if (!checkP4Command()) {
showOutput(tr("No p4 executable specified!"));
showOutput(tr("No p4 executable specified!"), true);
delete m_changeTmpFile;
m_changeTmpFile = 0;
return false;
@@ -981,8 +981,8 @@ bool PerforcePlugin::editorAboutToClose(Core::IEditor *editor)
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
proc.start(m_settings.p4Command,
basicP4Args() << QLatin1String("submit") << QLatin1String("-i"));
if (!proc.waitForStarted(3000)) {
showOutput(tr("Cannot execute p4 submit."));
if (!proc.waitForStarted(p4Timeout)) {
showOutput(tr("Cannot execute p4 submit."), true);
QApplication::restoreOverrideCursor();
delete m_changeTmpFile;
m_changeTmpFile = 0;
@@ -992,7 +992,7 @@ bool PerforcePlugin::editorAboutToClose(Core::IEditor *editor)
proc.closeWriteChannel();
if (!proc.waitForFinished()) {
showOutput(tr("Cannot execute p4 submit."));
showOutput(tr("Cannot execute p4 submit."), true);
QApplication::restoreOverrideCursor();
delete m_changeTmpFile;
m_changeTmpFile = 0;
@@ -1000,7 +1000,7 @@ bool PerforcePlugin::editorAboutToClose(Core::IEditor *editor)
}
QString output = QString::fromUtf8(proc.readAll());
showOutput(output);
if (output.contains("Out of date files must be resolved or reverted")) {
if (output.contains("Out of date files must be resolved or reverted"), true) {
QMessageBox::warning(editor->widget(), "Pending change", "Could not submit the change, because your workspace was out of date. Created a pending submit instead.");
}
QApplication::restoreOverrideCursor();

View File

@@ -36,6 +36,7 @@
#include "perforceplugin.h"
#include "perforceconstants.h"
#include <vcsbase/submitfilemodel.h>
#include <utils/qtcassert.h>
#include <QtCore/QDebug>
@@ -43,10 +44,14 @@
namespace Perforce {
namespace Internal {
enum { FileSpecRole = Qt::UserRole + 1 };
PerforceSubmitEditor::PerforceSubmitEditor(const VCSBase::VCSBaseSubmitEditorParameters *parameters, QWidget *parent) :
VCSBaseSubmitEditor(parameters, new PerforceSubmitEditorWidget(parent))
VCSBaseSubmitEditor(parameters, new PerforceSubmitEditorWidget(parent)),
m_fileModel(new VCSBase::SubmitFileModel(this))
{
setDisplayName(tr("Perforce Submit"));
setFileModel(m_fileModel);
}
PerforceSubmitEditorWidget *PerforceSubmitEditor::submitEditorWidget()
@@ -54,14 +59,6 @@ PerforceSubmitEditorWidget *PerforceSubmitEditor::submitEditorWidget()
return static_cast<PerforceSubmitEditorWidget *>(widget());
}
QStringList PerforceSubmitEditor::vcsFileListToFileList(const QStringList &rawList) const
{
QStringList rc;
foreach (const QString &rf, rawList)
rc.push_back(fileFromChangeLine(rf));
return rc;
}
QString PerforceSubmitEditor::fileContents() const
{
const_cast<PerforceSubmitEditor*>(this)->updateEntries();
@@ -121,25 +118,7 @@ bool PerforceSubmitEditor::parseText(QString text)
void PerforceSubmitEditor::restrictToProjectFiles(const QStringList &knownProjectFiles)
{
QStringList allFiles = submitEditorWidget()->fileList();
const int oldSize = allFiles.size();
for (int i = oldSize - 1; i >= 0; i--)
if (!knownProjectFiles.contains(fileFromChangeLine(allFiles.at(i))))
allFiles.removeAt(i);
if (allFiles.size() != oldSize)
submitEditorWidget()->setFileList(allFiles);
if (Perforce::Constants::debug)
qDebug() << Q_FUNC_INFO << oldSize << "->" << allFiles.size();
}
QString PerforceSubmitEditor::fileFromChangeLine(const QString &line)
{
QString rc = line;
// " foo.cpp#add"
const int index = rc.lastIndexOf(QLatin1Char('#'));
if (index != -1)
rc.truncate(index);
return rc.trimmed();
m_fileModel->filter(knownProjectFiles, fileNameColumn());
}
void PerforceSubmitEditor::updateFields()
@@ -161,12 +140,15 @@ void PerforceSubmitEditor::updateFields()
widget->setDescriptionText(lines.join(newLine));
lines = m_entries.value(QLatin1String("Files")).split(newLine);
lines.replaceInStrings(leadingTabPattern, QString());
QStringList fileList;
foreach (const QString &line, lines)
if (!line.isEmpty())
fileList.push_back(line);
widget->setFileList(fileList);
// split up "file#add" and store complete spec line as user data
foreach (const QString &specLine, lines) {
const QStringList list = specLine.split(QLatin1Char('#'));
if (list.size() == 2) {
const QString file = list.at(0).trimmed();
const QString state = list.at(1).trimmed();
m_fileModel->addFile(file, state).at(0)->setData(specLine, FileSpecRole);
}
}
}
void PerforceSubmitEditor::updateEntries()
@@ -181,14 +163,15 @@ void PerforceSubmitEditor::updateEntries()
lines.replaceInStrings(QRegExp(QLatin1String("^")), tab);
m_entries.insert(QLatin1String("Description"), newLine + lines.join(newLine) + QLatin1String("\n\n"));
QString files = newLine;
// Files
const QStringList fileList = submitEditorWidget()->fileList();
const int count = fileList.size();
for (int i = 0; i < count; i++) {
files += tab;
files += fileList.at(i);
// Re-build the file spec '<tab>file#add' from the user data
const int count = m_fileModel->rowCount();
for (int r = 0; r < count; r++) {
const QStandardItem *item = m_fileModel->item(r, 0);
if (item->checkState() == Qt::Checked) {
files += item->data(FileSpecRole).toString();
files += newLine;
}
}
files += newLine;
m_entries.insert(QLatin1String("Files"), files);
}

View File

@@ -39,6 +39,10 @@
#include <QtCore/QStringList>
#include <QtCore/QMap>
namespace VCSBase {
class SubmitFileModel;
}
namespace Perforce {
namespace Internal {
@@ -66,7 +70,6 @@ public:
static QString fileFromChangeLine(const QString &line);
protected:
virtual QStringList vcsFileListToFileList(const QStringList &) const;
virtual QString fileContents() const;
virtual bool setFileContents(const QString &contents);
@@ -77,6 +80,7 @@ private:
void updateEntries();
QMap<QString, QString> m_entries;
VCSBase::SubmitFileModel *m_fileModel;
};
} // namespace Internal

View File

@@ -36,6 +36,7 @@
#include "buildstepspage.h"
#include "project.h"
#include <coreplugin/coreconstants.h>
#include <extensionsystem/pluginmanager.h>
#include <QtCore/QDebug>
@@ -102,9 +103,9 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
m_ui.splitter->setStretchFactor(1,10);
m_ui.buildSettingsList->setContextMenuPolicy(Qt::CustomContextMenu);
m_ui.addButton->setIcon(QIcon(":/qworkbench/images/plus.png"));
m_ui.addButton->setIcon(QIcon(Core::Constants::ICON_PLUS));
m_ui.addButton->setText("");
m_ui.removeButton->setIcon(QIcon(":/qworkbench/images/minus.png"));
m_ui.removeButton->setIcon(QIcon(Core::Constants::ICON_MINUS));
m_ui.removeButton->setText("");
QMenu *addButtonMenu = new QMenu(this);

View File

@@ -36,6 +36,7 @@
#include "ui_buildstepspage.h"
#include "project.h"
#include <coreplugin/coreconstants.h>
#include <extensionsystem/pluginmanager.h>
#include <utils/qtcassert.h>
@@ -50,8 +51,8 @@ BuildStepsPage::BuildStepsPage(Project *project) :
m_ui->setupUi(this);
m_ui->buildStepAddButton->setMenu(new QMenu(this));
m_ui->buildStepAddButton->setIcon(QIcon(":/qworkbench/images/plus.png"));
m_ui->buildStepRemoveToolButton->setIcon(QIcon(":/qworkbench/images/minus.png"));
m_ui->buildStepAddButton->setIcon(QIcon(Core::Constants::ICON_PLUS));
m_ui->buildStepRemoveToolButton->setIcon(QIcon(Core::Constants::ICON_MINUS));
m_ui->buildStepUpToolButton->setArrowType(Qt::UpArrow);
m_ui->buildStepDownToolButton->setArrowType(Qt::DownArrow);

View File

@@ -1,59 +1,45 @@
<ui version="4.0" >
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ProjectExplorer::Internal::DependenciesDialog</class>
<widget class="QDialog" name="ProjectExplorer::Internal::DependenciesDialog" >
<property name="geometry" >
<widget class="QDialog" name="ProjectExplorer::Internal::DependenciesDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>618</width>
<height>660</height>
<width>492</width>
<height>435</height>
</rect>
</property>
<property name="windowTitle" >
<property name="windowTitle">
<string>Project Dependencies</string>
</property>
<layout class="QVBoxLayout" >
<property name="spacing" >
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin" >
<number>9</number>
</property>
<property name="topMargin" >
<number>9</number>
</property>
<property name="rightMargin" >
<number>9</number>
</property>
<property name="bottomMargin" >
<property name="margin">
<number>9</number>
</property>
<item>
<widget class="QTableView" name="dependencyTable" >
<property name="minimumSize" >
<size>
<width>600</width>
<height>600</height>
</size>
</property>
<property name="selectionMode" >
<widget class="QTableView" name="dependencyTable">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line" >
<property name="orientation" >
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox" >
<property name="orientation" >
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons" >
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
@@ -68,11 +54,11 @@
<receiver>ProjectExplorer::Internal::DependenciesDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel" >
<hint type="sourcelabel">
<x>142</x>
<y>285</y>
</hint>
<hint type="destinationlabel" >
<hint type="destinationlabel">
<x>142</x>
<y>155</y>
</hint>
@@ -84,11 +70,11 @@
<receiver>ProjectExplorer::Internal::DependenciesDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel" >
<hint type="sourcelabel">
<x>142</x>
<y>285</y>
</hint>
<hint type="destinationlabel" >
<hint type="destinationlabel">
<x>142</x>
<y>155</y>
</hint>

View File

@@ -209,7 +209,7 @@ Core::NavigationView FolderNavigationWidgetFactory::createWidget()
n.widget = ptw;
QToolButton *toggleSync = new QToolButton;
toggleSync->setProperty("type", "dockbutton");
toggleSync->setIcon(QIcon(":/qworkbench/images/linkicon.png"));
toggleSync->setIcon(QIcon(":/core/images/linkicon.png"));
toggleSync->setCheckable(true);
toggleSync->setChecked(ptw->autoSynchronization());
toggleSync->setToolTip(tr("Synchronize with Editor"));

View File

@@ -484,6 +484,10 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin
mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
msessionContextMenu->addAction(cmd, Constants::G_SESSION_BUILD);
// dependencies action
m_dependenciesAction = new QAction(tr("Edit Dependencies..."), this);
cmd = am->registerAction(m_dependenciesAction, Constants::DEPENDENCIES, globalcontext);
mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
// build action
m_buildAction = new QAction(tr("Build Project"), this);
@@ -555,11 +559,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin
mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
modeManager->addAction(cmd, Constants::P_ACTION_DEBUG, m_runConfigurationMenu);
// dependencies action
m_dependenciesAction = new QAction(tr("Edit Dependencies..."), this);
cmd = am->registerAction(m_dependenciesAction, Constants::DEPENDENCIES, pecontext);
msessionContextMenu->addAction(cmd, Constants::G_SESSION_CONFIG);
// add new file action
m_addNewFileAction = new QAction(tr("Add New..."), this);
cmd = am->registerAction(m_addNewFileAction, ProjectExplorer::Constants::ADDNEWFILE,

View File

@@ -159,7 +159,7 @@ ProjectTreeWidget::ProjectTreeWidget(Core::ICore *core, QWidget *parent)
m_toggleSync = new QToolButton;
m_toggleSync->setProperty("type", "dockbutton");
m_toggleSync->setIcon(QIcon(":/qworkbench/images/linkicon.png"));
m_toggleSync->setIcon(QIcon(":/core/images/linkicon.png"));
m_toggleSync->setCheckable(true);
m_toggleSync->setChecked(autoSynchronization());
m_toggleSync->setToolTip(tr("Synchronize with Editor"));

View File

@@ -36,6 +36,7 @@
#include "ui_runsettingspropertiespage.h"
#include <coreplugin/coreconstants.h>
#include <extensionsystem/pluginmanager.h>
#include <utils/qtcassert.h>
@@ -180,9 +181,9 @@ RunSettingsWidget::RunSettingsWidget(Project *project)
m_ui = new Ui::RunSettingsPropertiesPage;
m_ui->setupUi(this);
m_addMenu = new QMenu(m_ui->addToolButton);
m_ui->addToolButton->setIcon(QIcon(":/qworkbench/images/plus.png"));
m_ui->addToolButton->setIcon(QIcon(Core::Constants::ICON_PLUS));
m_ui->addToolButton->setMenu(m_addMenu);
m_ui->removeToolButton->setIcon(QIcon(":/qworkbench/images/minus.png"));
m_ui->removeToolButton->setIcon(QIcon(Core::Constants::ICON_MINUS));
m_ui->runConfigurationCombo->setModel(m_runConfigurationsModel);
connect(m_addMenu, SIGNAL(aboutToShow()),

View File

@@ -139,6 +139,29 @@ inline Core::IEditor* locateEditor(const Core::ICore *core, const char *property
return 0;
}
// Parse "svn status" output for added/modified/deleted files
// "M<7blanks>file"
typedef QList<SubversionSubmitEditor::StatusFilePair> StatusList;
StatusList parseStatusOutput(const QString &output)
{
StatusList changeSet;
const QString newLine = QString(QLatin1Char('\n'));
const QStringList list = output.split(newLine, QString::SkipEmptyParts);
foreach (const QString &l, list) {
const QString line =l.trimmed();
if (line.size() > 8) {
const QChar state = line.at(0);
if (state == QLatin1Char('A') || state == QLatin1Char('D') || state == QLatin1Char('M')) {
const QString fileName = line.mid(7);
changeSet.push_back(SubversionSubmitEditor::StatusFilePair(QString(state), fileName));
}
}
}
return changeSet;
}
// ------------- SubversionPlugin
Core::ICore *SubversionPlugin::m_coreInstance = 0;
SubversionPlugin *SubversionPlugin::m_subversionPluginInstance = 0;
@@ -694,7 +717,7 @@ void SubversionPlugin::startCommit(const QStringList &files)
if (response.error)
return;
// Get list of added/modified/deleted files
const QStringList statusOutput = parseStatusOutput(response.stdOut);
const StatusList statusOutput = parseStatusOutput(response.stdOut);
if (statusOutput.empty()) {
showOutput(tr("There are no modified files."), true);
return;
@@ -717,22 +740,7 @@ void SubversionPlugin::startCommit(const QStringList &files)
m_changeTmpFile->seek(0);
// Create a submit editor and set file list
SubversionSubmitEditor *editor = openSubversionSubmitEditor(m_changeTmpFile->fileName());
editor->setFileList(statusOutput);
}
// Parse "status" output for added/modified/deleted files
QStringList SubversionPlugin::parseStatusOutput(const QString &output) const
{
QStringList changeSet;
const QString newLine = QString(QLatin1Char('\n'));
const QStringList list = output.split(newLine, QString::SkipEmptyParts);
foreach (const QString &l, list) {
QString line(l.trimmed());
if (line.startsWith(QLatin1Char('A')) || line.startsWith(QLatin1Char('D'))
|| line.startsWith(QLatin1Char('M')))
changeSet.append(line);
}
return changeSet;
editor->setStatusList(statusOutput);
}
bool SubversionPlugin::commit(const QString &messageFile,

View File

@@ -133,7 +133,6 @@ private:
SubversionResponse runSvn(const QStringList &arguments, int timeOut,
bool showStdOutInOutputWindow, QTextCodec *outputCodec = 0);
void showOutput(const QString &output, bool bringToForeground = true);
QStringList parseStatusOutput(const QString &output) const;
void annotate(const QString &file);
void filelog(const QString &file);
bool managesDirectory(const QDir &directory) const;

View File

@@ -35,6 +35,7 @@
#include "subversionsubmiteditor.h"
#include <utils/submiteditorwidget.h>
#include <vcsbase/submitfilemodel.h>
using namespace Subversion::Internal;
@@ -45,6 +46,19 @@ SubversionSubmitEditor::SubversionSubmitEditor(const VCSBase::VCSBaseSubmitEdito
setDisplayName(tr("Subversion Submit"));
}
void SubversionSubmitEditor::setStatusList(const QList<StatusFilePair> &statusOutput)
{
typedef QList<StatusFilePair>::const_iterator ConstIterator;
VCSBase::SubmitFileModel *model = new VCSBase::SubmitFileModel(this);
const ConstIterator cend = statusOutput.constEnd();
for (ConstIterator it = statusOutput.constBegin(); it != cend; ++it)
model->addFile(it->second, it->first, true);
setFileModel(model);
}
/*
QStringList SubversionSubmitEditor::vcsFileListToFileList(const QStringList &rl) const
{
QStringList files;
@@ -59,3 +73,5 @@ QString SubversionSubmitEditor::fileFromStatusLine(const QString &statusLine)
enum { filePos = 7 };
return statusLine.mid(filePos, statusLine.size() - filePos);
}
*/

View File

@@ -34,6 +34,9 @@
#ifndef SUBVERSIONSUBMITEDITOR_H
#define SUBVERSIONSUBMITEDITOR_H
#include <QtCore/QPair>
#include <QtCore/QStringList>
#include <vcsbase/vcsbasesubmiteditor.h>
namespace Subversion {
@@ -48,8 +51,10 @@ public:
static QString fileFromStatusLine(const QString &statusLine);
private:
virtual QStringList vcsFileListToFileList(const QStringList &) const;
// A list of ( 'A','M','D') status indicators and file names.
typedef QPair<QString, QString> StatusFilePair;
void setStatusList(const QList<StatusFilePair> &statusOutput);
};
} // namespace Internal

View File

@@ -86,10 +86,10 @@ TextEditorSettings::TextEditorSettings(Internal::TextEditorPlugin *plugin,
formatDescriptions.push_back(FormatDescription(QLatin1String(C_DISABLED_CODE), tr("Disabled Code"), Qt::gray));
// Diff categories
formatDescriptions.push_back(FormatDescription(QLatin1String(C_ADDED_LINE), tr("Added Line"), Qt::blue));
formatDescriptions.push_back(FormatDescription(QLatin1String(C_ADDED_LINE), tr("Added Line"), QColor(0, 170, 0)));
formatDescriptions.push_back(FormatDescription(QLatin1String(C_REMOVED_LINE), tr("Removed Line"), Qt::red));
formatDescriptions.push_back(FormatDescription(QLatin1String(C_DIFF_FILE), tr("Diff File"), Qt::black));
formatDescriptions.push_back(FormatDescription(QLatin1String(C_DIFF_LOCATION), tr("Diff Location"), Qt::green));
formatDescriptions.push_back(FormatDescription(QLatin1String(C_DIFF_FILE), tr("Diff File"), Qt::darkBlue));
formatDescriptions.push_back(FormatDescription(QLatin1String(C_DIFF_LOCATION), tr("Diff Location"), Qt::blue));
m_fontSettingsPage = new FontSettingsPage(formatDescriptions,
QLatin1String("TextEditor"),

View File

@@ -0,0 +1,78 @@
/***************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/
#include "submitfilemodel.h"
#include "vcsbaseconstants.h"
#include <QtGui/QStandardItem>
#include <QtCore/QDebug>
namespace VCSBase {
SubmitFileModel::SubmitFileModel(QObject *parent) :
QStandardItemModel(0, 2, parent)
{
// setColumnCount(2);
QStringList headerLabels;
headerLabels << tr("State") << tr("File");
setHorizontalHeaderLabels(headerLabels);
}
QList<QStandardItem *> SubmitFileModel::addFile(const QString &fileName, const QString &status, bool checked)
{
if (VCSBase::Constants::Internal::debug)
qDebug() << Q_FUNC_INFO << fileName << status << checked;
QStandardItem *statusItem = new QStandardItem(status);
statusItem->setCheckable(true);
statusItem->setCheckState(checked ? Qt::Checked : Qt::Unchecked);
QStandardItem *fileItem = new QStandardItem(fileName);
QList<QStandardItem *> row;
row << statusItem << fileItem;
appendRow(row);
return row;
}
unsigned SubmitFileModel::filter(const QStringList &filter, int column)
{
unsigned rc = 0;
for (int r = rowCount() - 1; r >= 0; r--)
if (const QStandardItem *i = item(r, column))
if (!filter.contains(i->text())) {
qDeleteAll(takeRow(r));
rc++;
}
if (VCSBase::Constants::Internal::debug)
qDebug() << Q_FUNC_INFO << " deleted " << rc << " items using " << filter << " , remaining " << rowCount();
return rc;
}
}

View File

@@ -0,0 +1,62 @@
/***************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/
#ifndef SUBMITMODEL_H
#define SUBMITMODEL_H
#include "vcsbase_global.h"
#include <QtGui/QStandardItemModel>
namespace VCSBase {
/* A 2-column (checkable, state, file name) model to be used to list the files-
* in the submit editor. Provides header items and a convience to add files. */
class VCSBASE_EXPORT SubmitFileModel : public QStandardItemModel
{
Q_OBJECT
public:
explicit SubmitFileModel(QObject *parent = 0);
// Convenience to add a file plus status text.
QList<QStandardItem *> addFile(const QString &fileName, const QString &status = QString(), bool checked = true);
// Filter for entries contained in the filter list. Returns the
// number of deleted entries.
unsigned filter(const QStringList &filter, int column);
};
}
#endif // SUBMITMODEL_H

View File

@@ -1,31 +1,28 @@
TEMPLATE = lib
TARGET = VCSBase
DEFINES += VCSBASE_LIBRARY
include(../../qworkbenchplugin.pri)
include(vcsbase_dependencies.pri)
HEADERS += vcsbase_global.h \
vcsbaseconstants.h \
vcsbaseplugin.h \
baseannotationhighlighter.h \
diffhighlighter.h \
vcsbasetextdocument.h \
vcsbaseeditor.h \
vcsbasesubmiteditor.h \
basevcseditorfactory.h \
submiteditorfile.h \
basevcssubmiteditorfactory.h
vcsbaseconstants.h \
vcsbaseplugin.h \
baseannotationhighlighter.h \
diffhighlighter.h \
vcsbasetextdocument.h \
vcsbaseeditor.h \
vcsbasesubmiteditor.h \
basevcseditorfactory.h \
submiteditorfile.h \
basevcssubmiteditorfactory.h \
submitfilemodel.h
SOURCES += vcsbaseplugin.cpp \
baseannotationhighlighter.cpp \
diffhighlighter.cpp \
vcsbasetextdocument.cpp \
vcsbaseeditor.cpp \
vcsbasesubmiteditor.cpp \
basevcseditorfactory.cpp \
submiteditorfile.cpp \
basevcssubmiteditorfactory.cpp
RESOURCES=vcsbase.qrc
baseannotationhighlighter.cpp \
diffhighlighter.cpp \
vcsbasetextdocument.cpp \
vcsbaseeditor.cpp \
vcsbasesubmiteditor.cpp \
basevcseditorfactory.cpp \
submiteditorfile.cpp \
basevcssubmiteditorfactory.cpp \
submitfilemodel.cpp
RESOURCES = vcsbase.qrc

View File

@@ -129,6 +129,16 @@ VCSBaseSubmitEditor::~VCSBaseSubmitEditor()
delete m_d;
}
int VCSBaseSubmitEditor::fileNameColumn() const
{
return m_d->m_widget->fileNameColumn();
}
void VCSBaseSubmitEditor::setFileNameColumn(int c)
{
m_d->m_widget->setFileNameColumn(c);
}
void VCSBaseSubmitEditor::slotDescriptionChanged()
{
}
@@ -246,22 +256,22 @@ bool VCSBaseSubmitEditor::restoreState(const QByteArray &/*state*/)
QStringList VCSBaseSubmitEditor::checkedFiles() const
{
return vcsFileListToFileList(m_d->m_widget->checkedFiles());
return m_d->m_widget->checkedFiles();
}
void VCSBaseSubmitEditor::setFileList(const QStringList &l)
void VCSBaseSubmitEditor::setFileModel(QAbstractItemModel *m)
{
m_d->m_widget->setFileList(l);
m_d->m_widget->setFileModel(m);
}
void VCSBaseSubmitEditor::addFiles(const QStringList& list, bool checked, bool userCheckable)
QAbstractItemModel *VCSBaseSubmitEditor::fileModel() const
{
m_d->m_widget->addFiles(list, checked, userCheckable);
return m_d->m_widget->fileModel();
}
void VCSBaseSubmitEditor::slotDiffSelectedVCSFiles(const QStringList &rawList)
{
emit diffSelectedFiles(vcsFileListToFileList(rawList));
emit diffSelectedFiles(rawList);
}
bool VCSBaseSubmitEditor::save(const QString &fileName)

View File

@@ -42,6 +42,7 @@
QT_BEGIN_NAMESPACE
class QIcon;
class QAbstractItemModel;
QT_END_NAMESPACE
namespace Core {
@@ -90,6 +91,7 @@ struct VCSBASE_EXPORT VCSBaseSubmitEditorParameters {
class VCSBASE_EXPORT VCSBaseSubmitEditor : public Core::IEditor
{
Q_OBJECT
Q_PROPERTY(int fileNameColumn READ fileNameColumn WRITE setFileNameColumn DESIGNABLE false)
public:
typedef QList<int> Context;
@@ -100,6 +102,9 @@ protected:
public:
virtual ~VCSBaseSubmitEditor();
int fileNameColumn() const;
void setFileNameColumn(int c);
// Core::IEditor
virtual bool createNew(const QString &contents);
virtual bool open(const QString &fileName);
@@ -119,8 +124,8 @@ public:
QStringList checkedFiles() const;
void setFileList(const QStringList&);
void addFiles(const QStringList&, bool checked = true, bool userCheckable = true);
void setFileModel(QAbstractItemModel *m);
QAbstractItemModel *fileModel() const;
// Utilities returning some predefined icons for actions
static QIcon diffIcon();
@@ -139,11 +144,6 @@ private slots:
void slotDescriptionChanged();
protected:
/* Implemented this to extract the real file list from the status
* output of the versioning system as displayed in the file list
* for example "M foo.cpp" -> "foo.cpp". */
virtual QStringList vcsFileListToFileList(const QStringList &) const = 0;
/* These hooks allow for modifying the contents that goes to
* the file. The default implementation uses the text
* of the description editor. */

View File

@@ -20,11 +20,15 @@ public:
{
StringLiteral *fileId = control.findOrInsertFileName("<stdin>");
TranslationUnit *unit = new TranslationUnit(&control, fileId);
unit->setObjCEnabled(true);
unit->setSource(source.constData(), source.length());
unit->parse(mode);
return unit;
}
TranslationUnit *parseDeclaration(const QByteArray &source)
{ return parse(source, TranslationUnit::ParseDeclaration); }
TranslationUnit *parseExpression(const QByteArray &source)
{ return parse(source, TranslationUnit::ParseExpression); }
@@ -43,6 +47,11 @@ private slots:
void while_condition_statement();
void for_statement();
void cpp_initializer_or_function_declaration();
// objc++
void objc_attributes_followed_by_at_keyword();
void objc_protocol_forward_declaration_1();
void objc_protocol_definition_1();
};
void tst_AST::simple_name()
@@ -293,6 +302,31 @@ void tst_AST::cpp_initializer_or_function_declaration()
QCOMPARE(param->type_specifier->asNamedTypeSpecifier()->name->asSimpleName()->identifier_token, 4U);
}
void tst_AST::objc_attributes_followed_by_at_keyword()
{
QSharedPointer<TranslationUnit> unit(parseDeclaration("\n"
"__attribute__((deprecated)) @interface foo <bar>\n"
"{\n"
" int a, b;\n"
"}\n"
"+ (id) init;\n"
"- (id) init:(int)a foo:(int)b, c;\n"
"@end\n"
));
AST *ast = unit->ast();
}
void tst_AST::objc_protocol_forward_declaration_1()
{
QSharedPointer<TranslationUnit> unit(parseDeclaration("\n@protocol foo;"));
AST *ast = unit->ast();
}
void tst_AST::objc_protocol_definition_1()
{
QSharedPointer<TranslationUnit> unit(parseDeclaration("\n@protocol foo <ciao, bar> @end"));
AST *ast = unit->ast();
}
QTEST_APPLESS_MAIN(tst_AST)
#include "tst_ast.moc"

View File

@@ -248,6 +248,7 @@ int main(int argc, char *argv[])
Control control;
StringLiteral *fileId = control.findOrInsertFileName("<stdin>");
TranslationUnit unit(&control, fileId);
unit.setObjCEnabled(true);
unit.setSource(source.constData(), source.size());
unit.parse();
if (! unit.ast())