Merge remote-tracking branch 'origin/2.4'

Conflicts:
	src/libs/qmljs/qmljsinterpreter.cpp
	src/libs/qmljs/qmljsinterpreter.h
	src/plugins/madde/maemopackagecreationstep.cpp
	src/plugins/projectexplorer/buildmanager.cpp
	src/plugins/qmljstools/qmljsqtstylecodeformatter.cpp
	src/plugins/qmljstools/qmljsqtstylecodeformatter.h
	tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp

Change-Id: I63ab2ba5dac006c37ccfbae55b023396a4676ff7
This commit is contained in:
Eike Ziller
2011-11-01 18:16:38 +01:00
84 changed files with 940 additions and 587 deletions

View File

@@ -96,8 +96,6 @@ HTML.postpostheader = \
" <div class=\"content mainContent\">\n"
HTML.footer = \
" <div class=\"feedback t_button\">\n" \
" [+] Documentation Feedback</div>\n" \
" </div>\n" \
" </div>\n" \
" </div> \n" \
@@ -123,17 +121,6 @@ HTML.footer = \
" Free Documentation License version 1.3</a>\n" \
" as published by the Free Software Foundation.</p>\n" \
" </div>\n" \
" <div id=\"feedbackBox\">\n" \
" <div id=\"feedcloseX\" class=\"feedclose t_button\">X</div>\n" \
" <form id=\"feedform\" action=\"http://doc.qt.nokia.com/docFeedbck/feedback.php\" method=\"get\">\n" \
" <p id=\"noteHead\">Thank you for giving your feedback.</p> <p class=\"note\">Make sure it is related to this specific page. For more general bugs and \n" \
" requests, please use the <a href=\"https://bugreports.qt.nokia.com/secure/Dashboard.jspa\">Qt Bug Tracker</a>.</p>\n" \
" <p><textarea id=\"feedbox\" name=\"feedText\" rows=\"5\" cols=\"40\"></textarea></p>\n" \
" <p><input id=\"feedsubmit\" class=\"feedclose\" type=\"submit\" name=\"feedback\" /></p>\n" \
" </form>\n" \
" </div>\n" \
" <div id=\"blurpage\">\n" \
" </div>\n" \
"\n" \
" <script src=\"scripts/functions.js\" type=\"text/javascript\"></script>\n" \
" <script type=\"text/javascript\">\n" \

View File

@@ -1,40 +1,37 @@
/***************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (info@qt.nokia.com)
**
** This file is part of the documentation of Qt Creator.
**
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
** the names of its contributors may be used to endorse or promote
** products derived from this software without specific prior written
** permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
****************************************************************************/
# Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# Contact: Nokia Corporation (info@qt.nokia.com)
#
# This file is part of the documentation of Qt Creator.
#
# You may use this file under the terms of the BSD license as follows:
#
# "Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
# the names of its contributors may be used to endorse or promote
# products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
# Add more folders to ship with the application, here
folder_01.source = qml/BatteryStatus

View File

