diff --git a/dist/gdb/Makefile.linux b/dist/gdb/Makefile.linux index f12d25eaf8f436bec7a9718a80e691c6a101c8ee..94bf99bca9aea68dde3ada993be661564e8df127 100644 --- a/dist/gdb/Makefile.linux +++ b/dist/gdb/Makefile.linux @@ -1,6 +1,6 @@ broot=${PWD} source=${broot}/source -targets=x86_64-unknown-linux-gnu i686-unknown-linux-gnu arm-none-linux-gnueabi arm-none-symbianelf +targets=x86_64-unknown-linux-gnu i686-unknown-linux-gnu arm-none-linux-gnueabi staging=${broot}/staging pyversion=2.7 expatversion=2.0.1 diff --git a/dist/gdb/Makefile.mingw b/dist/gdb/Makefile.mingw index 4d36fa67bd24de54ca49640f9d161307fe357576..acc8a841739c51ce1906cbefc9317c029cf64ab9 100644 --- a/dist/gdb/Makefile.mingw +++ b/dist/gdb/Makefile.mingw @@ -1,6 +1,6 @@ broot=${PWD} source=${broot}/source -targets=arm-none-symbianelf arm-none-linux-gnueabi i686-pc-mingw32 +targets=arm-none-linux-gnueabi i686-pc-mingw32 staging=${broot}/staging pyversion=2.7 pydir=${broot}/python diff --git a/dist/gdb/Makefile.osx b/dist/gdb/Makefile.osx index e73a9624346d8ae5d7ef49c7ba49f4f23c477024..20517d01ea18606986967f35335b90303e333d9d 100644 --- a/dist/gdb/Makefile.osx +++ b/dist/gdb/Makefile.osx @@ -1,6 +1,6 @@ broot=${PWD} source=${broot}/source -targets=x86_64-unknown-linux-gnu i686-unknown-linux-gnu arm-none-linux-gnueabi arm-none-symbianelf x86_64-apple-darwin10 +targets=x86_64-unknown-linux-gnu i686-unknown-linux-gnu arm-none-linux-gnueabi x86_64-apple-darwin10 staging=${broot}/staging pyversion=2.7 expatversion=2.0.1 diff --git a/dist/installer/ifw/config/config.xml.in b/dist/installer/ifw/config/config.xml.in new file mode 100644 index 0000000000000000000000000000000000000000..39fe7f4f00f915016a44a6f2223d12db24795ad9 --- /dev/null +++ b/dist/installer/ifw/config/config.xml.in @@ -0,0 +1,24 @@ +<?xml version="1.0"?> +<Installer> + <Name>Qt Creator</Name> + <Version>{version}</Version> + <Title>Qt Creator</Title> + <MaintenanceTitle>Qt Creator Maintenance</MaintenanceTitle> + <Publisher>Qt Project</Publisher> + <ProductUrl>http://qt-project.org</ProductUrl> + + <Icon>logo.png</Icon> + <Watermark>watermark.png</Watermark> + <UninstallerName>QtCreatorUninstaller</UninstallerName> + <!-- @homeDir@ and @rootDir@ are some of the supported vars --> + <TargetDir>@homeDir@/QtCreator</TargetDir> + <AdminTargetDir>/opt/QtCreator</AdminTargetDir> + + <Pages> + <Page name="LicenseAgreementPage"> + <AcceptLicenseLabel>I have read and understood the terms contained in the above license agreements.</AcceptLicenseLabel> + <RejectLicenseLabel>I do not accept the terms contained in the above license agreements.</RejectLicenseLabel> + </Page> + </Pages> + +</Installer> diff --git a/dist/installer/ifw/config/logo.png b/dist/installer/ifw/config/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d892f85fe2c11f273bc66774fad74c3deeddb989 Binary files /dev/null and b/dist/installer/ifw/config/logo.png differ diff --git a/dist/installer/ifw/config/watermark.png b/dist/installer/ifw/config/watermark.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44c44f4c651679158c733d9e5a8a0c4319cd57 Binary files /dev/null and b/dist/installer/ifw/config/watermark.png differ diff --git a/dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/installscript.qs b/dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/installscript.qs new file mode 100644 index 0000000000000000000000000000000000000000..33436bbbb166d4c35dcafc5ed52f8f97110dbec7 --- /dev/null +++ b/dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/installscript.qs @@ -0,0 +1,155 @@ +/* This file is part of the Qt SDK + +Copyright (c) 2008-2012 Nokia Corporation and/or its subsidiary(-ies). +All rights reserved. + +Contact: Nokia Corporation (qt-info@nokia.com) + +GNU Lesser General Public License Usage +This file may be used under the terms of the GNU Lesser General Public +License version 2.1 as published by the Free Software Foundation and +appearing in the file LICENSE.LGPL included in the packaging of this file. +Please review the following information to ensure the GNU Lesser General +Public License version 2.1 requirements will be met: +http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + +If you have questions regarding the use of this file, please contact Nokia +at qt-info@nokia.com. +*/ + +// constructor +function Component() +{ + installer.finishButtonClicked.connect(this, Component.prototype.installationFinished); +} + +Component.prototype.beginInstallation = function() +{ + if ( installer.value("os") === "win" ) { + component.setStopProcessForUpdateRequest("@TargetDir@/bin/qtcreator.exe", true); + component.setStopProcessForUpdateRequest("@TargetDir@/bin/linguist.exe", true); + component.setStopProcessForUpdateRequest("@TargetDir@/bin/qmlviewer.exe", true); + } +} + +registerWindowsFileTypeExtensions = function() +{ + var headerExtensions = new Array("h", "hh", "hxx", "h++", "hpp", "hpp"); + + for (var i = 0; i < headerExtensions.length; ++i) { + component.addOperation( "RegisterFileType", + headerExtensions[i], + "@TargetDir@\\bin\\qtcreator.exe -client '%1'", + "C++ Header file", + "", + "@TargetDir@\\bin\\qtcreator.exe,3"); + } + + var cppExtensions = new Array("cc", "cxx", "c++", "cp", "cpp"); + + for (var i = 0; i < cppExtensions.length; ++i) { + component.addOperation( "RegisterFileType", + cppExtensions[i], + "@TargetDir@\\bin\\qtcreator.exe -client '%1'", + "C++ Source file", + "", + "@TargetDir@\\bin\\qtcreator.exe,2"); + } + + component.addOperation( "RegisterFileType", + "c", + "@TargetDir@\\bin\\qtcreator.exe -client '%1'", + "C Source file", + "", + "@TargetDir@\\bin\\qtcreator.exe,1"); + component.addOperation( "RegisterFileType", + "ui", + "@TargetDir@\\bin\\qtcreator.exe -client '%1'", + "Qt UI file", + "", + "@TargetDir@\\bin\\qtcreator.exe,4"); + component.addOperation( "RegisterFileType", + "pro", + "@TargetDir@\\bin\\qtcreator.exe -client '%1'", + "Qt Project file", + "", + "@TargetDir@\\bin\\qtcreator.exe,5"); + component.addOperation( "RegisterFileType", + "pri", + "@TargetDir@\\bin\\qtcreator.exe -client '%1'", + "Qt Project Include file", + "", + "@TargetDir@\\bin\\qtcreator.exe,6"); + component.addOperation( "RegisterFileType", + "qs", + "@TargetDir@\\bin\\qtcreator.exe -client '%1'", + "Qt Script file", + "", + "@TargetDir@\\bin\\qtcreator.exe,0"); + component.addOperation( "RegisterFileType", + "qml", + "@TargetDir@\\bin\\qtcreator.exe -client '%1'", + "Qt Quick Markup language file", + "", + "@TargetDir@\\bin\\qtcreator.exe,0"); +} + +Component.prototype.createOperations = function() +{ + // Call the base createOperations and afterwards set some registry settings + component.createOperations(); + if ( installer.value("os") == "win" ) + { + component.addOperation( "SetPluginPathOnQtCore", + "@TargetDir@/bin", + "@TargetDir@/plugins"); + component.addOperation( "SetImportsPathOnQtCore", + "@TargetDir@/bin", + "@TargetDir@/bin"); + component.addOperation( "CreateShortcut", + "@TargetDir@\\\bin\\qtcreator.exe", + "@StartMenuDir@/Qt Creator.lnk", + "workingDirectory=@homeDir@" ); + registerWindowsFileTypeExtensions(); + } + if ( installer.value("os") == "x11" ) + { + component.addOperation( "SetPluginPathOnQtCore", + "@TargetDir@/lib/qtcreator", + "@TargetDir@/lib/qtcreator/plugins"); + component.addOperation( "SetImportsPathOnQtCore", + "@TargetDir@/lib/qtcreator", + "@TargetDir@/bin"); + + component.addOperation( "InstallIcons", "@TargetDir@/share/icons" ); + component.addOperation( "CreateDesktopEntry", + "QtProject-qtcreator.desktop", + "Type=Application\nExec=@TargetDir@/bin/qtcreator\nPath=@TargetDir@\nName=Qt Creator\nGenericName=The IDE of choice for Qt development.\nGenericName[de]=Die IDE der Wahl zur Qt Entwicklung\nIcon=QtProject-qtcreator\nTerminal=false\nCategories=Development;IDE;Qt;\nMimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.nokia.qt.qmakeprofile;application/vnd.nokia.xml.qt.resource;text/x-qml;" + ); + } +} + +Component.prototype.installationFinished = function() +{ + try { + if (component.installed && installer.isInstaller() && installer.status == QInstaller.Success) { + var isLaunchQtCreatorCheckBoxChecked = component.userInterface( "LaunchQtCreatorCheckBoxForm" ).launchQtCreatorCheckBox.checked; + if (isLaunchQtCreatorCheckBoxChecked) { + + var qtCreatorBinary = installer.value("TargetDir"); + if (installer.value("os") == "win") + qtCreatorBinary = qtCreatorBinary + "\\bin\\qtcreator.exe"; + else if (installer.value("os") == "x11") + qtCreatorBinary = qtCreatorBinary + "/bin/qtcreator"; + else if (installer.value("os") == "mac") + qtCreatorBinary = "\"" + qtCreatorBinary + "/Qt Creator.app/Contents/MacOS/Qt Creator\""; + + if (installer.executeDetached) + installer.executeDetached(qtCreatorBinary); + } + } + } catch(e) { + print(e); + } +} + diff --git a/dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/license.txt b/dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/license.txt new file mode 100644 index 0000000000000000000000000000000000000000..602bfc94635ddf8f1bf2b00419a85ead645a5b67 --- /dev/null +++ b/dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/package.xml.in b/dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/package.xml.in new file mode 100644 index 0000000000000000000000000000000000000000..ed2cf104c989e21e9fbed2e15a434489ba07ccd6 --- /dev/null +++ b/dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/package.xml.in @@ -0,0 +1,15 @@ +<?xml version="1.0"?> +<Package> + <DisplayName>Qt Creator Application</DisplayName> + <Description>The IDE of choice for Qt development.</Description> + <Version>{version}</Version> + <ReleaseDate>{date}</ReleaseDate> + <Name>org.qtproject.qtcreator.application</Name> + <Script>installscript.qs</Script> + <Licenses> + <License name="Qt Creator License" file="license.txt" /> + </Licenses> + <ForcedInstallation>true</ForcedInstallation> + <Default>true</Default> + <AutoDependOn>org.qtproject.qtcreator</AutoDependOn> +</Package> diff --git a/dist/installer/ifw/packages/org.qtproject.qtcreator/meta/package.xml.in b/dist/installer/ifw/packages/org.qtproject.qtcreator/meta/package.xml.in new file mode 100644 index 0000000000000000000000000000000000000000..122ca71cad40670a72fb6c524848918ea0e25c12 --- /dev/null +++ b/dist/installer/ifw/packages/org.qtproject.qtcreator/meta/package.xml.in @@ -0,0 +1,9 @@ +<?xml version="1.0"?> +<Package> + <DisplayName>Qt Creator</DisplayName> + <Description>Installs the Qt Creator IDE.</Description> + <Version>{version}</Version> + <ReleaseDate>{date}</ReleaseDate> + <Name>org.qtproject.qtcreator</Name> + <!-- <Script>installscript.js</Script> --> +</Package> diff --git a/doc/images/qmldesigner-new-project.png b/doc/images/qmldesigner-new-project.png index ac8e4e15058ddb44b93fda989b98db4e5ebcb937..acbbc37893871dc24789c10337d01450f3c70ce8 100644 Binary files a/doc/images/qmldesigner-new-project.png and b/doc/images/qmldesigner-new-project.png differ diff --git a/doc/images/qtcreator-new-qt-quick-project-wizard.png b/doc/images/qtcreator-new-qt-quick-project-wizard.png index 9c318c9390019883b1c6cf74d1acb74ab3a5485d..1bd69f05642777a7c42c27d0e7e27837c2a9defb 100644 Binary files a/doc/images/qtcreator-new-qt-quick-project-wizard.png and b/doc/images/qtcreator-new-qt-quick-project-wizard.png differ diff --git a/doc/src/howto/creator-vcs.qdoc b/doc/src/howto/creator-vcs.qdoc index 337a45ca77d371616a33bd541c92b4d16707d343..2ec977a99291905eb78950bd9d4716733faf2651 100644 --- a/doc/src/howto/creator-vcs.qdoc +++ b/doc/src/howto/creator-vcs.qdoc @@ -41,6 +41,10 @@ \o Bazaar \o \l{http://bazaar.canonical.com/} \o \QC 2.2 and later + \row + \o ClearCase + \o \l{http://www-01.ibm.com/software/awdtools/clearcase/} + \i Experimental plugin in \QC 2.6 \row \o CVS \o \l{http://www.cvshome.org} @@ -304,7 +308,45 @@ \endtable - \section2 Using Additional CVS Functions + \section2 Using Additional ClearCase Functions + + IBM Rational ClearCase is a version control, workspace management, parallel + development support, and build automation solution developed by IBM. The + ClearCase client plugin is an experimental plugin that you can enable by + selecting \gui Help > \gui {About Plugins} > \gui {Version Control} > + \gui ClearCase. The ClearCase client plugin is available on Linux and + Windows for accessing a ClearCase server. + + The \gui ClearCase submenu contains the following additional items: + + \table + \header + \o Menu Item + \o Description + \row + \o \gui{Check In} + \o Create a permanent new version of the current file or all files + in the versioned object base (VOB). + \row + \o \gui{Check In Activity} + \o Check in checked-out versions in the change set of the current + Unified Change Management (UCM) activity. + \row + \o \gui{Check Out} + \o Create a writable copy of a branch. If you check out files in a + UCM view, they are added to the change set of the UCM activity. + \row + \o \gui{Undo Check Out} + \o Cancel the checkout for a file and delete the checked-out + version. + \row + \o \gui{Undo Hijack} + \o Resolve hijacked files. If you change the read-only attribute of + a file that is loaded into a snapshot view and modify the file + without checking it out, you \e hijack the file. + \endtable + +\section2 Using Additional CVS Functions CVS is an open source version control system. diff --git a/doc/src/projects/creator-projects-creating.qdoc b/doc/src/projects/creator-projects-creating.qdoc index e28850ea927d6527e949ab4a1a148de3d7f7d9f2..211a129df7999a6b4fe50e1a9233bb0c620ecd97 100644 --- a/doc/src/projects/creator-projects-creating.qdoc +++ b/doc/src/projects/creator-projects-creating.qdoc @@ -116,9 +116,10 @@ \o Qt Quick Application (Built-in Elements) - Use built-in QML elements to design Qt Quick based user - interfaces with a custom look and feel and QML and C++ code to - implement the application logic + Use built-in QML elements to design user interfaces based on + Qt Quick 1 (Qt 4.7.1, or later) or Qt Quick 2 (Qt 5) with a + custom look and feel and QML and C++ code to implement the + application logic \o Qt Quick Application for MeeGo Harmattan diff --git a/doc/src/qtquick/qtquick-creating.qdoc b/doc/src/qtquick/qtquick-creating.qdoc index 27d87db53ae33d9e2377a8537e56d6b685295448..80763000a400d8a1fdc4aa012667365b046bd511 100644 --- a/doc/src/qtquick/qtquick-creating.qdoc +++ b/doc/src/qtquick/qtquick-creating.qdoc @@ -50,6 +50,14 @@ custom look and feel, whereas the components provide the look and feel for a particular platform. + The Qt Quick 1 Application wizard imports Qt Quick 1.1, and + therefore, you can use it without changes to develop for platforms + that run Qt 4.7.4 (such as MeeGo). To develop for platforms that run + Qt 4.7.3 (such as Maemo), you must change the import statement to + import Qt Quick 1.0. + + The Qt Quick 2 Application wizard imports Qt Quick 2.0. Use it to + develop for platforms that run Qt 5. \o \gui {Qt Quick UI} creates a Qt Quick UI project with a single QML file that contains the main view. You can review Qt Quick UI projects in the QML Viewer and you need not build them. You do not @@ -68,16 +76,6 @@ \endlist - \if defined(qcmanual) - \note Qt 4.7.3 supports Qt Quick 1.0 and Qt 4.7.4 supports Qt Quick 1.1. The - application wizards import Qt Quick 1.1, and therefore, you can use them - without changes if you target only platforms that run Qt 4.7.4 (such as - MeeGo or the desktop). If you also target platforms that run Qt 4.7.3 - (such as Maemo), you must change the import statement to - import Qt Quick 1.0. - \endif - - \section1 Creating Qt Quick UI Projects \list 1 diff --git a/qtcreator.pro b/qtcreator.pro index 4720d20b0edda8b5e3c6fe474c494344b17ad2ed..c1e5fa0014b1d9e72bde7c2db47ee8edccc93f57 100644 --- a/qtcreator.pro +++ b/qtcreator.pro @@ -27,6 +27,7 @@ PATTERN = $${PLATFORM}$(INSTALL_EDITION)-$${QTCREATOR_VERSION}$(INSTALL_POSTFIX) macx { APPBUNDLE = "$$OUT_PWD/bin/Qt Creator.app" BINDIST_SOURCE = "$$OUT_PWD/bin/Qt Creator.app" + BINDIST_INSTALLER_SOURCE = $$BINDIST_SOURCE deployqt.commands = $$PWD/scripts/deployqtHelper_mac.sh \"$${APPBUNDLE}\" codesign.commands = codesign -s \"$(SIGNING_IDENTITY)\" \"$${APPBUNDLE}\" dmg.commands = $$PWD/scripts/makedmg.sh $$OUT_PWD/bin qt-creator-$${PATTERN}.dmg @@ -34,6 +35,7 @@ macx { QMAKE_EXTRA_TARGETS += codesign dmg } else { BINDIST_SOURCE = "$(INSTALL_ROOT)$$QTC_PREFIX" + BINDIST_INSTALLER_SOURCE = "$$BINDIST_SOURCE/*" deployqt.commands = $$PWD/scripts/deployqt.py -i \"$(INSTALL_ROOT)$$QTC_PREFIX\" deployqt.depends = install win32 { @@ -43,13 +45,20 @@ macx { } } +INSTALLER_ARCHIVE = $$OUT_PWD/qt-creator-$${PATTERN}-installer-archive.7z + +bindist.depends = deployqt bindist.commands = 7z a -mx9 $$OUT_PWD/qt-creator-$${PATTERN}.7z \"$$BINDIST_SOURCE\" +bindist_installer.depends = deployqt +bindist_installer.commands = 7z a -mx9 $$OUT_PWD/qt-creator-$${PATTERN}-installer-archive.7z \"$$BINDIST_INSTALLER_SOURCE\" +installer.depends = bindist_installer +installer.commands = $$PWD/scripts/packageIfw.py -i \"$(IFW_PATH)\" -v $${QTCREATOR_VERSION} -a \"$$INSTALLER_ARCHIVE\" "qt-creator-$${PATTERN}-installer" win32 { deployqt.commands ~= s,/,\\\\,g bindist.commands ~= s,/,\\\\,g + bindist_installer.commands ~= s,/,\\\\,g + installer.commands ~= s,/,\\\\,g } -bindist.depends = deployqt - -QMAKE_EXTRA_TARGETS += deployqt bindist +QMAKE_EXTRA_TARGETS += deployqt bindist bindist_installer installer diff --git a/scripts/packageIfw.py b/scripts/packageIfw.py new file mode 100755 index 0000000000000000000000000000000000000000..b78cb548f280f8b475eec681f761ce9dddd940ff --- /dev/null +++ b/scripts/packageIfw.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python +################################################################################ +# Copyright (c) 2011 Nokia Corporation +# All rights reserved. +# +# 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, 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. +################################################################################ + +import os +import sys +import datetime +import getopt +import subprocess +import fnmatch +import tempfile +import shutil +import inspect + +def usage(): + print 'Usage: %s [-v|--version-string=versionstring] [-i|--installer-path=/path/to/installerfw] [-a|--archive=archive.7z] <outputname>' % os.path.basename(sys.argv[0]) + +def substitute_file(infile, outfile, substitutions): + with open(infile, 'r') as f: + template = f.read() + with open(outfile, 'w') as f: + f.write(template.format(**substitutions)) + +def ifw_template_dir(): + script_dir = os.path.dirname(inspect.getfile(inspect.currentframe())) + source_dir = os.path.normpath(os.path.join(script_dir, '..')); + return os.path.normpath(os.path.join(source_dir, 'dist', 'installer', 'ifw')) + +def main(): + try: + opts, args = getopt.gnu_getopt(sys.argv[1:], 'hv:i:a:', ['help', 'version-string=', 'installer-path=', 'archive']) + except: + usage() + sys.exit(2) + + if len(args) < 1: + usage() + sys.exit(2) + + version = '' + ifw_location = '' + archive = '' + for o, a in opts: + if o in ('-h', '--help'): + usage() + sys.exit(0) + if o in ('-v', '--version-string'): + version = a + if o in ('-i', '--installer-path'): + ifw_location = a + if o in ('-a', '--archive'): + archive = a + + if (version == ''): + raise Exception('Version not specified (--version-string)!') + + if (ifw_location == ''): + raise Exception('Installer framework location not specified (--installer-path)!') + + if (archive == ''): + raise Exception('Archive not specified (--archive)!') + + installer_name = args[0] + if sys.platform == 'darwin': + installer_name = installer_name + '.dmg' + + try: + temp_dir = tempfile.mkdtemp() + except: + raise Exception('Failed to create a temporary directory!') + + try: + substs = {} + substs['version'] = version + substs['date'] = datetime.date.today().isoformat() + + template_dir = ifw_template_dir() + out_config_dir = os.path.join(temp_dir,'config') + out_packages_dir = os.path.join(temp_dir, 'packages') + + shutil.copytree(os.path.join(template_dir, 'packages'), os.path.join(temp_dir, 'packages')) + shutil.copytree(os.path.join(template_dir, 'config'), os.path.join(temp_dir, 'config')) + + for root, dirnames, filenames in os.walk(out_packages_dir): + for template in fnmatch.filter(filenames, '*.in'): + substitute_file(os.path.join(root, template), os.path.join(root, template[:-3]), substs) + os.remove(os.path.join(root, template)) + + for root, dirnames, filenames in os.walk(out_config_dir): + for template in fnmatch.filter(filenames, '*.in'): + substitute_file(os.path.join(root, template), os.path.join(root, template[:-3]), substs) + os.remove(os.path.join(root, template)) + + data_path = os.path.join(out_packages_dir, 'org.qtproject.qtcreator.application', 'data') + if not os.path.exists(data_path): + os.makedirs(data_path) + shutil.copy(archive, data_path) + + ifw_call = [os.path.join(ifw_location, 'bin', 'binarycreator'), '-c', os.path.join(out_config_dir, 'config.xml'), '-p', out_packages_dir, installer_name, '--offline-only' ] + subprocess.check_call(ifw_call, stderr=subprocess.STDOUT) + finally: + print 'Cleaning up...' + shutil.rmtree(temp_dir) + print 'Done.' + +if __name__ == '__main__': + main() diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 8f4b74be1139b425001b8c03a8df1937b123cc6b..91a1e313f355db21295393895d3f73758f79c547 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -7416,10 +7416,6 @@ Fehler: %2</translation> <source>Run</source> <translation>Ausführen</translation> </message> - <message> - <source>No executable</source> - <translation>Keine ausführbare Datei</translation> - </message> </context> <context> <name>ProjectExplorer::Internal::ProcessStep</name> @@ -12253,10 +12249,6 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.</translat <source>There are no changes to commit.</source> <translation>Es sind keine ausstehenden Änderungen vorhanden.</translation> </message> - <message> - <source>Unable to generate a temporary file for the commit editor.</source> - <translation>Es konnte keine temporäre Datei für die Abgabe angelegt werden.</translation> - </message> <message> <source>Unable to create an editor for the commit.</source> <translation>Es konnte kein Editor für die Abgabe angelegt werden.</translation> @@ -13279,6 +13271,14 @@ Sie können die Änderungen in einem Stash ablegen oder zurücksetzen.</translat <source>File '%1' does not exist or is not readable.</source> <translation>Die Datei '%1' existiert nicht oder ist nicht lesbar.</translation> </message> + <message> + <source>Device type is not desktop.</source> + <translation>Der Gerätetyp ist nicht "Desktop".</translation> + </message> + <message> + <source>No Qt version set in kit.</source> + <translation>Im Kit ist keine Qt-Version gesetzt.</translation> + </message> </context> <context> <name>QmlProjectManager::Internal::QmlProjectApplicationWizardDialog</name> @@ -13570,6 +13570,10 @@ Erfordert <b>Qt 4.7.4</b> oder neuer.</translation> <source>Evaluating</source> <translation>Auswertung</translation> </message> + <message> + <source>No Qt version set in kit.</source> + <translation>Im Kit ist keine Qt-Version gesetzt.</translation> + </message> <message> <source>The .pro file '%1' does not exist.</source> <translation>Die .pro-Datei '%1' existiert nicht.</translation> @@ -18813,10 +18817,6 @@ Lokale Pull-Operationen werden nicht auf den Master-Branch angewandt.</translati <source>There are no changes to commit.</source> <translation>Es sind keine ausstehenden Änderungen vorhanden.</translation> </message> - <message> - <source>Unable to generate a temporary file for the commit editor.</source> - <translation>Es konnte keine temporäre Datei für die Abgabe angelegt werden.</translation> - </message> <message> <source>Unable to create an editor for the commit.</source> <translation>Es konnte kein Editor für die Abgabe angelegt werden.</translation> @@ -19730,6 +19730,10 @@ Fehler: %2</translation> <source>Kit Selection</source> <translation>Kit-Auswahl</translation> </message> + <message> + <source>%1 - temporary</source> + <translation>%1 - temporär</translation> + </message> <message> <source>Qt Creator can use the following kits for project <b>%1</b>:</source> <comment>%1: Project name</comment> @@ -20245,7 +20249,7 @@ Bei vollständiger Cache-Simulation werden weitere Ereigniszähler aktiviert: <translation>Globale Bus-Ereignisse aufnehmen</translation> </message> <message> - <source>Visualisation: Minimum event cost:</source> + <source>Visualization: Minimum event cost:</source> <translation>Minimale Ereigniskosten für Visualisierung:</translation> </message> </context> @@ -21327,10 +21331,22 @@ Bitte verwenden Sie den Stop-Button.</translation> <source>Debugging Helper Build Log for '%1'</source> <translation>Erstellungsprotokoll der Ausgabe-Hilfsbibliothek für '%1'</translation> </message> + <message> + <source>Select a qmake Executable</source> + <translation>Wählen Sie die ausführbare qmake-Datei aus</translation> + </message> + <message> + <source>Qt Version Already Registered</source> + <translation>Qt-Version bereits registriert</translation> + </message> <message> <source>Select a qmake executable</source> <translation>Wählen Sie die ausführbare qmake-Datei aus</translation> </message> + <message> + <source>This Qt version was already registered as "%1".</source> + <translation>Diese Qt-Version ist bereits unter "%1" registriert.</translation> + </message> <message> <source>Helpers: None available</source> <translation>Hilfskomponenten: Keine verfügbar</translation> @@ -26030,11 +26046,11 @@ should a repository require SSH-authentication (see documentation on SSH and the <translation>IDE-Überblick</translation> </message> <message> - <source>To find out what kind of integrated enviroment (IDE) Qt Creator is.</source> + <source>To find out what kind of integrated environment (IDE) Qt Creator is.</source> <translation>Um herauszufinden, um welche Art von integrierter Entwicklungsumgebung es sich bei Qt Creator handelt.</translation> </message> <message> - <source>To become familar with the parts of the Qt Creator user interface and to learn how to use them.</source> + <source>To become familiar with the parts of the Qt Creator user interface and to learn how to use them.</source> <translation>Um sich mit den Teilen der Benutzeroberfläche von Qt Creator vertraut zu machen und ihre Bedienung zu erlernen.</translation> </message> <message> @@ -26815,8 +26831,8 @@ Möchten Sie es beenden?</translation> <context> <name>QmlProfiler::Internal::QmlProfilerEventsWidget</name> <message> - <source>Trace information from the v8 JavaScript engine. Available only in Qt5 based applications</source> - <translation>Trace-Information vom v8 JavaScript-Engine. Nur in Qt-5 basierten Anwendungen verfügbar</translation> + <source>Trace information from the v8 JavaScript engine. Available only in Qt5 based applications.</source> + <translation>Trace-Information vom v8 JavaScript-Engine. Nur in Qt-5 basierten Anwendungen verfügbar.</translation> </message> <message> <source>Copy Row</source> @@ -26898,13 +26914,13 @@ Möchten Sie es beenden?</translation> <translation>Das Binding wird von der optimierten Engine ausgewertet.</translation> </message> <message> - <source>Binding not optimized (eg. has side effects or assignments, + <source>Binding not optimized (e.g. has side effects or assignments, references to elements in other files, loops, etc.)</source> <translation>Das Binding ist nicht optimiert (d.h., es hat Seiteneffekte oder Zuweisungen, Referenzen zu Elementen in anderen Dateien, Schleifen, etc.)</translation> </message> <message> - <source>Binding loop detected</source> - <translation>Endlosschleife bei Binding festgestellt</translation> + <source>Binding loop detected.</source> + <translation>Endlosschleife bei Binding festgestellt.</translation> </message> <message utf8="true"> <source> µs</source> @@ -26942,8 +26958,8 @@ references to elements in other files, loops, etc.)</source> <context> <name>QmlProfiler::Internal::QmlProfilerEventsParentsAndChildrenView</name> <message> - <source>Part of binding loop</source> - <translation>Teil der Binding-Endlosschleife</translation> + <source>Part of binding loop.</source> + <translation>Teil der Binding-Schleife.</translation> </message> <message> <source>Callee</source> @@ -27035,28 +27051,28 @@ references to elements in other files, loops, etc.)</source> <translation>AvahiZConfLib c konnte die native Bibliothek '%1' nicht laden: %2</translation> </message> <message> - <source>%1 could not create a client (probably the daemon is not running)</source> - <translation>%1 konnte keinen Client erzeugen (möglicherweise läuft kein Hintergrundprozess)</translation> + <source>%1 cannot create a client. The daemon is probably not running.</source> + <translation>%1 konnte keinen Client erzeugen (möglicherweise läuft kein Hintergrundprozess).</translation> </message> <message> - <source>cAvahiClient, server collision</source> - <translation>cAvahiClient, Server-Kollision</translation> + <source>cAvahiClient, server collision.</source> + <translation>cAvahiClient, Server-Kollision.</translation> </message> <message> - <source>cAvahiClient, some kind of error happened on the client side</source> - <translation>cAvahiClient, client-seitiger Fehler</translation> + <source>cAvahiClient, an error occurred on the client side.</source> + <translation>cAvahiClient, client-seitiger Fehler.</translation> </message> <message> - <source>cAvahiClient, still connecting, no server available</source> - <translation>cAvahiClient, versuche Verbindung herzustellen, es ist kein Server verfügbar</translation> + <source>cAvahiClient, still connecting, no server available.</source> + <translation>cAvahiClient, versuche Verbindung herzustellen, es ist kein Server verfügbar.</translation> </message> <message> - <source>unexpected state %1 in cAvahiClientReply</source> - <translation>unerwarteter Status %1 in cAvahiClientReply</translation> + <source>Unexpected state %1 in cAvahiClientReply.</source> + <translation>Unerwarteter Status %1 in cAvahiClientReply.</translation> </message> <message> - <source>unexpected state %1 in cAvahiBrowseReply</source> - <translation>unerwarteter Status %1 in cAvahiBrowseReply</translation> + <source>Unexpected state %1 in cAvahiBrowseReply.</source> + <translation>Unerwarteter Status %1 in cAvahiBrowseReply.</translation> </message> <message> <source>%1 failed to kill other daemons with '%2'.</source> @@ -27168,8 +27184,8 @@ references to elements in other files, loops, etc.)</source> <context> <name>Debugger::Internal::QmlV8DebuggerClient</name> <message> - <source>anonymous function</source> - <translation>anonyme Funktion</translation> + <source>Anonymous Function</source> + <translation>Anonyme Funktion</translation> </message> </context> <context> @@ -27179,7 +27195,7 @@ references to elements in other files, loops, etc.)</source> <translation>Offene Dokumente</translation> </message> <message> - <source>Open Documents:</source> + <source>Open documents:</source> <translation>Offene Dokumente:</translation> </message> <message> @@ -27422,6 +27438,10 @@ references to elements in other files, loops, etc.)</source> </context> <context> <name>BinEditorDocument</name> + <message> + <source>The Binary Editor can not open empty files.</source> + <translation>Der Binäreditor kann keine leeren Dateien öffnen.</translation> + </message> <message> <source>Cannot open %1: %2</source> <translation>Die Datei %1 kann nicht geöffnet werden: %2</translation> @@ -27687,24 +27707,24 @@ references to elements in other files, loops, etc.)</source> <translation>Name der privaten Schlüsseldatei auswählen</translation> </message> <message> - <source>Failure To Save Key File</source> - <translation>Fehler beim Speichern der Schlüsseldatei</translation> + <source>Cannot Save Key File</source> + <translation>Schlüsseldatei kann nicht gespeichert werden</translation> </message> <message> - <source>Failed to create directory: '%1'.</source> - <translation>Der Ordner '%1' konnte nicht erstellt werden.</translation> + <source>Cannot Save Private Key File</source> + <translation>Die private Schlüsseldatei kann nicht gespeichert werden</translation> </message> <message> - <source>Saving Private Key File failed</source> - <translation>Das Speichern des privaten Schlüssels schlug fehl</translation> + <source>Cannot Save Public Key File</source> + <translation>Öffentliche Schlüsseldatei kann nicht gespeichert werden</translation> </message> <message> - <source>The private key file could not be saved: %1</source> - <translation>Die private Schlüsseldatei konnte nicht gespeichert werden: %1</translation> + <source>Failed to create directory: '%1'.</source> + <translation>Der Ordner '%1' konnte nicht erstellt werden.</translation> </message> <message> - <source>Saving Public Key File failed</source> - <translation>Das Speichern des öffentlichen Schlüssels schlug fehl</translation> + <source>The private key file could not be saved: %1</source> + <translation>Die private Schlüsseldatei konnte nicht gespeichert werden: %1</translation> </message> <message> <source>The public key file could not be saved: %1</source> @@ -27788,14 +27808,6 @@ references to elements in other files, loops, etc.)</source> <source>Organization (e.g. KDE):</source> <translation>Organisation (z.B. KDE):</translation> </message> - <message> - <source>City or Locality:</source> - <translation>Stadt:</translation> - </message> - <message> - <source>State or Province:</source> - <translation>Staat oder Provinz:</translation> - </message> <message> <source>Two-letter country code for this unit (e.g. RO):</source> <translation>Länderkennung für die Einheit (2 Buchstaben, z.B. RO):</translation> @@ -27812,6 +27824,14 @@ references to elements in other files, loops, etc.)</source> <source>Certificate Distinguished Names</source> <translation>Namen des Zertifikats</translation> </message> + <message> + <source>City or locality:</source> + <translation>Stadt:</translation> + </message> + <message> + <source>State or province:</source> + <translation>Bundesland oder Provinz:</translation> + </message> </context> <context> <name>AndroidDeployStepWidget</name> @@ -27819,18 +27839,6 @@ references to elements in other files, loops, etc.)</source> <source>Form</source> <translation>Form</translation> </message> - <message> - <source>Edit rules file</source> - <translation>Regeldatei bearbeiten</translation> - </message> - <message> - <source>Choose apk</source> - <translation>Apk wählen</translation> - </message> - <message> - <source>Install Ministro system wide Qt shared libraries installer</source> - <translation>Installiere Ministro system wide Qt shared libraries installer</translation> - </message> <message> <source>Choose and install Ministro system wide Qt shared libraries. This option is useful when you want to try your application on devices which don't have Android Market (e.g. Android Emulator).</source> @@ -27859,6 +27867,18 @@ Sie müssen für die Plattform kompiliert vorliegen</translation> <source>Use local Qt libraries</source> <translation>Lokale Qt-Bibliotheken ausliefern</translation> </message> + <message> + <source>Edit Rules File</source> + <translation>Regeldatei bearbeiten</translation> + </message> + <message> + <source>Install Ministro, system-wide Qt shared libraries installer</source> + <translation>Installiere Ministro (systemweiter Installer für Qt shared libraries)</translation> + </message> + <message> + <source>Choose APK</source> + <translation>APK wählen</translation> + </message> </context> <context> <name>AndroidPackageCreationWidget</name> @@ -28022,30 +28042,14 @@ Sie müssen für die Plattform kompiliert vorliegen</translation> <source>Android NDK location:</source> <translation>Android-NDK:</translation> </message> - <message> - <source>Android NDK toolchain version:</source> - <translation>Toolchain-Version des Android NDK:</translation> - </message> <message> <source>Ant location:</source> <translation>ant:</translation> </message> - <message> - <source>arm GDB location:</source> - <translation>arm GDB:</translation> - </message> - <message> - <source>arm GDBserver location:</source> - <translation>arm GDBserver:</translation> - </message> <message> <source>x86 GDB location:</source> <translation>x86 GDB:</translation> </message> - <message> - <source>x86 GDBserver location:</source> - <translation>x86 GDBserver:</translation> - </message> <message> <source>OpenJDK location:</source> <translation>OpenJDK:</translation> @@ -28078,6 +28082,22 @@ Sie müssen für die Plattform kompiliert vorliegen</translation> <source>Remove</source> <translation>Entfernen</translation> </message> + <message> + <source>Android NDK tool chain version:</source> + <translation>Toolchain-Version des Android NDK:</translation> + </message> + <message> + <source>ARM GDB location:</source> + <translation>ARM GDB:</translation> + </message> + <message> + <source>ARM GDB server location:</source> + <translation>ARM GDB-Server:</translation> + </message> + <message> + <source>x86 GDB server location:</source> + <translation>x86 GDB-Server:</translation> + </message> </context> <context> <name>Core::RemoveFileDialog</name> @@ -28403,8 +28423,8 @@ Sie müssen für die Plattform kompiliert vorliegen</translation> <context> <name>QSsh::Internal::SftpChannelPrivate</name> <message> - <source>Server could not start sftp subsystem.</source> - <translation>Der Server konnte das sftp-Subsystem nicht starten.</translation> + <source>Server could not start SFTP subsystem.</source> + <translation>Der Server konnte das SFTP-Subsystem nicht starten.</translation> </message> <message> <source>Unexpected packet of type %1.</source> @@ -28523,13 +28543,32 @@ Sie müssen für die Plattform kompiliert vorliegen</translation> <source>Botan library exception: %1</source> <translation>Ausnahmefehler in der Botan-Bibliothek: %1</translation> </message> + <message numerus="yes"> + <source>Server identification string is %n characters long, but the maximum allowed length is 255.</source> + <translation> + <numerusform>Die Zeichenkette zur Identifikation des Servers ist ein Zeichen lang, die maximal zulässige Länge ist aber 255.</numerusform> + <numerusform>Die Zeichenkette zur Identifikation des Servers ist %n Zeichen lang, die maximal zulässige Länge ist aber 255.</numerusform> + </translation> + </message> <message> - <source>Invalid protocol version: Expected '2.0', got '%1'.</source> - <translation>Die Versionen des Protokolls stimmen nicht überein: Erwartet '2.0', erhalten %1.</translation> + <source>Server identification string contains illegal NUL character.</source> + <translation>Die Zeichenkette zur Identifikation des Servers enthält ein unzulässiges NUL-Zeichen.</translation> </message> <message> - <source>Invalid server id '%1'.</source> - <translation>Ungültige Server-Kennzeichnung '%1'.</translation> + <source>Server Identification string '%1' is invalid.</source> + <translation>Die Zeichenkette '%1' zur Identifikation des Servers ist ungültig.</translation> + </message> + <message> + <source>Server protocol version is '%1', but needs to be 2.0 or 1.99.</source> + <translation>Die Version des Serverprotokolls ist '%1', erforderlich ist jedoch 2.0 oder 1.99.</translation> + </message> + <message> + <source>Server identification string is invalid (missing carriage return).</source> + <translation>Die Zeichenkette zur Identifikation des Servers ist ungültig (es fehlt der Zeilenvorschub).</translation> + </message> + <message> + <source>Server reports protocol version 1.99, but sends data before the identification string, which is not allowed.</source> + <translation>Der Server gibt Protokollversion 1.99 an, sendet aber Daten vor der Zeichenkette zur Identifikation, was nicht gestattet ist.</translation> </message> <message> <source>Unexpected packet of type %1.</source> @@ -28631,7 +28670,7 @@ Sie müssen für die Plattform kompiliert vorliegen</translation> <translation>Fehler beim Erstellen von AVD</translation> </message> <message> - <source>Cannot create a new AVD, no sufficiently recent Android SDK available. + <source>Cannot create a new AVD. No sufficiently recent Android SDK available. Please install an SDK of at least API version %1.</source> <translation>Es konnte kein AVD erzeugt werden, da kein hinreichend aktuelles Android-SDK verfügbar ist. Bitte installieren Sie ein Android-SDK der API-Version %1 oder neuer.</translation> @@ -28720,13 +28759,21 @@ Bitte installieren Sie ein Android-SDK der API-Version %1 oder neuer.</translati <source>Exit code: %1</source> <translation>Rückgabewert: %1</translation> </message> + <message> + <source>Deploy Qt libraries. This may take some time, please wait.</source> + <translation>Das Deployment der Qt-Bibliotheken kann einige Zeit dauern, bitte warten Sie.</translation> + </message> <message> <source>Qt Android smart installer installation failed</source> <translation>Die Installation des Qt-Android-Smart-Installers schlug fehl</translation> </message> <message> - <source>Package installation failed</source> - <translation>Die Installation des Pakets schlug fehl</translation> + <source>Package installation failed.</source> + <translation>Die Installation des Pakets schlug fehl.</translation> + </message> + <message> + <source>Pulling files necessary for debugging.</source> + <translation>Die für das Debuggen erforderlichen Dateien werden installiert.</translation> </message> <message> <source>Installing package onto %1.</source> @@ -28736,19 +28783,11 @@ Bitte installieren Sie ein Android-SDK der API-Version %1 oder neuer.</translati <source>Clean old Qt libraries</source> <translation>Alte Qt-Bibliotheken bereinigen</translation> </message> - <message> - <source>Deploy Qt libraries ... this may take some time, please wait</source> - <translation>Das Deployment der Qt-Bibliotheken kann einige Zeit dauern, bitte warten Sie</translation> - </message> - <message> - <source>Pulling files necessary for debugging</source> - <translation>Die für das Debuggen erforderlichen Dateien werden installiert</translation> - </message> </context> <context> <name>Android::Internal::AndroidDeployStepFactory</name> <message> - <source>Deploy to Android device/emulator</source> + <source>Deploy to Android device or emulator</source> <translation>Deployment auf Android-Gerät oder Emulator</translation> </message> </context> @@ -28925,8 +28964,12 @@ Bitte wählen Sie einen gültigen Paketnamen für Ihre Anwendung (z.B. "org <translation>Wählen Sie ein Symbol für hohe DPI-Werte aus</translation> </message> <message> - <source>png images (*.png)</source> - <translation>png-Dateien (*.png)</translation> + <source>PNG images (*.png)</source> + <translation>PNG-Dateien (*.png)</translation> + </message> + <message> + <source>< Type or choose a permission ></source> + <translation>< Geben Sie eine Berechtigung ein oder wählen Sie eine aus ></translation> </message> <message> <source>Choose Medium DPI Icon</source> @@ -28936,10 +28979,6 @@ Bitte wählen Sie einen gültigen Paketnamen für Ihre Anwendung (z.B. "org <source>Choose Low DPI Icon</source> <translation>Wählen Sie ein Symbol für geringe DPI-Werte aus</translation> </message> - <message> - <source>< type or choose a permission ></source> - <translation>< Geben Sie eine Berechtigung ein oder wählen Sie eine aus ></translation> - </message> <message> <source><b>Package configurations</b></source> <translation><b>Paket-Konfigurationen</b></translation> @@ -28970,15 +29009,15 @@ Bitte wählen Sie einen gültigen Paketnamen für Ihre Anwendung (z.B. "org <context> <name>Android::Internal::AndroidRunControl</name> <message> - <source>Starting remote process...</source> - <translation>Starte entfernten Prozess...</translation> + <source>Starting remote process.</source> + <translation>Starte entfernten Prozess.</translation> </message> </context> <context> <name>Android::Internal::AndroidRunControlFactory</name> <message> - <source>Run on Android device/emulator</source> - <translation>Ausführung auf Android-Gerät oder Emulator</translation> + <source>Run on Android device or emulator.</source> + <translation>Ausführung auf Android-Gerät oder Emulator.</translation> </message> </context> <context> @@ -28986,46 +29025,46 @@ Bitte wählen Sie einen gültigen Paketnamen für Ihre Anwendung (z.B. "org <message> <source> -'%1' died</source> +'%1' died.</source> <translation> -'%1' beendet</translation> +'%1' beendet.</translation> </message> <message> - <source>Failed to forward C++ debugging ports. Reason: %1</source> - <translation>Die C++-Debuggerports konnten nicht übermittelt werden. Grund: %1</translation> + <source>Failed to forward C++ debugging ports. Reason: %1.</source> + <translation>Die C++-Debuggerports konnten nicht übermittelt werden. Grund: %1.</translation> </message> <message> - <source>Failed to forward C++ debugging ports</source> - <translation>C++-Debuggerports konnten nicht übermittelt werden</translation> + <source>Failed to forward C++ debugging ports.</source> + <translation>C++-Debuggerports konnten nicht übermittelt werden.</translation> </message> <message> - <source>Failed to forward QML debugging ports. Reason: %1</source> - <translation>Die QML-Debuggerports konnten nicht übermittelt werden. Grund: %1</translation> + <source>Failed to forward QML debugging ports. Reason: %1.</source> + <translation>Die QML-Debuggerports konnten nicht übermittelt werden. Grund: %1.</translation> </message> <message> - <source>Failed to forward QML debugging ports</source> - <translation>QML-Debuggerports konnten nicht übermittelt werden</translation> + <source>Failed to forward QML debugging ports.</source> + <translation>QML-Debuggerports konnten nicht übermittelt werden.</translation> </message> <message> - <source>Failed to start the activity. Reason: %1</source> - <translation>Die Aktivität konnte nicht gestartet werden: Grund: %1</translation> + <source>Failed to start the activity. Reason: %1.</source> + <translation>Die Aktivität konnte nicht gestartet werden: Grund: %1.</translation> </message> <message> - <source>Unable to start '%1'</source> - <translation>'%1' konnte nicht gestartet werden</translation> + <source>Unable to start '%1'.</source> + <translation>'%1' konnte nicht gestartet werden.</translation> </message> <message> - <source>Cannot find %1 process</source> - <translation>Der Prozess '%1' konnte nicht gefunden werden</translation> + <source>Cannot find %1 process.</source> + <translation>Der Prozess %1 konnte nicht gefunden werden.</translation> </message> <message> <source> -'%1' killed</source> +'%1' killed.</source> <translation> -'%1' abgebrochen</translation> +'%1' abgebrochen.</translation> </message> </context> <context> @@ -29042,12 +29081,12 @@ Bitte wählen Sie einen gültigen Paketnamen für Ihre Anwendung (z.B. "org <translation>Android-SDK-Ordner</translation> </message> <message> - <source>"%1" doesn't seem to be an Android SDK top folder</source> - <translation>"%1" ist offenbar kein Android-SDK-Ordner</translation> + <source>"%1" does not seem to be an Android SDK top folder.</source> + <translation>"%1" ist offenbar kein Android-SDK-Ordner.</translation> </message> <message> - <source>"%1" doesn't seem to be an Android NDK top folder</source> - <translation>"%1" ist offenbar kein Android-NDK-Ordner</translation> + <source>"%1" does not seem to be an Android NDK top folder.</source> + <translation>"%1" ist offenbar kein Android-NDK-Ordner.</translation> </message> <message> <source>Select Android SDK folder</source> @@ -29469,40 +29508,40 @@ Einzelschritt in den Modul und das Setzen von Haltepunkten nach Datei und Zeilen <translation>Fehler: (%1) %2</translation> </message> <message> - <source>disconnected. + <source>Disconnected. </source> - <translation>getrennt. + <translation>Getrennt. </translation> </message> <message> - <source>resolving host...</source> - <translation>Hostname wird aufgelöst...</translation> + <source>Resolving host.</source> + <translation>Hostname wird aufgelöst.</translation> </message> <message> - <source>connecting to debug server...</source> - <translation>Verbinde zum Debug-Server...</translation> + <source>Connecting to debug server.</source> + <translation>Verbinde zum Debug-Server.</translation> </message> <message> - <source>connected. + <source>Connected. </source> - <translation>verbunden. + <translation>Verbunden. </translation> </message> <message> - <source>closing...</source> - <translation>schließe Verbindung...</translation> + <source>Closing.</source> + <translation>Schließe Verbindung.</translation> </message> </context> <context> <name>Debugger::Internal::QmlInspectorAgent</name> <message> - <source> success : </source> - <translation> Erfolg : </translation> + <source>Success: </source> + <translation>Erfolg: </translation> </message> <message> - <source>properties</source> + <source>Properties</source> <translation>Eigenschaften</translation> </message> </context> @@ -30063,8 +30102,8 @@ nicht konfiguriert ist.</translation> <translation>Gerrit...</translation> </message> <message> - <source>git is not available.</source> - <translation>git ist nicht verfügbar.</translation> + <source>Git is not available.</source> + <translation>Git ist nicht verfügbar.</translation> </message> <message> <source>Enter Local Repository for '%1' (%2)</source> @@ -30243,7 +30282,7 @@ Möchten Sie sie zum Projekt hinzufügen?</html></translation> <translation>Der Typ des Geräts, auf dem die Anwendung laufen soll.</translation> </message> <message> - <source>Device Type:</source> + <source>Device type:</source> <translation>Gerätetyp:</translation> </message> </context> @@ -30746,8 +30785,16 @@ Soll es noch einmal versucht werden?</translation> <context> <name>QtSupport::CustomExecutableRunConfiguration</name> <message> - <source>Could not find the executable, please specify one.</source> - <translation>Es konnte keine ausführbare Datei gefunden werden; bitte geben Sie eine an.</translation> + <source>No executable.</source> + <translation>Keine ausführbare Datei.</translation> + </message> + <message> + <source>The executable +%1 +cannot be found in the path.</source> + <translation>Die ausführbare Datei +%1 +konnte nicht im Pfad gefunden werden.</translation> </message> <message> <source>Clean Environment</source> @@ -30914,8 +30961,8 @@ Soll es noch einmal versucht werden?</translation> <context> <name>Android::Internal::AndroidQtVersion</name> <message> - <source>Failed to detect the ABI(s) used by the Qt version.</source> - <translation>Es konnten keine ABI(s)für diese Qt-Version bestimmt werden.</translation> + <source>Failed to detect the ABIs used by the Qt version.</source> + <translation>Die von der Qt-Version verwendeten ABIs konnten nicht bestimmt werden.</translation> </message> <message> <source>Android</source> @@ -31224,10 +31271,6 @@ Fehlerausgabe: %1</translation> <source>Check Out</source> <translation>Check Out</translation> </message> - <message> - <source>&Checkout Comment:</source> - <translation>&Checkout-Kommentar:</translation> - </message> <message> <source>&Reserved</source> <translation>&Reserviert</translation> @@ -31245,6 +31288,10 @@ Fehlerausgabe: %1</translation> <extracomment>Hijack: Unset read-only flag without check-out. This is used for local changes which the user does not want to commit.</extracomment> <translation>Datei &hijacked verwenden</translation> </message> + <message> + <source>&Checkout comment:</source> + <translation>&Checkout-Kommentar:</translation> + </message> </context> <context> <name>ClearCase::Internal::SettingsPage</name> @@ -31351,15 +31398,6 @@ Fehlerausgabe: %1</translation> <source>&Loaded Version</source> <translation>Ge&ladene Version</translation> </message> - <message> - <source>Created By:</source> - <translation>Erstellt von:</translation> - </message> - <message> - <source>Created On:</source> - <extracomment>Date</extracomment> - <translation>Erstellt am:</translation> - </message> <message> <source>Version after &update</source> <translation>Version nach &Aktualisierung</translation> @@ -31368,6 +31406,15 @@ Fehlerausgabe: %1</translation> <source><html><head/><body><p><b>NOTE: You will not be able to check in this file without merging the changes (not supported by the plugin)</b></p></body></html></source> <translation><html><head/><body><p><b>Hinweis: Diese Datei kann nicht ohne Mergen der Änderungen eingecheckt werden (durch das Plugin nicht unterstützt)</b></p></body></html></translation> </message> + <message> + <source>Created by:</source> + <translation>Erstellt von:</translation> + </message> + <message> + <source>Created on:</source> + <extracomment>Date</extracomment> + <translation>Erstellt am:</translation> + </message> </context> <context> <name>Android::Internal::AvdModel</name> @@ -31388,7 +31435,7 @@ Fehlerausgabe: %1</translation> <context> <name>ClearCase::Internal::ActivitySelector</name> <message> - <source>Select &Activity:</source> + <source>Select &activity:</source> <translation>Aktivität &auswählen:</translation> </message> <message> @@ -31629,10 +31676,26 @@ Fehlerausgabe: %1</translation> <source>File is already checked out.</source> <translation>Die Datei ist bereits ausgecheckt.</translation> </message> + <message> + <source>ClearCase Add File %1</source> + <translation>ClearCase Datei %1 hinzufügen</translation> + </message> + <message> + <source>ClearCase Remove Element %1</source> + <translation>ClearCase Element %1 entfernen</translation> + </message> <message> <source>This operation is irreversible. Are you sure?</source> <translation>Dieser Vorgang kann nicht rückgängig gemacht werden. Sind Sie sicher?</translation> </message> + <message> + <source>ClearCase Remove File %1</source> + <translation>ClearCase Datei %1 löschen</translation> + </message> + <message> + <source>ClearCase Rename File %1 -> %2</source> + <translation>ClearCase Datei %1 -> %2 umbenennen</translation> + </message> <message> <source>Do you want to undo hijack of '%1'?</source> <translation>Möchten Sie den Hijack von "%1" rückgängig machen?</translation> @@ -31669,22 +31732,6 @@ Fehlerausgabe: %1</translation> <source>Enter &comment:</source> <translation>&Kommentar eingeben:</translation> </message> - <message> - <source>ClearCase Add File</source> - <translation>ClearCase Datei hinzufügen</translation> - </message> - <message> - <source>ClearCase Remove Element</source> - <translation>ClearCase Element entfernen</translation> - </message> - <message> - <source>ClearCase Remove File</source> - <translation>ClearCase Datei löschen</translation> - </message> - <message> - <source>ClearCase Rename File</source> - <translation>ClearCase Datei umbenennen</translation> - </message> <message> <source>Activity Headline</source> <translation>Titel der Aktivität</translation> @@ -31747,7 +31794,7 @@ Fehlerausgabe: %1</translation> </message> <message> <source>Server port:</source> - <translation type="unfinished"></translation> + <translation>Server-Port:</translation> </message> <message> <source>Select Working Directory</source> @@ -31997,25 +32044,24 @@ Fehlerausgabe: %1</translation> <context> <name>Debugger::Internal::DebuggerKitConfigWidget</name> <message> - <source>The debugger to use for this kit.</source> - <translation>Der für dieses Kit zu verwendende Debugger.</translation> + <source>Manage...</source> + <translation>Verwalten...</translation> </message> <message> - <source><html><body><p>Specify the path to the <a href="%1">Windows Console Debugger executable</a> (%2) here.</p></body></html></source> - <extracomment>Label text for path configuration. %2 is "x-bit version".</extracomment> - <translation><html><body><p>Geben Sie den Pfad zu der ausführbaren Datei des <a href="%1">Windows Console Debuggers</a> (%2) an.</p></body></html></translation> + <source>The debugger to use for this kit.</source> + <translation>Der für dieses Kit zu verwendende Debugger.</translation> </message> <message> - <source>64-bit version</source> - <translation>64-bit-Version</translation> + <source>Auto-detect</source> + <translation>Automatisch bestimmen</translation> </message> <message> - <source>32-bit version</source> - <translation>32-bit-Version</translation> + <source>Edit...</source> + <translation>Bearbeiten...</translation> </message> <message> - <source>Auto detect</source> - <translation>Automatisch bestimmen</translation> + <source>Debugger for "%1"</source> + <translation>Debugger für "%1"</translation> </message> <message> <source>Debugger:</source> @@ -32041,8 +32087,12 @@ Fehlerausgabe: %1</translation> <translation>Der Pfad zum Debugger muss als absoluter Pfad angegeben werden (%1).</translation> </message> <message> - <source>%1 using '%2'</source> - <translation>%1 unter Verwendung von '%2'</translation> + <source>%1 <None></source> + <translation>%1 <keine></translation> + </message> + <message> + <source>%1 using "%2"</source> + <translation>%1 unter Verwendung von "%2"</translation> </message> <message> <source>Debugger</source> @@ -32187,8 +32237,12 @@ Fehlerausgabe: %1</translation> <context> <name>ProjectExplorer::Internal::KitManagerConfigWidget</name> <message> - <source>Kits</source> - <translation>Kits</translation> + <source>Name:</source> + <translation>Name:</translation> + </message> + <message> + <source>Kit name and icon.</source> + <translation>Kit-Name und Symbol.</translation> </message> <message> <source>Select Icon</source> @@ -32314,4 +32368,42 @@ Fehlerausgabe: %1</translation> <translation>Keine</translation> </message> </context> +<context> + <name>Debugger::Internal::DebuggerKitConfigDialog</name> + <message> + <source>&Engine:</source> + <translation>&Engine:</translation> + </message> + <message> + <source>&Binary:</source> + <translation>&Ausführbare Datei:</translation> + </message> + <message> + <source>64-bit version</source> + <translation>64-bit-Version</translation> + </message> + <message> + <source>32-bit version</source> + <translation>32-bit-Version</translation> + </message> + <message> + <source><html><body><p>Specify the path to the <a href="%1">Windows Console Debugger executable</a> (%2) here.</p></body></html></source> + <extracomment>Label text for path configuration. %2 is "x-bit version".</extracomment> + <translation><html><body><p>Geben Sie den Pfad zu der ausführbaren Datei des <a href="%1">Windows Console Debuggers</a> (%2) an.</p></body></html></translation> + </message> +</context> +<context> + <name>ProjectExplorer::RunConfiguration</name> + <message> + <source>Unknown error.</source> + <translation>Unbekannter Fehler.</translation> + </message> +</context> +<context> + <name>CustomExecutableDialog</name> + <message> + <source>Could not find the executable, please specify one.</source> + <translation>Es konnte keine ausführbare Datei gefunden werden; bitte geben Sie eine an.</translation> + </message> +</context> </TS> diff --git a/src/app/main.cpp b/src/app/main.cpp index e96692b04fb2e57c34021512c8c24df13b1a6c7b..b3cf0c7cd248a19431dda6e00fc178e288ebf990 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -219,7 +219,7 @@ int main(int argc, char **argv) setrlimit(RLIMIT_NOFILE, &rl); #endif -#ifdef Q_WS_X11 +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) // QML is unusable with the xlib backend QApplication::setGraphicsSystem("raster"); #endif diff --git a/src/libs/cplusplus/CppRewriter.cpp b/src/libs/cplusplus/CppRewriter.cpp index 31eefe8deefe0ed3f93e5680c6da98a292f3e473..8f8da60218e6a01d823f9e6799604f37f9dffdb8 100644 --- a/src/libs/cplusplus/CppRewriter.cpp +++ b/src/libs/cplusplus/CppRewriter.cpp @@ -395,7 +395,8 @@ FullySpecifiedType UseMinimalNames::apply(const Name *name, Rewrite *rewrite) co SubstitutionEnvironment *env = rewrite->env; Scope *scope = env->scope(); - if (name->isTemplateNameId()) + if (name->isTemplateNameId() || + (name->isQualifiedNameId() && name->asQualifiedNameId()->name()->isTemplateNameId())) return FullySpecifiedType(); if (! scope) diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 8edd3b30ca64855cc4ddb7cb120fc5afc617f51a..3e6756440755ddbd707122ffefb7727d5f1d82e0 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -708,11 +708,22 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac if (!referenceClass) return reference; + const TemplateNameId *templId = name->asTemplateNameId(); + if (_alreadyConsideredClasses.contains(referenceClass) || + (templId && + _alreadyConsideredTemplates.contains(templId))) { + return reference; + } + + if (!name->isTemplateNameId()) + _alreadyConsideredClasses.insert(referenceClass); + QSet<ClassOrNamespace *> knownUsings = reference->usings().toSet(); // If we are dealling with a template type, more work is required, since we need to // construct all instantiation data. - if (const TemplateNameId *templId = name->asTemplateNameId()) { + if (templId) { + _alreadyConsideredTemplates.insert(templId); ClassOrNamespace *instantiation = _factory->allocClassOrNamespace(reference); instantiation->_templateId = templId; instantiation->_instantiationOrigin = origin; @@ -786,18 +797,41 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac } } + _alreadyConsideredTemplates.clear(templId); return instantiation; } + if (allBases.isEmpty() || allBases.size() == knownUsings.size()) + return reference; + + QList<const Name *> fullyQualifiedNameForReferenceClass = + LookupContext::fullyQualifiedName(referenceClass); // Find the missing bases for regular (non-template) types. // Ex.: class A : public B<Some>::Type {}; foreach (const Name *baseName, allBases) { ClassOrNamespace *binding = this; if (const QualifiedNameId *qBaseName = baseName->asQualifiedNameId()) { + QList<const Name *> fullyQualifiedNameForBaseClass; + addNames(baseName, &fullyQualifiedNameForBaseClass); + if (compareFullyQualifiedName(fullyQualifiedNameForReferenceClass, + fullyQualifiedNameForBaseClass)) { + continue; + } + if (const Name *qualification = qBaseName->base()) binding = lookupType(qualification); + else if (binding->parent() != 0) + //if this is global identifier we take global namespace + //Ex: class A{}; namespace NS { class A: public ::A{}; } + binding = binding->globalNamespace(); + else + //if we are in the global scope + continue; baseName = qBaseName->name(); } + else if (compareName(name, baseName)) { + continue; + } if (binding) { ClassOrNamespace * baseBinding = binding->lookupType(baseName); @@ -806,7 +840,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac } } - + _alreadyConsideredClasses.clear(referenceClass); return reference; } diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index fef317fd6146ccadc27ead391cced84c659ab489..6db8b1187deb42c457aeb1f63bac2b504cf1bc81 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -45,6 +45,33 @@ namespace CPlusPlus { class CreateBindings; +class Class; +template<typename T> +class AlreadyConsideredClassContainer +{ +public: + AlreadyConsideredClassContainer() : _class(0) {} + void insert(const T *item) + { + if (_container.isEmpty()) + _class = item; + _container.insert(item); + } + bool contains(const T *item) + { + return _container.contains(item); + } + + void clear(const T *item) + { + if (_class != item) + _container.clear(); + } + +private: + QSet<const T *> _container; + const T * _class; +}; class CPLUSPLUS_EXPORT ClassOrNamespace { @@ -112,6 +139,9 @@ private: const TemplateNameId *_templateId; ClassOrNamespace *_instantiationOrigin; + AlreadyConsideredClassContainer<Class> _alreadyConsideredClasses; + AlreadyConsideredClassContainer<TemplateNameId> _alreadyConsideredTemplates; + friend class CreateBindings; }; diff --git a/src/libs/qmldebug/baseenginedebugclient.cpp b/src/libs/qmldebug/baseenginedebugclient.cpp index a669d59f6b224c2c7abf88f2bf19cfb28164929e..15acd7a6c1a81ba2262bfa2db01f928c244af22b 100644 --- a/src/libs/qmldebug/baseenginedebugclient.cpp +++ b/src/libs/qmldebug/baseenginedebugclient.cpp @@ -76,8 +76,8 @@ void BaseEngineDebugClient::decode(QDataStream &ds, QmlObjectData data; ds >> data; int parentId = -1; - if (objectName() == QLatin1String("QmlDebugger") && - serviceVersion() >= Constants::CURRENT_SUPPORTED_VERSION ) + // qt > 4.8.3 + if (objectName() != QLatin1String(Constants::QDECLARATIVE_ENGINE)) ds >> parentId; o.m_debugId = data.objectId; o.m_className = data.objectType; @@ -184,19 +184,15 @@ void BaseEngineDebugClient::messageReceived(const QByteArray &data) QDataStream ds(data); int queryId; QByteArray type; - ds >> type; + ds >> type >> queryId; if (type == "OBJECT_CREATED") { int engineId; int objectId; - ds >> engineId >> objectId; - emit newObject(engineId, objectId, -1); - return; - } - - ds >> queryId; - - if (type == "LIST_ENGINES_R") { + int parentId; + ds >> engineId >> objectId >> parentId; + emit newObject(engineId, objectId, parentId); + } else if (type == "LIST_ENGINES_R") { int count; ds >> count; QList<EngineReference> engines; @@ -398,7 +394,7 @@ quint32 BaseEngineDebugClient::setBindingForObject( id = getId(); QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << QByteArray("SET_BINDING") << objectDebugId << propertyName + ds << QByteArray("SET_BINDING") << id << objectDebugId << propertyName << bindingExpression << isLiteralValue << source << line; sendMessage(message); } @@ -414,7 +410,7 @@ quint32 BaseEngineDebugClient::resetBindingForObject( id = getId(); QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << QByteArray("RESET_BINDING") << objectDebugId << propertyName; + ds << QByteArray("RESET_BINDING") << id << objectDebugId << propertyName; sendMessage(message); } return id; @@ -429,7 +425,7 @@ quint32 BaseEngineDebugClient::setMethodBody( id = getId(); QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << QByteArray("SET_METHOD_BODY") << objectDebugId + ds << QByteArray("SET_METHOD_BODY") << id << objectDebugId << methodName << methodBody; sendMessage(message); } diff --git a/src/libs/qmldebug/qmlenginedebugclient.cpp b/src/libs/qmldebug/declarativeenginedebugclient.cpp similarity index 77% rename from src/libs/qmldebug/qmlenginedebugclient.cpp rename to src/libs/qmldebug/declarativeenginedebugclient.cpp index 07c69a497cc8e2181b936644f739dea5f787fb7d..2a5191e2a187c95ed8579861e391be1fff8f078c 100644 --- a/src/libs/qmldebug/qmlenginedebugclient.cpp +++ b/src/libs/qmldebug/declarativeenginedebugclient.cpp @@ -27,18 +27,18 @@ ** **************************************************************************/ -#include "qmlenginedebugclient.h" +#include "declarativeenginedebugclient.h" #include "qmldebugconstants.h" namespace QmlDebug { -QmlEngineDebugClient::QmlEngineDebugClient( +DeclarativeEngineDebugClient::DeclarativeEngineDebugClient( QmlDebugConnection *connection) - : BaseEngineDebugClient(QLatin1String(Constants::QML_DEBUGGER), connection) + : BaseEngineDebugClient(QLatin1String(Constants::QDECLARATIVE_ENGINE), connection) { } -quint32 QmlEngineDebugClient::setBindingForObject( +quint32 DeclarativeEngineDebugClient::setBindingForObject( int objectDebugId, const QString &propertyName, const QVariant &bindingExpression, @@ -50,14 +50,14 @@ quint32 QmlEngineDebugClient::setBindingForObject( id = getId(); QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << QByteArray("SET_BINDING") << id << objectDebugId << propertyName + ds << QByteArray("SET_BINDING") << objectDebugId << propertyName << bindingExpression << isLiteralValue << source << line; sendMessage(message); } return id; } -quint32 QmlEngineDebugClient::resetBindingForObject( +quint32 DeclarativeEngineDebugClient::resetBindingForObject( int objectDebugId, const QString &propertyName) { @@ -66,13 +66,13 @@ quint32 QmlEngineDebugClient::resetBindingForObject( id = getId(); QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << QByteArray("RESET_BINDING") << id << objectDebugId << propertyName; + ds << QByteArray("RESET_BINDING") << objectDebugId << propertyName; sendMessage(message); } return id; } -quint32 QmlEngineDebugClient::setMethodBody( +quint32 DeclarativeEngineDebugClient::setMethodBody( int objectDebugId, const QString &methodName, const QString &methodBody) { @@ -81,26 +81,24 @@ quint32 QmlEngineDebugClient::setMethodBody( id = getId(); QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); - ds << QByteArray("SET_METHOD_BODY") << id << objectDebugId + ds << QByteArray("SET_METHOD_BODY") << objectDebugId << methodName << methodBody; sendMessage(message); } return id; } -void QmlEngineDebugClient::messageReceived(const QByteArray &data) +void DeclarativeEngineDebugClient::messageReceived(const QByteArray &data) { QDataStream ds(data); - int queryId; QByteArray type; - ds >> type >> queryId; + ds >> type; if (type == "OBJECT_CREATED") { int engineId; int objectId; - int parentId; - ds >> engineId >> objectId >> parentId; - emit newObject(engineId, objectId, parentId); + ds >> engineId >> objectId; + emit newObject(engineId, objectId, -1); return; } else { BaseEngineDebugClient::messageReceived(data); diff --git a/src/libs/qmldebug/declarativeenginedebugclient.h b/src/libs/qmldebug/declarativeenginedebugclient.h index 5cfe28279ff42b8fdc52fc72dfc23c96b58a3829..2807163ff0e3dfd3589f52fa089846720a090d5e 100644 --- a/src/libs/qmldebug/declarativeenginedebugclient.h +++ b/src/libs/qmldebug/declarativeenginedebugclient.h @@ -40,10 +40,18 @@ class QMLDEBUG_EXPORT DeclarativeEngineDebugClient : public BaseEngineDebugClien { Q_OBJECT public: - DeclarativeEngineDebugClient(QmlDebugConnection *conn) - : BaseEngineDebugClient(QLatin1String("QDeclarativeEngine"), conn) - { - } + explicit DeclarativeEngineDebugClient(QmlDebugConnection *conn); + + quint32 setBindingForObject(int objectDebugId, const QString &propertyName, + const QVariant &bindingExpression, + bool isLiteralValue, + QString source, int line); + quint32 resetBindingForObject(int objectDebugId, const QString &propertyName); + quint32 setMethodBody(int objectDebugId, const QString &methodName, + const QString &methodBody); + +protected: + void messageReceived(const QByteArray &data); }; } // namespace QmlDebug diff --git a/src/libs/qmldebug/declarativeenginedebugclientv2.h b/src/libs/qmldebug/declarativeenginedebugclientv2.h new file mode 100644 index 0000000000000000000000000000000000000000..6db574393504dad18705746859394066e517afe7 --- /dev/null +++ b/src/libs/qmldebug/declarativeenginedebugclientv2.h @@ -0,0 +1,51 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: http://www.qt-project.org/ +** +** GNU Lesser General Public License Usage +** +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this file. +** Please review the following information to ensure the GNU Lesser General +** Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** Other Usage +** +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +**************************************************************************/ + +#ifndef DECLARATIVEENGINEDEBUGCLIENTV2_H +#define DECLARATIVEENGINEDEBUGCLIENTV2_H + +#include "baseenginedebugclient.h" + +namespace QmlDebug { + +class QmlDebugConnection; + +class QMLDEBUG_EXPORT DeclarativeEngineDebugClientV2 : public BaseEngineDebugClient +{ + Q_OBJECT +public: + explicit DeclarativeEngineDebugClientV2(QmlDebugConnection *conn) + : BaseEngineDebugClient(QLatin1String("DeclarativeDebugger"), conn) + { + } +}; + +} // namespace QmlDebug + +#endif // DECLARATIVEENGINEDEBUGCLIENTV2_H diff --git a/src/libs/qmldebug/qdebugmessageclient.cpp b/src/libs/qmldebug/qdebugmessageclient.cpp index c6c6433e67679c80a7a3bca52a1b6b411aa02ac8..48ffa89b5b3f087fba3b26548fb9db6b82b1e0d0 100644 --- a/src/libs/qmldebug/qdebugmessageclient.cpp +++ b/src/libs/qmldebug/qdebugmessageclient.cpp @@ -55,30 +55,17 @@ void QDebugMessageClient::messageReceived(const QByteArray &data) ds >> command; if (command == "MESSAGE") { - if (serviceVersion() == 1.0) { - QByteArray messagePacket; - ds >> messagePacket; - - QByteArray debugMessage; - int type; - QDataStream ms(messagePacket); - ms >> type >> debugMessage; - QDebugContextInfo info; - emit message(QtMsgType(type), QString::fromUtf8(debugMessage.data()), - info); - } else { - int type; - int line; - QByteArray debugMessage; - QByteArray file; - QByteArray function; - ds >> type >> debugMessage >> file >> line >> function; - QDebugContextInfo info; - info.line = line; - info.file = QString::fromUtf8(file); - info.function = QString::fromUtf8(function); - emit message(QtMsgType(type), QString::fromUtf8(debugMessage), info); - } + int type; + int line; + QByteArray debugMessage; + QByteArray file; + QByteArray function; + ds >> type >> debugMessage >> file >> line >> function; + QDebugContextInfo info; + info.line = line; + info.file = QString::fromUtf8(file); + info.function = QString::fromUtf8(function); + emit message(QtMsgType(type), QString::fromUtf8(debugMessage), info); } } diff --git a/src/libs/qmldebug/qmldebug-lib.pri b/src/libs/qmldebug/qmldebug-lib.pri index a1406ee580e984e27e994b0c1c6490df1adb99ba..54f09258b07acf72607be80c496d0901d3778682 100644 --- a/src/libs/qmldebug/qmldebug-lib.pri +++ b/src/libs/qmldebug/qmldebug-lib.pri @@ -11,6 +11,7 @@ HEADERS += \ $$PWD/qmldebugclient.h \ $$PWD/baseenginedebugclient.h \ $$PWD/declarativeenginedebugclient.h \ + $$PWD/declarativeenginedebugclientv2.h \ $$PWD/qmloutputparser.h \ $$PWD/qmldebug_global.h \ $$PWD/qmlprofilereventtypes.h \ @@ -32,8 +33,8 @@ SOURCES += \ $$PWD/qpacketprotocol.cpp \ $$PWD/qv8profilerclient.cpp \ $$PWD/qdebugmessageclient.cpp \ - $$PWD/qmlenginedebugclient.cpp \ $$PWD/basetoolsclient.cpp \ $$PWD/declarativetoolsclient.cpp \ - $$PWD/qmltoolsclient.cpp + $$PWD/qmltoolsclient.cpp \ + $$PWD/declarativeenginedebugclient.cpp diff --git a/src/libs/qmldebug/qmldebug.qbs b/src/libs/qmldebug/qmldebug.qbs index f3269e3ec2e18d4bf701d35d81b5b342b971d2aa..5b6d5d21cffb404f9ec9f913b7bda757dd00c528 100644 --- a/src/libs/qmldebug/qmldebug.qbs +++ b/src/libs/qmldebug/qmldebug.qbs @@ -20,7 +20,9 @@ QtcLibrary { "baseenginedebugclient.h", "basetoolsclient.cpp", "basetoolsclient.h", + "declarativeenginedebugclient.cpp", "declarativeenginedebugclient.h", + "declarativeenginedebugclientv2.h", "declarativetoolsclient.cpp", "declarativetoolsclient.h", "qdebugmessageclient.cpp", diff --git a/src/libs/qmldebug/qmldebugconstants.h b/src/libs/qmldebug/qmldebugconstants.h index 36ccf4fb9e46a68edeffe784f58786f8411a79a4..147d4f62ec9ed4d38e5d8aa5e477e100000372df 100644 --- a/src/libs/qmldebug/qmldebugconstants.h +++ b/src/libs/qmldebug/qmldebugconstants.h @@ -42,8 +42,7 @@ const char STR_IGNORING_DEBUGGER[] = "Ignoring \"-qmljsdebugger="; const char STR_IGNORING_DEBUGGER2[] = "Ignoring\"-qmljsdebugger="; // There is (was?) a bug in one of the error strings - safest to handle both const char STR_CONNECTION_ESTABLISHED[] = "Connection established"; -const char QML_DEBUGGER[] = "QmlDebugger"; -const float CURRENT_SUPPORTED_VERSION = 2.0; +const char QDECLARATIVE_ENGINE[] = "QDeclarativeEngine"; } // namespace Constants } // namespace QmlDebug diff --git a/src/libs/qmldebug/qmlenginedebugclient.h b/src/libs/qmldebug/qmlenginedebugclient.h index eea286b810ca2b8c84fdb115739d6a2be61afce7..7231d65d7d3799c2d541d60cbb2c6d482ab76650 100644 --- a/src/libs/qmldebug/qmlenginedebugclient.h +++ b/src/libs/qmldebug/qmlenginedebugclient.h @@ -40,18 +40,10 @@ class QMLDEBUG_EXPORT QmlEngineDebugClient : public BaseEngineDebugClient { Q_OBJECT public: - explicit QmlEngineDebugClient(QmlDebugConnection *conn); - - quint32 setBindingForObject(int objectDebugId, const QString &propertyName, - const QVariant &bindingExpression, - bool isLiteralValue, - QString source, int line); - quint32 resetBindingForObject(int objectDebugId, const QString &propertyName); - quint32 setMethodBody(int objectDebugId, const QString &methodName, - const QString &methodBody); - -protected: - void messageReceived(const QByteArray &data); + explicit QmlEngineDebugClient(QmlDebugConnection *conn) + : BaseEngineDebugClient(QLatin1String("QmlDebugger"), conn) + { + } }; } // namespace QmlDebug diff --git a/src/libs/ssh/sftpchannel.cpp b/src/libs/ssh/sftpchannel.cpp index 152afaa4535ca58b6902b948107c5e9133e2a934..bba482ae9d1cfe0cda2216ce05a2b1ecf5f44327 100644 --- a/src/libs/ssh/sftpchannel.cpp +++ b/src/libs/ssh/sftpchannel.cpp @@ -272,7 +272,7 @@ void SftpChannelPrivate::handleChannelFailure() throw SSH_SERVER_EXCEPTION(SSH_DISCONNECT_PROTOCOL_ERROR, "Unexpected SSH_MSG_CHANNEL_FAILURE packet."); } - emit initializationFailed(tr("Server could not start sftp subsystem.")); + emit initializationFailed(tr("Server could not start SFTP subsystem.")); closeChannel(); } diff --git a/src/libs/ssh/sshconnection.cpp b/src/libs/ssh/sshconnection.cpp index e03304ca2eedcd59c7d8c1c81921906d4bd733c3..0498b4f2856d0ba072d92700992be785c990ad1c 100644 --- a/src/libs/ssh/sshconnection.cpp +++ b/src/libs/ssh/sshconnection.cpp @@ -365,8 +365,8 @@ void SshConnectionPrivate::handleServerId() if (newLinePos > 255 - 1) { throw SshServerException(SSH_DISCONNECT_PROTOCOL_ERROR, "Identification string too long.", - tr("Server identification string is %1 characters long, but the maximum " - "allowed length is 255.").arg(newLinePos + 1)); + tr("Server identification string is %n characters long, but the maximum " + "allowed length is 255.", 0, newLinePos + 1)); } const bool hasCarriageReturn = m_incomingData.at(newLinePos - 1) == '\r'; diff --git a/src/libs/ssh/sshkeycreationdialog.cpp b/src/libs/ssh/sshkeycreationdialog.cpp index 287ea8e21ac8540dad383ef19aa64d231bca91c5..d3d59a88f0c1798cb31f0d79e30a6002d1403486 100644 --- a/src/libs/ssh/sshkeycreationdialog.cpp +++ b/src/libs/ssh/sshkeycreationdialog.cpp @@ -106,7 +106,7 @@ void SshKeyCreationDialog::saveKeys() { const QString parentDir = QFileInfo(privateKeyFilePath()).dir().path(); if (!QDir::root().mkpath(parentDir)) { - QMessageBox::critical(this, tr("Failure To Save Key File"), + QMessageBox::critical(this, tr("Cannot Save Key File"), tr("Failed to create directory: '%1'.").arg(parentDir)); return; } @@ -114,7 +114,7 @@ void SshKeyCreationDialog::saveKeys() QFile privateKeyFile(privateKeyFilePath()); if (!privateKeyFile.open(QIODevice::WriteOnly) || !privateKeyFile.write(m_keyGenerator->privateKey())) { - QMessageBox::critical(this, tr("Saving Private Key File failed"), + QMessageBox::critical(this, tr("Cannot Save Private Key File"), tr("The private key file could not be saved: %1").arg(privateKeyFile.errorString())); return; } @@ -123,7 +123,7 @@ void SshKeyCreationDialog::saveKeys() QFile publicKeyFile(publicKeyFilePath()); if (!publicKeyFile.open(QIODevice::WriteOnly) || !publicKeyFile.write(m_keyGenerator->publicKey())) { - QMessageBox::critical(this, tr("Saving Public Key File failed"), + QMessageBox::critical(this, tr("Cannot Save Public Key File"), tr("The public key file could not be saved: %1").arg(publicKeyFile.errorString())); return; } diff --git a/src/libs/zeroconf/avahiLib.cpp b/src/libs/zeroconf/avahiLib.cpp index 69b9993781b00d6532053f2f2bb7868a21f4792b..d23eccc4c4d7ec98ed475f886bf44cb5b021b695 100644 --- a/src/libs/zeroconf/avahiLib.cpp +++ b/src/libs/zeroconf/avahiLib.cpp @@ -346,7 +346,7 @@ public: if (m_simplePollFree) m_simplePollFree(connection->simple_poll); delete connection; - setError(true, ZConfLib::tr("%1 could not create a client (probably the daemon is not running)").arg(name())); + setError(true, ZConfLib::tr("%1 cannot create a client. The daemon is probably not running.").arg(name())); return kDNSServiceErr_Unknown; } *sdRef = reinterpret_cast<ConnectionRef>(connection); @@ -472,16 +472,16 @@ extern "C" void cAvahiClientReply (AvahiClient * /*s*/, AvahiClientState state, break; case (AVAHI_CLIENT_S_COLLISION): /* Server state: COLLISION */ - lib->setError(true, ZConfLib::tr("cAvahiClient, server collision")); + lib->setError(true, ZConfLib::tr("cAvahiClient, server collision.")); break; case (AVAHI_CLIENT_FAILURE): - lib->setError(true, ZConfLib::tr("cAvahiClient, some kind of error happened on the client side")); + lib->setError(true, ZConfLib::tr("cAvahiClient, an error occurred on the client side.")); break; case (AVAHI_CLIENT_CONNECTING): - lib->setError(false, ZConfLib::tr("cAvahiClient, still connecting, no server available")); + lib->setError(false, ZConfLib::tr("cAvahiClient, still connecting, no server available.")); break; default: - lib->setError(true, ZConfLib::tr("unexpected state %1 in cAvahiClientReply") + lib->setError(true, ZConfLib::tr("Unexpected state %1 in cAvahiClientReply.") .arg(state)); } } @@ -532,7 +532,7 @@ extern "C" void cAvahiBrowseReply( break; default: browser->mainConnection->lib->setError(true, ZConfLib::tr( - "unexpected state %1 in cAvahiBrowseReply") + "Unexpected state %1 in cAvahiBrowseReply.") .arg(event)); } } diff --git a/src/libs/zeroconf/servicebrowser.cpp b/src/libs/zeroconf/servicebrowser.cpp index fff6069df32aec99d672aae376ab93b08cc7f4f7..9a31075255d451f2019ec6747a63780582552de2 100644 --- a/src/libs/zeroconf/servicebrowser.cpp +++ b/src/libs/zeroconf/servicebrowser.cpp @@ -1849,7 +1849,7 @@ void MainConnection::createConnection() if (m_nErrs > lib->maxErrors() || !lib->isOk()) { abortLib(); } else if (lib->tryStartDaemon(this)) { - appendError(ErrorMessage::WarningLevel, tr("Zeroconf using %1 daemon starting seem successful, continuing.") + appendError(ErrorMessage::WarningLevel, tr("Starting the Zeroconf daemon using %1 seems successful, continuing.") .arg(lib->name())); } else { appendError(ErrorMessage::WarningLevel, tr("Zeroconf using %1 failed because no daemon is running.") @@ -1863,7 +1863,7 @@ void MainConnection::createConnection() } } if (status() < Stopping) { - startupPhase(zeroConfLibInstance()->nFallbacksTot() + 3, tr("Succeded using %1.").arg(lib->name())); + startupPhase(zeroConfLibInstance()->nFallbacksTot() + 3, tr("Succeeded using %1.").arg(lib->name())); appendError(ErrorMessage::NoteLevel, tr("MainConnection could successfully create a connection using %1.") .arg(lib->name())); diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 17e28257a72ccfbc3ce8b6b5c4357731091baa61..c6b9d9dbe4c59d4fcb8bfefac16a002ede2ebc82 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -439,7 +439,7 @@ bool AndroidConfigurations::createAVD(int minApiLevel) const avdDialog.targetComboBox->setModel(&model); if (!model.rowCount()) { QMessageBox::critical(0, tr("Error Creating AVD"), - tr("Cannot create a new AVD, no sufficiently recent Android SDK available.\n" + tr("Cannot create a new AVD. No sufficiently recent Android SDK available.\n" "Please install an SDK of at least API version %1."). arg(minApiLevel)); return false; diff --git a/src/plugins/android/androidcreatekeystorecertificate.ui b/src/plugins/android/androidcreatekeystorecertificate.ui index 553cdba0f660da26cff3e642cc48237b53996df6..ed0d4ecf8b70e59e37a578c1b5d78b853946ca32 100644 --- a/src/plugins/android/androidcreatekeystorecertificate.ui +++ b/src/plugins/android/androidcreatekeystorecertificate.ui @@ -248,7 +248,7 @@ <item row="3" column="0"> <widget class="QLabel" name="label_8"> <property name="text"> - <string>City or Locality:</string> + <string>City or locality:</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> @@ -261,7 +261,7 @@ <item row="4" column="0"> <widget class="QLabel" name="label_9"> <property name="text"> - <string>State or Province:</string> + <string>State or province:</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> diff --git a/src/plugins/android/androiddeploystep.cpp b/src/plugins/android/androiddeploystep.cpp index df8fc9867b1deedce7f8570f62226688e078974f..a233c625b0daf936cd21c76b0832ed37c33c2774 100644 --- a/src/plugins/android/androiddeploystep.cpp +++ b/src/plugins/android/androiddeploystep.cpp @@ -255,7 +255,7 @@ bool AndroidDeployStep::deployPackage() QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("shell") << QLatin1String("rm") << QLatin1String("-r") << QLatin1String("/data/local/qt")); - writeOutput(tr("Deploy Qt libraries ... this may take some time, please wait")); + writeOutput(tr("Deploy Qt libraries. This may take some time, please wait.")); const QString tempPath = QDir::tempPath() + QLatin1String("/android_qt_libs_") + m_packageName; AndroidPackageCreationStep::removeDirectory(tempPath); QStringList stripFiles; @@ -299,13 +299,13 @@ bool AndroidDeployStep::deployPackage() if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("install") << package)) { - raiseError(tr("Package installation failed")); + raiseError(tr("Package installation failed.")); disconnect(deployProc, 0, this, 0); deployProc->deleteLater(); return false; } - writeOutput(tr("Pulling files necessary for debugging")); + writeOutput(tr("Pulling files necessary for debugging.")); runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(), QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("pull") << QLatin1String("/system/bin/app_process") diff --git a/src/plugins/android/androiddeploystepfactory.cpp b/src/plugins/android/androiddeploystepfactory.cpp index e7a6a6e9cdfd1537916108ac589d7ea088b2eec5..0ac3502b9ba68415e600c1e31b6ca714bb944316 100644 --- a/src/plugins/android/androiddeploystepfactory.cpp +++ b/src/plugins/android/androiddeploystepfactory.cpp @@ -65,7 +65,7 @@ QList<Core::Id> AndroidDeployStepFactory::availableCreationIds(BuildStepList *pa QString AndroidDeployStepFactory::displayNameForId(const Core::Id id) const { if (id == AndroidDeployStep::Id) - return tr("Deploy to Android device/emulator"); + return tr("Deploy to Android device or emulator"); return QString(); } diff --git a/src/plugins/android/androiddeploystepwidget.ui b/src/plugins/android/androiddeploystepwidget.ui index 50e1eb620db2c4cbd45385cbd9a83bf12c931f05..dd7c51e78420e04a0d8c5a4863d6b948401cb1d8 100644 --- a/src/plugins/android/androiddeploystepwidget.ui +++ b/src/plugins/android/androiddeploystepwidget.ui @@ -59,7 +59,7 @@ You must have Qt libraries compiled for that platform</string> <item> <widget class="QPushButton" name="editRulesFilePushButton"> <property name="text"> - <string>Edit rules file</string> + <string>Edit Rules File</string> </property> </widget> </item> @@ -74,7 +74,7 @@ You must have Qt libraries compiled for that platform</string> This option is useful when you want to try your application on devices which don't have Android Market (e.g. Android Emulator).</string> </property> <property name="text"> - <string>Install Ministro system wide Qt shared libraries installer</string> + <string>Install Ministro, system-wide Qt shared libraries installer</string> </property> </widget> </item> @@ -84,7 +84,7 @@ This option is useful when you want to try your application on devices which don <bool>false</bool> </property> <property name="text"> - <string>Choose apk</string> + <string>Choose APK</string> </property> </widget> </item> diff --git a/src/plugins/android/androidpackagecreationwidget.cpp b/src/plugins/android/androidpackagecreationwidget.cpp index 61757995fa6514913350c4256a32ac1d7c82db88..8ea43ab17c6fa7438aa60c9cdbb95c2311e3b0d2 100644 --- a/src/plugins/android/androidpackagecreationwidget.cpp +++ b/src/plugins/android/androidpackagecreationwidget.cpp @@ -403,7 +403,7 @@ void AndroidPackageCreationWidget::prebundledLibMoveDown() void AndroidPackageCreationWidget::setHDPIIcon() { - QString file = QFileDialog::getOpenFileName(this, tr("Choose High DPI Icon"), QDir::homePath(), tr("png images (*.png)")); + QString file = QFileDialog::getOpenFileName(this, tr("Choose High DPI Icon"), QDir::homePath(), tr("PNG images (*.png)")); if (!file.length()) return; AndroidManager::setHighDpiIcon(m_step->target(), file); @@ -412,7 +412,7 @@ void AndroidPackageCreationWidget::setHDPIIcon() void AndroidPackageCreationWidget::setMDPIIcon() { - QString file = QFileDialog::getOpenFileName(this, tr("Choose Medium DPI Icon"), QDir::homePath(), tr("png images (*.png)")); + QString file = QFileDialog::getOpenFileName(this, tr("Choose Medium DPI Icon"), QDir::homePath(), tr("PNG images (*.png)")); if (!file.length()) return; AndroidManager::setMediumDpiIcon(m_step->target(), file); @@ -421,7 +421,7 @@ void AndroidPackageCreationWidget::setMDPIIcon() void AndroidPackageCreationWidget::setLDPIIcon() { - QString file = QFileDialog::getOpenFileName(this, tr("Choose Low DPI Icon"), QDir::homePath(), tr("png images (*.png)")); + QString file = QFileDialog::getOpenFileName(this, tr("Choose Low DPI Icon"), QDir::homePath(), tr("PNG images (*.png)")); if (!file.length()) return; AndroidManager::setLowDpiIcon(m_step->target(), file); @@ -438,8 +438,8 @@ void AndroidPackageCreationWidget::permissionActivated(QModelIndex index) void AndroidPackageCreationWidget::addPermission() { setEnabledSaveDiscardButtons(true); - m_ui->permissionsListView->setCurrentIndex(m_permissionsModel->addPermission(tr("< type or choose a permission >"))); - m_ui->permissionsComboBox->lineEdit()->setText(tr("< type or choose a permission >")); + m_ui->permissionsListView->setCurrentIndex(m_permissionsModel->addPermission(tr("< Type or choose a permission >"))); + m_ui->permissionsComboBox->lineEdit()->setText(tr("< Type or choose a permission >")); m_ui->permissionsComboBox->setFocus(); m_ui->removePermissionButton->setEnabled(m_permissionsModel->permissions().size()); } diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp index 026c82acea09c5464749cab9bfcf968609a06349..38a4d25759b9f529698dce24ff0dd55df1492fef 100644 --- a/src/plugins/android/androidqtversion.cpp +++ b/src/plugins/android/androidqtversion.cpp @@ -69,7 +69,7 @@ QString AndroidQtVersion::invalidReason() const { QString tmp = BaseQtVersion::invalidReason(); if (tmp.isEmpty() && qtAbis().isEmpty()) - return tr("Failed to detect the ABI(s) used by the Qt version."); + return tr("Failed to detect the ABIs used by the Qt version."); return tmp; } diff --git a/src/plugins/android/androidruncontrol.cpp b/src/plugins/android/androidruncontrol.cpp index 0597668ebede59a9c28523224867786daa8ba6c5..a03872fe593053a2e8a74dfa91b784c113fd079d 100644 --- a/src/plugins/android/androidruncontrol.cpp +++ b/src/plugins/android/androidruncontrol.cpp @@ -66,7 +66,7 @@ void AndroidRunControl::start() SLOT(handleRemoteOutput(QByteArray))); connect(m_runner, SIGNAL(remoteProcessFinished(QString)), SLOT(handleRemoteProcessFinished(QString))); - appendMessage(tr("Starting remote process..."), Utils::NormalMessageFormat); + appendMessage(tr("Starting remote process."), Utils::NormalMessageFormat); m_runner->start(); } diff --git a/src/plugins/android/androidrunfactories.cpp b/src/plugins/android/androidrunfactories.cpp index 206e44d4aafc19f880800a6a0888115d6049756a..113cf9b1f9ba4463ee1a56d8bf5b8cd98ffbd2ce 100644 --- a/src/plugins/android/androidrunfactories.cpp +++ b/src/plugins/android/androidrunfactories.cpp @@ -184,7 +184,7 @@ RunControl *AndroidRunControlFactory::create(RunConfiguration *runConfig, QString AndroidRunControlFactory::displayName() const { - return tr("Run on Android device/emulator"); + return tr("Run on Android device or emulator."); } } // namespace Internal diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index c0b67ae198d63e31ef32872e6a98ceb192c0c353..20a31dfe0054f97e03fb1e2c2c8d952e7cd8cb3a 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -96,7 +96,7 @@ void AndroidRunner::checkPID() if (-1 != m_processPID && pid == -1) { m_processPID = -1; - emit remoteProcessFinished(tr("\n\n'%1' died").arg(m_packageName)); + emit remoteProcessFinished(tr("\n\n'%1' died.").arg(m_packageName)); return; } m_processPID = pid; @@ -151,11 +151,11 @@ void AndroidRunner::asyncStart() << QString::fromLatin1("localfilesystem:/data/data/%1/debug-socket").arg(m_packageName); adbStarProc.start(AndroidConfigurations::instance().adbToolPath().toString(), arguments); if (!adbStarProc.waitForStarted()) { - emit remoteProcessFinished(tr("Failed to forward C++ debugging ports. Reason: %1").arg(adbStarProc.errorString())); + emit remoteProcessFinished(tr("Failed to forward C++ debugging ports. Reason: %1.").arg(adbStarProc.errorString())); return; } if (!adbStarProc.waitForFinished(-1)) { - emit remoteProcessFinished(tr("Failed to forward C++ debugging ports")); + emit remoteProcessFinished(tr("Failed to forward C++ debugging ports.")); return; } extraParams = QLatin1String("-e native_debug true -e gdbserver_socket +debug-socket"); @@ -167,11 +167,11 @@ void AndroidRunner::asyncStart() << QLatin1String("forward") << port << port; // currently forward to same port on device and host adbStarProc.start(AndroidConfigurations::instance().adbToolPath().toString(), arguments); if (!adbStarProc.waitForStarted()) { - emit remoteProcessFinished(tr("Failed to forward QML debugging ports. Reason: %1").arg(adbStarProc.errorString())); + emit remoteProcessFinished(tr("Failed to forward QML debugging ports. Reason: %1.").arg(adbStarProc.errorString())); return; } if (!adbStarProc.waitForFinished(-1)) { - emit remoteProcessFinished(tr("Failed to forward QML debugging ports")); + emit remoteProcessFinished(tr("Failed to forward QML debugging ports.")); return; } extraParams+=QString::fromLatin1(" -e qml_debug true -e qmljsdebugger port:%1") @@ -196,12 +196,12 @@ void AndroidRunner::asyncStart() adbStarProc.start(AndroidConfigurations::instance().adbToolPath().toString(), arguments); if (!adbStarProc.waitForStarted()) { - emit remoteProcessFinished(tr("Failed to start the activity. Reason: %1").arg(adbStarProc.errorString())); + emit remoteProcessFinished(tr("Failed to start the activity. Reason: %1.").arg(adbStarProc.errorString())); return; } if (!adbStarProc.waitForFinished(-1)) { adbStarProc.terminate(); - emit remoteProcessFinished(tr("Unable to start '%1'").arg(m_packageName)); + emit remoteProcessFinished(tr("Unable to start '%1'.").arg(m_packageName)); return; } QTime startTime = QTime::currentTime(); @@ -209,7 +209,7 @@ void AndroidRunner::asyncStart() checkPID(); } if (m_processPID == -1) { - emit remoteProcessFinished(tr("Cannot find %1 process").arg(m_packageName)); + emit remoteProcessFinished(tr("Cannot find %1 process.").arg(m_packageName)); return; } @@ -246,7 +246,7 @@ void AndroidRunner::stop() void AndroidRunner::asyncStop() { killPID(); - emit remoteProcessFinished(tr("\n\n'%1' killed").arg(m_packageName)); + emit remoteProcessFinished(tr("\n\n'%1' killed.").arg(m_packageName)); } void AndroidRunner::logcatReadStandardError() diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 12366ff9d261841bfad63b4b48bbe99ccf860b07..f4dbd73f4328e3c2a48b6555d2e9a9170c123aee 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -195,7 +195,7 @@ bool AndroidSettingsWidget::checkSDK(const Utils::FileName &location) || (!androidExe.appendPath(QLatin1String("/tools/android" QTC_HOST_EXE_SUFFIX)).toFileInfo().exists() && !androidBat.appendPath(QLatin1String("/tools/android" ANDROID_BAT_SUFFIX)).toFileInfo().exists()) || !emulator.appendPath(QLatin1String("/tools/emulator" QTC_HOST_EXE_SUFFIX)).toFileInfo().exists()) { - QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" doesn't seem to be an Android SDK top folder").arg(location.toUserOutput())); + QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" does not seem to be an Android SDK top folder.").arg(location.toUserOutput())); return false; } return true; @@ -216,7 +216,7 @@ bool AndroidSettingsWidget::checkNDK(const Utils::FileName &location) if (!platformPath.appendPath(QLatin1String("platforms")).toFileInfo().exists() || !toolChainPath.appendPath(QLatin1String("toolchains")).toFileInfo().exists() || !sourcesPath.appendPath(QLatin1String("sources/cxx-stl")).toFileInfo().exists()) { - QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" doesn't seem to be an Android NDK top folder").arg(location.toUserOutput())); + QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" does not seem to be an Android NDK top folder.").arg(location.toUserOutput())); return false; } m_androidConfig.ndkLocation = location; diff --git a/src/plugins/android/androidsettingswidget.ui b/src/plugins/android/androidsettingswidget.ui index 1e7cba16af95ec1e32694b15d2248c201242d4a9..9d1c4f62f4d5f1242c31e326fa387fbaba3c61c2 100644 --- a/src/plugins/android/androidsettingswidget.ui +++ b/src/plugins/android/androidsettingswidget.ui @@ -59,7 +59,7 @@ <item row="2" column="0"> <widget class="QLabel" name="NDKToolchainVersionLabel"> <property name="text"> - <string>Android NDK toolchain version:</string> + <string>Android NDK tool chain version:</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> @@ -92,7 +92,7 @@ <item row="4" column="0"> <widget class="QLabel" name="GdbLocationLabel"> <property name="text"> - <string>arm GDB location:</string> + <string>ARM GDB location:</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> @@ -112,7 +112,7 @@ <item row="5" column="0"> <widget class="QLabel" name="GdbserverLocationLabel"> <property name="text"> - <string>arm GDBserver location:</string> + <string>ARM GDB server location:</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> @@ -152,7 +152,7 @@ <item row="7" column="0"> <widget class="QLabel" name="GdbserverLocationLabelx86"> <property name="text"> - <string>x86 GDBserver location:</string> + <string>x86 GDB server location:</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> diff --git a/src/plugins/bineditor/bineditorplugin.cpp b/src/plugins/bineditor/bineditorplugin.cpp index ce28543c22130b9256dfb6a17243092307e42a98..fc75eff62baf6862797feee345d08556a5ebb27a 100644 --- a/src/plugins/bineditor/bineditorplugin.cpp +++ b/src/plugins/bineditor/bineditorplugin.cpp @@ -224,7 +224,7 @@ public: QFile file(fileName); quint64 size = static_cast<quint64>(file.size()); if (size == 0) { - QString msg = tr("The Binary Editor can not open empty files."); + QString msg = tr("The Binary Editor cannot open empty files."); if (errorString) *errorString = msg; else diff --git a/src/plugins/clearcase/activityselector.cpp b/src/plugins/clearcase/activityselector.cpp index d677881edc053d3e84c5495d318afe40777140d1..d0fce680109e7723d573be6b2ede16a23a545a5d 100644 --- a/src/plugins/clearcase/activityselector.cpp +++ b/src/plugins/clearcase/activityselector.cpp @@ -54,7 +54,7 @@ ActivitySelector::ActivitySelector(QWidget *parent) : QHBoxLayout *hboxLayout = new QHBoxLayout(this); hboxLayout->setContentsMargins(0, 0, 0, 0); - QLabel *lblActivity = new QLabel(tr("Select &Activity:")); + QLabel *lblActivity = new QLabel(tr("Select &activity:")); lblActivity->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); hboxLayout->addWidget(lblActivity); diff --git a/src/plugins/clearcase/checkoutdialog.ui b/src/plugins/clearcase/checkoutdialog.ui index 73f6a398c529f96d82a47672cc5c4199dac63b7a..3af4fa0eeb30aa149ab27dbd8f682344e0c2f0f9 100644 --- a/src/plugins/clearcase/checkoutdialog.ui +++ b/src/plugins/clearcase/checkoutdialog.ui @@ -24,7 +24,7 @@ <item> <widget class="QLabel" name="lblComment"> <property name="text"> - <string>&Checkout Comment:</string> + <string>&Checkout comment:</string> </property> <property name="buddy"> <cstring>txtComment</cstring> diff --git a/src/plugins/clearcase/versionselector.ui b/src/plugins/clearcase/versionselector.ui index b120bcf944a6c358a50b619d00a8c34cbe3c5457..d6afca55901a95aef9503de88c9b71ce238f313e 100644 --- a/src/plugins/clearcase/versionselector.ui +++ b/src/plugins/clearcase/versionselector.ui @@ -49,7 +49,7 @@ <item row="1" column="0"> <widget class="QLabel" name="loadedCreatedByHeaderLabel"> <property name="text"> - <string>Created By:</string> + <string>Created by:</string> </property> </widget> </item> @@ -63,7 +63,7 @@ <item row="2" column="0"> <widget class="QLabel" name="loadedCreatedOnHeaderLabel"> <property name="text"> - <string>Created On:</string> + <string>Created on:</string> </property> </widget> </item> @@ -91,7 +91,7 @@ <item row="1" column="0"> <widget class="QLabel" name="updatedCreatedByHeaderLabel"> <property name="text"> - <string>Created By:</string> + <string>Created by:</string> </property> </widget> </item> @@ -105,7 +105,7 @@ <item row="2" column="0"> <widget class="QLabel" name="updatedCreatedOnHeaderLabel"> <property name="text"> - <string extracomment="Date">Created On:</string> + <string extracomment="Date">Created on:</string> </property> </widget> </item> diff --git a/src/plugins/coreplugin/idocument.cpp b/src/plugins/coreplugin/idocument.cpp index 2d5e7d3e3c28619a14e923639bacb86d4b241d44..d79facc78c8363b2ba6eea7b39d0366207d51446 100644 --- a/src/plugins/coreplugin/idocument.cpp +++ b/src/plugins/coreplugin/idocument.cpp @@ -88,7 +88,7 @@ void IDocument::setRestoredFrom(const QString &name) m_restored = true; InfoBarEntry info(QLatin1String(kRestoredAutoSave), tr("File was restored from auto-saved copy. " - "Use <i>Save</i> to confirm, or <i>Revert to Saved</i> to discard changes.")); + "Select Save to confirm or Revert to Saved to discard changes.")); infoBar()->addInfo(info); } diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index afc34b6ea0e5594dcb7bb6715616df372eaf2d11..d8420a3e055ce2b0b56bba958e076ce3c3be8161 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -186,7 +186,7 @@ MainWindow::MainWindow() : QCoreApplication::setApplicationVersion(QLatin1String(Core::Constants::IDE_VERSION_LONG)); QCoreApplication::setOrganizationName(QLatin1String(Constants::IDE_SETTINGSVARIANT_STR)); QString baseName = QApplication::style()->objectName(); -#ifdef Q_WS_X11 +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) if (baseName == QLatin1String("windows")) { // Sometimes we get the standard windows 95 style as a fallback // e.g. if we are running on a KDE4 desktop diff --git a/src/plugins/cppeditor/cpptypehierarchy.cpp b/src/plugins/cppeditor/cpptypehierarchy.cpp index 88ca5f89287219b7c40b23fbe52b0f0e4e73be4d..d764cce11490d4c82e8b2a3550eb961b362c46cd 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.cpp +++ b/src/plugins/cppeditor/cpptypehierarchy.cpp @@ -124,7 +124,6 @@ private: // CppTypeHierarchyWidget CppTypeHierarchyWidget::CppTypeHierarchyWidget(Core::IEditor *editor) : QWidget(0), - m_cppEditor(0), m_treeView(0), m_model(0), m_delegate(0) @@ -133,9 +132,7 @@ CppTypeHierarchyWidget::CppTypeHierarchyWidget(Core::IEditor *editor) : layout->setMargin(0); layout->setSpacing(0); - if (CPPEditor *cppEditor = qobject_cast<CPPEditor *>(editor)) { - m_cppEditor = static_cast<CPPEditorWidget *>(cppEditor->widget()); - + if (qobject_cast<CPPEditor *>(editor)) { m_inspectedClass = new CppClassLabel(this); m_inspectedClass->setMargin(5); layout->addWidget(m_inspectedClass); @@ -165,27 +162,18 @@ CppTypeHierarchyWidget::CppTypeHierarchyWidget(Core::IEditor *editor) : CppTypeHierarchyWidget::~CppTypeHierarchyWidget() {} -bool CppTypeHierarchyWidget::handleEditorChange(Core::IEditor *editor) -{ - if (CPPEditor *cppEditor = qobject_cast<CPPEditor *>(editor)) { - if (m_cppEditor) { - m_cppEditor = static_cast<CPPEditorWidget *>(cppEditor->widget()); - return true; - } - } else if (!m_cppEditor) { - return true; - } - return false; -} - void CppTypeHierarchyWidget::perform() { - if (!m_cppEditor) + CPPEditor *editor = qobject_cast<CPPEditor *>(Core::EditorManager::instance()->currentEditor()); + if (!editor) + return; + CPPEditorWidget *widget = qobject_cast<CPPEditorWidget *>(editor->widget()); + if (!widget) return; m_model->clear(); - CppElementEvaluator evaluator(m_cppEditor); + CppElementEvaluator evaluator(widget); evaluator.setLookupBaseClasses(true); evaluator.setLookupDerivedClasses(true); evaluator.execute(); @@ -218,7 +206,13 @@ void CppTypeHierarchyWidget::buildHierarchy(const CppClass &cppClass, QStandardI void CppTypeHierarchyWidget::onItemClicked(const QModelIndex &index) { - m_cppEditor->openLink(index.data(LinkRole).value<TextEditor::BaseTextEditorWidget::Link>()); + const TextEditor::BaseTextEditorWidget::Link link + = index.data(LinkRole).value<TextEditor::BaseTextEditorWidget::Link>(); + if (!link.fileName.isEmpty()) + TextEditor::BaseTextEditorWidget::openEditorAt(link.fileName, + link.line, + link.column, + Constants::CPPEDITOR_ID); } // CppTypeHierarchyStackedWidget @@ -227,9 +221,6 @@ CppTypeHierarchyStackedWidget::CppTypeHierarchyStackedWidget(QWidget *parent) : m_typeHiearchyWidgetInstance(new CppTypeHierarchyWidget(Core::EditorManager::currentEditor())) { addWidget(m_typeHiearchyWidgetInstance); - - connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), - this, SLOT(editorChanged(Core::IEditor*))); } CppTypeHierarchyStackedWidget::~CppTypeHierarchyStackedWidget() @@ -237,17 +228,6 @@ CppTypeHierarchyStackedWidget::~CppTypeHierarchyStackedWidget() delete m_typeHiearchyWidgetInstance; } -void CppTypeHierarchyStackedWidget::editorChanged(Core::IEditor *editor) -{ - if (!m_typeHiearchyWidgetInstance->handleEditorChange(editor)) { - CppTypeHierarchyWidget *replacement = new CppTypeHierarchyWidget(editor); - removeWidget(m_typeHiearchyWidgetInstance); - m_typeHiearchyWidgetInstance->deleteLater(); - m_typeHiearchyWidgetInstance = replacement; - addWidget(m_typeHiearchyWidgetInstance); - } -} - // CppTypeHierarchyFactory CppTypeHierarchyFactory::CppTypeHierarchyFactory() {} diff --git a/src/plugins/cppeditor/cpptypehierarchy.h b/src/plugins/cppeditor/cpptypehierarchy.h index 2d862d69044f0df5069110f1e53a2190d72b672d..23acb0e3e5fcc245cebed5521d24a0946c717f12 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.h +++ b/src/plugins/cppeditor/cpptypehierarchy.h @@ -69,8 +69,6 @@ public: CppTypeHierarchyWidget(Core::IEditor *editor); virtual ~CppTypeHierarchyWidget(); - bool handleEditorChange(Core::IEditor *editor); - public slots: void perform(); @@ -97,9 +95,6 @@ public: CppTypeHierarchyStackedWidget(QWidget *parent = 0); virtual ~CppTypeHierarchyStackedWidget(); -public slots: - void editorChanged(Core::IEditor* editor); - private: CppTypeHierarchyWidget *m_typeHiearchyWidgetInstance; }; diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index a6681bb39813bf22fd2acc839911b95ce0267ada..8f0b5ecbe3b1a4a4eafd70e04ffd0c4b28035c57 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -231,7 +231,7 @@ void CppToolsPlugin::test_completion_template_1() QVERIFY(!completions.contains("func")); } -void CppToolsPlugin::test_completion_template_as_base() +void CppToolsPlugin::test_completion() { QFETCH(QByteArray, code); QFETCH(QStringList, expectedCompletions); @@ -253,6 +253,11 @@ void CppToolsPlugin::test_completion_template_as_base() QCOMPARE(actualCompletions, expectedCompletions); } +void CppToolsPlugin::test_completion_template_as_base() +{ + test_completion(); +} + void CppToolsPlugin::test_completion_template_as_base_data() { QTest::addColumn<QByteArray>("code"); @@ -399,3 +404,391 @@ void CppToolsPlugin::test_completion_template_as_base_data() completions.append("otherMember"); QTest::newRow("case: base as template name in non-template") << code << completions; } + +void CppToolsPlugin::test_completion_use_global_identifier_as_base_class() +{ + test_completion(); +} + +void CppToolsPlugin::test_completion_use_global_identifier_as_base_class_data() +{ + QTest::addColumn<QByteArray>("code"); + QTest::addColumn<QStringList>("expectedCompletions"); + + QByteArray code; + QStringList completions; + + code = "\n" + "struct Global\n" + "{\n" + " int int_global;\n" + "};\n" + "\n" + "struct Final : ::Global\n" + "{\n" + " int int_final;\n" + "};\n" + "\n" + "Final c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_global"); + completions.append("int_final"); + completions.append("Final"); + completions.append("Global"); + QTest::newRow("case: derived as global and base as global") << code << completions; + + completions.clear(); + + code = "\n" + "struct Global\n" + "{\n" + " int int_global;\n" + "};\n" + "\n" + "namespace NS\n" + "{\n" + "struct Final : ::Global\n" + "{\n" + " int int_final;\n" + "};\n" + "}\n" + "\n" + "NS::Final c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_global"); + completions.append("int_final"); + completions.append("Final"); + completions.append("Global"); + QTest::newRow("case: derived is inside namespace, base as global") + << code << completions; + + completions.clear(); + + //this test does not work due to the bug QTCREATORBUG-7912 + + +// code = "\n" +// "struct Global\n" +// "{\n" +// " int int_global;\n" +// "};\n" +// "\n" +// "template <typename T>\n" +// "struct Enclosing\n" +// "{\n" +// "struct Final : ::Global\n" +// "{\n" +// " int int_final;\n" +// "};\n" +// "}\n" +// "\n" +// "Enclosing<int>::Final c;\n" +// "@\n" +// "// padding so we get the scope right\n"; + +// completions.append("int_global"); +// completions.append("int_final"); +// completions.append("Final"); +// completions.append("Global"); +// QTest::newRow("case: derived is enclosed by template, base as global") +// << code << completions; + +// completions.clear(); +} + +void CppToolsPlugin::test_completion_base_class_has_name_the_same_as_derived() +{ + test_completion(); +} + +void CppToolsPlugin::test_completion_base_class_has_name_the_same_as_derived_data() +{ + QTest::addColumn<QByteArray>("code"); + QTest::addColumn<QStringList>("expectedCompletions"); + + QByteArray code; + QStringList completions; + + code = "\n" + "struct A : A\n" + "{\n" + " int int_a;\n" + "};\n" + "\n" + "A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_a"); + completions.append("A"); + QTest::newRow("case: base class is derived class") << code << completions; + + completions.clear(); + + code = "\n" + "namespace NS\n" + "{\n" + "struct A : A\n" + "{\n" + " int int_a;\n" + "};\n" + "}\n" + "\n" + "NS::A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_a"); + completions.append("A"); + QTest::newRow("case: base class is derived class. class is in namespace") + << code << completions; + + completions.clear(); + + code = "\n" + "namespace NS\n" + "{\n" + "struct A : NS::A\n" + "{\n" + " int int_a;\n" + "};\n" + "}\n" + "\n" + "NS::A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_a"); + completions.append("A"); + QTest::newRow("case: base class is derived class. class is in namespace. " + "use scope operator for base class") << code << completions; + + completions.clear(); + + code = "\n" + "namespace NS1\n" + "{\n" + "struct A\n" + "{\n" + " int int_ns1_a;\n" + "};\n" + "}\n" + "namespace NS2\n" + "{\n" + "struct A : NS1::A\n" + "{\n" + " int int_ns2_a;\n" + "};\n" + "}\n" + "\n" + "NS2::A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_ns1_a"); + completions.append("int_ns2_a"); + completions.append("A"); + QTest::newRow("case: base class has the same name as derived but in different namespace") + << code << completions; + + completions.clear(); + + code = "\n" + "struct Enclosing\n" + "{\n" + "struct A\n" + "{\n" + " int int_enclosing_a;\n" + "};\n" + "};\n" + "namespace NS2\n" + "{\n" + "struct A : Enclosing::A\n" + "{\n" + " int int_ns2_a;\n" + "};\n" + "}\n" + "\n" + "NS2::A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_enclosing_a"); + completions.append("int_ns2_a"); + completions.append("A"); + QTest::newRow("case: base class has the same name as derived(in namespace) " + "but is nested by different class") << code << completions; + + completions.clear(); + + code = "\n" + "struct EnclosingBase\n" + "{\n" + "struct A\n" + "{\n" + " int int_enclosing_base_a;\n" + "};\n" + "};\n" + "struct EnclosingDerived\n" + "{\n" + "struct A : EnclosingBase::A\n" + "{\n" + " int int_enclosing_derived_a;\n" + "};\n" + "};\n" + "\n" + "EnclosingDerived::A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_enclosing_base_a"); + completions.append("int_enclosing_derived_a"); + completions.append("A"); + QTest::newRow("case: base class has the same name as derived(nested) " + "but is nested by different class") << code << completions; + + completions.clear(); + + code = "\n" + "template <typename T>\n" + "struct A : A\n" + "{\n" + " int int_a;\n" + "};\n" + "\n" + "A<int> c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_a"); + completions.append("A"); + QTest::newRow("case: base class is derived class. class is a template") + << code << completions; + + completions.clear(); + +} + + +void CppToolsPlugin::test_completion_cyclic_inheritance() +{ + test_completion(); +} + +void CppToolsPlugin::test_completion_cyclic_inheritance_data() +{ + QTest::addColumn<QByteArray>("code"); + QTest::addColumn<QStringList>("expectedCompletions"); + + QByteArray code; + QStringList completions; + + code = "\n" + "struct B;\n" + "struct A : B { int _a; };\n" + "struct B : A { int _b; };\n" + "\n" + "A c;\n" + "@\n" + ; + completions.append("A"); + completions.append("_a"); + completions.append("B"); + completions.append("_b"); + QTest::newRow("case: direct cyclic inheritance") << code << completions; + + completions.clear(); + code = "\n" + "struct C;\n" + "struct A : C { int _a; };\n" + "struct B : A { int _b; };\n" + "struct C : B { int _c; };\n" + "\n" + "A c;\n" + "@\n" + ; + completions.append("A"); + completions.append("_a"); + completions.append("B"); + completions.append("_b"); + completions.append("C"); + completions.append("_c"); + QTest::newRow("case: indirect cyclic inheritance") << code << completions; + + completions.clear(); + code = "\n" + "struct B;\n" + "struct A : B { int _a; };\n" + "struct C { int _c; };\n" + "struct B : C, A { int _b; };\n" + "\n" + "A c;\n" + "@\n" + ; + completions.append("A"); + completions.append("_a"); + completions.append("B"); + completions.append("_b"); + completions.append("C"); + completions.append("_c"); + QTest::newRow("case: indirect cyclic inheritance") << code << completions; + + completions.clear(); + code = "\n" + "template< typename T > struct C;\n" + "template< typename T, typename S > struct D : C< S >\n" + "{\n" + " T _d_t;\n" + " S _d_s;\n" + "};\n" + "template< typename T > struct C : D< T, int >\n" + "{\n" + " T _c_t;\n" + "};\n" + "\n" + "D<int, float> c;\n" + "@\n" + ; + completions.append("D"); + completions.append("_d_t"); + completions.append("_d_s"); + completions.append("C"); + completions.append("_c_t"); + QTest::newRow("case: direct cyclic inheritance with templates") + << code << completions; + + completions.clear(); + code = "\n" + "template< typename T > struct C;\n" + "template< typename T, typename S > struct D : C< S >\n" + "{\n" + " T _d_t;\n" + " S _d_s;\n" + "};\n" + "template< typename T > struct B : D< T, int >\n" + "{\n" + " T _b_t;\n" + "};\n" + "template< typename T > struct C : B<T>\n" + "{\n" + " T _c_t;\n" + "};\n" + "\n" + "D<int, float> c;\n" + "@\n" + ; + completions.append("D"); + completions.append("_d_t"); + completions.append("_d_s"); + completions.append("C"); + completions.append("_c_t"); + completions.append("B"); + completions.append("_b_t"); + QTest::newRow("case: indirect cyclic inheritance with templates") + << code << completions; + +} diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index ba88d11896e11912095a035b451f7f6ce5329f4e..d84319db03b55e24298afec5ecee1bfc978e469c 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -77,6 +77,7 @@ private slots: void switchHeaderSource(); #ifdef WITH_TESTS + // codegen tests void test_codegen_public_in_empty_class(); void test_codegen_public_in_nonempty_class(); @@ -95,6 +96,15 @@ private slots: void test_completion_template_1(); void test_completion_template_as_base(); void test_completion_template_as_base_data(); + void test_completion_use_global_identifier_as_base_class(); + void test_completion_use_global_identifier_as_base_class_data(); + void test_completion_base_class_has_name_the_same_as_derived(); + void test_completion_base_class_has_name_the_same_as_derived_data(); + void test_completion_cyclic_inheritance(); + void test_completion_cyclic_inheritance_data(); + +private: + void test_completion(); #endif private: diff --git a/src/plugins/debugger/debuggerkitconfigwidget.h b/src/plugins/debugger/debuggerkitconfigwidget.h index 735d02fd01f48d9b03c65c67c62cec10deedf5f2..3c8658ca307d0cdd74137afff314c33ca8ac2353 100644 --- a/src/plugins/debugger/debuggerkitconfigwidget.h +++ b/src/plugins/debugger/debuggerkitconfigwidget.h @@ -62,7 +62,7 @@ class DebuggerKitConfigWidget : public ProjectExplorer::KitConfigWidget Q_OBJECT public: - DebuggerKitConfigWidget(ProjectExplorer::Kit *p, + DebuggerKitConfigWidget(ProjectExplorer::Kit *k, const DebuggerKitInformation *ki, QWidget *parent = 0); diff --git a/src/plugins/debugger/debuggerkitinformation.cpp b/src/plugins/debugger/debuggerkitinformation.cpp index 5b86f09c323ab293a2d9cd9a2c7c366feedc0d53..f497e2b19ed86fd69762efc49aa8f15654cf487f 100644 --- a/src/plugins/debugger/debuggerkitinformation.cpp +++ b/src/plugins/debugger/debuggerkitinformation.cpp @@ -296,8 +296,27 @@ DebuggerKitInformation::DebuggerItem DebuggerKitInformation::variantToItem(const } QTC_ASSERT(v.type() == QVariant::Map, return result); const QVariantMap vmap = v.toMap(); - result.binary = Utils::FileName::fromString(vmap.value(QLatin1String(binaryKeyC)).toString()); result.engineType = static_cast<DebuggerEngineType>(vmap.value(QLatin1String(engineTypeKeyC)).toInt()); + QString binary = vmap.value(QLatin1String(binaryKeyC)).toString(); + // Check for special 'auto' entry for binary written by the sdktool during + // installation. Try to autodetect. + if (binary == QLatin1String("auto")) { + binary.clear(); + switch (result.engineType) { + case Debugger::GdbEngineType: // Auto-detect system gdb on Unix + if (Abi::hostAbi().os() != Abi::WindowsOS) + binary = Environment::systemEnvironment().searchInPath(QLatin1String("gdb")); + break; + case Debugger::CdbEngineType: { // Auto-detect system CDB on Windows. + const QPair<QString, QString> cdbs = autoDetectCdbDebugger(); + binary = cdbs.second.isEmpty() ? cdbs.first : cdbs.second; + } + break; + default: + break; + } + } + result.binary = Utils::FileName::fromString(binary); return result; } diff --git a/src/plugins/debugger/debuggerkitinformation.h b/src/plugins/debugger/debuggerkitinformation.h index 93f632be76c7a219ec58ea045577964c9dbc174b..3fdfb165e7089ad7318225fde2ab229b77184bce 100644 --- a/src/plugins/debugger/debuggerkitinformation.h +++ b/src/plugins/debugger/debuggerkitinformation.h @@ -77,13 +77,13 @@ public: static DebuggerItem debuggerItem(const ProjectExplorer::Kit *k); static void setDebuggerItem(ProjectExplorer::Kit *k, const DebuggerItem &item); - static Utils::FileName debuggerCommand(const ProjectExplorer::Kit *p) - { return debuggerItem(p).binary; } + static Utils::FileName debuggerCommand(const ProjectExplorer::Kit *k) + { return debuggerItem(k).binary; } - static void setDebuggerCommand(ProjectExplorer::Kit *p, const Utils::FileName &command); + static void setDebuggerCommand(ProjectExplorer::Kit *k, const Utils::FileName &command); - static DebuggerEngineType engineType(const ProjectExplorer::Kit *p) - { return debuggerItem(p).engineType; } + static DebuggerEngineType engineType(const ProjectExplorer::Kit *k) + { return debuggerItem(k).engineType; } static void setEngineType(ProjectExplorer::Kit *k, DebuggerEngineType type); diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp index d6c956250edd1206d3cb9fb7b00facc87ea14acc..7b03136e479f006393bb46605d16c9aa958143c8 100644 --- a/src/plugins/debugger/debuggertooltipmanager.cpp +++ b/src/plugins/debugger/debuggertooltipmanager.cpp @@ -691,9 +691,7 @@ void DebuggerToolTipWidget::copy() { const QString clipboardText = clipboardContents(); QClipboard *clipboard = QApplication::clipboard(); -#ifdef Q_WS_X11 clipboard->setText(clipboardText, QClipboard::Selection); -#endif clipboard->setText(clipboardText, QClipboard::Clipboard); } diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index d96a7e711ed00c8a483816ae3f9afbba94604556..d589d7e68a18a3676f40cfc940f7a7754850d919 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -221,7 +221,7 @@ public: QAction *createAction(QObject *parent) const { QAction *action = new QAction(DebuggerPlugin::tr("Install &Debug Information"), parent); - action->setToolTip(DebuggerPlugin::tr("This tries to install missing debug information.")); + action->setToolTip(DebuggerPlugin::tr("Tries to install missing debug information.")); return action; } @@ -302,7 +302,7 @@ QString GdbEngine::errorMessage(QProcess::ProcessError error) switch (error) { case QProcess::FailedToStart: return tr("The gdb process failed to start. Either the " - "invoked program '%1' is missing, or you may have insufficient " + "invoked program \"%1\" is missing, or you may have insufficient " "permissions to invoke the program.\n%2") .arg(m_gdb, gdbProc()->errorString()); case QProcess::Crashed: @@ -1053,7 +1053,7 @@ void GdbEngine::commandTimeout() "to a command within %n second(s). This could mean it is stuck " "in an endless loop or taking longer than expected to perform " "the operation.\nYou can choose between waiting " - "longer or abort debugging.", 0, timeOut / 1000); + "longer or aborting debugging.", 0, timeOut / 1000); QMessageBox *mb = showMessageBox(QMessageBox::Critical, tr("GDB not responding"), msg, QMessageBox::Ok | QMessageBox::Cancel); @@ -2095,7 +2095,7 @@ int GdbEngine::currentFrame() const static QString msgNoGdbBinaryForToolChain(const Abi &tc) { - return GdbEngine::tr("There is no gdb binary available for binaries in format '%1'") + return GdbEngine::tr("There is no GDB binary available for binaries in format '%1'") .arg(tc.toString()); } diff --git a/src/plugins/debugger/moduleshandler.cpp b/src/plugins/debugger/moduleshandler.cpp index 10786d29dff4e3220e2bd1cb5e38634e711766b9..890146f05124f45b0ad16b805650a874c74fe631 100644 --- a/src/plugins/debugger/moduleshandler.cpp +++ b/src/plugins/debugger/moduleshandler.cpp @@ -80,12 +80,12 @@ QVariant ModulesModel::headerData(int section, { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { static QString headers[] = { - ModulesHandler::tr("Module name") + QLatin1String(" "), - ModulesHandler::tr("Module path") + QLatin1String(" "), - ModulesHandler::tr("Symbols read") + QLatin1String(" "), - ModulesHandler::tr("Symbols type") + QLatin1String(" "), - ModulesHandler::tr("Start address") + QLatin1String(" "), - ModulesHandler::tr("End address") + QLatin1String(" ") + ModulesHandler::tr("Module Name") + QLatin1String(" "), + ModulesHandler::tr("Module Path") + QLatin1String(" "), + ModulesHandler::tr("Symbols Read") + QLatin1String(" "), + ModulesHandler::tr("Symbols Type") + QLatin1String(" "), + ModulesHandler::tr("Start Address") + QLatin1String(" "), + ModulesHandler::tr("End Address") + QLatin1String(" ") }; return headers[section]; } @@ -123,22 +123,22 @@ QVariant ModulesModel::data(const QModelIndex &index, int role) const case 2: if (role == Qt::DisplayRole) switch (module.symbolsRead) { - case Module::UnknownReadState: return ModulesHandler::tr("unknown"); - case Module::ReadFailed: return ModulesHandler::tr("no"); - case Module::ReadOk: return ModulesHandler::tr("yes"); + case Module::UnknownReadState: return ModulesHandler::tr("Unknown"); + case Module::ReadFailed: return ModulesHandler::tr("No"); + case Module::ReadOk: return ModulesHandler::tr("Yes"); } break; case 3: if (role == Qt::DisplayRole) switch (module.elfData.symbolsType) { case UnknownSymbols: - return ModulesHandler::tr("unknown"); + return ModulesHandler::tr("Unknown"); case NoSymbols: - return ModulesHandler::tr("none"); + return ModulesHandler::tr("None"); case PlainSymbols: - return ModulesHandler::tr("plain"); + return ModulesHandler::tr("Plain"); case FastSymbols: - return ModulesHandler::tr("fast"); + return ModulesHandler::tr("Fast"); case LinkedSymbols: return ModulesHandler::tr("debuglnk"); case BuildIdSymbols: diff --git a/src/plugins/debugger/qml/qmladapter.cpp b/src/plugins/debugger/qml/qmladapter.cpp index 05da501875d9de1c5d22fde8c51dfb92f49f4671..eb6747eb01332353fa38e5ac9bc61d76e5326ed1 100644 --- a/src/plugins/debugger/qml/qmladapter.cpp +++ b/src/plugins/debugger/qml/qmladapter.cpp @@ -144,20 +144,20 @@ void QmlAdapter::connectionStateChanged() switch (m_conn->state()) { case QAbstractSocket::UnconnectedState: { - showConnectionStatusMessage(tr("disconnected.\n\n")); + showConnectionStatusMessage(tr("Disconnected.\n\n")); emit disconnected(); break; } case QAbstractSocket::HostLookupState: - showConnectionStatusMessage(tr("resolving host...")); + showConnectionStatusMessage(tr("Resolving host.")); break; case QAbstractSocket::ConnectingState: - showConnectionStatusMessage(tr("connecting to debug server...")); + showConnectionStatusMessage(tr("Connecting to debug server.")); break; case QAbstractSocket::ConnectedState: { - showConnectionStatusMessage(tr("connected.\n")); + showConnectionStatusMessage(tr("Connected.\n")); m_connectionTimer.stop(); @@ -166,7 +166,7 @@ void QmlAdapter::connectionStateChanged() break; } case QAbstractSocket::ClosingState: - showConnectionStatusMessage(tr("closing...")); + showConnectionStatusMessage(tr("Closing.")); break; case QAbstractSocket::BoundState: case QAbstractSocket::ListeningState: diff --git a/src/plugins/debugger/qml/qmlinspectoradapter.cpp b/src/plugins/debugger/qml/qmlinspectoradapter.cpp index 9528a1d5aff69d620fa6fefb0c978e2ab2d97786..677bbe99975a70576cebccc8c481fb75fa13e899 100644 --- a/src/plugins/debugger/qml/qmlinspectoradapter.cpp +++ b/src/plugins/debugger/qml/qmlinspectoradapter.cpp @@ -42,6 +42,7 @@ #include <coreplugin/editormanager/ieditor.h> #include <coreplugin/icore.h> #include <qmldebug/declarativeenginedebugclient.h> +#include <qmldebug/declarativeenginedebugclientv2.h> #include <qmldebug/declarativetoolsclient.h> #include <qmldebug/qmlenginedebugclient.h> #include <qmldebug/qmltoolsclient.h> @@ -96,13 +97,23 @@ QmlInspectorAdapter::QmlInspectorAdapter(QmlAdapter *debugAdapter, connect(engineClient2, SIGNAL(newStatus(QmlDebug::ClientStatus)), this, SLOT(engineClientStatusChanged(QmlDebug::ClientStatus))); + DeclarativeEngineDebugClientV2 *engineClient3 + = new DeclarativeEngineDebugClientV2(connection); + connect(engineClient3, SIGNAL(newStatus(QmlDebug::ClientStatus)), + this, SLOT(clientStatusChanged(QmlDebug::ClientStatus))); + connect(engineClient3, SIGNAL(newStatus(QmlDebug::ClientStatus)), + this, SLOT(engineClientStatusChanged(QmlDebug::ClientStatus))); + m_engineClients.insert(engineClient1->name(), engineClient1); m_engineClients.insert(engineClient2->name(), engineClient2); + m_engineClients.insert(engineClient3->name(), engineClient3); if (engineClient1->status() == QmlDebug::Enabled) setActiveEngineClient(engineClient1); if (engineClient2->status() == QmlDebug::Enabled) setActiveEngineClient(engineClient2); + if (engineClient3->status() == QmlDebug::Enabled) + setActiveEngineClient(engineClient3); DeclarativeToolsClient *toolsClient1 = new DeclarativeToolsClient(connection); connect(toolsClient1, SIGNAL(newStatus(QmlDebug::ClientStatus)), diff --git a/src/plugins/debugger/qml/qmlinspectoragent.cpp b/src/plugins/debugger/qml/qmlinspectoragent.cpp index c6fe7cb375e68429193f1a9a0c4f75d7d2fb61a9..314aae360f384dce06308b82d442fdc63e219510 100644 --- a/src/plugins/debugger/qml/qmlinspectoragent.cpp +++ b/src/plugins/debugger/qml/qmlinspectoragent.cpp @@ -42,6 +42,7 @@ #include <QElapsedTimer> using namespace QmlDebug; +using namespace QmlDebug::Constants; namespace Debugger { namespace Internal { @@ -97,6 +98,17 @@ void QmlInspectorAgent::assignValue(const WatchData *data, } } +int parentIdForIname(const QByteArray &iname) +{ + // Extract the parent id + int lastIndex = iname.lastIndexOf('.'); + int secondLastIndex = iname.lastIndexOf('.', lastIndex - 1); + int parentId = -1; + if (secondLastIndex != -1) + parentId = iname.mid(secondLastIndex + 1, lastIndex - secondLastIndex - 1).toInt(); + return parentId; +} + void QmlInspectorAgent::updateWatchData(const WatchData &data) { if (debug) @@ -104,6 +116,15 @@ void QmlInspectorAgent::updateWatchData(const WatchData &data) if (data.id && !m_fetchDataIds.contains(data.id)) { // objects + using namespace QmlDebug::Constants; + if (m_engineClient->objectName() == QLatin1String(QDECLARATIVE_ENGINE)) { + int parentId = parentIdForIname(data.iname); + if (parentId != -1) { + QList<int> childIds = m_debugIdChildIds.value(parentId); + childIds << data.id; + m_debugIdChildIds.insert(parentId, childIds); + } + } m_fetchDataIds << data.id; fetchObject(data.id); } @@ -424,7 +445,7 @@ void QmlInspectorAgent::onResult(quint32 queryId, const QVariant &value, } else if (type == "SET_BINDING_R" || type == "RESET_BINDING_R" || type == "SET_METHOD_BODY_R") { - QString msg = QLatin1String(type) + tr(" success : "); + QString msg = QLatin1String(type) + tr("Success: "); msg += value.toBool() ? QLatin1Char('1') : QLatin1Char('0'); if (!value.toBool()) emit automaticUpdateFailed(); @@ -440,10 +461,10 @@ void QmlInspectorAgent::onResult(quint32 queryId, const QVariant &value, foreach (QVariant var, objList) { // TODO: check which among the list is the actual // object that needs to be selected. - objectTreeFetched(qvariant_cast<ObjectReference>(var)); + insertObjectInTree(qvariant_cast<ObjectReference>(var)); } } else { - objectTreeFetched(qvariant_cast<ObjectReference>(value)); + insertObjectInTree(qvariant_cast<ObjectReference>(value)); } } else if (queryId == m_engineQueryId) { m_engineQueryId = 0; @@ -455,7 +476,7 @@ void QmlInspectorAgent::onResult(quint32 queryId, const QVariant &value, } else if (queryId == m_rootContextQueryId) { m_rootContextQueryId = 0; clearObjectTree(); - fetchObjectsInContextRecursive(qvariant_cast<ContextReference>(value)); + updateObjectTree(qvariant_cast<ContextReference>(value)); } else { emit expressionResult(queryId, value); } @@ -476,7 +497,7 @@ void QmlInspectorAgent::newObject(int engineId, int objectId, int /*parentId*/) return; m_newObjectsCreated = true; - if (m_engineClient->objectName() == QLatin1String(QmlDebug::Constants::QML_DEBUGGER)) + if (m_engineClient->objectName() != QLatin1String(QDECLARATIVE_ENGINE)) fetchObject(objectId); else m_delayQueryTimer.start(); @@ -583,8 +604,7 @@ void QmlInspectorAgent::fetchContextObjectsForLocation(const QString &file, m_objectTreeQueryIds << queryId; } -// fetch the root objects from the context + any child contexts -void QmlInspectorAgent::fetchObjectsInContextRecursive(const ContextReference &context) +void QmlInspectorAgent::updateObjectTree(const ContextReference &context) { if (debug) qDebug() << __FUNCTION__ << '(' << context << ')'; @@ -593,22 +613,14 @@ void QmlInspectorAgent::fetchObjectsInContextRecursive(const ContextReference &c || !debuggerCore()->boolSetting(ShowQmlObjectTree)) return; - foreach (const ObjectReference & obj, context.objects()) { - using namespace QmlDebug::Constants; - if (m_engineClient->objectName() == QLatin1String(QML_DEBUGGER) && - m_engineClient->serviceVersion() >= CURRENT_SUPPORTED_VERSION) { - //Fetch only root objects - if (obj.parentId() == -1) - fetchObject(obj.debugId()); - } else { - m_objectTreeQueryIds << m_engineClient->queryObjectRecursive(obj.debugId()); - } - } + foreach (const ObjectReference & obj, context.objects()) + insertObjectInTree(obj); + foreach (const ContextReference &child, context.contexts()) - fetchObjectsInContextRecursive(child); + updateObjectTree(child); } -void QmlInspectorAgent::objectTreeFetched(const ObjectReference &object) +void QmlInspectorAgent::insertObjectInTree(const ObjectReference &object) { if (debug) qDebug() << __FUNCTION__ << '(' << object << ')'; @@ -628,8 +640,8 @@ void QmlInspectorAgent::objectTreeFetched(const ObjectReference &object) ObjectReference last; QStack<QmlDebug::ObjectReference> stack; - // 4.x - if (m_newObjectsCreated && m_engineClient->objectName() != QLatin1String(QmlDebug::Constants::QML_DEBUGGER)) { + // qt <= 4.8.3 + if (m_newObjectsCreated && m_engineClient->objectName() == QLatin1String(QDECLARATIVE_ENGINE)) { // We need to reverse the stack as the root objects // are pushed to the bottom since they are fetched first. // The child objects need to placed in the correct position and therefore @@ -645,8 +657,8 @@ void QmlInspectorAgent::objectTreeFetched(const ObjectReference &object) int parentId = last.parentId(); QByteArray parentIname; - // 4.x - if (m_engineClient->objectName() != QLatin1String(QmlDebug::Constants::QML_DEBUGGER)) { + // qt <= 4.8.3 + if (m_engineClient->objectName() == QLatin1String(QDECLARATIVE_ENGINE)) { QHashIterator<int, QList<int> > i(m_debugIdChildIds); while (i.hasNext()) { i.next(); @@ -662,8 +674,8 @@ void QmlInspectorAgent::objectTreeFetched(const ObjectReference &object) fetchObject(parentId); return; } - // 5.x - if (m_engineClient->objectName() == QLatin1String(QmlDebug::Constants::QML_DEBUGGER) + // qt > 4.8.3 + if (m_engineClient->objectName() != QLatin1String(QDECLARATIVE_ENGINE) && m_newObjectsCreated && parentIname.isEmpty()) { if (watchData.count()) break; @@ -735,13 +747,14 @@ void QmlInspectorAgent::buildDebugIdHashRecursive(const ObjectReference &ref) m_debugIdHash[file][location].append(ref.debugId()); m_debugIdLocations.insert(ref.debugId(), FileReference(filePath, lineNum, colNum)); - // 4.x - if (m_newObjectsCreated && m_engineClient->objectName() != QLatin1String(QmlDebug::Constants::QML_DEBUGGER)) { - QList<int> childIds; + // qt <= 4.8.3 + if (m_newObjectsCreated + && m_engineClient->objectName() == QLatin1String(QDECLARATIVE_ENGINE)) { + QList<int> childIds = m_debugIdChildIds.value(ref.debugId()); foreach (const ObjectReference &c, ref.children()) { childIds << c.debugId(); } - // For 4.x, we do not get the parentId. Hence, store the child ids + // For qt <= 4.8.3, we do not get the parentId. Hence, store the child ids // to look up correct insertion places later m_debugIdChildIds.insert(ref.debugId(), childIds); } @@ -814,7 +827,7 @@ QList<WatchData> QmlInspectorAgent::buildWatchData(const ObjectReference &obj, WatchData propertiesWatch; propertiesWatch.id = objDebugId; propertiesWatch.exp = ""; - propertiesWatch.name = tr("properties"); + propertiesWatch.name = tr("Properties"); propertiesWatch.iname = objIname + ".[properties]"; propertiesWatch.type = ""; propertiesWatch.value = _("list"); @@ -867,18 +880,18 @@ bool QmlInspectorAgent::isConnected() const void QmlInspectorAgent::clearObjectTree() { // clear view - m_debuggerEngine->watchHandler()->removeChildren("inspect"); + m_debuggerEngine->watchHandler()->cleanup(); m_objectTreeQueryIds.clear(); - + m_fetchDataIds.clear(); int old_count = m_debugIdHash.count(); m_debugIdHash.clear(); m_debugIdHash.reserve(old_count + 1); m_debugIdToIname.clear(); m_debugIdChildIds.clear(); m_objectStack.clear(); - // reset only for 5.x. - if (m_engineClient->objectName() == QLatin1String(QmlDebug::Constants::QML_DEBUGGER)) + // reset only for qt > 4.8.3. + if (m_engineClient->objectName() != QLatin1String(QDECLARATIVE_ENGINE)) m_newObjectsCreated = false; removeAllObjectWatches(); diff --git a/src/plugins/debugger/qml/qmlinspectoragent.h b/src/plugins/debugger/qml/qmlinspectoragent.h index 2d4ad81aefbd0f5cf45028b0daee9c810b15ae98..a289483e7976738bef9c5273644cc37184f23d54 100644 --- a/src/plugins/debugger/qml/qmlinspectoragent.h +++ b/src/plugins/debugger/qml/qmlinspectoragent.h @@ -110,9 +110,9 @@ private slots: void onValueChanged(int debugId, const QByteArray &propertyName, const QVariant &value); private: - void fetchObjectsInContextRecursive(const QmlDebug::ContextReference &context); + void updateObjectTree(const QmlDebug::ContextReference &context); - void objectTreeFetched(const QmlDebug::ObjectReference &result); + void insertObjectInTree(const QmlDebug::ObjectReference &result); void buildDebugIdHashRecursive(const QmlDebug::ObjectReference &ref); QList<WatchData> buildWatchData(const QmlDebug::ObjectReference &obj, diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp index 1106cb78c982a51f339a2b080d29e05864d86dba..fcf5b224b16320fcc307562a9450646e22de4aae 100644 --- a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp +++ b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp @@ -978,8 +978,6 @@ QmlV8DebuggerClient::~QmlV8DebuggerClient() void QmlV8DebuggerClient::startSession() { - //Supports v2.0 and above - QTC_ASSERT(serviceVersion() >= CURRENT_SUPPORTED_VERSION, return); flushSendBuffer(); d->connect(); //Query for the V8 version. This is @@ -1635,7 +1633,7 @@ StackFrame QmlV8DebuggerClient::extractStackFrame(const QVariant &bodyVal, const QmlV8ObjectData objectData = d->extractData(body.value(_("func")), refsVal); QString functionName = objectData.value.toString(); if (functionName.isEmpty()) - functionName = tr("anonymous function"); + functionName = tr("Anonymous Function"); stackFrame.function = functionName; objectData = d->extractData(body.value(_("script")), refsVal); diff --git a/src/plugins/debugger/qml/qmlv8debuggerclientconstants.h b/src/plugins/debugger/qml/qmlv8debuggerclientconstants.h index 19935617c22370f9082fd97229579429e7ce7e7e..2f7c8f0ba47899061874a0c20e44aaec319f65de 100644 --- a/src/plugins/debugger/qml/qmlv8debuggerclientconstants.h +++ b/src/plugins/debugger/qml/qmlv8debuggerclientconstants.h @@ -34,7 +34,6 @@ namespace Debugger { namespace Internal { -const float CURRENT_SUPPORTED_VERSION = 2.0; const char V8REQUEST[] = "v8request"; const char V8MESSAGE[] = "v8message"; const char BREAKONSIGNAL[] = "breakonsignal"; diff --git a/src/plugins/debugger/sourcefileshandler.cpp b/src/plugins/debugger/sourcefileshandler.cpp index 50fb3289dde6fb38857b7aa0ca7493b2d512474d..cc75808f0fe543d6133eb8838de05d340fd827af 100644 --- a/src/plugins/debugger/sourcefileshandler.cpp +++ b/src/plugins/debugger/sourcefileshandler.cpp @@ -60,8 +60,8 @@ QVariant SourceFilesHandler::headerData(int section, { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { static QString headers[] = { - tr("Internal name") + QLatin1String(" "), - tr("Full name") + QLatin1String(" "), + tr("Internal Name") + QLatin1String(" "), + tr("Full Name") + QLatin1String(" "), }; return headers[section]; } diff --git a/src/plugins/debugger/stackwindow.cpp b/src/plugins/debugger/stackwindow.cpp index 2d6958f4dd6ade4f4162fb3ff2d4eaa249d19da6..3a2962ddf4be5281afc25e5592cc28b04d7050fb 100644 --- a/src/plugins/debugger/stackwindow.cpp +++ b/src/plugins/debugger/stackwindow.cpp @@ -225,9 +225,7 @@ void StackTreeView::copyContentsToClipboard() str += QLatin1Char('\n'); } QClipboard *clipboard = QApplication::clipboard(); -# ifdef Q_WS_X11 clipboard->setText(str, QClipboard::Selection); -# endif clipboard->setText(str, QClipboard::Clipboard); } diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp index 96d9fc3ecec2d1d3ac4b90505c4fd6bad85c85bb..45cb435b60ba40443bdc07c34bc1b9aca720a562 100644 --- a/src/plugins/debugger/watchwindow.cpp +++ b/src/plugins/debugger/watchwindow.cpp @@ -600,9 +600,7 @@ static QString removeWatchActionText(QString exp) static void copyToClipboard(const QString &clipboardText) { QClipboard *clipboard = QApplication::clipboard(); -#ifdef Q_WS_X11 clipboard->setText(clipboardText, QClipboard::Selection); -#endif clipboard->setText(clipboardText, QClipboard::Clipboard); } diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp index c9fa258eb23369215da94e680abb9cc87f472735..e935869d76c41895cd52b78c3808ac269c24f6b2 100644 --- a/src/plugins/git/gerrit/gerritplugin.cpp +++ b/src/plugins/git/gerrit/gerritplugin.cpp @@ -387,7 +387,7 @@ QString GerritPlugin::gitBinary() bool ok; const QString git = Git::Internal::GitPlugin::instance()->gitClient()->gitBinaryPath(&ok); if (!ok) { - VcsBase::VcsBaseOutputWindow::instance()->appendError(tr("git is not available.")); + VcsBase::VcsBaseOutputWindow::instance()->appendError(tr("Git is not available.")); return QString(); } return git; diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp index 1d26187b7cc2f78ed20a04df4945574dc0961b18..30d67bd30b5f4dc620fd804a8b42c471c2882f24 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp @@ -102,7 +102,6 @@ DeviceSettingsWidget::DeviceSettingsWidget(QWidget *parent) m_deviceManager(DeviceManager::cloneInstance()), m_deviceManagerModel(new DeviceManagerModel(m_deviceManager, this)), m_nameValidator(new NameValidator(m_deviceManager, this)), - m_saveSettingsRequested(false), m_additionalActionsMapper(new QSignalMapper(this)), m_configWidget(0) { @@ -115,11 +114,6 @@ DeviceSettingsWidget::DeviceSettingsWidget(QWidget *parent) DeviceSettingsWidget::~DeviceSettingsWidget() { - if (m_saveSettingsRequested) { - Core::ICore::settings()->setValue(QLatin1String(LastDeviceIndexKey), - currentIndex()); - DeviceManager::replaceInstance(); - } DeviceManager::removeClonedInstance(); delete m_configWidget; delete m_ui; @@ -237,10 +231,17 @@ void DeviceSettingsWidget::fillInValues() m_ui->nameLineEdit->setText(current->displayName()); } +void DeviceSettingsWidget::updateDeviceFromUi() +{ + deviceNameEditingFinished(); + if (m_configWidget) + m_configWidget->updateDeviceFromUi(); +} + void DeviceSettingsWidget::saveSettings() { - // We must defer this step because of a stupid bug on MacOS. See QTCREATORBUG-1675. - m_saveSettingsRequested = true; + Core::ICore::settings()->setValue(QLatin1String(LastDeviceIndexKey), currentIndex()); + DeviceManager::replaceInstance(); } int DeviceSettingsWidget::currentIndex() const @@ -329,12 +330,14 @@ void DeviceSettingsWidget::handleAdditionalActionRequest(int actionId) { const IDevice::ConstPtr device = m_deviceManager->find(currentDevice()->id()); QTC_ASSERT(device, return); + updateDeviceFromUi(); device->executeAction(Core::Id::fromUniqueIdentifier(actionId), this); } void DeviceSettingsWidget::handleProcessListRequested() { QTC_ASSERT(currentDevice()->canCreateProcessModel(), return); + updateDeviceFromUi(); DeviceProcessesDialog dlg; dlg.addCloseButton(); dlg.setDevice(currentDevice()); diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.h b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.h index 177315a959fc77cade86fb46ca25ab758dea4ca6..64a8491e3df42e0218226637f3364992b16191ee 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.h +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.h @@ -81,12 +81,12 @@ private: void clearDetails(); QString parseTestOutput(); void fillInValues(); + void updateDeviceFromUi(); Ui::DeviceSettingsWidget *m_ui; DeviceManager * const m_deviceManager; DeviceManagerModel * const m_deviceManagerModel; NameValidator * const m_nameValidator; - bool m_saveSettingsRequested; QList<QPushButton *> m_additionalActionButtons; QSignalMapper * const m_additionalActionsMapper; IDeviceWidget *m_configWidget; diff --git a/src/plugins/projectexplorer/devicesupport/idevicewidget.h b/src/plugins/projectexplorer/devicesupport/idevicewidget.h index 0b7ccf363c050bc063e82621376679c5d3a0c1cc..5b212efa7cac744d9cc62603c0cbf7fb5f46dded 100644 --- a/src/plugins/projectexplorer/devicesupport/idevicewidget.h +++ b/src/plugins/projectexplorer/devicesupport/idevicewidget.h @@ -50,6 +50,18 @@ namespace ProjectExplorer { class PROJECTEXPLORER_EXPORT IDeviceWidget : public QWidget { Q_OBJECT +public: + + /*! + * \brief Ensures that all changes in the UI are propagated to the device object. + * + * If the device is always updated right when the change happens, the implementation of + * this function can be empty. Note, however, that you cannot generally rely on the + * QLineEdit::editingFinished() signal being emitted on time if some button in the dialog is + * clicked (e.g. "Apply"). So if you have any handlers for line edit changes, they should + * probably be called here. + */ + virtual void updateDeviceFromUi() = 0; protected: IDeviceWidget(const IDevice::Ptr &device, QWidget *parent = 0) diff --git a/src/plugins/projectexplorer/kitinformation.h b/src/plugins/projectexplorer/kitinformation.h index ce6a6749dd756f23132cffddca2c44b35196a8f9..84127020d69afe58165d4b74d0d747e592ca7b76 100644 --- a/src/plugins/projectexplorer/kitinformation.h +++ b/src/plugins/projectexplorer/kitinformation.h @@ -78,9 +78,9 @@ public: SysRootMatcher(const Utils::FileName &fn) : m_sysroot(fn) { } - bool matches(const Kit *p) const + bool matches(const Kit *k) const { - return SysRootKitInformation::sysRoot(p) == m_sysroot; + return SysRootKitInformation::sysRoot(k) == m_sysroot; } private: @@ -125,9 +125,9 @@ public: ToolChainMatcher(const ToolChain *tc) : m_tc(tc) { } - bool matches(const Kit *p) const + bool matches(const Kit *k) const { - return ToolChainKitInformation::toolChain(p) == m_tc; + return ToolChainKitInformation::toolChain(k) == m_tc; } private: @@ -166,9 +166,9 @@ public: DeviceTypeMatcher(const Core::Id t) : m_type(t) { } - bool matches(const Kit *p) const + bool matches(const Kit *k) const { - Core::Id deviceType = DeviceTypeKitInformation::deviceTypeId(p); + Core::Id deviceType = DeviceTypeKitInformation::deviceTypeId(k); if (!deviceType.isValid()) return false; return deviceType == m_type; @@ -214,9 +214,9 @@ public: DeviceMatcher(Core::Id id) : m_devId(id) { } - bool matches(const Kit *p) const + bool matches(const Kit *k) const { - return DeviceKitInformation::deviceId(p) == m_devId; + return DeviceKitInformation::deviceId(k) == m_devId; } private: diff --git a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp index da8903581fd4be768edb45ff6d50d38f17c70b83..7fdfb5cf671a663d5cfbef8135815714c3cdcce2 100644 --- a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp @@ -165,7 +165,7 @@ bool ToolChainInformationConfigWidget::isDirty() const { ToolChain *tc = ToolChainKitInformation::toolChain(m_kit); return (m_comboBox->itemData(m_comboBox->currentIndex()).toString()) - == (tc ? tc->id() : QString()); + != (tc ? tc->id() : QString()); } void ToolChainInformationConfigWidget::makeReadOnly() @@ -308,6 +308,9 @@ DeviceInformationConfigWidget::DeviceInformationConfigWidget(Kit *k, QWidget *pa m_comboBox(new QComboBox), m_manageButton(new QPushButton(this)), m_model(new DeviceManagerModel(DeviceManager::instance())) { + connect(m_model, SIGNAL(modelAboutToBeReset()), SLOT(modelAboutToReset())); + connect(m_model, SIGNAL(modelReset()), SLOT(modelReset())); + setToolTip(tr("The device to run the applications on.")); QHBoxLayout *layout = new QHBoxLayout(this); @@ -368,5 +371,15 @@ void DeviceInformationConfigWidget::manageDevices() QLatin1String(ProjectExplorer::Constants::DEVICE_SETTINGS_PAGE_ID)); } +void DeviceInformationConfigWidget::modelAboutToReset() +{ + m_selectedId = m_model->deviceId(m_comboBox->currentIndex()); +} + +void DeviceInformationConfigWidget::modelReset() +{ + m_comboBox->setCurrentIndex(m_model->indexForId(m_selectedId)); +} + } // namespace Internal } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/kitinformationconfigwidget.h b/src/plugins/projectexplorer/kitinformationconfigwidget.h index f338b9be4cc68fe0a29f1b6d2aec7ebfe6576770..632ce87ba59fc10dfe69f4f483f09ac63dc0de7d 100644 --- a/src/plugins/projectexplorer/kitinformationconfigwidget.h +++ b/src/plugins/projectexplorer/kitinformationconfigwidget.h @@ -33,6 +33,8 @@ #include "kitconfigwidget.h" +#include <coreplugin/id.h> + QT_BEGIN_NAMESPACE class QComboBox; class QPushButton; @@ -148,6 +150,8 @@ public: private slots: void manageDevices(); + void modelAboutToReset(); + void modelReset(); private: bool m_isReadOnly; @@ -155,6 +159,7 @@ private: QComboBox *m_comboBox; QPushButton *m_manageButton; DeviceManagerModel *m_model; + Core::Id m_selectedId; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index e90cd6dfe8654e9ba6e2faf2ec415d31aa8c77db..b5093acc26f7b5007404a8487936a510a65c2df2 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -284,14 +284,18 @@ KitManager::KitList KitManager::restoreKits(const Utils::FileName &fileName) KitList result; PersistentSettingsReader reader; - if (!reader.load(fileName)) + if (!reader.load(fileName)) { + qWarning("Warning: Failed to read \"%s\", can not restore kits!", qPrintable(fileName.toUserOutput())); return result; + } QVariantMap data = reader.restoreValues(); // Check version: int version = data.value(QLatin1String(KIT_FILE_VERSION_KEY), 0).toInt(); - if (version < 1) + if (version < 1) { + qWarning("Warning: Kit file version %d not supported, can not restore kits!", version); return result; + } const int count = data.value(QLatin1String(KIT_COUNT_KEY), 0).toInt(); for (int i = 0; i < count; ++i) { diff --git a/src/plugins/projectexplorer/kitmodel.cpp b/src/plugins/projectexplorer/kitmodel.cpp index 9e79e4b2ef1b6f0b7b2da2d9c13ba9be9c483a6a..cbfc99969581f111310b7af0428501761632a309 100644 --- a/src/plugins/projectexplorer/kitmodel.cpp +++ b/src/plugins/projectexplorer/kitmodel.cpp @@ -266,7 +266,7 @@ void KitModel::setDirty() KitConfigWidget *w = qobject_cast<KitConfigWidget *>(sender()); foreach (KitNode *n, m_manualRoot->childNodes) { if (n->widget == w) { - n->changed = true; + n->changed = n->widget->isDirty(); emit dataChanged(index(n, 0), index(n, columnCount(QModelIndex()))); } } diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 0f23a403d34835c6be3bb972bef69613548e194b..b00c48ba2f80f3876e5160081f9ebcf5359cd536 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -266,7 +266,7 @@ Target *Project::restoreTarget(const QVariantMap &data) Kit *k = KitManager::instance()->find(id); if (!k) { - qWarning("Warning: No profile '%s' found. Continuing.", qPrintable(id.toString())); + qWarning("Warning: No kit '%s' found. Continuing.", qPrintable(id.toString())); return 0; } diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index 92e2e7bdccf68551ffce5b8c560fac6dcd6afdbd..5c3d702b59157e82db21418eb3fdc46c47df3363 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -188,6 +188,7 @@ void Target::handleKitUpdates(Kit *k) setDisplayName(k->displayName()); setIcon(k->icon()); updateDefaultDeployConfigurations(); + updateDeviceState(); // in case the device changed... emit kitChanged(); } diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h index 4fb87066a6d1d24f0ea4f42fa0cbe87f0d9b2e06..f35c5d1d1e1e4409388eae1f90568b69a9009646 100644 --- a/src/plugins/projectexplorer/target.h +++ b/src/plugins/projectexplorer/target.h @@ -59,7 +59,7 @@ class PROJECTEXPLORER_EXPORT Target : public ProjectConfiguration Q_OBJECT public: - Target(Project *parent, Kit *p); + Target(Project *parent, Kit *k); ~Target(); Project *project() const; diff --git a/src/plugins/qmlprofiler/qmlprofilereventview.cpp b/src/plugins/qmlprofiler/qmlprofilereventview.cpp index 5147bcea0809906887d6a54e84988f56ea685593..33d0d14c9797e827039a7b2df865e795b8eadae6 100644 --- a/src/plugins/qmlprofiler/qmlprofilereventview.cpp +++ b/src/plugins/qmlprofiler/qmlprofilereventview.cpp @@ -184,7 +184,7 @@ void QmlProfilerEventsWidget::switchToV8View() d->m_eventTree->setViewType(QmlProfilerEventsMainView::V8ProfileView); d->m_eventParents->setViewType(QmlProfilerEventsParentsAndChildrenView::V8ParentsView); d->m_eventChildren->setViewType(QmlProfilerEventsParentsAndChildrenView::V8ChildrenView); - setToolTip(tr("Trace information from the v8 JavaScript engine. Available only in Qt5 based applications")); + setToolTip(tr("Trace information from the v8 JavaScript engine. Available only in Qt5 based applications.")); } void QmlProfilerEventsWidget::clear() @@ -614,7 +614,7 @@ void QmlProfilerEventsMainView::QmlProfilerEventsMainViewPrivate::buildModelFrom typeString = typeString + tr(" (Opt)"); toolTipText = tr("Binding is evaluated by the optimized engine."); } else if (binding->bindingType == (int)V8Binding) { - toolTipText = tr("Binding not optimized (eg. has side effects or assignments,\n" + toolTipText = tr("Binding not optimized (e.g. has side effects or assignments,\n" "references to elements in other files, loops, etc.)"); } @@ -681,7 +681,7 @@ void QmlProfilerEventsMainView::QmlProfilerEventsMainViewPrivate::buildModelFrom if (binding->isBindingLoop) foreach (QStandardItem *item, newRow) { item->setBackground(colors()->bindingLoopBackground); - item->setToolTip(tr("Binding loop detected")); + item->setToolTip(tr("Binding loop detected.")); } // append @@ -921,9 +921,7 @@ void QmlProfilerEventsMainView::copyTableToClipboard() const str += d->textForItem(d->m_model->item(i)); } QClipboard *clipboard = QApplication::clipboard(); -# ifdef Q_WS_X11 clipboard->setText(str, QClipboard::Selection); -# endif clipboard->setText(str, QClipboard::Clipboard); } @@ -933,9 +931,7 @@ void QmlProfilerEventsMainView::copyRowToClipboard() const str = d->textForItem(d->m_model->itemFromIndex(selectedItem()), false); QClipboard *clipboard = QApplication::clipboard(); -# ifdef Q_WS_X11 clipboard->setText(str, QClipboard::Selection); -# endif clipboard->setText(str, QClipboard::Clipboard); } @@ -1041,7 +1037,7 @@ void QmlProfilerEventsParentsAndChildrenView::rebuildTree(void *profilerDataMode if (event->inLoopPath) foreach (QStandardItem *item, newRow) { item->setBackground(colors()->bindingLoopBackground); - item->setToolTip(tr("Part of binding loop")); + item->setToolTip(tr("Part of binding loop.")); } } else { QV8EventSub *event = v8List->at(index); diff --git a/src/plugins/qnx/blackberrydeviceconfigurationwidget.cpp b/src/plugins/qnx/blackberrydeviceconfigurationwidget.cpp index c4d94d90237028dcdf54f203d630d69d1fee48c9..0cc62a6a69eede0e8abe5888accc24238a64dfbd 100644 --- a/src/plugins/qnx/blackberrydeviceconfigurationwidget.cpp +++ b/src/plugins/qnx/blackberrydeviceconfigurationwidget.cpp @@ -93,6 +93,14 @@ void BlackBerryDeviceConfigurationWidget::debugTokenEditingFinished() deviceConfiguration()->setDebugToken(ui->debugToken->path()); } +void BlackBerryDeviceConfigurationWidget::updateDeviceFromUi() +{ + hostNameEditingFinished(); + passwordEditingFinished(); + keyFileEditingFinished(); + debugTokenEditingFinished(); +} + void BlackBerryDeviceConfigurationWidget::initGui() { ui->debugToken->setExpectedKind(Utils::PathChooser::File); diff --git a/src/plugins/qnx/blackberrydeviceconfigurationwidget.h b/src/plugins/qnx/blackberrydeviceconfigurationwidget.h index 299ec4cc9c0b3c139b0fb227f21d351a36fd468a..fb8b207dcc36cb92af3e2139199565096e912761 100644 --- a/src/plugins/qnx/blackberrydeviceconfigurationwidget.h +++ b/src/plugins/qnx/blackberrydeviceconfigurationwidget.h @@ -62,6 +62,7 @@ private slots: void debugTokenEditingFinished(); private: + void updateDeviceFromUi(); void initGui(); BlackBerryDeviceConfiguration::Ptr deviceConfiguration() const; diff --git a/src/plugins/qt4projectmanager/qt4targetsetupwidget.cpp b/src/plugins/qt4projectmanager/qt4targetsetupwidget.cpp index e5caae7e6403b356007773a65b43db02d88da6f8..fc61671b0ca129657241546ed99da3aff883fbb9 100644 --- a/src/plugins/qt4projectmanager/qt4targetsetupwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4targetsetupwidget.cpp @@ -230,7 +230,8 @@ void Qt4TargetSetupWidget::manageKit() page->showKit(m_kit); Core::ICore::showOptionsDialog(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY), - QLatin1String(ProjectExplorer::Constants::KITS_SETTINGS_PAGE_ID)); + QLatin1String(ProjectExplorer::Constants::KITS_SETTINGS_PAGE_ID), + this); } void Qt4TargetSetupWidget::setProFilePath(const QString &proFilePath) diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index fa822d067fb1701ff265f8672fdeb29ad5a128e4..d8d5abb3b9000c16b96bdef90b015d80bbad6d63 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -511,20 +511,25 @@ void TargetSetupPage::setupImports() if (!m_importSearch || m_proFilePath.isEmpty()) return; - QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); - import(Utils::FileName::fromString(sourceDir), true); + QFileInfo pfi(m_proFilePath); + const QString prefix = pfi.baseName(); + QStringList toImport; + toImport << pfi.absolutePath(); QList<ProjectExplorer::Kit *> kitList = ProjectExplorer::KitManager::instance()->kits(); foreach (ProjectExplorer::Kit *k, kitList) { QFileInfo fi(Qt4Project::shadowBuildDirectory(m_proFilePath, k, QString())); const QString baseDir = fi.absolutePath(); - const QString prefix = fi.baseName(); foreach (const QString &dir, QDir(baseDir).entryList()) { - if (dir.startsWith(prefix)) - import(Utils::FileName::fromString(baseDir + QLatin1Char('/') + dir), true); + const QString path = baseDir + QLatin1Char('/') + dir; + if (dir.startsWith(prefix) && !toImport.contains(path)) + toImport << path; + } } + foreach (const QString &path, toImport) + import(Utils::FileName::fromString(path), true); } void TargetSetupPage::handleKitAddition(ProjectExplorer::Kit *k) @@ -609,7 +614,8 @@ void TargetSetupPage::updateVisibility() void TargetSetupPage::openOptions() { Core::ICore::instance()->showOptionsDialog(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY), - QLatin1String(ProjectExplorer::Constants::KITS_SETTINGS_PAGE_ID)); + QLatin1String(ProjectExplorer::Constants::KITS_SETTINGS_PAGE_ID), + this); } void TargetSetupPage::removeWidget(ProjectExplorer::Kit *k) diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index 9dfec0343da745696b44df576ad2c3970bdc9814..e533246d0f4e00dba65598b3ecb777d47b9c8139 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -635,7 +635,7 @@ void QtOptionsPageWidget::addQtDir() { Utils::FileName qtVersion = Utils::FileName::fromString( QFileInfo(QFileDialog::getOpenFileName(this, - tr("Select a qmake executable"), + tr("Select a qmake Executable"), QString(), filterForQmakeFileDialog(), 0, @@ -645,7 +645,7 @@ void QtOptionsPageWidget::addQtDir() BaseQtVersion *version = QtVersionManager::instance()->qtVersionForQMakeBinary(qtVersion); if (version) { // Already exist - QMessageBox::warning(this, tr("Qt known"), + QMessageBox::warning(this, tr("Qt Version Already Registered"), tr("This Qt version was already registered as \"%1\".") .arg(version->displayName())); return; diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp index b2d87407c2bcb4b6f944144bb725d9a4c6d44928..343c19a8d430bf38a76f6bf369b89687b649780c 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.cpp @@ -151,6 +151,17 @@ void GenericLinuxDeviceConfigurationWidget::createNewKey() setPrivateKey(dialog.privateKeyFilePath()); } +void GenericLinuxDeviceConfigurationWidget::updateDeviceFromUi() +{ + hostNameEditingFinished(); + sshPortEditingFinished(); + timeoutEditingFinished(); + userNameEditingFinished(); + passwordEditingFinished(); + keyFileEditingFinished(); + handleFreePortsChanged(); +} + void GenericLinuxDeviceConfigurationWidget::updatePortsWarningLabel() { m_ui->portsWarningLabel->setVisible(!device()->freePorts().hasMore()); diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h index 0b996fb1e92ec14583339f6af00cfa4a81eeb13f..3a0d2f12296254dd85eba4c6de0dbafde5275686 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwidget.h @@ -64,6 +64,7 @@ private slots: void createNewKey(); private: + void updateDeviceFromUi(); void updatePortsWarningLabel(); void initGui(); diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp index fce4f33299b0cde9c8131d861c95067850f9b1d6..b97399d7b81b461f607af09eb4316391c855b0d4 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp @@ -252,6 +252,7 @@ public: QPointer<GenericProposalInfoFrame> m_infoFrame; QTimer m_infoTimer; CodeAssistant *m_assistant; + bool m_autoWidth; public slots: void handleActivation(const QModelIndex &modelIndex); @@ -266,6 +267,7 @@ GenericProposalWidgetPrivate::GenericProposalWidgetPrivate(QWidget *completionWi , m_explicitlySelected(false) , m_justInvoked(false) , m_assistant(0) + , m_autoWidth(true) { connect(m_completionListView, SIGNAL(activated(QModelIndex)), this, SLOT(handleActivation(QModelIndex))); @@ -330,6 +332,10 @@ GenericProposalWidget::GenericProposalWidget() d->m_completionListView->setMinimumSize(1, 1); connect(d->m_completionListView->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(updatePositionAndSize())); + connect(d->m_completionListView->verticalScrollBar(), SIGNAL(sliderPressed()), + this, SLOT(turnOffAutoWidth())); + connect(d->m_completionListView->verticalScrollBar(), SIGNAL(sliderReleased()), + this, SLOT(turnOnAutoWidth())); QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); @@ -494,6 +500,9 @@ bool GenericProposalWidget::updateAndCheck(const QString &prefix) void GenericProposalWidget::updatePositionAndSize() { + if (!d->m_autoWidth) + return; + const QSize &shint = d->m_completionListView->calculateSize(); const int fw = frameWidth(); const int width = shint.width() + fw * 2 + 30; @@ -514,6 +523,17 @@ void GenericProposalWidget::updatePositionAndSize() setGeometry(pos.x(), pos.y(), width, height); } +void GenericProposalWidget::turnOffAutoWidth() +{ + d->m_autoWidth = false; +} + +void GenericProposalWidget::turnOnAutoWidth() +{ + d->m_autoWidth = true; + updatePositionAndSize(); +} + bool GenericProposalWidget::eventFilter(QObject *o, QEvent *e) { if (e->type() == QEvent::FocusOut) { diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.h b/src/plugins/texteditor/codeassist/genericproposalwidget.h index 745f7d51bcecc9675791f1690cf8bb18c95373aa..77a1688ef3f55089b8e230c2b6eb42e19ca52ce0 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.h +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.h @@ -65,6 +65,8 @@ private: private slots: void updatePositionAndSize(); + void turnOffAutoWidth(); + void turnOnAutoWidth(); protected: virtual bool eventFilter(QObject *o, QEvent *e); diff --git a/src/plugins/texteditor/findinopenfiles.cpp b/src/plugins/texteditor/findinopenfiles.cpp index 2c7e942a7939049d305227e978ef0116bf57244c..979417f5d4fda075cbabbe51cfb74602b2dce3bb 100644 --- a/src/plugins/texteditor/findinopenfiles.cpp +++ b/src/plugins/texteditor/findinopenfiles.cpp @@ -89,7 +89,7 @@ QVariant FindInOpenFiles::additionalParameters() const QString FindInOpenFiles::label() const { - return tr("Open Documents:"); + return tr("Open documents:"); } QString FindInOpenFiles::toolTip() const diff --git a/src/plugins/texteditor/fontsettings.cpp b/src/plugins/texteditor/fontsettings.cpp index 219fab2a8beec93ef8a6ddd13cc1422d3e0c01ba..ada0f6fcaf7ea5a073317a5e72a6e9d75161a5ae 100644 --- a/src/plugins/texteditor/fontsettings.cpp +++ b/src/plugins/texteditor/fontsettings.cpp @@ -55,15 +55,13 @@ static const bool DEFAULT_ANTIALIAS = true; #ifdef Q_OS_MAC enum { DEFAULT_FONT_SIZE = 12 }; static const char *DEFAULT_FONT_FAMILY = "Monaco"; -#else -#ifdef Q_WS_X11 +#elif defined(Q_OS_UNIX) enum { DEFAULT_FONT_SIZE = 9 }; static const char *DEFAULT_FONT_FAMILY = "Monospace"; #else enum { DEFAULT_FONT_SIZE = 10 }; static const char *DEFAULT_FONT_FAMILY = "Courier"; #endif -#endif } // anonymous namespace namespace TextEditor { diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 445bf48ac1365ce2df7586055439cbb75f2731cc..4afb3cb95413470a4320d075382596823646187e 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -510,8 +510,8 @@ void UrlTextCursorHandler::fillContextMenu(QMenu *menu, EditorContentType type) { Q_UNUSED(type); menu->addSeparator(); - menu->addAction(createOpenUrlAction(tr("Open URL in browser..."))); - menu->addAction(createCopyUrlAction(tr("Copy URL location"))); + menu->addAction(createOpenUrlAction(tr("Open URL in Browser..."))); + menu->addAction(createCopyUrlAction(tr("Copy URL Location"))); } QString UrlTextCursorHandler::currentContents() const @@ -575,8 +575,8 @@ void EmailTextCursorHandler::fillContextMenu(QMenu *menu, EditorContentType type { Q_UNUSED(type); menu->addSeparator(); - menu->addAction(createOpenUrlAction(tr("Send email to..."))); - menu->addAction(createCopyUrlAction(tr("Copy email address"))); + menu->addAction(createOpenUrlAction(tr("Send Email To..."))); + menu->addAction(createCopyUrlAction(tr("Copy Email Address"))); } void EmailTextCursorHandler::slotOpenUrl() diff --git a/src/tools/sdktool/README.txt b/src/tools/sdktool/README.txt index be6f2225ff3844e4eca4b21712e4cd1348c186c8..9e21e73cbbdca86430aec1c4d45eefee4a42d5f8 100644 --- a/src/tools/sdktool/README.txt +++ b/src/tools/sdktool/README.txt @@ -119,6 +119,7 @@ Add a Kit using the newly set up tool chain and Qt version: Tricky parts: - debuggerengine is the integer used in the enum Debugger::DebuggerEngineType The most important type is 1 for GDB. + - debugger can be a absolute path or the value: 'auto' - devicetype is the string returned IDevice::type() diff --git a/src/tools/sdktool/addkeysoperation.cpp b/src/tools/sdktool/addkeysoperation.cpp index 4cc898088a1580d970bea6dba371c145f3511792..f87dcacdccb3e64602ce0965ce56ee92129101e7 100644 --- a/src/tools/sdktool/addkeysoperation.cpp +++ b/src/tools/sdktool/addkeysoperation.cpp @@ -113,7 +113,7 @@ bool AddKeysOperation::test() const data.append(KeyValuePair(QLatin1String("newsub/1/2.1/3/qbytearray"), QString::fromLatin1("QByteArray:test array."))); QVariantMap result = addKeys(testMap, data); - if (!result.count() == 8) + if (result.count() != 8) return false; // subkeys: diff --git a/src/tools/sdktool/addkitoperation.cpp b/src/tools/sdktool/addkitoperation.cpp index ba5a05d46fe2982b2d681364db10543084a6352f..4fd5104efb76da2bb61be90dbaff41e576bf2b58 100644 --- a/src/tools/sdktool/addkitoperation.cpp +++ b/src/tools/sdktool/addkitoperation.cpp @@ -63,6 +63,12 @@ static char TOOLCHAIN[] = "PE.Profile.ToolChain"; static char MKSPEC[] = "QtPM4.mkSpecInformation"; static char QT[] = "QtSupport.QtInformation"; +AddKitOperation::AddKitOperation() + : m_debuggerEngine(0) + , m_debugger(QLatin1String("auto")) +{ +} + QString AddKitOperation::name() const { return QLatin1String("addKit"); @@ -216,7 +222,7 @@ bool AddKitOperation::test() const { QVariantMap map = initializeKits(); - if (!map.count() == 3 + if (map.count() != 3 || !map.contains(QLatin1String(VERSION)) || map.value(QLatin1String(VERSION)).toInt() != 1 || !map.contains(QLatin1String(COUNT)) @@ -231,7 +237,7 @@ bool AddKitOperation::test() const QLatin1String("{some-tc-id}"), QLatin1String("{some-qt-id}"), QLatin1String("unsupported/mkspec"), KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue")))); - if (!map.count() == 4 + if (map.count() != 4 || !map.contains(QLatin1String(VERSION)) || map.value(QLatin1String(VERSION)).toInt() != 1 || !map.contains(QLatin1String(COUNT)) @@ -242,7 +248,7 @@ bool AddKitOperation::test() const return false; QVariantMap profile0 = map.value(QLatin1String("Profile.0")).toMap(); - if (!profile0.count() == 6 + if (profile0.count() != 6 || !profile0.contains(QLatin1String(ID)) || profile0.value(QLatin1String(ID)).toString() != QLatin1String("testId") || !profile0.contains(QLatin1String(DISPLAYNAME)) @@ -266,7 +272,7 @@ bool AddKitOperation::test() const QLatin1String("Desktop"), QString(), QLatin1String("{some-tc-id2}"), QLatin1String("{some-qt-id2}"), QLatin1String("unsupported/mkspec2"), KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue2")))); - if (!map.count() == 5 + if (map.count() != 5 || !map.contains(QLatin1String(VERSION)) || map.value(QLatin1String(VERSION)).toInt() != 1 || !map.contains(QLatin1String(COUNT)) @@ -280,7 +286,7 @@ bool AddKitOperation::test() const return false; QVariantMap profile1 = map.value(QLatin1String("Profile.1")).toMap(); - if (!profile1.count() == 6 + if (profile1.count() != 6 || !profile1.contains(QLatin1String(ID)) || profile1.value(QLatin1String(ID)).toString() != QLatin1String("testId2") || !profile1.contains(QLatin1String(DISPLAYNAME)) diff --git a/src/tools/sdktool/addkitoperation.h b/src/tools/sdktool/addkitoperation.h index e526bcb604463aa06e86f5b16d93b55c3e7addf3..e1910674b3260d51a3710b916b47727a9b2f92c9 100644 --- a/src/tools/sdktool/addkitoperation.h +++ b/src/tools/sdktool/addkitoperation.h @@ -38,6 +38,8 @@ class AddKitOperation : public Operation { public: + AddKitOperation(); + QString name() const; QString helpText() const; QString argumentsHelpText() const; diff --git a/src/tools/sdktool/addqtoperation.cpp b/src/tools/sdktool/addqtoperation.cpp index 7ed44d77541a1e00a32a44fd036501b9f963222f..c643e2a6255322056c4d7225d019d90638ca9bc8 100644 --- a/src/tools/sdktool/addqtoperation.cpp +++ b/src/tools/sdktool/addqtoperation.cpp @@ -149,14 +149,14 @@ bool AddQtOperation::test() const QLatin1String("/tmp/test/qmake"), KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue")))); - if (!map.count() == 2 + if (map.count() != 2 || !map.contains(QLatin1String(VERSION)) || map.value(QLatin1String(VERSION)).toInt() != 1 || !map.contains(QLatin1String("QtVersion.0"))) return false; QVariantMap version0 = map.value(QLatin1String("QtVersion.0")).toMap(); - if (!version0.count() == 6 + if (version0.count() != 6 || !version0.contains(QLatin1String(ID)) || version0.value(QLatin1String(ID)).toInt() != -1 || !version0.contains(QLatin1String(DISPLAYNAME)) @@ -184,7 +184,7 @@ bool AddQtOperation::test() const map = addQt(map, QLatin1String("testId2"), QLatin1String("Test Qt Version"), QLatin1String("testType3"), QLatin1String("/tmp/test/qmake2"), KeyValuePairList() << KeyValuePair(QLatin1String("extraData"), QVariant(QLatin1String("extraValue")))); - if (!map.count() == 3 + if (map.count() != 3 || !map.contains(QLatin1String(VERSION)) || map.value(QLatin1String(VERSION)).toInt() != 1 || !map.contains(QLatin1String("QtVersion.0")) @@ -195,7 +195,7 @@ bool AddQtOperation::test() const return false; QVariantMap version1 = map.value(QLatin1String("QtVersion.1")).toMap(); - if (!version1.count() == 6 + if (version1.count() != 6 || !version1.contains(QLatin1String(ID)) || version1.value(QLatin1String(ID)).toInt() != -1 || !version1.contains(QLatin1String(DISPLAYNAME)) diff --git a/src/tools/sdktool/addtoolchainoperation.cpp b/src/tools/sdktool/addtoolchainoperation.cpp index 01317d7b9a0252526147e3f15ca96ca7329c9d9d..73acc045f8682acde5b104ebbdf2cff74d402b08 100644 --- a/src/tools/sdktool/addtoolchainoperation.cpp +++ b/src/tools/sdktool/addtoolchainoperation.cpp @@ -183,7 +183,7 @@ bool AddToolChainOperation::test() const map = addToolChain(map, QLatin1String("testId2"), QLatin1String("name"), QLatin1String("/tmp/test"), QLatin1String("test-abi"), QLatin1String("test-abi,test-abi2"), KeyValuePairList() << KeyValuePair(QLatin1String("ExtraKey"), QVariant(QLatin1String("ExtraValue")))); - if (!map.value(QLatin1String(COUNT)).toInt() == 2 + if (map.value(QLatin1String(COUNT)).toInt() != 2 || !map.contains(QString::fromLatin1(PREFIX) + QLatin1Char('0')) || !map.contains(QString::fromLatin1(PREFIX) + QLatin1Char('1'))) return false; diff --git a/tests/system/objects.map b/tests/system/objects.map index ce30f1bdafdef0da47d77f4e89c4dd24a93242ff..98896e6c4f837a49fef3a5a65c6dedf064eb5202 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -105,6 +105,8 @@ :QtSupport__Internal__QtVersionManager.QLabel {container=':qt_tabwidget_stackedwidget.QtSupport__Internal__QtVersionManager_QtSupport::Internal::QtOptionsPageWidget' type='QLabel' unnamed='1' visible='1'} :QtSupport__Internal__QtVersionManager.qmake_QLabel {container=':qt_tabwidget_stackedwidget.QtSupport__Internal__QtVersionManager_QtSupport::Internal::QtOptionsPageWidget' name='qmakePath' type='QLabel' visible='1'} :QtSupport__Internal__QtVersionManager.qtdirList_QTreeWidget {container=':qt_tabwidget_stackedwidget.QtSupport__Internal__QtVersionManager_QtSupport::Internal::QtOptionsPageWidget' name='qtdirList' type='QTreeWidget' visible='1'} +:Revert to Saved.Proceed_QPushButton {text='Proceed' type='QPushButton' unnamed='1' visible='1' window=':Revert to Saved_QMessageBox'} +:Revert to Saved_QMessageBox {text?='You will lose your current changes if you proceed reverting*' type='QMessageBox' unnamed='1' visible='1'} :Startup.contextHelpComboBox_QComboBox {container=':Form.Startup_QGroupBox' name='contextHelpComboBox' type='QComboBox' visible='1'} :Symbol Server_Utils::CheckableMessageBox {type='Utils::CheckableMessageBox' unnamed='1' visible='1' windowTitle='Symbol Server'} :addToVersionControlComboBox_QComboBox {name='addToVersionControlComboBox' type='QComboBox' visible='1'} diff --git a/tests/system/settings/unix/Nokia/qtcreator/toolchains.xml b/tests/system/settings/unix/Nokia/qtcreator/toolchains.xml index 05a7e5e39b675c23b899dd8170ce8ab58ea0e9f5..a2525c73ac07224f2b6c4965bf85fadf1184619c 100644 --- a/tests/system/settings/unix/Nokia/qtcreator/toolchains.xml +++ b/tests/system/settings/unix/Nokia/qtcreator/toolchains.xml @@ -10,6 +10,7 @@ <value type="QString">x86-linux-generic-elf-64bit</value> <value type="QString">x86-linux-generic-elf-32bit</value> </valuelist> + <value type="QString" key="ProjectExplorer.GccToolChain.TargetAbi">SET_BY_SQUISH</value> <value type="bool" key="ProjectExplorer.ToolChain.Autodetect">false</value> <value type="QString" key="ProjectExplorer.ToolChain.DisplayName">GCC</value> <value type="QString" key="ProjectExplorer.ToolChain.Id">ProjectExplorer.ToolChain.Gcc:{c3f59b87-6997-4bd8-8067-ee04dc536371}</value> diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py index 1bb7c5d3fcb8b12574632c83eb9df11919ccc843..6ae6dc9cc4eb4eb872eb7007ef3566aac5ef12ad 100644 --- a/tests/system/shared/qtcreator.py +++ b/tests/system/shared/qtcreator.py @@ -5,6 +5,7 @@ import glob; import atexit; import codecs; import subprocess; +import sys import errno; from datetime import datetime,timedelta; @@ -83,6 +84,69 @@ def substituteTildeWithinToolchains(settingsDir): os.remove(origToolchains) test.log("Substituted all tildes with '%s' inside toolchains.xml..." % home) +def __guessABI__(supportedABIs, use64Bit): + if use64Bit: + searchFor = "64bit" + else: + searchFor = "32bit" + for abi in supportedABIs: + if searchFor in abi: + return abi + if use64Bit: + test.log("Supported ABIs do not include an ABI supporting 64bit - trying 32bit now") + return __guessABI__(supportedABIs, False) + test.fatal('Could not guess ABI!', + 'Given ABIs: %s' % str(supportedABIs)) + return '' + +def __is64BitOS__(): + if platform.system() == 'Darwin': + return sys.maxsize > (2 ** 32) + if platform.system() in ('Microsoft', 'Windows'): + machine = os.getenv("PROCESSOR_ARCHITEW6432", os.getenv("PROCESSOR_ARCHITECTURE")) + else: + machine = platform.machine() + if machine: + return '64' in machine + else: + return False + +def substituteUnchosenTargetABIs(settingsDir): + class ReadState: + NONE = 0 + READING = 1 + CLOSED = 2 + + on64Bit = __is64BitOS__() + toolchains = os.path.join(settingsDir, "Nokia", 'qtcreator', 'toolchains.xml') + origToolchains = toolchains + "_orig" + os.rename(toolchains, origToolchains) + origFile = open(origToolchains, "r") + modifiedFile = open(toolchains, "w") + supported = [] + readState = ReadState.NONE + for line in origFile: + if readState == ReadState.NONE: + if "SupportedAbis" in line: + supported = [] + readState = ReadState.READING + elif readState == ReadState.READING: + if "</valuelist>" in line: + readState = ReadState.CLOSED + else: + supported.append(line.split(">", 1)[1].rsplit("<", 1)[0]) + elif readState == ReadState.CLOSED: + if "SupportedAbis" in line: + supported = [] + readState = ReadState.READING + elif "SET_BY_SQUISH" in line: + line = line.replace("SET_BY_SQUISH", __guessABI__(supported, on64Bit)) + modifiedFile.write(line) + origFile.close() + modifiedFile.close() + os.remove(origToolchains) + test.log("Substituted unchosen ABIs inside toolchains.xml...") + if platform.system() in ('Windows', 'Microsoft'): sdkPath = "C:\\QtSDK" cwd = os.getcwd() # current dir is directory holding qtcreator.py @@ -103,5 +167,6 @@ if os.getenv("SYSTEST_NOSETTINGSPATH") != "1": shutil.copytree(cwd, tmpSettingsDir) if platform.system() in ('Linux', 'Darwin'): substituteTildeWithinToolchains(tmpSettingsDir) + substituteUnchosenTargetABIs(tmpSettingsDir) atexit.register(__removeTmpSettingsDir__) SettingsPath = ' -settingspath "%s"' % tmpSettingsDir diff --git a/tests/system/suite_editors/suite.conf b/tests/system/suite_editors/suite.conf new file mode 100644 index 0000000000000000000000000000000000000000..717453e22dc5afe5e538ae1650e142b34f2d1125 --- /dev/null +++ b/tests/system/suite_editors/suite.conf @@ -0,0 +1,12 @@ +AUT=qtcreator +CLASS= +CLASSPATH= +CWD= +ENVVARS=envvars +HOOK_SUB_PROCESSES=false +IMPLICITAUTSTART=0 +LANGUAGE=Python +OBJECTMAP=../objects.map +TEST_CASES=tst_memberoperator +VERSION=2 +WRAPPERS=Qt diff --git a/tests/system/suite_editors/tst_memberoperator/test.py b/tests/system/suite_editors/tst_memberoperator/test.py new file mode 100644 index 0000000000000000000000000000000000000000..7e329ba900f54a642b262f7c6e88d9cae6676d28 --- /dev/null +++ b/tests/system/suite_editors/tst_memberoperator/test.py @@ -0,0 +1,26 @@ +source("../../shared/qtcreator.py") + +def main(): + startApplication("qtcreator" + SettingsPath) + createProject_Qt_Console(tempDir(), "SquishProject") + selectFromLocator("main.cpp") + cppwindow = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget") + + for record in testData.dataset("usages.tsv"): + include = testData.field(record, "include") + if include: + placeCursorToLine(cppwindow, "#include <QCoreApplication>") + typeLines(cppwindow, ("", "#include " + include)) + placeCursorToLine(cppwindow, "return a.exec();") + typeLines(cppwindow, ("<Up>", testData.field(record, "declaration"))) + type(cppwindow, testData.field(record, "usage")) + waitForSignal("{type='CppTools::Internal::CppModelManager' unnamed='1'}", + "sourceFilesRefreshed(QStringList)") + type(cppwindow, testData.field(record, "operator")) + waitForSignal("{type='CppTools::Internal::CppModelManager' unnamed='1'}", + "sourceFilesRefreshed(QStringList)") + test.compare(str(lineUnderCursor(cppwindow)).strip(), testData.field(record, "expected")) + invokeMenuItem("File", 'Revert "main.cpp" to Saved') + clickButton(waitForObject(":Revert to Saved.Proceed_QPushButton")) + + invokeMenuItem("File", "Exit") diff --git a/tests/system/suite_editors/tst_memberoperator/testdata/usages.tsv b/tests/system/suite_editors/tst_memberoperator/testdata/usages.tsv new file mode 100644 index 0000000000000000000000000000000000000000..a1e21767bf05511d0776cd7a5019f4cb38ef3262 --- /dev/null +++ b/tests/system/suite_editors/tst_memberoperator/testdata/usages.tsv @@ -0,0 +1,23 @@ +"include" "declaration" "usage" "operator" "expected" +"" "" "syntaxError" "." "syntaxError." +"" "" "argc" "." "argc." +"" "" "argv[0]" "." "argv[0]." +"" "QCoreApplication qa;" "qa" "." "qa." +"" "QCoreApplication *p;" "p" "." "p->" +"" "QCoreApplication &ref = a;" "ref" "." "ref." +"<QPointer>" "QPointer p;" "p" "." "p." +"<QPointer>" "QPointer *poi;" "poi" "." "poi->" +"<QPointer>" "QPointer &poi;" "poi" "." "poi." +"<QPointer>" "QPointer poi[5];" "poi[2]" "." "poi[2]." +"<QPointer>" "QPointer *poi[5];" "poi[2]" "." "poi[2]->" +"<memory>" "std::auto_ptr sap;" "sap" "." "sap." +"<memory>" "std::auto_ptr *sap;" "sap" "." "sap->" +"<memory>" "std::auto_ptr &sap;" "sap" "." "sap." +"<memory>" "std::auto_ptr sap[10];" "sap[2]" "." "sap[2]." +"<memory>" "std::auto_ptr *sap[10];" "sap[2]" "." "sap[2]->" +"<QVector>" "QVector<QCoreApplication> vec;" "vec" "." "vec." +"<QVector>" "QVector<QCoreApplication *> vec;" "vec" "." "vec." +"<QVector>" "QVector<QCoreApplication> *vec;" "vec" "." "vec->" +"<QVector>" "QVector<QCoreApplication *> *vec;" "vec" "." "vec->" +"<QVector>" "QVector<QCoreApplication> vec;" "vec[0]" "." "vec[0]." +"<QVector>" "QVector<QCoreApplication *> vec;" "vec[0]" "." "vec[0]->"