@@ -35,10 +35,14 @@
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
****************************************************************************/
//! [3]
import QtQuick 1.1
import com.nokia.symbian 1.1
//! [3]
import QtQuick 1.0
import com.nokia.symbian 1.0
import QtMobility.systeminfo 1.1
//! [4]
import QtMobility.systeminfo 1.2
//! [4]
//! [0]
Page {
@@ -46,13 +50,7 @@ Page {
DeviceInfo {
id: deviceinfo
Component.onCompleted: {
deviceinfo.startBatteryLevelChanged();
}
onBatteryLevelChanged: {
progressbar1.value = batteryLevel
}
monitorBatteryLevelChanges: true
}
//! [0]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -44,7 +44,9 @@
field displays the location of the file on the development PC. The
\gui {Remote Directory} field displays the folder where the file is
installed on the device. Text in red color indicates that the information is
missing. Select the red text to edit it and add the missing information.
missing. Edit the qmake
\l{http://doc.qt.nokia.com/4.8/qmake-variable-reference.html#installs}
{INSTALLS variable} in the project .pro file to add the missing files.
You can use desktop files to display icons on the home screen of the
device. To add desktop files to the project file, select \gui {Add Desktop
@@ -55,8 +57,8 @@
If you develop your own libraries, \QC needs to be able to find them when
you compile projects depending on them. When you install MADDE, an instance
of the device file system, called sysroot, is installed to the development
PC. Libraries are copied to sysroot if the \gui {Also deploy to sysroot}
check box is selected.
PC. Libraries are copied to sysroot during the \gui {Install Debian package
to sysroot} step.
\section1 Creating Debian Installation Packages

View File

@@ -23,7 +23,7 @@
\contentspage index.html
\if defined(qcmanual)
\previouspage creator-build-dependencies.html
\previouspage creator-sharing-project-settings.html
\else
\previouspage creator-developing-symbian.html
\endif

View File

@@ -35,6 +35,8 @@
The following table lists Qt support sites and other useful links.
\table
\header
\o What Do You Want to Do
@@ -62,6 +64,9 @@
\o Find free Qt-based applications
\o \l{http://qt-apps.org/}{Qt Apps}
\note The \QC help browser does not allow you to download files,
and therefore, you must copy the following link to a browser:
http://qt-apps.org/
\row
\o Buy commercial Qt support from Digia
\o \l{http://qt.digia.com/}{Qt Commercial}

View File

@@ -29,7 +29,7 @@
\contentspage index.html
\previouspage creator-code-style-settings.html
\page creator-build-dependencies.html
\nextpage creator-developing-meego.html
\nextpage creator-sharing-project-settings.html
\title Specifying Dependencies

View File

@@ -0,0 +1,91 @@
/****************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Free Documentation License
**
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of this
** file.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
****************************************************************************/
// **********************************************************************
// NOTE: the sections are not ordered by their logical order to avoid
// reshuffling the file each time the index order changes (i.e., often).
// Run the fixnavi.pl script to adjust the links to the index order.
// **********************************************************************
/*!
\contentspage index.html
\previouspage creator-build-dependencies.html
\page creator-sharing-project-settings.html
\nextpage creator-developing-meego.html
\title Sharing Project Settings
\QC stores user-specific project settings in a .pro.user file. You can
share these settings between several projects as a .pro.shared file. It
has the same XML structure as a .pro.user file, but only contains the
settings to share.
\section1 Creating Shared Settings File
The easiest way to create a .pro.shared file is to copy settings from the
.pro.user file. Typically, you would share some of the values in the
\c ProjectExplorer.Project.EditorSettings section.
\note You must always specify the
\c ProjectExplorer.Project.Updater.FileVersion variable and use the same
value for it as in the .pro.user file.
You can then deliver the .pro.shared file to other developers or copy it to
other development PCs.
The following is an example of a pro.shared file:
\code
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<qtcreator>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="int" key="EditorConfiguration.TabSize">14</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">10</value>
</data>
</qtcreator>
\endcode
\section1 Updating Shared Settings
The first time \QC loads the project after you added pro.shared settings,
it overwrites the pro.user settings with them. If you open the project for
the first time and \QC has not created a .pro.user file, the settings in the
.pro.shared file take effect immediately.
If you receive a .pro.shared file and do not want to use a particular
setting in it, you can change it. \QC marks it a \e sticky setting. The next
time you open a project, the setting is not updated. \QC tracks sticky
settings in the .pro.user file and removes the mark if the values in the
pro.user and pro.shared files eventually become identical. This is to avoid
a permanent sticky setting that was created just because you wanted to try
something out.
*/

View File

@@ -104,7 +104,7 @@
\if defined(qcmanual)
\o For RVCT, select the ARM version to use in the \gui {ARM version}
field. RVCT 2.2 is supported on Symbian^3 and earlier. RVCT 4.0 b902
field. RVCT 2.2 is supported on Symbian Anna and earlier. RVCT 4.0 b902
or later is required for Symbian Belle.
\endif

View File

@@ -78,6 +78,7 @@
\o \l{Specifying Editor Settings}
\o \l{Specifying Code Style Settings}
\o \l{Specifying Dependencies}
\o \l{Sharing Project Settings}
\endlist
\o \l{Connecting MeeGo Harmattan Devices}
\o \l{Connecting Generic Linux Devices}

View File

@@ -34,7 +34,7 @@
\title Creating a Qt Quick Application Using Qt Quick Components
\note To complete this tutorial, you must install the Qt Quick Components
for Symbian and the Symbian^3 tool chain as part of the \QSDK. In addition,
for Symbian and the Symbian Anna target as part of the \QSDK. In addition,
you must install the Qt Quick Components on the test device.
This tutorial describes how to use Qt Creator to create a small Qt
@@ -44,7 +44,7 @@
\image qtcreator-symbian-components-example.png "Mobile example"
The user interface for the application is designed using Qt Quick Components
for Symbian. This enforces a platform look and feel for Symbian^3 devices.
for Symbian. This enforces a platform look and feel for Symbian Anna devices.
\section1 Creating the Project
@@ -59,7 +59,7 @@
For example, \c {C:\Qt\examples}, and then click \gui{Next}.
\o In the \gui {Application Type} dialog, select \gui {Qt Quick
Components (Symbian Applications)}, and then click \gui{Next}.
Components for Symbian}, and then click \gui{Next}.
\o Select \gui {Symbian Device} and \gui {Qt Simulator} targets, and
then click \gui{Next}.
@@ -83,7 +83,7 @@
Qt Creator generates the necessary files that contain boiler plate code. The
wizard creates an application that uses
\l{http://doc.qt.nokia.com/qt-components-symbian-1.0/qt-components-pages-and-navigation-overview.html}
\l{http://doc.qt.nokia.com/qt-components-symbian/qt-components-pages-and-navigation-overview.html}
{page-based application navigation}.
Modify the files as described in the following sections.
@@ -113,18 +113,13 @@
The wizard adds the import statements for Qt Quick and the Qt Quick
Components for Symbian to the MainPage.qml file:
\code
import QtQuick 1.0
import com.nokia.symbian 1.0
\endcode
\snippet examples/batterystatus/qml/BatteryStatus/MainPage.qml 3
To use the Qt Mobility APIs, you must add the import statements for the
Qt Mobility APIs that you use. This example uses the System Info API, so you
must import it, as illustrated by the following code snippet:
\code
import QtMobility.systeminfo 1.1
\endcode
\snippet examples/batterystatus/qml/BatteryStatus/MainPage.qml 4
Use the values as you can assign to MOBILITY also to construct import
statements.
@@ -182,13 +177,11 @@
\o Add an invisible
\l{http://doc.qt.nokia.com/qtmobility/qml-deviceinfo.html}
{DeviceInfo element} that contains two signals. The
\l{http://doc.qt.nokia.com/4.7/qml-component.html#onCompleted-signal}
{onCompleted} signal starts battery level notification when the
component is initialized. The
\l{http://doc.qt.nokia.com/qtmobility/qml-deviceinfo.html#batteryLevelChanged-signal}
{batteryLevelChanged} signal is called when the battery level
changes.
{DeviceInfo element} that sets the
\l{http://doc.qt.nokia.com/qtmobility/qml-deviceinfo.html}
{monitorBatteryLevelChanges} property to true. It uses the
\c monitorBatteryLevelChanges signal to keep up with changes in the
battery level.
\snippet examples/batterystatus/qml/BatteryStatus/MainPage.qml 0

View File

@@ -37,20 +37,25 @@
When you install \QSDK, the build and run settings for Symbian devices
are set up automatically in \QC. You only need to install and launch
the CODA on-device debugging agent on the devices and connect the devices
to the development PC.
the \l{Using On-device Debugging Agents}{CODA on-device debugging agent}
on the devices and connect the devices to the development PC.
Make sure that PC Suite or Ovi Suite are installed on the development PC.
Make sure that \l{http://www.nokia.com/ovisuite}{Ovi Suite} or
\l{http://www.nokia.com/pcsuite}{PC Suite} is installed on the development PC.
Connect the device to the development PC with an USB cable in
PC Suite or Ovi Suite Mode. If you have not previously used the device with
Ovi Suite
Ovi Suite or PC Suite Mode. This setting is in the device USB settings.
If you have not previously used the device with Ovi Suite
or PC Suite, all the necessary drivers are installed automatically.
This takes approximately one minute.
You can run Qt applications on Symbian devices if the software that Qt
applications require (typically Qt, Qt Mobility, QtWebkit, and Open C) is
installed on the device. On Symbian^3 and later devices, some version of Qt
is pre-installed. To deploy applications to earlier devices, you can package
installed on the device. On Symbian Anna and later devices, some version of Qt
is pre-installed. For more information, see
\l{http://developer.qt.nokia.com/wiki/Support_for_Symbian#4ebe3e7733f9c23c76ac25559fc814a1}
{Device Configurations}.
To deploy applications to earlier devices, you can package
the application with Nokia Smart Installer for Symbian to automatically
install the modules that Qt applications require. For more information about
which Qt modules are supported on-demand for different Symbian device
@@ -58,19 +63,6 @@
\l{http://www.developer.nokia.com/Community/Wiki/Nokia_Smart_Installer_for_Symbian}
{Nokia Smart Installer for Symbian}.
To run and debug applications on Symbian devices from \QC, you must
install the CODA on-device debugging agent on the device. For more
information, see
\if defined(qcmanual)
\l{Using On-device Debugging Agents}.
\else
\l{http://doc.qt.nokia.com/qtcreator/creator-developing-symbian.html#using-on-device-debugging-agents}
{Using On-device Debugging Agents}.
\endif
The tool chain for building applications locally on the development PC for
the \gui {Symbian Device} target is only supported on Windows.
If you develop on Linux or Mac OS, you must use the Remote Compiler
@@ -87,17 +79,17 @@
For more information about developing applications for the Symbian
platform, select \gui {Help > Index} and look for \gui {Platform Notes},
or see
\l{http://doc.qt.nokia.com/4.7/platform-notes-symbian.html}{Platform Notes - Symbian}.
\if defined(qcmanual)
To run your applications in the Symbian emulator, you also need
to install Carbide.c++ v2.0.0 or higher.
\endif
\l{http://doc.qt.nokia.com/4.8/platform-notes-symbian.html}
{Platform Notes - Symbian}.
\section1 Using On-device Debugging Agents
To run and debug applications on Symbian devices from \QC, you must
install the CODA on-device debugging agent on the device.
Support for the App TRK on-device debugging agent has been removed from
\QC 2.3. Only CODA is supported. It offers the following benefits:
\QC 2.3. Only CODA is supported Qt SDK 1.1.3 onward. It offers the following
benefits:
\list
@@ -113,12 +105,10 @@
\section2 Installing Debugging Agents
CODA installation packages are delivered together with the \QSDK. On
Windows, you can use \gui Start menu commands to install CODA on Symbian
devices.
You can also download CODA from the
\l{http://tools.ext.nokia.com/coda/}{CODA download server}.
The CODA installation package is delivered together with \QSDK. You can
find it in the \QSDK installation folder in the
\c{\Symbian\sis\<target>\CODA} folder. On Windows, you can use \gui Start
menu commands to install CODA on Symbian devices.
\section1 Setting Up Qt Creator
@@ -126,13 +116,21 @@
Symbian, the installed SDKs and their corresponding Qt versions are
automatically detected. For each detected Symbian SDK with Qt, a special entry
is made in the Qt version management settings in \gui{Tools} >
\gui{Options} > \gui{Qt4} > \gui{Qt Versions}.
\gui{Options} > \gui{Build & Run} > \gui{Qt Versions}.
If you manually add a Qt version for Symbian, you must
also manually specify the Symbian SDK to use for this version.
For more information about adding Qt versions and tool chains, see
\if defined(qcmanual)
\l{Setting Up Qt for Symbian Versions} and \l{Adding Tool Chains}.
\else
\l{http://doc.qt.nokia.com/qtcreator/creator-project-qmake.html#setting-up-qt-for-symbian-versions}
{Setting Up Qt for Symbian Versions} and
\l{http://doc.qt.nokia.com/qtcreator/creator-tool-chains.html}
{Adding Tool Chains}.
\endif
\section1 Building and Running Applications
@@ -171,20 +169,25 @@
that applications that are built against Qt 4.6.3 also run on Qt 4.7.3.
Similarly, applications that are supported on S60 5th Edition are also
supported
on Symbian^3. However, dependencies, such as Qt Quick or Qt Mobility API
on Symbian Anna and Belle. However, dependencies, such as Qt Quick or Qt Mobility API
versions might restrict the choice of Qt versions that you have.
In general, if you use only Qt 4.6 APIs in the application, you
can use \gui {Qt 4.6.3 for Symbian^1} to build it.
The application is supported on both Symbian^1 and Symbian^3 devices.
If you use Qt Quick in the application, you can use \gui {S60 5th Edition
Qt 4.7.3} to build it. The application is supported on both S60 5th Edition
and Symbian Anna and Belle devices. However, if you only target Symbian
Anna and Belle, you can use the state of art Qt in the \gui {Symbian Anna
Qt 4.7.4} target to build the application. This allows you to re-use the
application for MeeGo Harmattan devices.
If you use Qt Quick in the application, you can use \gui {Qt 4.7.3 for
Symbian^1} to build it. The application is supported on both Symbian^1 and
Symbian^3 devices.
If you want to use the native Symbian Belle APIs and make sure that the
application created for earlier Symbian platforms work on Belle as well,
use \gui {Symbian Belle Qt 4.7.4} to build them. You cannot run such
applications on Symbian Anna or earlier Symbian platforms.
\note The tool chains for developing applications for S60 3rd Edition
devices have been removed from \QSDK 1.1. To develop for these early
devices, use an earlier version of \QSDK.
\note The \QSDK only contains the latest tool chains available for
developing applications for a particular Symbian platform. The Qt 4.6.3 for
Symbian and Qt 4.7.3 for Symbian^3 and Symbian Anna targets have been
removed from \QSDK 1.1.4. To develop for those targets, use \QSDK 1.1.2.
If you use native Symbian APIs, you must check that they are available on
the target devices. For more information about the API differences between
@@ -193,12 +196,10 @@
and which you can view in the \gui Help mode.
You can use a set of ready-made UI components called Qt Quick Components
for Symbian that enforce a Nokia UI look and feel.
\omit
\note We recomment that you use Qt Quick Components version 1.1, because
they contain usability and other improvements. The same set of devices
supports both 1.0 and 1.1.
\endomit
for Symbian that enforce a Nokia UI look and feel. \QSDK updates the Qt
Quick Components to version 1.1 that contains usability and other
improvements. All devices that support Qt Quick Components for Symbian
support version 1.1.
The following table summarizes the supported configurations for each Qt
version available in \QC build settings:
@@ -210,7 +211,68 @@
\i Qt Quick Components
\i Qt Mobility Version
\i Native Symbian C++ APIs
\i OpenGL
\i Qt OpenGL Support
\row
\i S60 5th Edition Qt 4.7.3 (online installer only)
\i 1.0
\i No
\i 1.1.3
\i No
\i No
\row
\i Symbian Anna Qt 4.7.4
\i 1.1
\i 1.1
\i 1.2
\i Yes (Symbian Anna APIs)
\i Yes
\row
\i Symbian Belle Qt 4.7.4
\i 1.1
\i 1.1
\i 1.2
\i Yes (Symbian Belle APIs)
\i Yes
\endtable
\section2 Developing Applications Using Qt 4.6.3 or Qt 4.7.3 for Symbian
S60 3rd Edition devices support only Qt 4.6.3, not Qt 4.7 or later. Further,
support for the App TRK on-device debugging agent has been removed from
\QC 2.3. Only CODA is supported from Qt SDK 1.1.3 onward, and CODA does not
support S60 3rd Edition. Therefore, you can no longer run and debug
applications from \QC on S60 3rd Edition devices.
The tool chains for developing applications using Qt 4.6.3 for Symbian
and Qt 4.7.3 for Symbian^ 3 and Symbian Anna have been removed from \QSDK
1.1.4. To develop such applications,
\l{http://qt.nokia.com/downloads/downloads}
{download and use \QSDK version 1.1.2} instead. It contains Qt 4.6.3 for
Symbian and Qt 4.7.4 for Symbian support for Symbian devices with
the Application TRK debug agent.
\note The \QSDK 1.1.2 and \QSDK 1.1.4 do not play well together. On Windows
and Linux, you must use separate user accounts to install them or install
them on separate development PCs.
\note Do not update \QSDK 1.1.2 with the \QSDK update tool, because
the updater removes App TRK support and the older targets.
In general, if you use only Qt 4.6 APIs in the application, you
can use \gui {S60 5th Edition Qt 4.6.3} to build it. The application is
supported on both S60 5th Edition and later devices.
The following table summarizes the supported configurations for each Qt
version available in \QC build settings if you installed \QSDK 1.1.2.
\table
\header
\i Qt Version
\i Qt Quick
\i Qt Quick Components
\i Qt Mobility Version
\i Native Symbian C++ APIs
\i Qt OpenGL Support
\row
\i Qt 4.6.3 for Symbian^1 (S60 5th Edition)
\i No
@@ -223,29 +285,28 @@
\i No
\i No
\i 1.0.2
\i Yes
\i No
\row
\i Qt 4.7.3 for Symbian^1
\i 1.0
\i No
\i 1.1.3
\i No
\i Yes (Symbian^3 APIs)
\i No
\row
\i Qt 4.7.3 for Symbian^3 and Symbian Anna
\i 1.0
\i Yes \omit 1.0 \endomit
\i 1.0
\i 1.1.3
\i Yes
\i Yes
\row
\i Qt 4.7.4 for Symbian Belle
\i 1.1
\i Yes \omit 1.1 \endomit
\i 1.2
\i Yes
\i Yes (Symbian Anna APIs)
\i Yes
\endtable
\section1 Advanced Development with Symbian SDK
For normal Qt application development, \QSDK provides all you need even if
the application needs native Symbian OS API access.
However, for more advanced Symbian application development, Nokia provides
the \l{http://www.developer.nokia.com/carbide_cpp}{Carbide C++ IDE} and
\l{http://www.developer.nokia.com/Resources/Tools_and_downloads/Other/Symbian_SDKs/}
{Symbian C++ SDKs}. You can use them also for Qt application development.
For example, these SDKs provide Symbian device emulators that are built
mostly from the software that the actual devices are running. Therefore,
they provide much closer emulation of the device than Qt Simulator.
*/

View File

@@ -117,13 +117,8 @@ function processNokiaData(response){
var blankRE=/^\s*$/;
function CheckEmptyAndLoadList()
{
var pageUrl = window.location.href;
var pageVal = $('title').html();
$('#feedUrl').remove();
$('#pageVal').remove();
$('.menuAlert').remove();
$('#feedform').append('<input id="feedUrl" name="feedUrl" value="'+pageUrl+'" style="display:none;">');
$('#feedform').append('<input id="pageVal" name="pageVal" value="'+pageVal+'" style="display:none;">');
$('.liveResult').remove();
$('.defaultLink').css('display','block');
var value = document.getElementById('pageType').value;

View File

@@ -918,11 +918,11 @@ void CPlusPlus::findMatchingDeclaration(const LookupContext &context,
return;
foreach (Symbol *s, binding->symbols()) {
Class *matchingClass = s->asClass();
if (!matchingClass)
Scope *scope = s->asScope();
if (!scope)
continue;
for (Symbol *s = matchingClass->find(funcId); s; s = s->next()) {
for (Symbol *s = scope->find(funcId); s; s = s->next()) {
if (! s->name())
continue;
else if (! funcId->isEqualTo(s->identifier()))

View File

@@ -387,18 +387,6 @@ UseMinimalNames::~UseMinimalNames()
}
static bool symbolIdentical(Symbol *s1, Symbol *s2)
{
if (!s1 || !s2)
return false;
if (s1->line() != s2->line())
return false;
if (s1->column() != s2->column())
return false;
return QByteArray(s1->fileName()) == QByteArray(s2->fileName());
}
FullySpecifiedType UseMinimalNames::apply(const Name *name, Rewrite *rewrite) const
{
SubstitutionEnvironment *env = rewrite->env;
@@ -416,26 +404,7 @@ FullySpecifiedType UseMinimalNames::apply(const Name *name, Rewrite *rewrite) co
const QList<LookupItem> results = context.lookup(name, scope);
foreach (const LookupItem &r, results) {
if (Symbol *d = r.declaration()) {
const Name *n = 0;
QList<const Name *> names = LookupContext::fullyQualifiedName(d);
for (int i = names.size() - 1; i >= 0; --i) {
if (! n)
n = names.at(i);
else
n = control->qualifiedNameId(names.at(i), n);
if (_target) {
// minimize the qualifications
const QList<LookupItem> tresults = _target->lookup(n);
foreach (const LookupItem &tr, tresults) {
if (symbolIdentical(tr.declaration(), d)) {
i = 0; // break outer
break;
}
}
}
}
return control->namedType(n);
return control->namedType(LookupContext::minimalName(d, _target, control));
}
return r.type();

View File

@@ -157,50 +157,40 @@ QList<const Name *> LookupContext::path(Symbol *symbol)
return names;
}
const Name *LookupContext::minimalName(const Name *name,
Scope *scope,
ClassOrNamespace *target) const
static bool symbolIdentical(Symbol *s1, Symbol *s2)
{
Q_UNUSED(name);
Q_UNUSED(scope);
Q_UNUSED(target);
if (!s1 || !s2)
return false;
if (s1->line() != s2->line())
return false;
if (s1->column() != s2->column())
return false;
qWarning() << "TODO:" << Q_FUNC_INFO;
return name;
return QByteArray(s1->fileName()) == QByteArray(s2->fileName());
}
#if 0
Q_ASSERT(name);
Q_ASSERT(source);
Q_ASSERT(target);
const Name *LookupContext::minimalName(Symbol *symbol, ClassOrNamespace *target, Control *control)
{
const Name *n = 0;
QList<const Name *> names = LookupContext::fullyQualifiedName(symbol);
QList<Symbol *> symbols = lookup(name, source);
if (symbols.isEmpty())
return 0;
Symbol *canonicalSymbol = symbols.first();
std::vector<const Name *> fqNames = fullyQualifiedName(canonicalSymbol).toVector().toStdVector();
if (const QualifiedNameId *qId = name->asQualifiedNameId())
fqNames.push_back(qId->name());
for (int i = names.size() - 1; i >= 0; --i) {
if (! n)
n = names.at(i);
else
fqNames.push_back(name);
n = control->qualifiedNameId(names.at(i), n);
const QualifiedNameId *lastWorking = 0;
for (unsigned i = 0; i < fqNames.size(); ++i) {
const QualifiedNameId *newName = control()->qualifiedNameId(&fqNames[i],
fqNames.size() - i);
QList<Symbol *> candidates = target->lookup(newName);
if (candidates.contains(canonicalSymbol))
lastWorking = newName;
else
break;
// once we're qualified enough to get the same symbol, break
if (target) {
const QList<LookupItem> tresults = target->lookup(n);
foreach (const LookupItem &tr, tresults) {
if (symbolIdentical(tr.declaration(), symbol))
return n;
}
}
}
if (lastWorking && lastWorking->nameCount() == 1)
return lastWorking->nameAt(0);
else
return lastWorking;
#endif
return n;
}

View File

@@ -235,8 +235,7 @@ public:
static QList<const Name *> fullyQualifiedName(Symbol *symbol);
static QList<const Name *> path(Symbol *symbol);
const Name *minimalName(const Name *name, Scope *source,
ClassOrNamespace *target) const;
static const Name *minimalName(Symbol *symbol, ClassOrNamespace *target, Control *control);
private:
// The current expression.

View File

@@ -523,10 +523,10 @@ int CodeFormatter::indentForNewLineAfter(const QTextBlock &block)
{
restoreCurrentState(block);
int lexerState = loadLexerState(block);
m_tokens.clear();
m_currentLine.clear();
adjustIndent(m_tokens, lexerState, &m_indentDepth);
const int startLexerState = loadLexerState(block.previous());
adjustIndent(m_tokens, startLexerState, &m_indentDepth);
return m_indentDepth;
}
@@ -671,10 +671,11 @@ void CodeFormatter::leave(bool statementDone)
void CodeFormatter::correctIndentation(const QTextBlock &block)
{
const int lexerState = tokenizeBlock(block);
tokenizeBlock(block);
Q_ASSERT(m_currentState.size() >= 1);
adjustIndent(m_tokens, lexerState, &m_indentDepth);
const int startLexerState = loadLexerState(block.previous());
adjustIndent(m_tokens, startLexerState, &m_indentDepth);
}
bool CodeFormatter::tryInsideExpression(bool alsoExpression)
@@ -1211,10 +1212,8 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd
}
}
void QtStyleCodeFormatter::adjustIndent(const QList<Token> &tokens, int lexerState, int *indentDepth) const
void QtStyleCodeFormatter::adjustIndent(const QList<Token> &tokens, int startLexerState, int *indentDepth) const
{
Q_UNUSED(lexerState)
State topState = state();
State previousState = state(1);
@@ -1226,6 +1225,12 @@ void QtStyleCodeFormatter::adjustIndent(const QList<Token> &tokens, int lexerSta
return;
}
}
// don't touch multi-line strings at all
if ((startLexerState & Scanner::MultiLineMask) == Scanner::MultiLineStringDQuote
|| (startLexerState & Scanner::MultiLineMask) == Scanner::MultiLineStringSQuote) {
*indentDepth = -1;
return;
}
const int kind = extendedTokenKind(tokenAt(0));
switch (kind) {

View File

@@ -71,7 +71,7 @@ public:
protected:
virtual void onEnter(int newState, int *indentDepth, int *savedIndentDepth) const = 0;
virtual void adjustIndent(const QList<Token> &tokens, int lexerState, int *indentDepth) const = 0;
virtual void adjustIndent(const QList<Token> &tokens, int startLexerState, int *indentDepth) const = 0;
struct State;
class QMLJS_EXPORT BlockData

View File

@@ -337,6 +337,22 @@ const CppComponentValue *CppComponentValue::prototype() const
return static_cast<const CppComponentValue *>(_prototype);
}
/*!
\returns a list started by this object and followed by all its prototypes
Prefer to use this over calling prototype() in a loop, as it avoids cycles.
*/
QList<const CppComponentValue *> CppComponentValue::prototypes() const
{
QList<const CppComponentValue *> protos;
for (const CppComponentValue *it = this; it; it = it->prototype()) {
if (protos.contains(it))
break;
protos += it;
}
return protos;
}
const CppComponentValue *CppComponentValue::attachedType() const
{
return _attachedType;
@@ -366,7 +382,7 @@ QString CppComponentValue::defaultPropertyName() const
QString CppComponentValue::propertyType(const QString &propertyName) const
{
for (const CppComponentValue *it = this; it; it = it->prototype()) {
foreach (const CppComponentValue *it, prototypes()) {
FakeMetaObject::ConstPtr iter = it->_metaObject;
int propIdx = iter->propertyIndex(propertyName);
if (propIdx != -1) {
@@ -378,7 +394,7 @@ QString CppComponentValue::propertyType(const QString &propertyName) const
bool CppComponentValue::isListProperty(const QString &propertyName) const
{
for (const CppComponentValue *it = this; it; it = it->prototype()) {
foreach (const CppComponentValue *it, prototypes()) {
FakeMetaObject::ConstPtr iter = it->_metaObject;
int propIdx = iter->propertyIndex(propertyName);
if (propIdx != -1) {
@@ -390,7 +406,7 @@ bool CppComponentValue::isListProperty(const QString &propertyName) const
FakeMetaEnum CppComponentValue::getEnum(const QString &typeName, const CppComponentValue **foundInScope) const
{
for (const CppComponentValue *it = this; it; it = it->prototype()) {
foreach (const CppComponentValue *it, prototypes()) {
FakeMetaObject::ConstPtr iter = it->_metaObject;
const int index = iter->enumeratorIndex(typeName);
if (index != -1) {
@@ -406,7 +422,7 @@ FakeMetaEnum CppComponentValue::getEnum(const QString &typeName, const CppCompon
const QmlEnumValue *CppComponentValue::getEnumValue(const QString &typeName, const CppComponentValue **foundInScope) const
{
for (const CppComponentValue *it = this; it; it = it->prototype()) {
foreach (const CppComponentValue *it, prototypes()) {
if (const QmlEnumValue *e = it->_enums.value(typeName)) {
if (foundInScope)
*foundInScope = it;
@@ -455,7 +471,7 @@ const ObjectValue *CppComponentValue::signalScope(const QString &signalName) con
bool CppComponentValue::isWritable(const QString &propertyName) const
{
for (const CppComponentValue *it = this; it; it = it->prototype()) {
foreach (const CppComponentValue *it, prototypes()) {
FakeMetaObject::ConstPtr iter = it->_metaObject;
int propIdx = iter->propertyIndex(propertyName);
if (propIdx != -1) {
@@ -467,7 +483,7 @@ bool CppComponentValue::isWritable(const QString &propertyName) const
bool CppComponentValue::isPointer(const QString &propertyName) const
{
for (const CppComponentValue *it = this; it; it = it->prototype()) {
foreach (const CppComponentValue *it, prototypes()) {
FakeMetaObject::ConstPtr iter = it->_metaObject;
int propIdx = iter->propertyIndex(propertyName);
if (propIdx != -1) {
@@ -487,7 +503,7 @@ bool CppComponentValue::hasLocalProperty(const QString &typeName) const
bool CppComponentValue::hasProperty(const QString &propertyName) const
{
for (const CppComponentValue *it = this; it; it = it->prototype()) {
foreach (const CppComponentValue *it, prototypes()) {
FakeMetaObject::ConstPtr iter = it->_metaObject;
int propIdx = iter->propertyIndex(propertyName);
if (propIdx != -1) {
@@ -499,7 +515,7 @@ bool CppComponentValue::hasProperty(const QString &propertyName) const
bool CppComponentValue::isDerivedFrom(FakeMetaObject::ConstPtr base) const
{
for (const CppComponentValue *it = this; it; it = it->prototype()) {
foreach (const CppComponentValue *it, prototypes()) {
FakeMetaObject::ConstPtr iter = it->_metaObject;
if (iter == base)
return true;

View File

@@ -499,6 +499,7 @@ public:
using ObjectValue::prototype;
const CppComponentValue *prototype() const;
QList<const CppComponentValue *> prototypes() const;
const CppComponentValue *attachedType() const;
void setAttachedType(CppComponentValue *value);

View File

@@ -70,6 +70,15 @@ static inline QString msgFound(const QString &searchTerm, int numMatches, int nu
namespace {
const int MAX_LINE_SIZE = 400;
QString clippedText(const QString &text, int maxLength)
{
if (text.length() > maxLength)
return text.left(maxLength) + QChar(0x2026); // '...'
return text;
}
void runFileSearch(QFutureInterface<FileSearchResultList> &future,
QString searchTerm,
FileIterator *files,
@@ -123,6 +132,7 @@ void runFileSearch(QFutureInterface<FileSearchResultList> &future,
while (!stream.atEnd()) {
++lineNr;
const QString chunk = stream.readLine();
const QString resultItemText = clippedText(chunk, MAX_LINE_SIZE);
int chunkLength = chunk.length();
const QChar *chunkPtr = chunk.constData();
const QChar *chunkEnd = chunkPtr + chunkLength - 1;
@@ -166,7 +176,7 @@ void runFileSearch(QFutureInterface<FileSearchResultList> &future,
}
}
if (equal) {
results << FileSearchResult(s, lineNr, chunk,
results << FileSearchResult(s, lineNr, resultItemText,
regionPtr - chunkPtr, termLength,
QStringList());
++numMatches;
@@ -244,10 +254,11 @@ void runFileSearchRegExp(QFutureInterface<FileSearchResultList> &future,
QString line;
while (!stream.atEnd()) {
line = stream.readLine();
const QString resultItemText = clippedText(line, MAX_LINE_SIZE);
int lengthOfLine = line.size();
int pos = 0;
while ((pos = expression.indexIn(line, pos)) != -1) {
results << FileSearchResult(s, lineNr, line,
results << FileSearchResult(s, lineNr, resultItemText,
pos, expression.matchedLength(),
expression.capturedTexts());
++numMatches;

View File

@@ -251,7 +251,7 @@ QStringList CMakeRunConfiguration::dumperLibraryLocations() const
{
QString qmakePath = ProjectExplorer::DebuggingHelperLibrary::findSystemQt(environment());
QString qtInstallData = ProjectExplorer::DebuggingHelperLibrary::qtInstallDataDir(qmakePath);
return ProjectExplorer::DebuggingHelperLibrary::locationsByInstallData(qtInstallData);
return ProjectExplorer::DebuggingHelperLibrary::debuggingHelperLibraryDirectories(qtInstallData);
}
Utils::Environment CMakeRunConfiguration::baseEnvironment() const

View File

@@ -261,13 +261,7 @@ public:
FullySpecifiedType tn = rewriteType(m_decl->type(), &env, control);
// rewrite the function name
QString name;
const FullySpecifiedType nametype = rewriteType(control->namedType(m_decl->name()), &env, control);
if (NamedType *nt = nametype.type()->asNamedType()) {
name = oo(nt->name());
} else {
name = oo(LookupContext::fullyQualifiedName(m_decl));
}
QString name = oo(LookupContext::minimalName(m_decl, targetCoN, control));
QString defText = oo.prettyType(tn, name) + "\n{\n}";

View File

@@ -1050,6 +1050,7 @@ StartRemoteEngineDialog::StartRemoteEngineDialog(QWidget *parent) :
StartRemoteEngineDialog::~StartRemoteEngineDialog()
{
delete m_ui;
}
QString StartRemoteEngineDialog::host() const

View File

@@ -2544,7 +2544,7 @@ void DebuggerPluginPrivate::showMessage(const QString &msg, int channel, int tim
void DebuggerPluginPrivate::showQtDumperLibraryWarning(const QString &details)
{
QMessageBox dialog(mainWindow());
QPushButton *qtPref = dialog.addButton(tr("Open Qt4 Options"),
QPushButton *qtPref = dialog.addButton(tr("Open Qt Options"),
QMessageBox::ActionRole);
QPushButton *helperOff = dialog.addButton(tr("Turn off Helper Usage"),
QMessageBox::ActionRole);

View File

@@ -61,6 +61,7 @@ ModulesWindow::ModulesWindow(QWidget *parent)
: BaseWindow(parent)
{
setWindowTitle(tr("Modules"));
setSortingEnabled(true);
setAlwaysAdjustColumnsAction(debuggerCore()->action(AlwaysAdjustModulesColumnWidths));
connect(this, SIGNAL(activated(QModelIndex)),

View File

@@ -60,6 +60,7 @@ SourceFilesWindow::SourceFilesWindow(QWidget *parent)
: BaseWindow(parent)
{
setWindowTitle(tr("Source Files"));
setSortingEnabled(true);
}
void SourceFilesWindow::rowActivated(const QModelIndex &index)

View File

@@ -52,6 +52,7 @@ ThreadsWindow::ThreadsWindow(QWidget *parent)
: BaseWindow(parent)
{
setWindowTitle(tr("Thread"));
setSortingEnabled(true);
setAlwaysAdjustColumnsAction(debuggerCore()->action(AlwaysAdjustThreadsColumnWidths));
setObjectName(QLatin1String("ThreadsWindow"));
}

View File

@@ -3296,6 +3296,7 @@ bool FakeVimHandler::Private::handleExSubstituteCommand(const ExCommand &cmd)
i += caps.at(0).size();
}
}
repl.replace("\\&", "&");
text = text.left(pos) + repl + text.mid(pos + matched.size());
pos += repl.size();
if (!global)

View File

@@ -162,8 +162,10 @@ void SearchResultTreeItemDelegate::drawMarker(QPainter *painter, const QModelInd
{
int searchTermStart = index.model()->data(index, ItemDataRoles::SearchTermStartRole).toInt();
int searchTermLength = index.model()->data(index, ItemDataRoles::SearchTermLengthRole).toInt();
if (searchTermStart < 0 || searchTermLength < 1)
if (searchTermStart < 0 || searchTermStart >= text.length() || searchTermLength < 1)
return;
// clip searchTermLength to end of line
searchTermLength = qMin(searchTermLength, text.length() - searchTermStart);
const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
int searchTermStartPixels = painter->fontMetrics().width(text.left(searchTermStart));
int searchTermLengthPixels = painter->fontMetrics().width(text.mid(searchTermStart, searchTermLength));

View File

@@ -74,6 +74,7 @@ namespace Internal {
QStackedWidget *m_widget;
QList<SearchResult *> m_searchResults;
int m_currentIndex;
QFont m_font;
public slots:
void setCurrentIndex(int index);
@@ -317,6 +318,7 @@ SearchResult *SearchResultWindow::startNewSearch(const QString &label,
d->m_searchResultWidgets.prepend(widget);
d->m_widget->insertWidget(1, widget);
connect(widget, SIGNAL(navigateStateChanged()), this, SLOT(navigateStateChanged()));
widget->setTextEditorFont(d->m_font);
widget->setShowReplaceUI(searchOrSearchAndReplace != SearchOnly);
widget->setAutoExpandResults(d->m_expandCollapseAction->isChecked());
widget->setInfo(label, toolTip, searchTerm);
@@ -390,6 +392,7 @@ void SearchResultWindow::setFocus()
*/
void SearchResultWindow::setTextEditorFont(const QFont &font)
{
d->m_font = font;
foreach (Internal::SearchResultWidget *widget, d->m_searchResultWidgets)
widget->setTextEditorFont(font);
}

View File

@@ -60,6 +60,11 @@ RemoteAdditionDialog::RemoteAdditionDialog(QWidget *parent) :
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
}
RemoteAdditionDialog::~RemoteAdditionDialog()
{
delete m_ui;
}
QString RemoteAdditionDialog::remoteName() const
{
return m_ui->nameEdit->text();

View File

@@ -56,6 +56,7 @@ class RemoteAdditionDialog : public QDialog
public:
explicit RemoteAdditionDialog(QWidget *parent = 0);
~RemoteAdditionDialog();
QString remoteName() const;
QString remoteUrl() const;

View File

@@ -339,11 +339,8 @@ bool MaemoDebianPackageCreationStep::createPackage(QProcess *buildProc,
}
}
if (inSourceBuild) {
buildProc->start(packagingCommand(m_maddeRoot, QLatin1String("dh_clean")));
buildProc->waitForFinished();
buildProc->terminate();
}
if (inSourceBuild)
callPackagingCommand(buildProc, QStringList() << QLatin1String("dh_clean"));
return true;
}

View File

@@ -51,6 +51,7 @@
#include <utils/qtcassert.h>
#include <QtCore/QDir>
#include <QtCore/QTime>
#include <QtCore/QTimer>
#include <QtCore/QMetaType>
#include <QtCore/QList>
@@ -88,6 +89,8 @@ struct BuildManagerPrivate {
QString m_currentConfiguration;
// used to decide if we are building a project to decide when to emit buildStateChanged(Project *)
QHash<Project *, int> m_activeBuildSteps;
QHash<Target *, int> m_activeBuildStepsPerTarget;
QHash<ProjectConfiguration *, int> m_activeBuildStepsPerProjectConfiguration;
Project *m_previousBuildStepProject;
// is set to true while canceling, so that nextBuildStep knows that the BuildStep finished because of canceling
bool m_canceling;
@@ -228,7 +231,7 @@ void BuildManager::cancel()
QTimer::singleShot(0, this, SLOT(emitCancelMessage()));
disconnectOutput(d->m_currentBuildStep);
decrementActiveBuildSteps(d->m_currentBuildStep->project());
decrementActiveBuildSteps(d->m_currentBuildStep);
d->m_progressFutureInterface->setProgressValueAndText(d->m_progress*100, tr("Build/Deployment canceled")); //TODO NBS fix in qtconcurrent
clearBuildQueue();
@@ -261,7 +264,7 @@ void BuildManager::emitCancelMessage()
void BuildManager::clearBuildQueue()
{
foreach (BuildStep *bs, d->m_buildQueue) {
decrementActiveBuildSteps(bs->project());
decrementActiveBuildSteps(bs);
disconnectOutput(bs);
}
@@ -358,7 +361,12 @@ void BuildManager::addToTaskWindow(const ProjectExplorer::Task &task)
void BuildManager::addToOutputWindow(const QString &string, BuildStep::OutputFormat format,
BuildStep::OutputNewlineSetting newLineSetting)
{
QString stringToWrite = string;
QString stringToWrite;
if (format == BuildStep::MessageOutput || format == BuildStep::ErrorMessageOutput) {
stringToWrite = QTime::currentTime().toString();
stringToWrite += QLatin1String(": ");
}
stringToWrite += string;
if (newLineSetting == BuildStep::DoAppendNewline)
stringToWrite += QLatin1Char('\n');
d->m_outputWindow->appendText(stringToWrite, format);
@@ -387,7 +395,7 @@ void BuildManager::nextBuildQueue()
disconnectOutput(d->m_currentBuildStep);
++d->m_progress;
d->m_progressFutureInterface->setProgressValueAndText(d->m_progress*100, msgProgress(d->m_progress, d->m_maxProgress));
decrementActiveBuildSteps(d->m_currentBuildStep->project());
decrementActiveBuildSteps(d->m_currentBuildStep);
bool result = d->m_watcher.result();
if (!result) {
@@ -496,7 +504,7 @@ bool BuildManager::buildQueueAppend(QList<BuildStep *> steps)
for (i = 0; i < count; ++i) {
++d->m_maxProgress;
d->m_buildQueue.append(steps.at(i));
incrementActiveBuildSteps(steps.at(i)->target()->project());
incrementActiveBuildSteps(steps.at(i));
}
return true;
}
@@ -536,14 +544,29 @@ void BuildManager::appendStep(BuildStep *step)
startBuildQueue();
}
template <class T>
int count(const QHash<T *, int> &hash, T *key)
{
typename QHash<T *, int>::const_iterator it = hash.find(key);
typename QHash<T *, int>::const_iterator end = hash.end();
if (it != end)
return *it;
return 0;
}
bool BuildManager::isBuilding(Project *pro)
{
QHash<Project *, int>::iterator it = d->m_activeBuildSteps.find(pro);
QHash<Project *, int>::iterator end = d->m_activeBuildSteps.end();
if (it == end || *it == 0)
return false;
else
return true;
return count(d->m_activeBuildSteps, pro) > 0;
}
bool BuildManager::isBuilding(Target *t)
{
return count(d->m_activeBuildStepsPerTarget, t) > 0;
}
bool BuildManager::isBuilding(ProjectConfiguration *p)
{
return count(d->m_activeBuildStepsPerProjectConfiguration, p) > 0;
}
bool BuildManager::isBuilding(BuildStep *step)
@@ -551,33 +574,51 @@ bool BuildManager::isBuilding(BuildStep *step)
return (d->m_currentBuildStep == step) || d->m_buildQueue.contains(step);
}
void BuildManager::incrementActiveBuildSteps(Project *pro)
template <class T> bool increment(QHash<T *, int> &hash, T *key)
{
QHash<Project *, int>::iterator it = d->m_activeBuildSteps.find(pro);
QHash<Project *, int>::iterator end = d->m_activeBuildSteps.end();
typename QHash<T *, int>::iterator it = hash.find(key);
typename QHash<T *, int>::iterator end = hash.end();
if (it == end) {
d->m_activeBuildSteps.insert(pro, 1);
emit buildStateChanged(pro);
hash.insert(key, 1);
return true;
} else if (*it == 0) {
++*it;
emit buildStateChanged(pro);
return true;
} else {
++*it;
}
return false;
}
void BuildManager::decrementActiveBuildSteps(Project *pro)
template <class T> bool decrement(QHash<T *, int> &hash, T *key)
{
QHash<Project *, int>::iterator it = d->m_activeBuildSteps.find(pro);
QHash<Project *, int>::iterator end = d->m_activeBuildSteps.end();
typename QHash<T *, int>::iterator it = hash.find(key);
typename QHash<T *, int>::iterator end = hash.end();
if (it == end) {
Q_ASSERT(false && "BuildManager d->m_activeBuildSteps says project is not building, but apparently a build step was still in the queue.");
// Can't happen
} else if (*it == 1) {
--*it;
emit buildStateChanged(pro);
return true;
} else {
--*it;
}
return false;
}
void BuildManager::incrementActiveBuildSteps(BuildStep *bs)
{
increment<ProjectConfiguration>(d->m_activeBuildStepsPerProjectConfiguration, bs->projectConfiguration());
increment<Target>(d->m_activeBuildStepsPerTarget, bs->target());
if (increment<Project>(d->m_activeBuildSteps, bs->project()))
emit buildStateChanged(bs->project());
}
void BuildManager::decrementActiveBuildSteps(BuildStep *bs)
{
decrement<ProjectConfiguration>(d->m_activeBuildStepsPerProjectConfiguration, bs->projectConfiguration());
decrement<Target>(d->m_activeBuildStepsPerTarget, bs->target());
if (decrement<Project>(d->m_activeBuildSteps, bs->project()))
emit buildStateChanged(bs->project());
}
void BuildManager::disconnectOutput(BuildStep *bs)

View File

@@ -63,6 +63,8 @@ public:
bool buildLists(QList<BuildStepList *> bsls);
bool buildList(BuildStepList *bsl);
bool isBuilding(Project *p);
bool isBuilding(Target *t);
bool isBuilding(ProjectConfiguration *p);
bool isBuilding(BuildStep *step);
// Append any build step to the list of build steps (currently only used to add the QMakeStep)
@@ -104,8 +106,8 @@ private:
void nextStep();
void clearBuildQueue();
bool buildQueueAppend(QList<BuildStep *> steps);
void incrementActiveBuildSteps(Project *pro);
void decrementActiveBuildSteps(Project *pro);
void incrementActiveBuildSteps(BuildStep *bs);
void decrementActiveBuildSteps(BuildStep *bs);
void disconnectOutput(BuildStep *bs);
BuildManagerPrivate *d;

View File

@@ -42,6 +42,8 @@
#include <coreplugin/coreconstants.h>
#include <extensionsystem/pluginmanager.h>
#include <utils/qtcassert.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/buildmanager.h>
#include <QtCore/QMargins>
#include <QtCore/QTimer>
@@ -370,6 +372,29 @@ void BuildSettingsWidget::deleteConfiguration(BuildConfiguration *deleteConfigur
m_target->buildConfigurations().size() <= 1)
return;
ProjectExplorer::BuildManager *bm = ProjectExplorerPlugin::instance()->buildManager();
if (bm->isBuilding(deleteConfiguration)) {
QMessageBox box;
QPushButton *closeAnyway = box.addButton(tr("Cancel Build && Remove Build Configuration"), QMessageBox::AcceptRole);
QPushButton *cancelClose = box.addButton(tr("Do Not Remove"), QMessageBox::RejectRole);
box.setDefaultButton(cancelClose);
box.setWindowTitle(tr("Remove Build Configuration %1?").arg(deleteConfiguration->displayName()));
box.setText(tr("The build configuration <b>%1</b> is currently being built.").arg(deleteConfiguration->displayName()));
box.setInformativeText(tr("Do you want to cancel the build process and remove the Build Configuration anyway?"));
box.exec();
if (box.clickedButton() != closeAnyway)
return;
bm->cancel();
} else {
QMessageBox msgBox(QMessageBox::Question, tr("Remove Build Configuration?"),
tr("Do you really want to delete build configuration <b>%1</b>?").arg(deleteConfiguration->displayName()),
QMessageBox::Yes|QMessageBox::No, this);
msgBox.setDefaultButton(QMessageBox::No);
msgBox.setEscapeButton(QMessageBox::No);
if (msgBox.exec() == QMessageBox::No)
return;
}
m_target->removeBuildConfiguration(deleteConfiguration);
updateBuildSettings();

View File

@@ -150,6 +150,11 @@ DeployConfiguration *BuildStep::deployConfiguration() const
return qobject_cast<DeployConfiguration *>(parent()->parent());
}
ProjectConfiguration *BuildStep::projectConfiguration() const
{
return static_cast<ProjectConfiguration *>(parent()->parent());
}
Target *BuildStep::target() const
{
return qobject_cast<Target *>(parent()->parent()->parent());

View File

@@ -72,12 +72,13 @@ public:
BuildConfiguration *buildConfiguration() const;
DeployConfiguration *deployConfiguration() const;
ProjectConfiguration *projectConfiguration() const;
Target *target() const;
Project *project() const;
enum OutputFormat { NormalOutput, ErrorOutput, MessageOutput, ErrorMessageOutput };
enum OutputNewlineSetting { DoAppendNewline, DontAppendNewline };
Project *project() const;
signals:
void addTask(const ProjectExplorer::Task &task);

View File

@@ -332,7 +332,7 @@ QStringList CustomExecutableRunConfiguration::dumperLibraryLocations() const
{
QString qmakePath = ProjectExplorer::DebuggingHelperLibrary::findSystemQt(environment());
QString qtInstallData = ProjectExplorer::DebuggingHelperLibrary::qtInstallDataDir(qmakePath);
return ProjectExplorer::DebuggingHelperLibrary::locationsByInstallData(qtInstallData);
return ProjectExplorer::DebuggingHelperLibrary::debuggingHelperLibraryDirectories(qtInstallData);
}
ProjectExplorer::Abi CustomExecutableRunConfiguration::abi() const

View File

@@ -68,18 +68,6 @@ QStringList DebuggingHelperLibrary::debuggingHelperLibraryDirectories(const QStr
return directories;
}
QStringList DebuggingHelperLibrary::locationsByInstallData(const QString &qtInstallData)
{
QStringList result;
QFileInfo fileInfo;
const QStringList binFilenames = validBinaryFilenames();
foreach(const QString &directory, debuggingHelperLibraryDirectories(qtInstallData)) {
if (getHelperFileInfoFor(binFilenames, directory, &fileInfo))
result << fileInfo.filePath();
}
return result;
}
static QString sourcePath()
{
return Core::ICore::instance()->resourcePath() + QLatin1String("/dumper/");

View File

@@ -47,7 +47,7 @@ class PROJECTEXPLORER_EXPORT DebuggingHelperLibrary : public Utils::BuildableHel
{
public:
static QString debuggingHelperLibraryByInstallData(const QString &qtInstallData);
static QStringList locationsByInstallData(const QString &qtInstallData);
static QStringList debuggingHelperLibraryDirectories(const QString &qtInstallData);
// Build the helpers and return the output log/errormessage.
static bool build(BuildHelperArguments arguments, QString *log, QString *errorMessage);
@@ -55,8 +55,6 @@ public:
// Copy the source files to a target location and return the chosen target location.
static QString copy(const QString &qtInstallData, QString *errorMessage);
private:
static QStringList debuggingHelperLibraryDirectories(const QString &qtInstallData);
};
} // namespace ProjectExplorer

View File

@@ -582,7 +582,13 @@ QList<ToolChain *> Internal::GccToolChainFactory::autoDetect()
// Fixme Prefer lldb once it is implemented: debuggers.push_back(QLatin1String("lldb"));
#endif
debuggers.push_back(QLatin1String("gdb"));
return autoDetectToolchains(QLatin1String("g++"), debuggers, Abi::hostAbi());
QList<ToolChain *> tcs = autoDetectToolchains(QLatin1String("g++"), debuggers, Abi::hostAbi());
// Old mac compilers needed to support macx-gccXY mkspecs:
tcs.append(autoDetectToolchains(QLatin1String("g++-4.0"), debuggers, Abi::hostAbi()));
tcs.append(autoDetectToolchains(QLatin1String("g++-4.2"), debuggers, Abi::hostAbi()));
return tcs;
}
// Used by the ToolChainManager to restore user-generated tool chains

View File

@@ -43,6 +43,7 @@
#include <coreplugin/ifile.h>
#include <coreplugin/icontext.h>
#include <extensionsystem/pluginmanager.h>
#include <projectexplorer/buildmanager.h>
#include <limits>
#include <utils/qtcassert.h>
@@ -166,9 +167,15 @@ void Project::addTarget(Target *t)
setActiveTarget(t);
}
void Project::removeTarget(Target *target)
bool Project::removeTarget(Target *target)
{
QTC_ASSERT(target && d->m_targets.contains(target), return);
if (!target || !d->m_targets.contains(target))
return false;
ProjectExplorer::BuildManager *bm =
ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager();
if (bm->isBuilding(target))
return false;
emit aboutToRemoveTarget(target);

View File

@@ -83,7 +83,7 @@ public:
// Target:
void addTarget(Target *target);
void removeTarget(Target *target);
bool removeTarget(Target *target);
QList<Target *> targets() const;
// Note: activeTarget can be 0 (if no targets are defined).

View File

@@ -1039,6 +1039,20 @@ void ProjectExplorerPlugin::unloadProject()
if (debug)
qDebug() << "ProjectExplorerPlugin::unloadProject";
if (buildManager()->isBuilding(d->m_currentProject)) {
QMessageBox box;
QPushButton *closeAnyway = box.addButton(tr("Cancel Build && Unload"), QMessageBox::AcceptRole);
QPushButton *cancelClose = box.addButton(tr("Do Not Unload"), QMessageBox::RejectRole);
box.setDefaultButton(cancelClose);
box.setWindowTitle(tr("Unload Project %1?").arg(d->m_currentProject->displayName()));
box.setText(tr("The project %1 is currently being built.").arg(d->m_currentProject->displayName()));
box.setInformativeText(tr("Do you want to cancel the build process and unload the project anyway?"));
box.exec();
if (box.clickedButton() != closeAnyway)
return;
buildManager()->cancel();
}
Core::IFile *fi = d->m_currentProject->file();
if (!fi || fi->fileName().isEmpty()) //nothing to save?

View File

@@ -42,6 +42,8 @@
#include <coreplugin/coreconstants.h>
#include <extensionsystem/pluginmanager.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/buildmanager.h>
#include <utils/qtcassert.h>
#include <QtCore/QPair>
@@ -389,6 +391,20 @@ void RunSettingsWidget::addDeployConfiguration()
void RunSettingsWidget::removeDeployConfiguration()
{
DeployConfiguration *dc = m_target->activeDeployConfiguration();
ProjectExplorer::BuildManager *bm = ProjectExplorerPlugin::instance()->buildManager();
if (bm->isBuilding(dc)) {
QMessageBox box;
QPushButton *closeAnyway = box.addButton(tr("Cancel Build && Remove Deploy Configuration"), QMessageBox::AcceptRole);
QPushButton *cancelClose = box.addButton(tr("Do Not Remove"), QMessageBox::RejectRole);
box.setDefaultButton(cancelClose);
box.setWindowTitle(tr("Remove Deploy Configuration %1?").arg(dc->displayName()));
box.setText(tr("The deploy configuration <b>%1</b> is currently being built.").arg(dc->displayName()));
box.setInformativeText(tr("Do you want to cancel the build process and remove the Deploy Configuration anyway?"));
box.exec();
if (box.clickedButton() != closeAnyway)
return;
bm->cancel();
} else {
QMessageBox msgBox(QMessageBox::Question, tr("Remove Deploy Configuration?"),
tr("Do you really want to delete deploy configuration <b>%1</b>?").arg(dc->displayName()),
QMessageBox::Yes|QMessageBox::No, this);
@@ -396,8 +412,10 @@ void RunSettingsWidget::removeDeployConfiguration()
msgBox.setEscapeButton(QMessageBox::No);
if (msgBox.exec() == QMessageBox::No)
return;
}
m_target->removeDeployConfiguration(dc);
m_removeDeployToolButton->setEnabled(m_target->deployConfigurations().size() > 1);
}

View File

@@ -42,6 +42,8 @@
#include <limits>
#include <extensionsystem/pluginmanager.h>
#include <projectexplorer/buildmanager.h>
#include <projectexplorer/projectexplorer.h>
#include <utils/qtcassert.h>
#include <QtGui/QIcon>
@@ -174,11 +176,16 @@ void Target::addBuildConfiguration(BuildConfiguration *configuration)
setActiveBuildConfiguration(configuration);
}
void Target::removeBuildConfiguration(BuildConfiguration *configuration)
bool Target::removeBuildConfiguration(BuildConfiguration *configuration)
{
//todo: this might be error prone
if (!d->m_buildConfigurations.contains(configuration))
return;
return false;
ProjectExplorer::BuildManager *bm =
ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager();
if (bm->isBuilding(configuration))
return false;
d->m_buildConfigurations.removeOne(configuration);
@@ -192,6 +199,7 @@ void Target::removeBuildConfiguration(BuildConfiguration *configuration)
}
delete configuration;
return true;
}
QList<BuildConfiguration *> Target::buildConfigurations() const
@@ -242,11 +250,16 @@ void Target::addDeployConfiguration(DeployConfiguration *dc)
Q_ASSERT(activeDeployConfiguration());
}
void Target::removeDeployConfiguration(DeployConfiguration *dc)
bool Target::removeDeployConfiguration(DeployConfiguration *dc)
{
//todo: this might be error prone
if (!d->m_deployConfigurations.contains(dc))
return;
return false;
ProjectExplorer::BuildManager *bm =
ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager();
if (bm->isBuilding(dc))
return false;
d->m_deployConfigurations.removeOne(dc);
@@ -260,6 +273,7 @@ void Target::removeDeployConfiguration(DeployConfiguration *dc)
}
delete dc;
return true;
}
QList<DeployConfiguration *> Target::deployConfigurations() const

View File

@@ -67,7 +67,7 @@ public:
// Build configuration
void addBuildConfiguration(BuildConfiguration *configuration);
void removeBuildConfiguration(BuildConfiguration *configuration);
bool removeBuildConfiguration(BuildConfiguration *configuration);
QList<BuildConfiguration *> buildConfigurations() const;
BuildConfiguration *activeBuildConfiguration() const;
@@ -77,7 +77,7 @@ public:
// DeployConfiguration
void addDeployConfiguration(DeployConfiguration *dc);
void removeDeployConfiguration(DeployConfiguration *dc);
bool removeDeployConfiguration(DeployConfiguration *dc);
QList<DeployConfiguration *> deployConfigurations() const;
DeployConfiguration *activeDeployConfiguration() const;

View File

@@ -40,6 +40,8 @@
#include "targetsettingswidget.h"
#include <extensionsystem/pluginmanager.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/buildmanager.h>
#include <QtCore/QCoreApplication>
#include <QtGui/QLabel>
@@ -47,6 +49,7 @@
#include <QtGui/QMessageBox>
#include <QtGui/QVBoxLayout>
#include <QtGui/QStackedWidget>
#include <QtGui/QPushButton>
using namespace ProjectExplorer;
using namespace ProjectExplorer::Internal;
@@ -230,13 +233,33 @@ void TargetSettingsPanelWidget::removeTarget()
{
int index = m_selector->currentIndex();
Target *t = m_targets.at(index);
ProjectExplorer::BuildManager *bm = ProjectExplorerPlugin::instance()->buildManager();
if (bm->isBuilding(t)) {
QMessageBox box;
QPushButton *closeAnyway = box.addButton(tr("Cancel Build && Remove Target"), QMessageBox::AcceptRole);
QPushButton *cancelClose = box.addButton(tr("Do Not Remove"), QMessageBox::RejectRole);
box.setDefaultButton(cancelClose);
box.setWindowTitle(tr("Remove Target %1?").arg(t->displayName()));
box.setText(tr("The target <b>%1</b> is currently being built.").arg(t->displayName()));
box.setInformativeText(tr("Do you want to cancel the build process and remove the Target anyway?"));
box.exec();
if (box.clickedButton() != closeAnyway)
return;
bm->cancel();
} else {
// We don't show the generic message box on removing the target, if we showed the still building one
int ret = QMessageBox::warning(this, tr("Qt Creator"),
tr("Do you really want to remove the\n"
"\"%1\" target?").arg(t->displayName()),
QMessageBox::Yes | QMessageBox::No,
QMessageBox::No);
if (ret == QMessageBox::Yes)
if (ret != QMessageBox::Yes)
return;
}
m_project->removeTarget(t);
}
void TargetSettingsPanelWidget::targetAdded(ProjectExplorer::Target *target)

View File

@@ -448,9 +448,10 @@ void DesignDocumentController::changeCurrentModelTo(const ModelNode &node)
if (Internal::DesignModeWidget::instance()->currentDesignDocumentController() != this)
return;
DesignDocumentControllerPrivate::clearCrumblePath = false;
while (!d->formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>().modelNode.isRootNode())
while (d->formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>().modelNode.isValid() &&
!d->formEditorView->crumblePath()->dataForLastIndex().value<CrumbleBarInfo>().modelNode.isRootNode())
d->formEditorView->crumblePath()->popElement();
if (node.isRootNode())
if (node.isRootNode() && d->formEditorView->crumblePath()->dataForLastIndex().isValid())
d->formEditorView->crumblePath()->popElement();
changeToSubComponent(node);
DesignDocumentControllerPrivate::clearCrumblePath = true;
@@ -537,8 +538,10 @@ void DesignDocumentController::goIntoComponent()
if (d->formEditorView)
selectedNodes = d->formEditorView->selectedModelNodes();
DesignDocumentControllerPrivate::clearCrumblePath = false;
if (selectedNodes.count() == 1)
ModelNodeAction::goIntoComponent(selectedNodes.first());
DesignDocumentControllerPrivate::clearCrumblePath = true;
}
void DesignDocumentController::loadCurrentModel()

View File

@@ -53,37 +53,6 @@
#include <QtGui/QPushButton>
#include <QtGui/QMainWindow>
namespace {
const char * const QMLDESIGNER_INFO_BAR = "QmlJSEditor.QmlDesignerInfoBar";
const char * const KEY_QMLGROUP = "QML";
const char * const KEY_NAGABOUTDESIGNER = "AskAboutVisualDesigner";
bool isQmlDesignerExperimentallyDisabled()
{
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
foreach (const ExtensionSystem::PluginSpec *spec, pm->plugins()) {
if (spec->name() == QLatin1String("QmlDesigner")) {
if (spec->isExperimental() && !spec->isEnabled())
return true;
return false;
}
}
return false;
}
bool isNaggingAboutExperimentalDesignerEnabled()
{
if (!isQmlDesignerExperimentallyDisabled()) {
return false;
}
QSettings *settings = Core::ICore::instance()->settings();
settings->beginGroup(QLatin1String(KEY_QMLGROUP));
bool nag = settings->value(QLatin1String(KEY_NAGABOUTDESIGNER), true).toBool();
settings->endGroup();
return nag;
}
}
using namespace QmlJSEditor;
using namespace QmlJSEditor::Internal;
using namespace QmlJSEditor::Constants;
@@ -123,13 +92,6 @@ Core::IEditor *QmlJSEditorFactory::createEditor(QWidget *parent)
{
QmlJSEditor::QmlJSTextEditorWidget *rc = new QmlJSEditor::QmlJSTextEditorWidget(parent);
QmlJSEditorPlugin::instance()->initializeEditor(rc);
if (isNaggingAboutExperimentalDesignerEnabled()) {
Core::InfoBarEntry info(QMLDESIGNER_INFO_BAR,
tr("Do you want to enable the experimental Qt Quick Designer?"));
info.setCustomButtonInfo(tr("Enable Qt Quick Designer"), this, SLOT(activateQmlDesigner()));
info.setCancelButtonInfo(this, SLOT(neverAskAgainAboutQmlDesigner()));
rc->file()->infoBar()->addInfo(info);
}
return rc->editor();
}
@@ -137,50 +99,3 @@ QStringList QmlJSEditorFactory::mimeTypes() const
{
return m_mimeTypes;
}
void QmlJSEditorFactory::activateQmlDesigner()
{
QString menu;
#ifdef Q_WS_MAC
menu = tr("Qt Creator -> About Plugins...");
#else
menu = tr("Help -> About Plugins...");
#endif
QMessageBox message(Core::ICore::instance()->mainWindow());
message.setWindowTitle(tr("Enable experimental Qt Quick Designer?"));
message.setText(tr("Do you want to enable the experimental Qt Quick Designer? "
"After enabling it, you can access the visual design capabilities by switching to Design Mode. "
"This can affect the overall stability of Qt Creator. "
"To disable Qt Quick Designer again, visit the menu '%1' and disable 'QmlDesigner'.").arg(menu));
message.setIcon(QMessageBox::Question);
QPushButton *enable = message.addButton(tr("Enable Qt Quick Designer"), QMessageBox::AcceptRole);
message.addButton(tr("Cancel"), QMessageBox::RejectRole);
message.exec();
if (message.clickedButton() == enable) {
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
foreach (ExtensionSystem::PluginSpec *spec, pm->plugins()) {
if (spec->name() == QLatin1String("QmlDesigner")) {
spec->setEnabled(true);
pm->writeSettings();
QMessageBox::information(Core::ICore::instance()->mainWindow(), tr("Please restart Qt Creator"),
tr("Please restart Qt Creator to make the change effective."));
foreach (Core::IEditor *editor, Core::EditorManager::instance()->openedEditors())
if (qobject_cast<QmlJSEditorEditable *>(editor))
editor->file()->infoBar()->removeInfo(QMLDESIGNER_INFO_BAR);
neverAskAgainAboutQmlDesigner();
return;
}
}
}
}
void QmlJSEditorFactory::neverAskAgainAboutQmlDesigner()
{
QSettings *settings = Core::ICore::instance()->settings();
settings->beginGroup(QLatin1String(KEY_QMLGROUP));
settings->setValue(QLatin1String(KEY_NAGABOUTDESIGNER), false);
settings->endGroup();
settings->sync();
disconnect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)),
this, SLOT(updateEditorInfoBar(Core::IEditor*)));
}

View File

@@ -54,10 +54,6 @@ public:
Core::IFile *open(const QString &fileName);
Core::IEditor *createEditor(QWidget *parent);
private slots:
void activateQmlDesigner();
void neverAskAgainAboutQmlDesigner();
private:
QStringList m_mimeTypes;
};

View File

@@ -70,6 +70,8 @@ void Indenter::indentBlock(QTextDocument *doc,
codeFormatter.updateStateUntil(block);
const int depth = codeFormatter.indentFor(block);
if (depth == -1)
return;
if (isElectricCharacter(typedChar)) {
// only reindent the current line when typing electric characters if the

View File

@@ -69,7 +69,9 @@ public:
codeFormatter.updateStateUntil(block);
do {
tabSettings.indentLine(block, codeFormatter.indentFor(block));
const int depth = codeFormatter.indentFor(block);
if (depth != -1)
tabSettings.indentLine(block, depth);
codeFormatter.updateLineStateChange(block);
block = block.next();
} while (block.isValid() && block != end);

View File

@@ -409,6 +409,11 @@ RvctToolChainConfigWidget::RvctToolChainConfigWidget(RvctToolChain *tc) :
setFromToolChain();
}
RvctToolChainConfigWidget::~RvctToolChainConfigWidget()
{
delete m_ui;
}
void RvctToolChainConfigWidget::apply()
{
RvctToolChain *tc = static_cast<RvctToolChain *>(toolChain());

View File

@@ -143,6 +143,7 @@ class RvctToolChainConfigWidget : public ProjectExplorer::ToolChainConfigWidget
public:
RvctToolChainConfigWidget(RvctToolChain *tc);
~RvctToolChainConfigWidget();
void apply();
void discard() { setFromToolChain(); }

View File

@@ -319,6 +319,11 @@ WinscwToolChainConfigWidget::WinscwToolChainConfigWidget(WinscwToolChain *tc) :
discard();
}
WinscwToolChainConfigWidget::~WinscwToolChainConfigWidget()
{
delete m_ui;
}
void WinscwToolChainConfigWidget::apply()
{
WinscwToolChain *tc = static_cast<WinscwToolChain *>(toolChain());

View File

@@ -105,6 +105,7 @@ class WinscwToolChainConfigWidget : public ProjectExplorer::ToolChainConfigWidge
public:
WinscwToolChainConfigWidget(WinscwToolChain *);
~WinscwToolChainConfigWidget();
void apply();
void discard();

View File

@@ -296,6 +296,20 @@ QList<ProjectExplorer::ToolChain *> Qt4BaseTarget::possibleToolChains(ProjectExp
return result;
}
ProjectExplorer::ToolChain *Qt4BaseTarget::preferredToolChain(ProjectExplorer::BuildConfiguration *bc) const
{
Qt4BuildConfiguration *qtBc = qobject_cast<Qt4BuildConfiguration *>(bc);
if (!qtBc || !qtBc->qtVersion())
return Target::preferredToolChain(bc);
QList<ProjectExplorer::ToolChain *> tcs = possibleToolChains(bc);
const QString mkspec = qtBc->qtVersion()->mkspec();
foreach (ProjectExplorer::ToolChain *tc, tcs)
if (tc->mkspec() == mkspec)
return tc;
return tcs.isEmpty() ? 0 : tcs.at(0);
}
void Qt4BaseTarget::removeUnconfiguredCustomExectutableRunConfigurations()
{
if (runConfigurations().count()) {

View File

@@ -90,6 +90,7 @@ public:
virtual QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Node *n) = 0;
QList<ProjectExplorer::ToolChain *> possibleToolChains(ProjectExplorer::BuildConfiguration *bc) const;
ProjectExplorer::ToolChain *preferredToolChain(ProjectExplorer::BuildConfiguration *) const;
signals:
void buildDirectoryInitialized();

View File

@@ -955,7 +955,7 @@ QStringList BaseQtVersion::debuggingHelperLibraryLocations() const
QString qtInstallData = versionInfo().value("QT_INSTALL_DATA");
if (qtInstallData.isEmpty())
return QStringList();
return ProjectExplorer::DebuggingHelperLibrary::locationsByInstallData(qtInstallData);
return ProjectExplorer::DebuggingHelperLibrary::debuggingHelperLibraryDirectories(qtInstallData);
}
bool BaseQtVersion::supportsBinaryDebuggingHelper() const

View File

@@ -275,6 +275,9 @@ QStringList ExamplesListModel::exampleSources() const
// Try to get dir from first Qt Version
QtVersionManager *versionManager = QtVersionManager::instance();
foreach (BaseQtVersion *version, versionManager->validVersions()) {
// There is no good solution for Qt 5 yet
if (version->qtVersion().majorVersion != 4)
continue;
QDir examplesDir(version->examplesPath());
if (examplesDir.exists()) {

View File

@@ -5538,8 +5538,13 @@ void BaseTextEditorWidget::setFontSettings(const TextEditor::FontSettings &fs)
void BaseTextEditorWidget::setTabSettings(const TabSettings &ts)
{
d->m_document->setTabSettings(ts);
int charWidth = QFontMetrics(font()).width(QChar(' '));
setTabStopWidth(charWidth * ts.m_tabSize);
// Although the tab stop is stored as qreal the API from QPlainTextEdit only allows it
// to be set as an int. A work around is to access directly the QTextOption.
qreal charWidth = QFontMetricsF(font()).width(QChar(' '));
QTextOption option = document()->defaultTextOption();
option.setTabStop(charWidth * ts.m_tabSize);
document()->setDefaultTextOption(option);
}
void BaseTextEditorWidget::setDisplaySettings(const DisplaySettings &ds)

View File

@@ -69,6 +69,9 @@ CodeStyleEditor::CodeStyleEditor(ICodeStylePreferencesFactory *factory,
tr("Edit preview contents to see how the current settings "
"are applied to custom code snippets. Changes in the preview "
"do not affect the current settings."), this);
QFont font = label->font();
font.setItalic(true);
label->setFont(font);
label->setWordWrap(true);
m_layout->addWidget(selector);
m_layout->addWidget(m_preview);

View File

@@ -31,6 +31,7 @@
**************************************************************************/
#include "codestyleselectorwidget.h"
#include "ui_codestyleselectorwidget.h"
#include "icodestylepreferences.h"
#include "icodestylepreferencesfactory.h"
#include "codestylepool.h"
@@ -67,15 +68,23 @@ public:
ICodeStylePreferences *codeStyle, QWidget *parent = 0);
~CodeStyleDialog();
ICodeStylePreferences *codeStyle() const;
QString displayName() const;
private slots:
void slotCopyClicked();
void slotDisplayNameChanged();
private:
ICodeStylePreferences *m_codeStyle;
QLineEdit *m_lineEdit;
QDialogButtonBox *m_buttons;
QLabel *m_warningLabel;
QPushButton *m_copyButton;
QString m_originalDisplayName;
};
CodeStyleDialog::CodeStyleDialog(ICodeStylePreferencesFactory *factory,
ICodeStylePreferences *codeStyle, QWidget *parent)
: QDialog(parent)
: QDialog(parent),
m_warningLabel(0),
m_copyButton(0)
{
setWindowTitle(tr("Edit Code Style"));
QVBoxLayout *layout = new QVBoxLayout(this);
@@ -85,17 +94,46 @@ CodeStyleDialog::CodeStyleDialog(ICodeStylePreferencesFactory *factory,
nameLayout->addWidget(label);
nameLayout->addWidget(m_lineEdit);
layout->addLayout(nameLayout);
if (codeStyle->isReadOnly()) {
QHBoxLayout *warningLayout = new QHBoxLayout();
m_warningLabel = new QLabel(
tr("You cannot save changes to a built-in code style. "
"Copy it first to create your own version."), this);
QFont font = m_warningLabel->font();
font.setItalic(true);
m_warningLabel->setFont(font);
m_warningLabel->setWordWrap(true);
m_copyButton = new QPushButton(tr("Copy Built-in Code Style"), this);
m_copyButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
connect(m_copyButton, SIGNAL(clicked()),
this, SLOT(slotCopyClicked()));
warningLayout->addWidget(m_warningLabel);
warningLayout->addWidget(m_copyButton);
layout->addLayout(warningLayout);
}
m_originalDisplayName = codeStyle->displayName();
m_codeStyle = factory->createCodeStyle();
m_codeStyle->setTabSettings(codeStyle->tabSettings());
m_codeStyle->setValue(codeStyle->value());
m_codeStyle->setDisplayName(m_originalDisplayName);
QWidget *editor = factory->createEditor(m_codeStyle, this);
QDialogButtonBox *buttons = new QDialogButtonBox(
m_buttons = new QDialogButtonBox(
QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this);
if (codeStyle->isReadOnly()) {
QPushButton *okButton = m_buttons->button(QDialogButtonBox::Ok);
okButton->setEnabled(false);
}
if (editor)
layout->addWidget(editor);
layout->addWidget(buttons);
connect(buttons, SIGNAL(accepted()), this, SLOT(accept()));
connect(buttons, SIGNAL(rejected()), this, SLOT(reject()));
layout->addWidget(m_buttons);
connect(m_lineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotDisplayNameChanged()));
connect(m_buttons, SIGNAL(accepted()), this, SLOT(accept()));
connect(m_buttons, SIGNAL(rejected()), this, SLOT(reject()));
}
ICodeStylePreferences *CodeStyleDialog::codeStyle() const
@@ -103,9 +141,22 @@ ICodeStylePreferences *CodeStyleDialog::codeStyle() const
return m_codeStyle;
}
QString CodeStyleDialog::displayName() const
void CodeStyleDialog::slotCopyClicked()
{
return m_lineEdit->text();
if (m_warningLabel)
m_warningLabel->hide();
if (m_copyButton)
m_copyButton->hide();
QPushButton *okButton = m_buttons->button(QDialogButtonBox::Ok);
okButton->setEnabled(true);
if (m_lineEdit->text() == m_originalDisplayName)
m_lineEdit->setText(tr("%1 (Copy)").arg(m_lineEdit->text()));
m_lineEdit->selectAll();
}
void CodeStyleDialog::slotDisplayNameChanged()
{
m_codeStyle->setDisplayName(m_lineEdit->text());
}
CodeStyleDialog::~CodeStyleDialog()
@@ -120,48 +171,32 @@ CodeStyleSelectorWidget::CodeStyleSelectorWidget(ICodeStylePreferencesFactory *f
QWidget(parent),
m_factory(factory),
m_codeStyle(0),
m_layout(0),
m_comboBox(0),
m_comboBoxLabel(0),
m_ui(new Ui::CodeStyleSelectorWidget),
m_ignoreGuiSignals(false)
{
m_layout = new QHBoxLayout(this);
m_layout->setContentsMargins(QMargins());
m_copyButton = new QPushButton(tr("Copy..."), this);
m_editButton = new QPushButton(tr("Edit..."), this);
m_removeButton = new QPushButton(tr("Remove"), this);
m_importButton = new QPushButton(tr("Import..."), this);
m_exportButton = new QPushButton(tr("Export..."), this);
m_importButton->setEnabled(false);
m_exportButton->setEnabled(false);
m_ui->setupUi(this);
m_ui->importButton->setEnabled(false);
m_ui->exportButton->setEnabled(false);
m_comboBoxLabel = new QLabel(tr("Current settings:"), this);
m_comboBoxLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
m_layout->addWidget(m_comboBoxLabel);
m_comboBox = new QComboBox(this);
m_comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
m_layout->addWidget(m_comboBox);
connect(m_comboBox, SIGNAL(activated(int)),
connect(m_ui->delegateComboBox, SIGNAL(activated(int)),
this, SLOT(slotComboBoxActivated(int)));
m_layout->addWidget(m_copyButton);
m_layout->addWidget(m_editButton);
m_layout->addWidget(m_removeButton);
m_layout->addWidget(m_importButton);
m_layout->addWidget(m_exportButton);
connect(m_copyButton, SIGNAL(clicked()),
connect(m_ui->copyButton, SIGNAL(clicked()),
this, SLOT(slotCopyClicked()));
connect(m_editButton, SIGNAL(clicked()),
connect(m_ui->editButton, SIGNAL(clicked()),
this, SLOT(slotEditClicked()));
connect(m_removeButton, SIGNAL(clicked()),
connect(m_ui->removeButton, SIGNAL(clicked()),
this, SLOT(slotRemoveClicked()));
connect(m_importButton, SIGNAL(clicked()),
connect(m_ui->importButton, SIGNAL(clicked()),
this, SLOT(slotImportClicked()));
connect(m_exportButton, SIGNAL(clicked()),
connect(m_ui->exportButton, SIGNAL(clicked()),
this, SLOT(slotExportClicked()));
}
CodeStyleSelectorWidget::~CodeStyleSelectorWidget()
{
delete m_ui;
}
void CodeStyleSelectorWidget::setCodeStyle(TextEditor::ICodeStylePreferences *codeStyle)
{
if (m_codeStyle == codeStyle)
@@ -179,9 +214,9 @@ void CodeStyleSelectorWidget::setCodeStyle(TextEditor::ICodeStylePreferences *co
disconnect(m_codeStyle, SIGNAL(currentDelegateChanged(ICodeStylePreferences*)),
this, SLOT(slotCurrentDelegateChanged(ICodeStylePreferences*)));
m_exportButton->setEnabled(false);
m_importButton->setEnabled(false);
m_comboBox->clear();
m_ui->exportButton->setEnabled(false);
m_ui->importButton->setEnabled(false);
m_ui->delegateComboBox->clear();
}
m_codeStyle = codeStyle;
// fillup new
@@ -195,8 +230,8 @@ void CodeStyleSelectorWidget::setCodeStyle(TextEditor::ICodeStylePreferences *co
this, SLOT(slotCodeStyleAdded(ICodeStylePreferences*)));
connect(codeStylePool, SIGNAL(codeStyleRemoved(ICodeStylePreferences*)),
this, SLOT(slotCodeStyleRemoved(ICodeStylePreferences*)));
m_exportButton->setEnabled(true);
m_importButton->setEnabled(true);
m_ui->exportButton->setEnabled(true);
m_ui->importButton->setEnabled(true);
}
for (int i = 0; i < delegates.count(); i++)
@@ -214,10 +249,10 @@ void CodeStyleSelectorWidget::slotComboBoxActivated(int index)
if (m_ignoreGuiSignals)
return;
if (!m_comboBox || index < 0 || index >= m_comboBox->count())
if (index < 0 || index >= m_ui->delegateComboBox->count())
return;
TextEditor::ICodeStylePreferences *delegate =
m_comboBox->itemData(index).value<TextEditor::ICodeStylePreferences *>();
m_ui->delegateComboBox->itemData(index).value<TextEditor::ICodeStylePreferences *>();
const bool wasBlocked = blockSignals(true);
m_codeStyle->setCurrentDelegate(delegate);
@@ -227,15 +262,12 @@ void CodeStyleSelectorWidget::slotComboBoxActivated(int index)
void CodeStyleSelectorWidget::slotCurrentDelegateChanged(TextEditor::ICodeStylePreferences *delegate)
{
m_ignoreGuiSignals = true;
if (m_comboBox) {
m_comboBox->setCurrentIndex(m_comboBox->findData(QVariant::fromValue(delegate)));
m_comboBox->setToolTip(m_comboBox->currentText());
}
m_ui->delegateComboBox->setCurrentIndex(m_ui->delegateComboBox->findData(QVariant::fromValue(delegate)));
m_ui->delegateComboBox->setToolTip(m_ui->delegateComboBox->currentText());
m_ignoreGuiSignals = false;
const bool enableEdit = delegate && !delegate->isReadOnly() && !delegate->currentDelegate();
m_editButton->setEnabled(enableEdit);
m_removeButton->setEnabled(enableEdit);
const bool removeEnabled = delegate && !delegate->isReadOnly() && !delegate->currentDelegate();
m_ui->removeButton->setEnabled(removeEnabled);
}
void CodeStyleSelectorWidget::slotCopyClicked()
@@ -271,9 +303,16 @@ void CodeStyleSelectorWidget::slotEditClicked()
Internal::CodeStyleDialog dialog(m_factory, codeStyle, this);
if (dialog.exec() == QDialog::Accepted) {
ICodeStylePreferences *dialogCodeStyle = dialog.codeStyle();
if (codeStyle->isReadOnly()) {
CodeStylePool *codeStylePool = m_codeStyle->delegatingPool();
codeStyle = codeStylePool->cloneCodeStyle(dialogCodeStyle);
if (codeStyle)
m_codeStyle->setCurrentDelegate(codeStyle);
return;
}
codeStyle->setTabSettings(dialogCodeStyle->tabSettings());
codeStyle->setValue(dialogCodeStyle->value());
codeStyle->setDisplayName(dialog.displayName());
codeStyle->setDisplayName(dialogCodeStyle->displayName());
}
}
@@ -337,8 +376,8 @@ void CodeStyleSelectorWidget::slotCodeStyleAdded(ICodeStylePreferences *codeStyl
const QVariant data = QVariant::fromValue(codeStylePreferences);
const QString name = displayName(codeStylePreferences);
m_comboBox->addItem(name, data);
m_comboBox->setItemData(m_comboBox->count() - 1, name, Qt::ToolTipRole);
m_ui->delegateComboBox->addItem(name, data);
m_ui->delegateComboBox->setItemData(m_ui->delegateComboBox->count() - 1, name, Qt::ToolTipRole);
connect(codeStylePreferences, SIGNAL(displayNameChanged(QString)),
this, SLOT(slotUpdateName()));
if (codeStylePreferences->delegatingPool()) {
@@ -350,7 +389,7 @@ void CodeStyleSelectorWidget::slotCodeStyleAdded(ICodeStylePreferences *codeStyl
void CodeStyleSelectorWidget::slotCodeStyleRemoved(ICodeStylePreferences *codeStylePreferences)
{
m_ignoreGuiSignals = true;
m_comboBox->removeItem(m_comboBox->findData(QVariant::fromValue(codeStylePreferences)));
m_ui->delegateComboBox->removeItem(m_ui->delegateComboBox->findData(QVariant::fromValue(codeStylePreferences)));
disconnect(codeStylePreferences, SIGNAL(displayNameChanged(QString)),
this, SLOT(slotUpdateName()));
if (codeStylePreferences->delegatingPool()) {
@@ -375,18 +414,18 @@ void CodeStyleSelectorWidget::slotUpdateName()
updateName(codeStyle);
}
m_comboBox->setToolTip(m_comboBox->currentText());
m_ui->delegateComboBox->setToolTip(m_ui->delegateComboBox->currentText());
}
void CodeStyleSelectorWidget::updateName(ICodeStylePreferences *codeStyle)
{
const int idx = m_comboBox->findData(QVariant::fromValue(codeStyle));
const int idx = m_ui->delegateComboBox->findData(QVariant::fromValue(codeStyle));
if (idx < 0)
return;
const QString name = displayName(codeStyle);
m_comboBox->setItemText(idx, name);
m_comboBox->setItemData(idx, name, Qt::ToolTipRole);
m_ui->delegateComboBox->setItemText(idx, name);
m_ui->delegateComboBox->setItemData(idx, name, Qt::ToolTipRole);
}
QString CodeStyleSelectorWidget::displayName(ICodeStylePreferences *codeStyle) const

View File

@@ -50,11 +50,16 @@ namespace TextEditor {
class ICodeStylePreferences;
class ICodeStylePreferencesFactory;
namespace Ui {
class CodeStyleSelectorWidget;
}
class TEXTEDITOR_EXPORT CodeStyleSelectorWidget : public QWidget
{
Q_OBJECT
public:
explicit CodeStyleSelectorWidget(ICodeStylePreferencesFactory *factory, QWidget *parent = 0);
~CodeStyleSelectorWidget();
void setCodeStyle(TextEditor::ICodeStylePreferences *codeStyle);
QString searchKeywords() const;
@@ -80,15 +85,7 @@ private:
QString displayName(ICodeStylePreferences *codeStyle) const;
QHBoxLayout *m_layout;
QComboBox *m_comboBox;
QLabel *m_comboBoxLabel;
QPushButton *m_copyButton;
QPushButton *m_editButton;
QPushButton *m_removeButton;
QPushButton *m_importButton;
QPushButton *m_exportButton;
Ui::CodeStyleSelectorWidget *m_ui;
bool m_ignoreGuiSignals;
};

View File

@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TextEditor::CodeStyleSelectorWidget</class>
<widget class="QWidget" name="TextEditor::CodeStyleSelectorWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>523</width>
<height>58</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>0</number>
</property>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Current settings:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="delegateComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="copyButton">
<property name="text">
<string>Copy...</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="editButton">
<property name="text">
<string>Edit...</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QPushButton" name="removeButton">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QPushButton" name="exportButton">
<property name="text">
<string>Export...</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QPushButton" name="importButton">
<property name="text">
<string>Import...</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>delegateComboBox</tabstop>
<tabstop>copyButton</tabstop>
<tabstop>editButton</tabstop>
<tabstop>removeButton</tabstop>
<tabstop>exportButton</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@@ -234,7 +234,8 @@ FORMS += \
snippets/snippetssettingspage.ui \
behaviorsettingswidget.ui \
behaviorsettingspage.ui \
tabsettingswidget.ui
tabsettingswidget.ui \
codestyleselectorwidget.ui
RESOURCES += texteditor.qrc
OTHER_FILES += TextEditor.mimetypes.xml
@@ -246,3 +247,4 @@ OTHER_FILES += TextEditor.mimetypes.xml

View File

@@ -170,6 +170,11 @@ SuppressionDialog::SuppressionDialog(MemcheckErrorView *view)
setWindowTitle(tr("Save Suppression"));
}
SuppressionDialog::~SuppressionDialog()
{
delete m_ui;
}
bool SuppressionDialog::shouldShow() const
{
return !m_errors.isEmpty();

View File

@@ -58,6 +58,7 @@ class SuppressionDialog : public QDialog
public:
SuppressionDialog(MemcheckErrorView *view);
~SuppressionDialog();
virtual void accept();
virtual void reject();

View File

@@ -3,7 +3,7 @@ include(../../rpath.pri)
TEMPLATE = app
TARGET = qmlprofiler
DESTDIR = $$IDE_APP_PATH
DESTDIR = $$IDE_BIN_PATH
QT = core
CONFIG += console

View File

@@ -98,8 +98,11 @@ private Q_SLOTS:
void json1();
void multilineTernaryInProperty();
void bug1();
void multilineString();
};
enum { DontCheck = -2, DontIndent = -1 };
struct Line {
Line(QString l)
: line(l)
@@ -142,7 +145,7 @@ void checkIndent(QList<Line> data, int style = 0)
int i = 0;
foreach (const Line &l, data) {
QTextBlock b = document.findBlockByLineNumber(i);
if (l.expectedIndent != -1) {
if (l.expectedIndent != DontCheck) {
int actualIndent = formatter.indentFor(b);
if (actualIndent != l.expectedIndent) {
QFAIL(QString("Wrong indent in line %1 with text '%2', expected indent %3, got %4").arg(
@@ -756,9 +759,9 @@ void tst_QMLCodeFormatter::strayElse()
data << Line("Rectangle {")
<< Line("onClicked: {", 4)
<< Line(" while ( true ) {}")
<< Line(" else", -1)
<< Line(" else {", -1)
<< Line(" }", -1)
<< Line(" else", DontCheck)
<< Line(" else {", DontCheck)
<< Line(" }", DontCheck)
<< Line("}");
checkIndent(data);
}
@@ -1292,6 +1295,23 @@ void tst_QMLCodeFormatter::bug1()
checkIndent(data);
}
void tst_QMLCodeFormatter::multilineString()
{
QList<Line> data;
data << Line("Item {")
<< Line(" a: 'foo")
<< Line(" bar", DontIndent)
<< Line(" boo boo", DontIndent)
<< Line(" end'", DontIndent)
<< Line(" a: \"foo")
<< Line(" bar", DontIndent)
<< Line(" boo boo", DontIndent)
<< Line(" end\"", DontIndent)
<< Line("}")
;
checkIndent(data);
}
QTEST_APPLESS_MAIN(tst_QMLCodeFormatter)
#include "tst_qmlcodeformatter.moc"

View File

@@ -14,10 +14,10 @@
:CMake Wizard_CMakeProjectManager::Internal::CMakeOpenProjectWizard {type='CMakeProjectManager::Internal::CMakeOpenProjectWizard' unnamed='1' visible='1' windowTitle='CMake Wizard'}
:Desktop_QLabel {container=':QtCreator.MenuBar_ProjectExplorer::Internal::ProjectListWidget' name='target' text='Desktop' type='QLabel' visible='1'}
:Generator:_QComboBox {buddy=':CMake Wizard.Generator:_QLabel' type='QComboBox' unnamed='1' visible='1'}
:New.Choose..._QPushButton {text='Choose...' type='QPushButton' unnamed='1' visible='1' window=':New_Core::Internal::NewDialog'}
:New.templateCategoryView_QTreeView {name='templateCategoryView' type='QTreeView' visible='1' window=':New_Core::Internal::NewDialog'}
:New.templatesView_QListView {name='templatesView' type='QListView' visible='1' window=':New_Core::Internal::NewDialog'}
:New_Core::Internal::NewDialog {name='Core__Internal__NewDialog' type='Core::Internal::NewDialog' visible='1' windowTitle='New'}
:Next_QPushButton {text~='(Next.*|Continue)' type='QPushButton' visible='1'}
:Project Setup.scrollArea_QScrollArea {name='scrollArea' type='QScrollArea' visible='1' window=':Project Setup_Qt4ProjectManager::Internal::ProjectLoadWizard'}
:Project Setup_Qt4ProjectManager::Internal::ProjectLoadWizard {type='Qt4ProjectManager::Internal::ProjectLoadWizard' unnamed='1' visible='1' windowTitle='Project Setup'}
:Qt Creator.QtCreator.MenuBar_QMenuBar {name='QtCreator.MenuBar' type='QMenuBar' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
@@ -30,7 +30,6 @@
:Qt Creator_Utils::NavigationTreeView {type='Utils::NavigationTreeView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
:Qt Gui Application.Form file:_QLabel {name='formLabel' text='Form file:' type='QLabel' visible='1' window=':Qt Gui Application_Qt4ProjectManager::Internal::GuiAppWizardDialog'}
:Qt Gui Application.Header file:_QLabel {name='headerLabel' text='Header file:' type='QLabel' visible='1' window=':Qt Gui Application_Qt4ProjectManager::Internal::GuiAppWizardDialog'}
:Qt Gui Application.Next_QPushButton {name='__qt__passive_wizardbutton1' text~='(Next.*|Continue)' type='QPushButton' visible='1' window=':Qt Gui Application_Qt4ProjectManager::Internal::GuiAppWizardDialog'}
:Qt Gui Application.Source file:_QLabel {name='sourceLabel' text='Source file:' type='QLabel' visible='1' window=':Qt Gui Application_Qt4ProjectManager::Internal::GuiAppWizardDialog'}
:Qt Gui Application.frame_QFrame {name='frame' type='QFrame' visible='1' window=':Qt Gui Application_Qt4ProjectManager::Internal::GuiAppWizardDialog'}
:Qt Gui Application.scrollArea_QScrollArea {name='scrollArea' type='QScrollArea' visible='1' window=':Qt Gui Application_Qt4ProjectManager::Internal::GuiAppWizardDialog'}
@@ -39,8 +38,6 @@
:QtCreator.MenuBar_ProjectExplorer::Internal::ProjectListWidget {type='ProjectExplorer::Internal::ProjectListWidget' window=':QtCreator.MenuBar_ProjectExplorer::Internal::MiniProjectTargetSelector'}
:addToVersionControlComboBox_QComboBox {name='addToVersionControlComboBox' type='QComboBox' visible='1'}
:formFileLineEdit_Utils::FileNameValidatingLineEdit {buddy=':Qt Gui Application.Form file:_QLabel' name='formFileLineEdit' type='Utils::FileNameValidatingLineEdit' visible='1'}
:frame.nameLineEdit_Utils::ProjectNameValidatingLineEdit {container=':Qt Gui Application.frame_QFrame' name='nameLineEdit' type='Utils::ProjectNameValidatingLineEdit' visible='1'}
:frame_Utils::BaseValidatingLineEdit {container=':Qt Gui Application.frame_QFrame' type='Utils::BaseValidatingLineEdit' unnamed='1' visible='1'}
:headerFileLineEdit_Utils::FileNameValidatingLineEdit {buddy=':Qt Gui Application.Header file:_QLabel' name='headerFileLineEdit' type='Utils::FileNameValidatingLineEdit' visible='1'}
:projects.projects.pro_QModelIndex {column='0' container=':projects_QModelIndex' text='projects.pro' type='QModelIndex'}
:projects_QModelIndex {column='0' container=':Qt Creator_Utils::NavigationTreeView' text='projects' type='QModelIndex'}

View File

@@ -53,6 +53,34 @@ def shadowBuildDir(path, project, qtVersion, debugVersion):
else:
return buildDir + "_Release"
def __createProjectSelectType__(category, template):
invokeMenuItem("File", "New File or Project...")
categoriesView = waitForObject("{type='QTreeView' name='templateCategoryView'}", 20000)
clickItem(categoriesView, "Projects." + category, 5, 5, 0, Qt.LeftButton)
templatesView = waitForObject("{name='templatesView' type='QListView'}", 20000)
clickItem(templatesView, template, 5, 5, 0, Qt.LeftButton)
clickButton(waitForObject("{text='Choose...' type='QPushButton' unnamed='1' visible='1'}", 20000))
def createProjectSetNameAndPath(path, projectName = None, checks = True):
directoryEdit = waitForObject("{type='Utils::BaseValidatingLineEdit' unnamed='1' visible='1'}", 20000)
replaceEditorContent(directoryEdit, path)
projectNameEdit = waitForObject("{name='nameLineEdit' visible='1' "
"type='Utils::ProjectNameValidatingLineEdit'}", 20000)
if projectName == None:
projectName = projectNameEdit.text
else:
replaceEditorContent(projectNameEdit, projectName)
if checks:
stateLabel = findObject("{type='QLabel' name='stateLabel'}")
labelCheck = stateLabel.text=="" and stateLabel.styleSheet == ""
test.verify(labelCheck, "Project name and base directory without warning or error")
# make sure this is not set as default location
cbDefaultLocation = waitForObject("{type='QCheckBox' name='projectsDirectoryCheckBox' visible='1'}", 20000)
if cbDefaultLocation.checked:
clickButton(cbDefaultLocation)
clickButton(waitForObject(":Next_QPushButton"))
return projectName
def createProjectHandleLastPage(expectedFiles = None):
if expectedFiles != None:
summary = str(waitForObject(":scrollArea.Files to be added").text)
@@ -65,17 +93,8 @@ def createProjectHandleLastPage(expectedFiles = None):
clickButton(waitForObject("{type='QPushButton' text~='(Finish|Done)' visible='1'}", 20000))
def createProject_Qt_GUI(path, projectName, qtVersion, checks):
invokeMenuItem("File", "New File or Project...")
waitForObjectItem(":New.templateCategoryView_QTreeView", "Projects.Qt Widget Project")
clickItem(":New.templateCategoryView_QTreeView", "Projects.Qt Widget Project", 125, 16, 0, Qt.LeftButton)
waitForObjectItem(":New.templatesView_QListView", "Qt Gui Application")
clickItem(":New.templatesView_QListView", "Qt Gui Application", 35, 12, 0, Qt.LeftButton)
clickButton(waitForObject(":New.Choose..._QPushButton"))
directoryEdit = waitForObject(":frame_Utils::BaseValidatingLineEdit")
replaceEditorContent(directoryEdit, path)
projectNameEdit = waitForObject(":frame.nameLineEdit_Utils::ProjectNameValidatingLineEdit")
replaceEditorContent(projectNameEdit, projectName)
clickButton(waitForObject(":Qt Gui Application.Next_QPushButton"))
__createProjectSelectType__("Qt Widget Project", "Qt Gui Application")
createProjectSetNameAndPath(path, projectName, checks)
desktopCheckbox = waitForObject(":scrollArea.Desktop_QCheckBox", 20000)
if checks:
@@ -89,7 +108,8 @@ def createProject_Qt_GUI(path, projectName, qtVersion, checks):
path = os.path.abspath(path)
verifyChecked(":scrollArea.Qt 4 for Desktop - (Qt SDK) debug_QCheckBox")
verifyChecked(":scrollArea.Qt 4 for Desktop - (Qt SDK) release_QCheckBox")
clickButton(waitForObject(":Qt Gui Application.Next_QPushButton"))
nextButton = waitForObject(":Next_QPushButton")
clickButton(nextButton)
if checks:
exp_filename = "mainwindow"
@@ -106,7 +126,7 @@ def createProject_Qt_GUI(path, projectName, qtVersion, checks):
test.compare(findObject(":sourceFileLineEdit_Utils::FileNameValidatingLineEdit").text, cpp_file)
test.compare(findObject(":formFileLineEdit_Utils::FileNameValidatingLineEdit").text, ui_file)
clickButton(verifyEnabled(":Qt Gui Application.Next_QPushButton"))
clickButton(nextButton)
expectedFiles = None
if checks:
@@ -128,25 +148,8 @@ def createProject_Qt_GUI(path, projectName, qtVersion, checks):
test.verify(os.path.exists(pro_path), "Checking if '" + pro_path + "' was created")
def createNewQtQuickApplication(workingDir, projectName = None, templateFile = None, targets = QtQuickConstants.Targets.DESKTOP):
invokeMenuItem("File", "New File or Project...")
clickItem(waitForObject("{type='QTreeView' name='templateCategoryView'}", 20000), "Projects.Qt Quick Project", 5, 5, 0, Qt.LeftButton)
clickItem(waitForObject("{name='templatesView' type='QListView'}", 20000), "Qt Quick Application", 5, 5, 0, Qt.LeftButton)
clickButton(waitForObject("{text='Choose...' type='QPushButton' unnamed='1' visible='1'}", 20000))
if projectName!=None:
baseLineEd = waitForObject("{name='nameLineEdit' visible='1' "
"type='Utils::ProjectNameValidatingLineEdit'}", 20000)
replaceEditorContent(baseLineEd, projectName)
baseLineEd = waitForObject("{type='Utils::BaseValidatingLineEdit' unnamed='1' visible='1'}", 20000)
replaceEditorContent(baseLineEd, workingDir)
stateLabel = findObject("{type='QLabel' name='stateLabel'}")
labelCheck = stateLabel.text=="" and stateLabel.styleSheet == ""
test.verify(labelCheck, "Project name and base directory without warning or error")
# make sure this is not set as default location
cbDefaultLocation = waitForObject("{type='QCheckBox' name='projectsDirectoryCheckBox' visible='1'}", 20000)
if cbDefaultLocation.checked:
clickButton(cbDefaultLocation)
nextButton = waitForObject("{text~='(Next.*|Continue)' type='QPushButton' visible='1'}", 20000)
clickButton(nextButton)
__createProjectSelectType__("Qt Quick Project", "Qt Quick Application")
projectName = createProjectSetNameAndPath(workingDir, projectName)
if (templateFile==None):
chooseComponents()
else:
@@ -154,6 +157,7 @@ def createNewQtQuickApplication(workingDir, projectName = None, templateFile = N
# define the existing qml file to import
baseLineEd = waitForObject("{type='Utils::BaseValidatingLineEdit' unnamed='1' visible='1'}", 20000)
type(baseLineEd, templateFile)
nextButton = waitForObject(":Next_QPushButton", 20000)
clickButton(nextButton)
chooseTargets(targets)
snooze(1)
@@ -161,45 +165,19 @@ def createNewQtQuickApplication(workingDir, projectName = None, templateFile = N
createProjectHandleLastPage()
def createNewQtQuickUI(workingDir):
invokeMenuItem("File", "New File or Project...")
clickItem(waitForObject("{type='QTreeView' name='templateCategoryView'}", 20000), "Projects.Qt Quick Project", 5, 5, 0, Qt.LeftButton)
clickItem(waitForObject("{name='templatesView' type='QListView'}", 20000), "Qt Quick UI", 5, 5, 0, Qt.LeftButton)
clickButton(waitForObject("{text='Choose...' type='QPushButton' unnamed='1' visible='1'}", 20000))
baseLineEd = waitForObject("{type='Utils::BaseValidatingLineEdit' unnamed='1' visible='1'}", 20000)
__createProjectSelectType__("Qt Quick Project", "Qt Quick UI")
if workingDir == None:
workingDir = tempDir()
replaceEditorContent(baseLineEd, workingDir)
stateLabel = findObject("{type='QLabel' name='stateLabel'}")
labelCheck = stateLabel.text=="" and stateLabel.styleSheet == ""
test.verify(labelCheck, "Project name and base directory without warning or error")
# make sure this is not set as default location
cbDefaultLocation = waitForObject("{type='QCheckBox' name='projectsDirectoryCheckBox' visible='1'}", 20000)
if cbDefaultLocation.checked:
clickButton(cbDefaultLocation)
# now there's the 'untitled' project inside a temporary directory - step forward...!
clickButton(waitForObject("{text~='(Next.*|Continue)' type='QPushButton' visible='1'}", 20000))
createProjectSetNameAndPath(workingDir)
createProjectHandleLastPage()
def createNewQmlExtension(workingDir):
invokeMenuItem("File", "New File or Project...")
clickItem(waitForObject("{type='QTreeView' name='templateCategoryView'}", 20000), "Projects.Qt Quick Project", 5, 5, 0, Qt.LeftButton)
clickItem(waitForObject("{name='templatesView' type='QListView'}", 20000), "Custom QML Extension Plugin", 5, 5, 0, Qt.LeftButton)
clickButton(waitForObject("{text='Choose...' type='QPushButton' unnamed='1' visible='1'}", 20000))
baseLineEd = waitForObject("{type='Utils::BaseValidatingLineEdit' unnamed='1' visible='1'}", 20000)
__createProjectSelectType__("Qt Quick Project", "Custom QML Extension Plugin")
if workingDir == None:
workingDir = tempDir()
replaceEditorContent(baseLineEd, workingDir)
stateLabel = findObject("{type='QLabel' name='stateLabel'}")
labelCheck = stateLabel.text=="" and stateLabel.styleSheet == ""
test.verify(labelCheck, "Project name and base directory without warning or error")
# make sure this is not set as default location
cbDefaultLocation = waitForObject("{type='QCheckBox' name='projectsDirectoryCheckBox' visible='1'}", 20000)
if cbDefaultLocation.checked:
clickButton(cbDefaultLocation)
# now there's the 'untitled' project inside a temporary directory - step forward...!
nextButton = waitForObject("{text~='(Next.*|Continue)' type='QPushButton' visible='1'}", 20000)
clickButton(nextButton)
createProjectSetNameAndPath(workingDir)
chooseTargets()
nextButton = waitForObject(":Next_QPushButton")
clickButton(nextButton)
nameLineEd = waitForObject("{buddy={type='QLabel' text='Object Class-name:' unnamed='1' visible='1'} "
"type='QLineEdit' unnamed='1' visible='1'}", 20000)

View File

@@ -31,6 +31,19 @@ def selectFromCombo(objectName, itemName):
mouseClick(object, 5, 5, 0, Qt.LeftButton)
mouseClick(waitForObjectItem(object, itemName), 5, 5, 0, Qt.LeftButton)
def selectFromLocator(filter, itemName = None):
if itemName == None:
itemName = filter
itemName = itemName.replace(".", "\\.")
locator = waitForObject(":*Qt Creator_Utils::FilterLineEdit", 20000)
mouseClick(locator, 5, 5, 0, Qt.LeftButton)
replaceEditorContent(locator, filter)
# clicking the wanted item
# if you replace this by pressing ENTER, be sure that something is selected
# otherwise you will run into unwanted behavior
wantedItem = waitForObjectItem("{type='QTreeView' unnamed='1' visible='1'}", itemName)
doubleClick(wantedItem, 5, 5, 0, Qt.LeftButton)
def wordUnderCursor(window):
cursor = window.textCursor()
oldposition = cursor.position()

View File

@@ -9,12 +9,7 @@ def main():
prepareForSignal("{type='CppTools::Internal::CppModelManager' unnamed='1'}", "sourceFilesRefreshed(QStringList)")
openQmakeProject(srcPath + "/creator/tests/manual/cplusplus-tools/cplusplus-tools.pro")
waitForSignal("{type='CppTools::Internal::CppModelManager' unnamed='1'}", "sourceFilesRefreshed(QStringList)", 20000)
mouseClick(waitForObject(":*Qt Creator_Utils::FilterLineEdit", 20000), 5, 5, 0, Qt.LeftButton)
type(waitForObject(":*Qt Creator_Utils::FilterLineEdit"), "dummy.cpp")
# pause to wait for results to populate
snooze(1)
type(waitForObject(":*Qt Creator_Utils::FilterLineEdit"), "<Return>")
selectFromLocator("dummy.cpp")
## Waiting for a solution from Froglogic to make the below work.
## There is an issue with slots that return a class type that wasn't running previously...
@@ -24,7 +19,7 @@ def main():
# t3 = t2.file()
# t4 = t3.fileName
# test.compare(editorManager.currentEditor().file().fileName, "base.cpp")
cppwindow = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
cppwindow = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")
# - Move the cursor to the usage of a variable.
# - Press F2 or select from the menu: Tools / C++ / Follow Symbol under Cursor
@@ -51,13 +46,9 @@ def main():
# Creator should show the definition of this function
# - Press Shift+F2 or select from menu: Tools / C++ / Switch Between Method Declaration/Definition again
# Creator should show the declaration of the function again.
mouseClick(waitForObject(":*Qt Creator_Utils::FilterLineEdit", 20000), 5, 5, 0, Qt.LeftButton)
clickButton(waitForObject(":Qt Creator_Utils::IconButton"))
type(waitForObject(":*Qt Creator_Utils::FilterLineEdit"), "dummy.cpp")
# pause to wait for results to populate
snooze(1)
type(waitForObject(":*Qt Creator_Utils::FilterLineEdit"), "<Return>")
selectFromLocator("dummy.cpp")
mainWin = findObject(":Qt Creator_Core::Internal::MainWindow")
waitFor("mainWin.windowTitle == 'dummy.cpp - cplusplus-tools - Qt Creator'")
# Reset cursor to the start of the document
cursor = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget").textCursor()
cursor.movePosition(QTextCursor.Start)

View File

@@ -20,7 +20,7 @@ def main():
buildCombo = waitForObject(":Build:_QComboBox")
sendEvent("QMouseEvent", waitForObject(":QtCreator.MenuBar_ProjectExplorer::Internal::MiniProjectTargetSelector"), QEvent.MouseButtonPress, -5, 5, Qt.LeftButton, 0)
prog = re.compile("Qt.*Release")
prog = re.compile("(Desktop )?Qt.*Release")
for row in range(buildCombo.count):
if prog.match(str(buildCombo.itemText(row))):
clickButton(waitForObject(":*Qt Creator_Core::Internal::FancyToolButton"))

View File

@@ -27,11 +27,7 @@ def main():
test.compare(waitForObject(node).text, value)
# Now check some basic lookups in the search box
mouseClick(waitForObject(":*Qt Creator_Utils::FilterLineEdit", 20000), 5, 5, 0, Qt.LeftButton)
replaceEditorContent(waitForObject(":*Qt Creator_Utils::FilterLineEdit", 20000), ": Qlist::QList")
type(waitForObject(":*Qt Creator_Utils::FilterLineEdit", 20000), "<Return>")
selectFromLocator(": Qlist::QList", "QList::QList")
test.compare(wordUnderCursor(waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget")), "QList")
invokeMenuItem("File", "Exit")

View File

@@ -12,6 +12,7 @@ def main():
# using a temporary directory won't mess up an eventually exisiting
workingDir = tempDir()
prepareTemplate(sourceExample)
prepareForSignal("{type='CppTools::Internal::CppModelManager' unnamed='1'}", "sourceFilesRefreshed(QStringList)")
createNewQtQuickApplication(workingDir, "untitled", templateDir + "/qml/focus.qml")
# wait for parsing to complete
waitForSignal("{type='CppTools::Internal::CppModelManager' unnamed='1'}", "sourceFilesRefreshed(QStringList)", 30000)