Mercurial > hg > octave-lyh
changeset 13401:8832a2221563
Removed QCodeEdit.
author | Jacob Dawid <jacob.dawid@googlemail.com> |
---|---|
date | Mon, 11 Apr 2011 19:06:18 +0200 |
parents | 4a718f51baa3 |
children | 17b9b85bd1a6 |
files | gui//Quint.pro gui//qcodeedit-2.2.3/GPL.txt gui//qcodeedit-2.2.3/README.txt gui//qcodeedit-2.2.3/document/qdocument.cpp gui//qcodeedit-2.2.3/document/qdocument.h gui//qcodeedit-2.2.3/document/qdocument_p.h gui//qcodeedit-2.2.3/document/qdocumentbuffer.cpp gui//qcodeedit-2.2.3/document/qdocumentbuffer.h gui//qcodeedit-2.2.3/document/qdocumentcommand.cpp gui//qcodeedit-2.2.3/document/qdocumentcommand.h gui//qcodeedit-2.2.3/document/qdocumentcursor.cpp gui//qcodeedit-2.2.3/document/qdocumentcursor.h gui//qcodeedit-2.2.3/document/qdocumentcursor_p.h gui//qcodeedit-2.2.3/document/qdocumentline.cpp gui//qcodeedit-2.2.3/document/qdocumentline.h gui//qcodeedit-2.2.3/document/qdocumentline_p.h gui//qcodeedit-2.2.3/document/qdocumentsearch.cpp gui//qcodeedit-2.2.3/document/qdocumentsearch.h gui//qcodeedit-2.2.3/lib.pri gui//qcodeedit-2.2.3/lib.pro gui//qcodeedit-2.2.3/qce-config.h gui//qcodeedit-2.2.3/qcodecompletionengine.cpp gui//qcodeedit-2.2.3/qcodecompletionengine.h gui//qcodeedit-2.2.3/qcodeedit.cpp gui//qcodeedit-2.2.3/qcodeedit.h gui//qcodeedit-2.2.3/qeditor.cpp gui//qcodeedit-2.2.3/qeditor.h gui//qcodeedit-2.2.3/qeditorfactory.cpp gui//qcodeedit-2.2.3/qeditorfactory.h gui//qcodeedit-2.2.3/qeditorinputbinding.cpp gui//qcodeedit-2.2.3/qeditorinputbinding.h gui//qcodeedit-2.2.3/qeditorinputbindinginterface.h gui//qcodeedit-2.2.3/qeditsession.cpp gui//qcodeedit-2.2.3/qeditsession.h gui//qcodeedit-2.2.3/qformat.h gui//qcodeedit-2.2.3/qformatfactory.h gui//qcodeedit-2.2.3/qformatscheme.cpp gui//qcodeedit-2.2.3/qformatscheme.h gui//qcodeedit-2.2.3/qlanguagedefinition.cpp gui//qcodeedit-2.2.3/qlanguagedefinition.h gui//qcodeedit-2.2.3/qlanguagefactory.cpp gui//qcodeedit-2.2.3/qlanguagefactory.h gui//qcodeedit-2.2.3/qlinemarksinfocenter.cpp gui//qcodeedit-2.2.3/qlinemarksinfocenter.h gui//qcodeedit-2.2.3/qnfa/light_vector.h gui//qcodeedit-2.2.3/qnfa/qnfa.cpp gui//qcodeedit-2.2.3/qnfa/qnfa.h gui//qcodeedit-2.2.3/qnfa/qnfadefinition.cpp gui//qcodeedit-2.2.3/qnfa/qnfadefinition.h gui//qcodeedit-2.2.3/qnfa/xml2qnfa.cpp gui//qcodeedit-2.2.3/qpanellayout.cpp gui//qcodeedit-2.2.3/qpanellayout.h gui//qcodeedit-2.2.3/qreliablefilewatch.cpp gui//qcodeedit-2.2.3/qreliablefilewatch.h gui//qcodeedit-2.2.3/snippets/qsnippet.cpp gui//qcodeedit-2.2.3/snippets/qsnippet.h gui//qcodeedit-2.2.3/snippets/qsnippet_p.h gui//qcodeedit-2.2.3/snippets/qsnippetbinding.cpp gui//qcodeedit-2.2.3/snippets/qsnippetbinding.h gui//qcodeedit-2.2.3/snippets/qsnippetedit.cpp gui//qcodeedit-2.2.3/snippets/qsnippetedit.h gui//qcodeedit-2.2.3/snippets/qsnippetmanager.cpp gui//qcodeedit-2.2.3/snippets/qsnippetmanager.h gui//qcodeedit-2.2.3/snippets/qsnippetpatternloader.h gui//qcodeedit-2.2.3/snippets/snippetedit.ui gui//qcodeedit-2.2.3/widgets/editconfig.ui gui//qcodeedit-2.2.3/widgets/formatconfig.ui gui//qcodeedit-2.2.3/widgets/gotoline.ui gui//qcodeedit-2.2.3/widgets/gotolinedialog.ui gui//qcodeedit-2.2.3/widgets/qcalltip.cpp gui//qcodeedit-2.2.3/widgets/qcalltip.h gui//qcodeedit-2.2.3/widgets/qeditconfig.cpp gui//qcodeedit-2.2.3/widgets/qeditconfig.h gui//qcodeedit-2.2.3/widgets/qfoldpanel.cpp gui//qcodeedit-2.2.3/widgets/qfoldpanel.h gui//qcodeedit-2.2.3/widgets/qformatconfig.cpp gui//qcodeedit-2.2.3/widgets/qformatconfig.h gui//qcodeedit-2.2.3/widgets/qgotolinedialog.cpp gui//qcodeedit-2.2.3/widgets/qgotolinedialog.h gui//qcodeedit-2.2.3/widgets/qgotolinepanel.cpp gui//qcodeedit-2.2.3/widgets/qgotolinepanel.h gui//qcodeedit-2.2.3/widgets/qlinechangepanel.cpp gui//qcodeedit-2.2.3/widgets/qlinechangepanel.h gui//qcodeedit-2.2.3/widgets/qlinemarkpanel.cpp gui//qcodeedit-2.2.3/widgets/qlinemarkpanel.h gui//qcodeedit-2.2.3/widgets/qlinenumberpanel.cpp gui//qcodeedit-2.2.3/widgets/qlinenumberpanel.h gui//qcodeedit-2.2.3/widgets/qpanel.cpp gui//qcodeedit-2.2.3/widgets/qpanel.h gui//qcodeedit-2.2.3/widgets/qsearchreplacepanel.cpp gui//qcodeedit-2.2.3/widgets/qsearchreplacepanel.h gui//qcodeedit-2.2.3/widgets/qsimplecolorpicker.cpp gui//qcodeedit-2.2.3/widgets/qsimplecolorpicker.h gui//qcodeedit-2.2.3/widgets/qstatuspanel.cpp gui//qcodeedit-2.2.3/widgets/qstatuspanel.h gui//qcodeedit-2.2.3/widgets/searchreplace.ui gui//src/MainWindow.cpp gui//src/MainWindow.h |
diffstat | 98 files changed, 8 insertions(+), 34892 deletions(-) [+] |
line wrap: on
line diff
--- a/gui//Quint.pro +++ b/gui//Quint.pro @@ -4,14 +4,14 @@ # #------------------------------------------------- -QT += core gui webkit +QT += core gui webkit xml UI_DIR = ui-files MOC_DIR = moc-files OBJECTS_DIR = object-files TARGET = Quint TEMPLATE = app DEFINES += HAVE_POSIX_OPENPT -INCLUDEPATH += src +INCLUDEPATH += src qcodeedit-2.2.3 DESTDIR = ../Quint/bin SOURCES +=\ src/TerminalCharacterDecoder.cpp \ @@ -87,5 +87,5 @@ LFLAGS = $$system(mkoctfile -p LFLAGS) \ $$system(mkoctfile -p OCTAVE_LIBS) \ $$system(mkoctfile -p LIBS) -LIBS += $$LFLAGS -loctave -loctinterp -lreadline -lutil +LIBS += $$LFLAGS -loctave -loctinterp -lreadline -lutil -L../Quint -lqcodeedit QMAKE_CXXFLAGS += $$INCFLAGS
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/GPL.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, 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 -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state 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 program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>.
deleted file mode 100755 --- a/gui//qcodeedit-2.2.3/README.txt +++ /dev/null @@ -1,175 +0,0 @@ - ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- - - QCodeEdit, copyright (c) 2006-2009 Luc Bruant aka fullmetalcoder, - is a free and open source software - - QCodeEdit sources are part of Edyuk and are thus available under GNU General Public - License version 3 (GPL v3), as published by the Free Software Foundation. - ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- - -QCodeEdit is a project aiming at the creation of a flexible and powerful text -editing framework for Qt4. It has started as a sub-project of Edyuk, copyright (c) -Luc Bruant, a free and open source IDE. As it proved successful it is also -released as a standalone library to make it easy for everyone to use such -a framework within other apps without having to reinvent the wheel. - -Writing closed source applications with QCodeEdit is possible after buying a -proper license. For more informations about pricing and licensing conditions -please contact the author directly <non.deterministic.finite.organism@gmail.com> -Note that you will still need a Qt commercial license for that or, starting with -Qt 4.5, a LGPL one. - -QCodeEdit depends on Qt 4.3 or newer, copyright (c) Nokia Corporation, which can -be downloaded at : ftp://ftp.trolltech.com/qt/sources - -More information about Qt and Qt Software (formerly Trolltech) : -http://www.qtsoftware.com - -Hoping you'll like it. - - -The author would like to thank all the people who contributed to QCodeEdit in various ways : - - * testing, reporting bugs, making suggestions : - Jeremy Sonander, from Saros Inc - Phil Martinot - Benito van der Zander - Ulrich Van Den Hekke - Boris Barbulovski - - * contributing patches : - Jerome Vizcaino - Benito van der Zander - Ulrich Van Den Hekke - Boris Barbulovski - - * funding (by buying commercial licenses) : - Saros Inc - Movimento SE - - * spreading the word : - Johan Thelin (posted a blog post that appeared on PlanetKDE) - -(If you have been forgotten send an email to the author and the list will be updated) - - -IMPORTANT : If you encounter any sort of troubles trying to build or run QCodeEdit -please send a bug report with as many details as possible (including but not limited -to : OS, Qt version, compiler, QCodeEdit version, compile log, backtrace, ...) to the -team using either of these : - * staff@qcodeedit.edyuk.org - * Edyuk task tracker on Sf.net : http://sf.net/projects/edyuk - * Edyuk webissues server (needs a WebIssues client) : http://edyuk.org/webissues/ - - login : anonymous - - password : anonymous - * QtCentre dedicated thread in Qt Software section : http://www.qtcentre.org/forum - - -In case you don't understand, blocks of text enclosed between lines of minus signs are -shell commands. The dollar signs just stand for command prompt. - - - >>> Building : - ------------------------------------------------------------------------------------------- -$ qmake -$ make ------------------------------------------------------------------------------------------- - -This will build the library and the example. You may want to alter the build mode to force -either debug or release. If so just pass the mode you want to make, e.g. : - ------------------------------------------------------------------------------------------- -$ make release ------------------------------------------------------------------------------------------- -or ------------------------------------------------------------------------------------------- -$ make debug ------------------------------------------------------------------------------------------- - -Finally, with admins rights/root privilegdes, you can install QCodeEdit so as to be able -to use it simply : - ------------------------------------------------------------------------------------------- -$ qmake -$ make install ------------------------------------------------------------------------------------------- - -NB : the extra "qmake" is NEEDED to ensure that binaries will be located and copied properly. -NB 2 : Only the "make install" command requires root priviledges, "qmake" can and should -always be run as normal user. -NB 3 : Apart from libs and headers, QCodeEdit also provides a .prf file which makes it -easier to use the lib in another project. Under non-Unix platforms it is recommended to -copy the files manually (and possibly edit them to fit your needs). - - - >>> Using within an app : - -To have one of your app building with QCodeEdit just add the following line to your project -file (this won't work if you have not installed QCodeEdit as described above....) : - -CONFIG += qcodeedit - -If you did not install QCodeEdit as described above you will have to either update the file -qcodeedit.prf or inspect it to determine what project variables need to be adjusted and how. - -Then, add proper headers in your sources and start coding. :D - - - >>> Testing : - -A very basic example is provided which open a list of files passed as parameters -and try to highlight them according to their file extension. Only a few language -definitions are provided : - * C++ (with Doxygen support) - * PHP - * XML - * Doxygen alone (for .dox files) - * QMake project files - * Python - * QtScript/JavaScript - * C# (WIP) - * Lua (WIP) - * LaTex (WIP) - * BibTex (WIP) - -If you write a new one for your own use (or modify an existing one to suit you needs) -please consider contributing it back to the project. - ------------------------------------------------------------------------------------------- -$ example/example [file] ------------------------------------------------------------------------------------------- - -Note : on Unix system it is recommended to use the script due to the need of setting -the LD_LIBRARY_PATH variable properly : - ------------------------------------------------------------------------------------------- -$ ./example.sh [file] ------------------------------------------------------------------------------------------- - -NB : [file] stands for a filename. If omitted a minimal string will be loaded and -considered as C++ source code - - - >>> Generating documentation [needs Doxygen : http://www.doxygen.org] : - ------------------------------------------------------------------------------------------- -$ doxygen ------------------------------------------------------------------------------------------- - -NB : - * This will create the documentation in the doc folder. Just open doc/html/index.html - - - >>> Fetching bleeding edge sources [needs Subversion : http://subversion.tigris.org] : - ------------------------------------------------------------------------------------------- -$ svn co http://edyuk.svn.sf.net/svnroot/edyuk/trunk/3rdparty/qcodeedit2 ------------------------------------------------------------------------------------------- - -NB : Using a graphical client this command extends to a "checkout" action using the above -repository URL.
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocument.cpp +++ /dev/null @@ -1,6617 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2008 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qdocument.h" - -/* - Document model : - - Goals : - * KISS : Keep It Simple Stupid - * FAST : ... - * LIGHTWEIGHT : reduce memory usage - * FLEXIBLE : allow punctual bidi through QTextLayout - - Implementation : - QDocument - QDocumentPrivate - - QDocumentLine and QDocumentLineHandle => equivalent of QTextBlock - QDocumentCursor and QDocumentCursorHandle => equivalent of QTextCursor - - Note : - The KISS principle has been kinda mistreated in the private API due to - the addition of some complex features which where not planned to be - supported when defining the goals (e.g line wrapping, variable width - fonts, ...). Such a compromission is affordable but should be avoided - whenever possible in the future. And of course the public API should - never suffer from such a thing. -*/ - -/*! - \ingroup document - @{ -*/ - -/*! - \class QDocument - - \brief A class storing a document - - QCE uses an architecture very similar to that of QTextEdit/QTextDocument - which closely ressembles model/view. The document holds all the textual - and formatting data. It offers some (mostly indirect) ways of modifying - its content and is usable without any GUI. - - In QCE, a document is merely a list of QDocumentLine objects on which some - extra formatting can be applied and which can be wrapped/hidden in various - ways. - - The document model has been designed with three goals in mind : - <ul> - <li>performance - <li>flexibility - <li>low memory usage - </ul> - - QDocument supports Bidi by using QTextLayout on lines that require it and - prefers custom rendering in other cases to achieve the above goals. - - All the actual text editing is done through QDocumentCursor objects. - - \see QDocumentLine - \see QDocumentCursor -*/ - -#include "qdocument_p.h" -#include "qdocumentcommand.h" - -#include "qformat.h" -#include "qformatscheme.h" -#include "qlanguagedefinition.h" -#include "qlinemarksinfocenter.h" - -#include <QPen> -#include <QTime> -#include <QRect> -#include <QLine> -#include <QPainter> -#include <QPrinter> -#include <QTextStream> -#include <QTextLayout> -#include <QApplication> -#include <QVarLengthArray> -#include <QMessageBox> - -static int m_spaceSignOffset = 2; - -static QPoint m_spaceSign[] = { - QPoint(2, -1), - QPoint(2, 0), - QPoint(3, 0) -}; - -inline static bool isWord(QChar c) -{ return c.isLetterOrNumber() || (c == QLatin1Char('_')); } - -int QDocument::screenLength(const QChar *d, int l, int tabStop) -{ - if ( tabStop == 1 ) - return l; - - int idx, column = idx = 0; - - while ( idx < l ) - { - QChar c = d[idx]; - - if ( c == QLatin1Char('\t') ) - { - int taboffset = tabStop - (column % tabStop); - column += taboffset; - } else { - ++column; - } - - ++idx; - } - - //qDebug("%s : %i", qPrintable(QString(d, l)), column); - - return column; -} - -QString QDocument::screenable(const QChar *d, int l, int tabStop) -{ - if ( tabStop == 1 ) - return QString(d, l); - - QString fragment; - int idx, column = idx = 0; - - while ( idx < l ) - { - QChar c = d[idx]; - - if ( c == QLatin1Char('\t') ) - { - int taboffset = tabStop - (column % tabStop); - - fragment += QString(taboffset, QLatin1Char(' ')); - column += taboffset; - } else { - fragment += c; - ++column; - } - - ++idx; - } - - return fragment; -} - -struct InitStruct -{ - InitStruct() - { - qRegisterMetaType<QDocumentIterator>("QDocumentIterator"); - qRegisterMetaType<QDocumentConstIterator>("QDocumentConstIterator"); - } -}; - -static InitStruct init_inst; - -/*! - \brief ctor -*/ -QDocument::QDocument(QObject *p) - : QObject(p), m_impl(new QDocumentPrivate(this)) -{ - if ( !QDocumentPrivate::m_font ) - { - // must not happen if config dialog plugged in... - setFont(QFont("Monospace", 10)); - } - - setText(QString()); - setLineEnding(QDocument::Conservative); - - connect(&(m_impl->m_commands) , SIGNAL( cleanChanged(bool) ), - this , SIGNAL( cleanChanged(bool) ) ); - - connect(&(m_impl->m_commands) , SIGNAL( canUndoChanged(bool) ), - this , SIGNAL( undoAvailable(bool) ) ); - - connect(&(m_impl->m_commands) , SIGNAL( canRedoChanged(bool) ), - this , SIGNAL( redoAvailable(bool) ) ); - - connect(this , - SIGNAL( lineDeleted(QDocumentLineHandle*) ), - QLineMarksInfoCenter::instance(), - SLOT ( lineDeleted(QDocumentLineHandle*) ) ); - -} - -/*! - \brief dtor -*/ -QDocument::~QDocument() -{ - delete m_impl; -} - -/*! - \brief Clear the content of the document -*/ -void QDocument::clear() -{ - setText(QString()); -} - -/*! - \return whether there commands to undo on the command stack -*/ -bool QDocument::canUndo() const -{ - return m_impl ? m_impl->m_commands.canUndo() : false; -} - -/*! - \return whether there are commands to redo on the command stack -*/ -bool QDocument::canRedo() const -{ - return m_impl ? m_impl->m_commands.canRedo() : false; -} - -/*! - \brief Undo the last editing operation -*/ -void QDocument::undo() -{ - if ( m_impl ) - { - m_impl->m_commands.undo(); - m_impl->m_lastModified = QDateTime::currentDateTime(); - } -} - -/*! - \brief Redo the last undone editing operation -*/ -void QDocument::redo() -{ - if ( m_impl ) - { - m_impl->m_commands.redo(); - m_impl->m_lastModified = QDateTime::currentDateTime(); - } - -} - -/*! - \return The content of the document - \param mode extra processing to perform on text -*/ -QString QDocument::text(int mode) const -{ - QString s; - - if ( !m_impl || m_impl->m_lines.isEmpty() ) - return s; - - int line = 0; - int prevIndent = 0, curIndent = 0, nextIndent = m_impl->m_lines.at(0)->nextNonSpaceChar(0); - - if ( nextIndent < 0 ) - nextIndent = 0; - - foreach ( QDocumentLineHandle *l, m_impl->m_lines ) - { - prevIndent = curIndent; - curIndent = nextIndent; - nextIndent = ++line < m_impl->m_lines.count() ? m_impl->m_lines.at(line)->nextNonSpaceChar(0) : 0; - - if ( nextIndent < 0 ) - nextIndent = 0; - - QString buf = l->text(); - int avgIndent = qMax(prevIndent, nextIndent); - - if ( (mode & RestoreTrailingIndent) && buf.isEmpty() && avgIndent ) - { - buf = QString(avgIndent, '\t'); - } else if ( mode & RemoveTrailingWS ) { - - int len = 0, idx = buf.length(); - - while ( --idx >= 0 ) - { - if ( !buf.at(idx).isSpace() ) - break; - - ++len; - } - - ++idx; - - if ( len && (idx || !(mode & PreserveIndent)) ) - buf.remove(idx, len); - } - - s += buf + m_impl->m_lineEndingString; - } - - //s.chop(m_impl->m_lineEndingString.count()); - return s; -} - -/*! - \return The content of the document - \param removeTrailing whether to remove trailing whitespaces - \param preserveIndent whether to keep trailing whitespaces when they are indent -*/ -QString QDocument::text(bool removeTrailing, bool preserveIndent) const -{ - int mode = 0; - - if ( removeTrailing ) - mode |= RemoveTrailingWS; - - if ( preserveIndent ) - mode |= PreserveIndent; - - return text(mode); -} - -/*! - \brief Set the content of the document -*/ -void QDocument::setText(const QString& s) -{ - if ( !m_impl ) - return; - - int last = 0, idx = 0; - - m_impl->m_deleting = true; - - //qDeleteAll(m_impl->m_lines); - foreach ( QDocumentLineHandle *h, m_impl->m_lines ) - { - h->m_doc = 0; - h->deref(); - } - - QDocumentCommand::discardHandlesFromDocument(this); - - m_impl->m_lines.clear(); - m_impl->m_marks.clear(); - m_impl->m_status.clear(); - m_impl->m_hidden.clear(); - m_impl->m_wrapped.clear(); - m_impl->m_matches.clear(); - m_impl->m_largest.clear(); - m_impl->m_commands.clear(); - - m_impl->m_deleting = false; - - if ( s.isEmpty() ) - m_impl->m_lines << new QDocumentLineHandle(QString(), this); - - m_impl->_nix = 0; - m_impl->_dos = 0; - m_impl->_mac = 0; - - while ( idx < s.length() ) - { - if ( s.at(idx) == '\n' ) - { - if ( (idx > 0) && (s.at(idx - 1) == '\r') ) - { - ++(m_impl->_dos); - - m_impl->m_lines << new QDocumentLineHandle( - s.mid(last, idx - last - 1), - this - ); - } else { - ++(m_impl->_nix); - - m_impl->m_lines << new QDocumentLineHandle( - s.mid(last, idx - last), - this - ); - } - - last = ++idx; - } else if ( s.at(idx) == '\r' ) { - ++idx; - if ( idx >= s.length() || (s.at(idx) != '\n') ) - { - ++(m_impl->_mac); - - m_impl->m_lines << new QDocumentLineHandle( - s.mid(last, idx - last - 1), - this - ); - - last = idx; - } - } else { - ++idx; - } - } - - if ( idx != last ) - { - m_impl->m_lines << new QDocumentLineHandle( - s.mid(last, s.length() - last), - this - ); - - } -// -// if ( (idx > 0) && ((idx - 1) < s.length()) && ((s.at(idx - 1) == '\n') || (s.at(idx - 1) == '\r')) ) -// m_impl->m_lines << new QDocumentLineHandle(this); -// - - //qDebug("[one go] dos : %i; nix : %i", m_impl->_dos, m_impl->_nix); - - m_impl->m_lastModified = QDateTime::currentDateTime(); - - if ( lineEnding() == Conservative ) - setLineEnding(Conservative); - - m_impl->setWidth(); - m_impl->setHeight(); - - emit lineCountChanged(lineCount()); - - m_impl->emitContentsChange(0, m_impl->m_lines.count()); -} - -/*! - \brief Start a chunk loading - - It is possible to load document contents in one piece - or by chunks. To achieve the later you have to proceed as follows : - - \code - QDocument doc; - doc.startChunkLoading(); - - // fetch data and add it using doc.addChunk(); - - doc.stopChunkLoading(); - \endcode - - \see addChunk(const QString&) - \see stopChunkLoading() -*/ -void QDocument::startChunkLoading() -{ - if ( !m_impl ) - return; - - m_impl->m_deleting = true; - - //qDeleteAll(m_impl->m_lines); - foreach ( QDocumentLineHandle *h, m_impl->m_lines ) - { - h->m_doc = 0; - h->deref(); - } - - m_impl->m_lines.clear(); - m_impl->m_marks.clear(); - m_impl->m_status.clear(); - m_impl->m_hidden.clear(); - m_impl->m_wrapped.clear(); - m_impl->m_matches.clear(); - m_impl->m_largest.clear(); - m_impl->m_commands.clear(); - - m_impl->m_deleting = false; - - m_impl->_nix = 0; - m_impl->_dos = 0; - m_impl->_mac = 0; - - m_leftOver.clear(); -} - -/*! - \brief Stop chunk loading - - \see startChunkLoading() -*/ -void QDocument::stopChunkLoading() -{ - if ( m_leftOver.count() ) - { - m_impl->m_lines << new QDocumentLineHandle( - m_leftOver, - this - ); - - m_leftOver.clear(); - - } else { - //m_impl->m_lines << new QDocumentLineHandle(this); - } - - //qDebug("[chunk] dos : %i; nix : %i", m_impl->_dos, m_impl->_nix); - - m_impl->m_lastModified = QDateTime::currentDateTime(); - - if ( lineEnding() == Conservative ) - setLineEnding(Conservative); - - m_impl->setWidth(); - m_impl->setHeight(); - - emit lineCountChanged(lineCount()); - - emit m_impl->emitContentsChange(0, m_impl->m_lines.count()); -} - -/*! - \return The format scheme used by the document -*/ -QFormatScheme* QDocument::formatScheme() const -{ - return m_impl ? m_impl->m_formatScheme : 0; -} - -/*! - \brief Set the format scheme used by the document -*/ -void QDocument::setFormatScheme(QFormatScheme *f) -{ - if ( m_impl ) - m_impl->setFormatScheme(f); -} - -/*! - \return the language definition set to the document -*/ -QLanguageDefinition* QDocument::languageDefinition() const -{ - return m_impl ? m_impl->m_language : 0; -} - -/*! - \brief Set the language definition -*/ -void QDocument::setLanguageDefinition(QLanguageDefinition *f) -{ - if ( m_impl ) - m_impl->m_language = f; -} - -/*! - \brief Update the formatting of the whole document - This function is only useful when changing the language definition - of a non-empty document. Make sure you do not call it more often - than needed. -*/ -void QDocument::highlight() -{ - if ( m_impl ) - m_impl->emitContentsChange(0, lines()); -} - -/*! - \brief Add a chunk of text to the document -*/ -void QDocument::addChunk(const QString& txt) -{ - if ( !m_impl || txt.isEmpty() ) - return; - - m_leftOver += txt; - int idx = 0, last = 0; - - while ( idx < m_leftOver.length() ) - { - if ( m_leftOver.at(idx) == '\n' ) - { - if ( (idx > 0) && (m_leftOver.at(idx - 1) == '\r') ) - { - ++(m_impl->_dos); - - m_impl->m_lines << new QDocumentLineHandle( - m_leftOver.mid(last, idx - last - 1), - this - ); - } else { - ++(m_impl->_nix); - - m_impl->m_lines << new QDocumentLineHandle( - m_leftOver.mid(last, idx - last), - this - ); - } - - last = ++idx; - } else if ( m_leftOver.at(idx) == '\r' ) { - ++idx; - if ( idx >= m_leftOver.length() || (m_leftOver.at(idx) != '\n') ) - { - ++(m_impl->_mac); - - m_impl->m_lines << new QDocumentLineHandle( - m_leftOver.mid(last, idx - last - 1), - this - ); - - last = idx; - } - } else { - ++idx; - } - } - - if ( idx != last ) - m_leftOver = m_leftOver.mid(last); - else - m_leftOver.clear(); - -} - -/*! - \brief Print the content of the document - \param pr printer to use - - \note the printer MUST be initialized (probably using a printing dialog) -*/ -void QDocument::print(QPrinter *pr) -{ - QRect fit = pr->pageRect(); - - if ( pr->printRange() == QPrinter::Selection ) - { - qWarning("printing selection not implemented yet"); - return; - } - - if ( fit.width() < width() ) - { - // TODO: got to temporarily wrap text to fit page size - - qWarning("temporary wrapping not implementated yet"); - } - - const int lineCount = lines(); - const int linesPerPage = fit.height() / m_impl->m_lineSpacing; - int pageCount = lineCount / linesPerPage; - - if ( lineCount % linesPerPage ) - ++pageCount; - - //qDebug("%i lines per page -> %i pages", linesPerPage, pageCount); - - const int pageWidth = fit.width(); - const int pageHeight = linesPerPage * m_impl->m_lineSpacing; - - int firstPage = pr->fromPage(), lastPage = pr->toPage(); - - if ( !lastPage ) - lastPage = pageCount - 1; - - QPainter p(pr); - PaintContext cxt; - cxt.xoffset = 0; - cxt.yoffset = firstPage * pageHeight; - cxt.width = pageWidth; - cxt.height = pageHeight - m_impl->m_lineSpacing; - cxt.palette = QApplication::palette(); - cxt.fillCursorRect = false; - cxt.blinkingCursor = false; - - for ( int i = firstPage; i <= lastPage; ++i ) - { - draw(&p, cxt); - - cxt.yoffset += pageHeight; - - if ( i != lastPage ) - { - pr->newPage(); - p.translate(0, -pageHeight); - } - } -} - -/*! - \return The line ending policy of the document - - The line ending policy determines how line endings - are used when saving the document (which includes - fetching the document's text()). - - It can either be conservative (auto detect upon loading - and do not modify when saving later on) or enforce - a particular line ending (either local line ending - or a specific value). -*/ -QDocument::LineEnding QDocument::lineEnding() const -{ - return m_impl ? m_impl->m_lineEnding : Local; -} - -/*! - \return the lin endings detected upon loading - - This should only ever take the the Window of Linux value - if a document has been loaded. If no content has been - loaded it will fall back to Local. -*/ -QDocument::LineEnding QDocument::originalLineEnding() const -{ - if ( !m_impl ) - return Local; - - bool dosVSnix = m_impl->_dos > m_impl->_nix; - bool dosVSmac = m_impl->_dos > m_impl->_mac; - bool nixVSmac = m_impl->_nix > m_impl->_mac; - - // nothing loaded thus far - if ( !(dosVSnix || dosVSmac || nixVSmac) ) - return Local; - - return dosVSnix ? (dosVSmac ? Windows : OldMac) : (nixVSmac ? Unix : OldMac); -} - -/*! - \brief Set the line ending policy of the document -*/ -void QDocument::setLineEnding(LineEnding le) -{ - if ( !m_impl ) - return; - - m_impl->m_lineEnding = le; - QString& les = m_impl->m_lineEndingString; - - /* - Notes about "local" line endings : - * Dos & co : well defined CRLF - * Unix & co : well defined LF - * Mac : CR up until OS 9 LF afterwards (OSX is Unix-based) - - Guess about macros (to be confirmed/infirmed) : - Q_OS_UNIX *should* be set under OSX - Q_OS_MAC *might* be set under OSX - - => order #ifdefs to try avoiding troubles - */ - #ifdef Q_OS_WIN - const QString loc_les = "\r\n"; - #elif defined(Q_OS_UNIX) - const QString loc_les = "\n"; - #elif defined(Q_OS_MAC) - const QString loc_les = "\r"; - #else - - const QString loc_les = "\n"; - #endif - - switch ( le ) - { - case Conservative : - switch ( originalLineEnding() ) - { - case Windows : - les = "\r\n"; - break; - case OldMac : - les = "\r"; - break; - case Unix : - les = "\n"; - default: - les = loc_les; - break; - } - break; - - case Unix : - les = "\n"; - break; - - case OldMac : - les = "\r"; - break; - - case Windows : - les = "\r\n"; - break; - - default : - les = "\n"; - break; - } - - emit lineEndingChanged(le); -} - -/*! - \return the font used by ALL documents to render their content - - This font is also used to do calculations (such as converting - (line, column) cursor position to (x, y) document position (or - the inverse transformation)) - - \note this limitation is historic and may disappear - in future versions -*/ -QFont QDocument::font() -{ - return *(QDocumentPrivate::m_font); -} - -/*! - \brief Set the font of ALL documents - - \note this limitation is historic and may disappear - in future versions -*/ -void QDocument::setFont(const QFont& f) -{ - QDocumentPrivate::setFont(f); - //emit contentsChanged(); -} - -/*! - \return The font metrics used by ALL documents - - \note this limitation is historic and may disappear - in future versions -*/ -const QFontMetrics& QDocument::fontMetrics() -{ - return *(QDocumentPrivate::m_fontMetrics); -} - -/*! - \return The default tab stop common to ALL documents - - \note this limitation is historic and may disappear - in future versions -*/ -int QDocument::tabStop() -{ - return QDocumentPrivate::m_defaultTabStop; -} - -/*! - \brief Set the default tab stop common to all documents - - \note this limitation is historic and may disappear - in future versions -*/ -void QDocument::setTabStop(int n) -{ - QDocumentPrivate::m_defaultTabStop = n; - - foreach ( QDocumentPrivate *d, QDocumentPrivate::m_documents ) - { - d->m_tabStop = n; - d->emitFormatsChanged(); - } -} - -/*! - \return the whitesapce display mode -*/ -QDocument::WhiteSpaceMode QDocument::showSpaces() -{ - return QDocumentPrivate::m_showSpaces; -} - -/*! - \brief Set the whitespace display mode -*/ -void QDocument::setShowSpaces(WhiteSpaceMode m) -{ - QDocumentPrivate::m_showSpaces = m; - - foreach ( QDocumentPrivate *d, QDocumentPrivate::m_documents ) - d->emitFormatsChanged(); - -} - -/*! - \brief Set the edit cursor - - Archaic concept designed for use in QEditor - (is it still used???) -*/ -QDocumentCursor* QDocument::editCursor() const -{ - return m_impl ? m_impl->m_editCursor : 0; -} - -/*! - \brief Set the edit cursor - - \see editCursor() -*/ -void QDocument::setEditCursor(QDocumentCursor *c) -{ - if ( m_impl ) - m_impl->m_editCursor = c; - -} - -/*! - \return the width of the document, in pixels - - The width of the document is that of longest text line. -*/ -int QDocument::width() const -{ - return m_impl ? m_impl->m_width : 0; -} - -/*! - \return the height of the document, in pixels -*/ -int QDocument::height() const -{ - return m_impl ? m_impl->m_height : 0; -} - -/*! - \return The width constraint imposed on that document - - Setting a width constraint on a document achieves line - wrapping. -*/ -int QDocument::widthConstraint() const -{ - return (m_impl && m_impl->m_constrained) ? m_impl->m_width : 0; -} - -/*! - \return the number of text lines in the document - - The number of visual lines may differ from that of text - lines as soon as line wrapping and/or folding are enabled. - - \deprecated Use lineCount() instead -*/ -int QDocument::lines() const -{ - return m_impl ? m_impl->m_lines.count() : 0; -} - -/*! - \return the number of text lines in the document - - The number of visual lines may differ from that of text - lines as soon as line wrapping and/or folding are enabled. -*/ -int QDocument::lineCount() const -{ - return m_impl ? m_impl->m_lines.count() : 0; -} - -/*! - \return the number of visual lines in the document - \deprecated Use visualLineCount() instead -*/ -int QDocument::visualLines() const -{ - return m_impl ? m_impl->visualLine(m_impl->m_lines.count() - 1) : 0; -} - -/*! - \return the number of visual lines in the document -*/ -int QDocument::visualLineCount() const -{ - return m_impl ? m_impl->visualLine(m_impl->m_lines.count() - 1) : 0; -} - -/*! - \brief Convert a text (logical) line number int a visual line number - - \note this is not a 1:1 mapping as logical lines can span over several visual lines -*/ -int QDocument::visualLineNumber(int textLineNumber) const -{ - return m_impl ? m_impl->visualLine(textLineNumber) : -1; -} - -/*! - \brief Convert a visual line number int a text (logical) line number - - \note this is not a 1:1 mapping as logical lines can span over several visual lines -*/ -int QDocument::textLineNumber(int visualLineNumber) const -{ - return m_impl ? m_impl->textLine(visualLineNumber) : -1; -} - -/*! - \brief Clear the width constraint, if any -*/ -void QDocument::clearWidthConstraint() -{ - if ( m_impl ) - m_impl->setWidth(0); -} - -/*! - \brief Set a new width constraint - \param width maximum width to allow - - Passing a value inferior (or equal) to zero clear the width constraint, if any. -*/ -void QDocument::setWidthConstraint(int width) -{ - if ( m_impl ) - m_impl->setWidth(qMax(0, width)); -} - -/*! - \return the line object at a given line number - \param line Text line to acces -*/ -QDocumentLine QDocument::line(int line) const -{ - return QDocumentLine(m_impl->at(line)); -} - -/*! - \return the line number corresponding to a given document y coordinate - \param ypos Y document coordinate of the target - \param wrap if not null, will be set to the wrap offset (position of the - visual line among the sublines of the wrapped text line). - -*/ -int QDocument::lineNumber(int ypos, int *wrap) const -{ - int ln = ypos / m_impl->m_lineSpacing; - - return m_impl->textLine(ln, wrap); -} - -/*! - \return the line object to which an iterator points -*/ -QDocumentLine QDocument::line(QDocumentConstIterator iterator) const -{ - return (m_impl && (m_impl->constEnd() != iterator)) ? QDocumentLine(*iterator) : QDocumentLine(); -} - -/*! - \return A cursor operating on the document, placed at a given position - \param line target line number (text line) - \param column target text column -*/ -QDocumentCursor QDocument::cursor(int line, int column) const -{ - return QDocumentCursor(const_cast<QDocument*>(this), line, column); -} - -/*! - \return the document line which contains a given (document-wide) text position - - \note The sole purpose of this method is to have an API close to that of QTextDocument. - This method being ridiculously slow it is recommended to avoid it whenever possible. -*/ -QDocumentLine QDocument::findLine(int& position) const -{ - if ( !m_impl ) - return QDocumentLine(); - - return QDocumentLine(m_impl->lineForPosition(position)); -} - -/*! - \return The Y document coordinate of a given line - \param ln textual line number -*/ -int QDocument::y(int ln) const -{ - if ( !m_impl ) - return -1; - - return m_impl->m_lineSpacing * m_impl->visualLine(ln); -} - -/*! - \overload - - \return The Y document coordinate of a given line - \param l line object - - \note Significantly slower than the line number based version. -*/ -int QDocument::y(const QDocumentLine& l) const -{ - qDebug("bad perf..."); - - return y(l.lineNumber()); -} - -/*! - \return the rectangle (in document position) occupied by the line - \param line textual line number - - \note the width of the returned rectangle is the DOCUMENT's width -*/ -QRect QDocument::lineRect(int line) const -{ - const int yoff = y(line); - - return (yoff != -1) ? QRect(0, yoff, width(), this->line(line).lineSpan() * m_impl->m_lineSpacing) : QRect(); -} - -/*! - \overload - \return the rectangle (in document position) occupied by the line - - \note the width of the returned rectangle is the DOCUMENT's width - \note Significantly slower than the line number based version. -*/ -QRect QDocument::lineRect(const QDocumentLine& l) const -{ - //return lineRect(l.lineNumber()); - const int yoff = y(l); - - return (yoff != -1) ? QRect(0, yoff, width(), m_impl->m_lineSpacing) : QRect(); -} - -/*! - \return the line at a given document position -*/ -QDocumentLine QDocument::lineAt(const QPoint& p) const -{ - if ( !m_impl ) - return QDocumentLine(); - - return line(lineNumber(p.y())); -} - -/*! - \return a document iterator pointing to the first line -*/ -QDocumentConstIterator QDocument::begin() const -{ - Q_ASSERT(m_impl); - - return m_impl->m_lines.constBegin(); -} - -/*! - \return a document iterator pointing past the last line -*/ -QDocumentConstIterator QDocument::end() const -{ - Q_ASSERT(m_impl); - - return m_impl->m_lines.constEnd(); -} - -/*! - \return a document iterator pointing to a given line -*/ -QDocumentConstIterator QDocument::iterator(int ln) const -{ - Q_ASSERT(m_impl); - - return begin() + ln; -} - -/*! - \overload - \note If you can avoid using this method, do so unless performance really isn't an issue -*/ -QDocumentConstIterator QDocument::iterator(const QDocumentLine& l) const -{ - Q_ASSERT(m_impl); - - QDocumentConstIterator it = begin(), e = end(); - - while ( (*it != l.handle()) && (it != e) ) - ++it; - - return it; -} - -/*! - \brief Convert a document (or viewport) (x, y) position to a (line, column) cursor position - \param p document position - \param line where the line number will be stored - \param column where the column (text position within line) will be stored -*/ -void QDocument::cursorForDocumentPosition(const QPoint& p, int& line, int& column) const -{ - if ( !m_impl ) - return; - - int wrap = 0; - line = lineNumber(p.y(), &wrap); - QDocumentLine l = this->line(line); - - if ( !l.isValid() ) - return; - - //qDebug("%i %i", line, wrap); - column = l.documentOffsetToCursor(p.x(), wrap * QDocumentPrivate::m_lineSpacing); - - //qDebug("(%i, %i) -> (%i [+%i], %i)", p.x(), p.y(), line, wrap, column); -} - -/*! - \return The cursor nearest to a document (x, y) position -*/ -QDocumentCursor QDocument::cursorAt(const QPoint& p) const -{ - int ln = -1, col = -1; - - cursorForDocumentPosition(p, ln, col); - - return QDocumentCursor(const_cast<QDocument*>(this), ln, col); -} - -/*! - \brief Draw the contents of the document - \param p painter to use - \param cxt paint context (specifies what part of the document to draw, among other things) -*/ -void QDocument::draw(QPainter *p, PaintContext& cxt) -{ - m_impl->draw(p, cxt); -} - -/*! - \brief Execute a document command (editing operation) -*/ -void QDocument::execute(QDocumentCommand *cmd) -{ - if ( m_impl && cmd ) - m_impl->execute(cmd); - -} - -/*! - \return The default line ending policy -*/ -QDocument::LineEnding QDocument::defaultLineEnding() -{ - return QDocumentPrivate::m_defaultLineEnding; -} - -/*! - \brief Set the default line ending policy - - \note The line ending policy of existing documents is changed accordingly -*/ -void QDocument::setDefaultLineEnding(QDocument::LineEnding le) -{ - QDocumentPrivate::m_defaultLineEnding = le; - - foreach ( QDocumentPrivate *d, QDocumentPrivate::m_documents ) - { - d->m_doc->setLineEnding(le); - } -} - -/*! - \return The default format scheme used to draw document contents -*/ -QFormatScheme* QDocument::defaultFormatScheme() -{ - return QDocumentPrivate::m_defaultFormatScheme; -} - -/*! - \brief Set the default format scheme - - \note Existing documents using the default format scheme will see their format scheme changed -*/ -void QDocument::setDefaultFormatScheme(QFormatScheme *f) -{ - foreach ( QDocumentPrivate *d, QDocumentPrivate::m_documents ) - { - if ( d->m_formatScheme == QDocumentPrivate::m_defaultFormatScheme ) - d->setFormatScheme(f); - } - - QDocumentPrivate::m_defaultFormatScheme = f; -} - -/*! - \deprecated - \brief Compatibility alias for defaultFormatScheme() -*/ -QFormatScheme* QDocument::formatFactory() -{ - return defaultFormatScheme(); -} - -/*! - \deprecated - \brief Compatibility alias for setDefaultFormatScheme() -*/ -void QDocument::setFormatFactory(QFormatScheme *f) -{ - setDefaultFormatScheme(f); -} - -/*! - \brief Begin a macro - - Macro in QDocument map directly to macro in the underlying undo stack -*/ -void QDocument::beginMacro() -{ - if ( m_impl ) - m_impl->beginChangeBlock(); - -} - -/*! - \brief End a macro -*/ -void QDocument::endMacro() -{ - if ( m_impl ) - m_impl->endChangeBlock(); - -} - -/*! - \brief Get an available group id for matches -*/ -int QDocument::getNextGroupId() -{ - return m_impl ? m_impl->getNextGroupId() : -1; -} - -void QDocument::releaseGroupId(int groupId) -{ - if ( m_impl ) - m_impl->releaseGroupId(groupId); -} - -/*! - \brief Clear matches -*/ -void QDocument::clearMatches(int gid) -{ - if ( m_impl ) - { - m_impl->clearMatches(gid); - } -} - -/*! - \brief Highlight the matched sequences - - \note Both position are BEFORE the matched characters (cursor position). -*/ -void QDocument::addMatch(int gid, int line, int pos, int len, int format) -{ - if ( m_impl ) - { - m_impl->addMatch(gid, line, pos, len, format); - } -} - -/*! - \ -*/ -void QDocument::flushMatches(int gid) -{ - if ( m_impl ) - { - m_impl->flushMatches(gid); - } -} - -/*! - \return Whether the document is in a clean state - - This is undo stak terminology. A clean document is one - whose undo stack is at the same index it was upon last - save/load. In other words : clean = !modified -*/ -bool QDocument::isClean() const -{ - return m_impl ? m_impl->m_commands.isClean() : true; -} - -/*! - \brief Set the document to clean state - - This method does not go back to clean state but tell - the stack that the current state is to be considered - as the clean state. -*/ -void QDocument::setClean() -{ - if ( m_impl ) - { - m_impl->m_commands.setClean(); - //m_impl->m_status.clear(); - - QHash<QDocumentLineHandle*, QPair<int, int> >::iterator it = m_impl->m_status.begin(); - - while ( it != m_impl->m_status.end() ) - { - it->second = it->first; - ++it; - } - } -} - -/*! - \return Whether a given line has been modified since last save/load -*/ -bool QDocument::isLineModified(const QDocumentLine& l) const -{ - if ( !m_impl ) - return false; - - QHash<QDocumentLineHandle*, QPair<int, int> >::const_iterator it = m_impl->m_status.constFind(l.handle()); - - //if ( it != m_impl->m_status.constEnd() ) - // qDebug("%i vs %i", it->first, it->second); - - return it != m_impl->m_status.constEnd() ? it->first != it->second : false; -} - -/*! - \return Whether a given line has been modified since last load -*/ -bool QDocument::hasLineEverBeenModified(const QDocumentLine& l) const -{ - return m_impl ? m_impl->m_status.contains(l.handle()) : false; -} - -/*! - \return the maximum number of marks on a single line - - This is meant for the line mark panel to smartly adapt its size. -*/ -int QDocument::maxMarksPerLine() const -{ - return m_impl ? m_impl->maxMarksPerLine() : 0; -} - -/*! - \brief Find the next mark of a given type - \return the line on which a mark was found - \param id mark identifier to find - \param from line from which to start search - \param until line until which to search - - \a from and \a until can be negatives, in which case they - indicate positions from the end of the document (i.e -1 is - last line, -2 the line before last line and so on). - - If \a until is inferior to \a from and no matching mark - is found in the [from, end] range then the [0, until] - range will also be searched. -*/ -int QDocument::findNextMark(int id, int from, int until) const -{ - return m_impl ? m_impl->findNextMark(id, from, until) : -1; -} - -/*! - \brief Find the previous mark of a given type - \return the line on which a mark was found - \param id mark identifier to find - \param from line from which to start search - \param until line until which to search - - \a from and \a until can be negatives, in which case they - indicate positions from the end of the document (i.e -1 is - last line, -2 the line before last line and so on). - - If \a until is superior to \a from and no matching mark - is found in the [0, from] range then the [until, end] - range will also be searched (both range being searched backward, - of course). -*/ -int QDocument::findPreviousMark(int id, int from, int until) const -{ - return m_impl ? m_impl->findPreviousMark(id, from, until) : -1; -} - -/*! - \return the date/time of the last modification of the document - - If the document has not been modified since its load the date/time - of last modification (as reported by QFileInfo) will be returned. -*/ -QDateTime QDocument::lastModified() const -{ - return m_impl ? m_impl->m_lastModified : QDateTime(); -} - -/*! - \brief set the date/time of the last modification of the document - - You should not need to use that EVER. It is only provided for use - in QEditor (and possibly in some panels). -*/ -void QDocument::setLastModified(const QDateTime& d) -{ - if ( m_impl ) - m_impl->m_lastModified = d; -} - -///////////////////////// -// QDocumentLineHandle -///////////////////////// -//static quint32 q_line_counter = 0; - -/*! - \class QDocumentLineHandle - \brief Private implementation of a document line -*/ - -/*! - \ -*/ -QDocumentLineHandle::QDocumentLineHandle(QDocument *d) - : m_doc(d) -#if QT_VERSION >= 0x040400 - , m_ref(1) -#endif - , m_indent(0) - , m_state(QDocumentLine::LayoutDirty) - , m_layout(0) -{ - #if QT_VERSION < 0x040400 - m_ref.init(1); - #endif -} - -/*! - \ -*/ -QDocumentLineHandle::QDocumentLineHandle(const QString& s, QDocument *d) - : m_text(s) - , m_doc(d) -#if QT_VERSION >= 0x040400 - , m_ref(1) -#endif - , m_indent(0) - , m_state(QDocumentLine::LayoutDirty) - , m_layout(0) -{ - #if QT_VERSION < 0x040400 - m_ref.init(1); - #endif -} - -QDocumentLineHandle::~QDocumentLineHandle() -{ - Q_ASSERT(!m_ref); - - if ( m_doc && m_doc->impl() ) - m_doc->impl()->emitLineDeleted(this); -} - -int QDocumentLineHandle::count() const -{ - return m_text.count(); -} - -int QDocumentLineHandle::length() const -{ - return m_text.length(); -} - -int QDocumentLineHandle::line() const -{ - return (m_doc && m_doc->impl()) ? m_doc->impl()->indexOf(this) : -1; -} - -int QDocumentLineHandle::position() const -{ - return (m_doc && m_doc->impl()) ? m_doc->impl()->position(this) : -1; -} - -QString QDocumentLineHandle::text() const -{ - return m_text; -} - -int QDocumentLineHandle::indent() const -{ - int l = nextNonSpaceChar(0); - return QDocument::screenLength(m_text.constData(), l == -1 ? m_text.length() : l, m_doc->tabStop()); -} - -int QDocumentLineHandle::nextNonSpaceChar(uint pos) const -{ - const int len = m_text.length(); - const QChar *unicode = m_text.unicode(); - - for ( int i = pos; i < len; ++i ) - { - if ( !unicode[i].isSpace() ) - return i; - } - - return -1; -} - -int QDocumentLineHandle::previousNonSpaceChar(int pos) const -{ - const int len = m_text.length(); - const QChar *unicode = m_text.unicode(); - - if ( pos < 0 ) - pos = 0; - - if ( pos >= len ) - pos = len - 1; - - for ( int i = pos; i >= 0; --i ) - { - if ( !unicode[i].isSpace() ) - return i; - } - - return -1; -} - -QDocument* QDocumentLineHandle::document() const -{ - return m_doc; -} - -bool QDocumentLineHandle::hasFlag(int s) const -{ - return m_state & s; -} - -void QDocumentLineHandle::setFlag(int s, bool y) const -{ - if ( y ) - m_state |= s; - else - m_state &= ~s; -} - -QDocumentLineHandle* QDocumentLineHandle::next() const -{ - return (m_doc && m_doc->impl()) ? m_doc->impl()->next(this) : 0; -} - -QDocumentLineHandle* QDocumentLineHandle::previous() const -{ - return (m_doc && m_doc->impl()) ? m_doc->impl()->previous(this) : 0; -} - -void QDocumentLineHandle::updateWrap() const -{ - m_indent = 0; - m_frontiers.clear(); - - if ( !m_doc->impl()->m_constrained ) - { - if ( m_layout ) - setFlag(QDocumentLine::LayoutDirty, true); - - return; - } - - const int tabStop = m_doc->impl()->m_tabStop; - const int maxWidth = m_doc->widthConstraint(); - - if ( m_layout ) - { - layout(); - } else if ( QDocumentPrivate::m_fixedPitch ) { - - int idx = 0, minx = 0, lastBreak = 0, lastWidth = 0, lastX = 0, rx, - x = QDocumentPrivate::m_leftMargin, column = 0, cwidth; - - QChar c; - int indent = 0; - const int sw = QDocumentPrivate::m_spaceWidth; - - while ( idx < m_text.length() && m_text.at(idx).isSpace() ) - { - c = m_text.at(idx); - - if ( c.unicode() == '\t' ) - { - int taboffset = tabStop - (column % tabStop); - - column += taboffset; - cwidth = sw * taboffset; - } else { - ++column; - cwidth = sw; - } - - x += cwidth; - ++idx; - } - - indent = idx; - minx = rx = x; - - if ( (minx + sw) >= maxWidth ) - { - //qWarning("Please stop shrinking so aggressively.\nNo attempt will be made to show something decent"); - // shrinking too aggresively (or too much spaces...) ungraceful fallback - - indent = idx = 0; - minx = rx = x = QDocumentPrivate::m_leftMargin; - } - - m_indent = minx - QDocumentPrivate::m_leftMargin; - - while ( idx < m_text.length() ) - { - if ( c.isSpace() ) //!isWord(c) || !isWord(m_text.at(idx)) ) - { - lastX = rx; - lastWidth = x; - lastBreak = idx; - } - - c = m_text.at(idx); - - if ( c.unicode() == '\t' ) - { - int taboffset = tabStop - (column % tabStop); - - column += taboffset; - cwidth = sw * taboffset; - } else { - ++column; - cwidth = sw; - } - - if ( x + cwidth > maxWidth ) - { - if ( lastBreak == (m_frontiers.count() ? m_frontiers.last().first : indent) ) - { - // perfect cut or fallback to aggressive cut - m_frontiers << qMakePair(idx, rx); - lastBreak = idx; - lastWidth = x; - lastX = rx; - x = minx; - } else if ( lastBreak < idx ) { - // word cut at a non-ideal position - m_frontiers << qMakePair(lastBreak, lastX); - x = minx + (x - lastWidth); - } else { - m_frontiers << qMakePair(idx, rx); - x = minx; - } - } - - rx += cwidth; - x += cwidth; - ++idx; - } - } else { - QMediumArray composited = compose(); - - int idx = 0, minx = 0, lastBreak = 0, lastWidth = 0, lastX = 0, rx, - x = QDocumentPrivate::m_leftMargin, column = 0, cwidth; - - QChar c; - int indent = 0; - int fmt = 0; - const QVector<QFont>& fonts = m_doc->impl()->m_fonts; - - while ( idx < m_text.length() && m_text.at(idx).isSpace() ) - { - c = m_text.at(idx); - fmt = idx < composited.count() ? composited[idx] : 0; - QFontMetrics fm(fonts.at(fmt)); - - if ( c.unicode() == '\t' ) - { - int taboffset = tabStop - (column % tabStop); - - column += taboffset; - cwidth = fm.width(' ') * taboffset; - } else { - ++column; - cwidth = fm.width(c); - } - - x += cwidth; - ++idx; - } - - indent = idx; - minx = rx = x; - - if ( (minx + QDocumentPrivate::m_spaceWidth) >= maxWidth ) - { - //qWarning("Please stop shrinking so aggressively.\nNo attempt will be made to show something decent"); - - indent = idx = 0; - minx = rx = x = QDocumentPrivate::m_leftMargin; - } - - m_indent = minx - QDocumentPrivate::m_leftMargin; - - while ( idx < m_text.length() ) - { - if ( c.isSpace() ) //!isWord(c) || !isWord(m_text.at(idx)) ) - { - lastX = rx; - lastWidth = x; - lastBreak = idx; - } - - c = m_text.at(idx); - fmt = idx < composited.count() ? composited[idx] : 0; - QFontMetrics fm(fonts.at(fmt)); - - if ( c.unicode() == '\t' ) - { - int taboffset = tabStop - (column % tabStop); - - column += taboffset; - cwidth = fm.width(' ') * taboffset; - } else { - ++column; - cwidth = fm.width(c); - } - - if ( x + cwidth > maxWidth ) - { - if ( lastBreak == (m_frontiers.count() ? m_frontiers.last().first : indent) ) - { - // perfect cut or fallback to aggressive cut - m_frontiers << qMakePair(idx, rx); - lastBreak = idx; - lastWidth = x; - lastX = rx; - x = minx; - } else if ( lastBreak < idx ) { - // word cut at a non-ideal position - m_frontiers << qMakePair(lastBreak, lastX); - x = minx + (x - lastWidth); - } else { - m_frontiers << qMakePair(idx, rx); - x = minx; - } - } - - rx += cwidth; - x += cwidth; - ++idx; - } - } -} - -int QDocumentLineHandle::cursorToX(int cpos) const -{ - cpos = qBound(0, cpos, m_text.length()); - - if ( m_layout ) - { - int xoff = QDocumentPrivate::m_leftMargin, coff = 0, line = m_frontiers.count(); - - for ( int i = 0; i < m_frontiers.count(); ++i ) - { - if ( m_frontiers.at(i).first >= cpos ) - { - line = i; - - break; - } - } - - if ( line ) - { - //coff = m_frontiers.at(line - 1).first; - xoff = m_frontiers.at(line - 1).second; - } - - //qDebug("c:%i (wrap:%i) => c2x(x - %i) + %i", cpos, line, coff, xoff); - return qRound(m_layout->lineAt(line).cursorToX(cpos - coff)) + xoff; - } - - int tabStop = m_doc->impl()->m_tabStop; - - if ( QDocumentPrivate::m_fixedPitch ) - { - return QDocument::screenLength(m_text.constData(), cpos, tabStop) - * QDocumentPrivate::m_spaceWidth - + QDocumentPrivate::m_leftMargin; - } - - //qDebug("c->x(%i) unsafe computations...", cpos); - - QMediumArray composited = compose(); - const QVector<QFont>& fonts = m_doc->impl()->m_fonts; - - if ( (composited.count() < cpos) || fonts.isEmpty() ) - return QDocumentPrivate::m_fontMetrics->width(m_text.left(cpos)); - - int idx = 0, column = 0, cwidth; - int screenx = QDocumentPrivate::m_leftMargin; - - while ( idx < cpos ) - { - QChar c = m_text.at(idx); - QFontMetrics fm(fonts.at(idx < composited.count() ? composited[idx] : 0)); - - if ( c == '\t' ) - { - int taboffset = tabStop - (column % tabStop); - - column += taboffset; - cwidth = fm.width(' ') * taboffset; - } else { - ++column; - cwidth = fm.width(c); - } - - screenx += cwidth; - ++idx; - } - - //qDebug("cursorToX(%i) = %i", cpos, screenx); - - return screenx; -} - -int QDocumentLineHandle::xToCursor(int xpos) const -{ - //qDebug("x->c(%i) unsafe computations...", xpos); - if ( m_layout ) - { - int xoff = QDocumentPrivate::m_leftMargin, coff = 0, line = m_frontiers.count(); - - for ( int i = 0; i < m_frontiers.count(); ++i ) - { - if ( m_frontiers.at(i).second >= xpos ) - { - line = i; - - break; - } - } - - if ( line ) - { - //coff = m_frontiers.at(line - 1).first; - xoff = m_frontiers.at(line - 1).second; - } - - //qDebug("x:%i (wrap:%i) => x2c(x - %i) + %i", xpos, line, xoff, coff); - return m_layout->lineAt(line).xToCursor(xpos - xoff) + coff; - } - - int screenx = xpos; - int tabStop = m_doc->impl()->m_tabStop; - const QVector<QFont>& fonts = m_doc->impl()->m_fonts; - - if ( QDocumentPrivate::m_fixedPitch ) - { - int screenPos = - (screenx - QDocumentPrivate::m_leftMargin / 2) - / - QDocumentPrivate::m_spaceWidth - ; - - if ( tabStop == 1 ) - return screenPos; - - int idx = 0, column = 0; - - while ( (column < screenPos) && (idx < m_text.length()) ) - { - QChar c = m_text.at(idx); - - if ( c == QLatin1Char('\t') ) - { - int taboffset = tabStop - (column % tabStop); - column += taboffset; - } else { - ++column; - } - - ++idx; - } - - return idx; - } else { - if ( screenx <= QDocumentPrivate::m_leftMargin ) - return 0; - - QMediumArray composited = compose(); - - int idx = 0, x = 0, column = 0, cwidth; - screenx -= QDocumentPrivate::m_leftMargin; - - while ( idx < m_text.length() ) - { - QFontMetrics fm(fonts.at(idx < composited.count() ? composited[idx] : 0)); - - if ( m_text.at(idx) == '\t' ) - { - int taboffset = tabStop - (column % tabStop); - - column += taboffset; - cwidth = fm.width(' ') * taboffset; - } else { - ++column; - cwidth = fm.width(m_text.at(idx)); - } - - int mid = (x + (cwidth / 2) + 1); - - if ( screenx <= mid ) - return idx; - else if ( screenx <= (x + cwidth) ) - return idx + 1; - - x += cwidth; - ++idx; - } - - return m_text.length(); - } -} - -int QDocumentLineHandle::wrappedLineForCursor(int cpos) const -{ - int wrap = m_frontiers.count(); - - for ( int i = 0; i < m_frontiers.count(); ++i ) - { - if ( m_frontiers.at(i).first > cpos ) - { - wrap = i; - break; - } - } - - return wrap; -} - -int QDocumentLineHandle::documentOffsetToCursor(int x, int y) const -{ - int wrap = y / QDocumentPrivate::m_lineSpacing; - - if ( wrap > m_frontiers.count() ) - { - // return an invalid value instead? - //qDebug("a bit too far : (%i, %i)", x, y); - //wrap = m_frontiers.count(); - - return m_text.length(); - } - - if ( m_frontiers.count() ) - { - //qDebug("(%i, %i) : %i", x, y, wrap); - x = qMin(x, m_doc->widthConstraint()); - } - - int cpos = 0; - int max = m_text.length(); - - if ( wrap < m_frontiers.count() ) - max = m_frontiers.at(wrap).first - 1; - - if ( wrap > 0 ) - cpos = m_frontiers.at(wrap - 1).first; - - x -= QDocumentPrivate::m_leftMargin; - - int idx = cpos, column = 0; - const int ts = m_doc->tabStop(); - - if ( m_layout ) - { - cpos = m_layout->lineAt(wrap).xToCursor(x); - } else if ( QDocumentPrivate::m_fixedPitch ) { - if ( wrap ) - x -= m_indent; - - while ( (idx < max) && (x > 0) ) - { - bool tab = m_text.at(idx).unicode() == '\t'; - int cwidth = QDocumentPrivate::m_spaceWidth; - - if ( tab ) - { - int coff = ts - (column % ts); - column += coff; - cwidth *= coff; - } else { - ++column; - } - - int thresold = (2 * cwidth) / 3; - - if ( x <= thresold ) - break; - - x -= cwidth; - ++idx; - } - - cpos = idx; - } else { - if ( !hasFlag(QDocumentLine::FormatsApplied) ) - compose(); - - if ( wrap ) - x -= m_indent; - - const QVector<QFont>& fonts = m_doc->impl()->m_fonts; - - while ( (idx < max) && (x > 0) ) - { - int fid = idx < m_cache.count() ? m_cache[idx] : 0; - - if ( fid < 0 ) - fid = 0; - - QFontMetrics fm = (fid < fonts.count()) ? QFontMetrics(fonts.at(fid)) : m_doc->fontMetrics(); - - QChar c = m_text.at(idx); - bool tab = c.unicode() == '\t'; - int cwidth = 0; - - if ( tab ) - { - int coff = ts - (column % ts); - column += coff; - cwidth = fm.width(' '); - cwidth *= coff; - } else { - ++column; - cwidth = fm.width(c); - } - - int thresold = (2 * cwidth) / 3; - - if ( x <= thresold ) - break; - - x -= cwidth; - ++idx; - } - - cpos = idx; - } - - return cpos; -} - -void QDocumentLineHandle::cursorToDocumentOffset(int cpos, int& x, int& y) const -{ - if ( cpos > m_text.length() ) - cpos = m_text.length(); - else if ( cpos < 0 ) - cpos = 0; - - int idx = 0; - int wrap = wrappedLineForCursor(cpos); - - x = QDocumentPrivate::m_leftMargin; - y = wrap * QDocumentPrivate::m_lineSpacing; - - if ( wrap ) - { - idx = m_frontiers.at(wrap - 1).first; - } - - int column = 0; - const int ts = m_doc->tabStop(); - - if ( m_layout ) - { - x += m_layout->lineAt(wrap).cursorToX(cpos); - } else if ( QDocumentPrivate::m_fixedPitch ) { - if ( wrap ) - x += m_indent; - - while ( idx < cpos ) - { - bool tab = m_text.at(idx).unicode() == '\t'; - int cwidth = QDocumentPrivate::m_spaceWidth; - - if ( tab ) - { - int coff = ts - (column % ts); - column += coff; - cwidth *= coff; - } else { - ++column; - } - - x += cwidth; - ++idx; - } - } else { - if ( !hasFlag(QDocumentLine::FormatsApplied) ) - compose(); - - if ( wrap ) - x += m_indent; - - const QVector<QFont>& fonts = m_doc->impl()->m_fonts; - - while ( idx < cpos ) - { - int fid = idx < m_cache.count() ? m_cache[idx] : 0; - - if ( fid < 0 ) - fid = 0; - - QFontMetrics fm = (fid < fonts.count()) ? QFontMetrics(fonts.at(fid)) : m_doc->fontMetrics(); - - QChar c = m_text.at(idx); - bool tab = c.unicode() == '\t'; - int cwidth = 0; - - if ( tab ) - { - int coff = ts - (column % ts); - column += coff; - cwidth = fm.width(' '); - cwidth *= coff; - } else { - ++column; - cwidth = fm.width(c); - } - - x += cwidth; - ++idx; - } - } -} - -QPoint QDocumentLineHandle::cursorToDocumentOffset(int cpos) const -{ - QPoint p; - cursorToDocumentOffset(cpos, p.rx(), p.ry()); - return p; - #if 0 - int y = 0; - int x = cursorToX(cpos); - - if ( m_frontiers.isEmpty() ) - return QPoint(x, y); - - int first = m_frontiers.at(0).first; - - if ( cpos < first ) - return QPoint(x, y); - - int wrappedX = 0; - int fns = nextNonSpaceChar(0), off = 0; - - if ( fns != -1 && fns < first ) - off = cursorToX(fns); - else - off = QDocumentPrivate::m_leftMargin; - - for ( int j = 0; j < m_frontiers.count(); ++j ) - { - if ( m_frontiers[j].first <= cpos ) - { - wrappedX = m_frontiers[j].second; - y += QDocumentPrivate::m_lineSpacing; - } else { - break; - } - } - - return QPoint(x - wrappedX + off, y); - #endif -} - -void QDocumentLineHandle::clearOverlays() -{ - m_overlays.clear(); - - //setFlag(QDocumentLine::LayoutDirty, true); - setFlag(QDocumentLine::FormatsApplied, false); - //applyOverlays(); -} - -void QDocumentLineHandle::addOverlay(const QFormatRange& over) -{ - m_overlays << over; - - //setFlag(QDocumentLine::LayoutDirty, true); - setFlag(QDocumentLine::FormatsApplied, false); - //applyOverlays(); -} - -void QDocumentLineHandle::removeOverlay(const QFormatRange& over) -{ - int i = m_overlays.removeAll(over); - - //setFlag(QDocumentLine::LayoutDirty, true); - if ( i ) - setFlag(QDocumentLine::FormatsApplied, false); - //applyOverlays(); -} - -void QDocumentLineHandle::shiftOverlays(int position, int offset) -{ - if ( offset > 0 ) - { - for ( int i = 0; i < m_overlays.count(); ++i ) - { - QFormatRange& r = m_overlays[i]; - - if ( r.offset >= position ) - { - r.offset += offset; - } else if ( r.offset + r.length > position ) { - m_overlays.removeAt(i); - --i; - } - } - } else if ( offset < 0 ) { - const int max = position - offset; - - for ( int i = 0; i < m_overlays.count(); ++i ) - { - QFormatRange& r = m_overlays[i]; - - if ( r.offset >= max ) - { - r.offset += offset; - } else if ( r.offset + r.length >= position ) { - m_overlays.removeAt(i); - --i; - } - } - } - - setFlag(QDocumentLine::FormatsApplied, false); -} - -void QDocumentLineHandle::setFormats(const QVector<int>& fmts) -{ - m_formats = fmts; - - while ( m_formats.count() > m_text.length() ) - m_formats.pop_back(); - - while ( m_formats.count() < m_text.length() ) - m_formats.append(0); - - //setFlag(QDocumentLine::LayoutDirty, true); - setFlag(QDocumentLine::FormatsApplied, false); - //applyOverlays(); -} - -QMediumArray QDocumentLineHandle::compose() const -{ - //QMediumArray m_composited(m_text.length()); - if ( hasFlag(QDocumentLine::FormatsApplied) ) - return m_cache; - - m_cache.resize(m_text.length()); - - for ( int i = 0; i < qMin(m_formats.count(), m_text.length()); ++i ) - m_cache[i] = m_formats.at(i); - - for ( int i = m_formats.count(); i < m_text.length(); ++i ) - m_cache[i] = 0; - - // compositing formats and overlays - foreach ( const QFormatRange& r, m_overlays ) - { - int beg = qMax(0, r.offset); - int end = qMin(r.offset + r.length, m_cache.count()); - - for ( int i = beg; i < end; ++i ) - { - m_cache[i] = r.format; - } - } - - setFlag(QDocumentLine::FormatsApplied, true); - - return m_cache; -} - -QList<QTextLayout::FormatRange> QDocumentLineHandle::decorations() const -{ - if ( !hasFlag(QDocumentLine::FormatsApplied) ) - compose(); - - // turning format "map" into ranges that QTextLayout can understand... - QList<QTextLayout::FormatRange> m_ranges; - - int fid = 0; - QTextLayout::FormatRange r; - r.start = r.length = -1; - - int i = 0; - - //if ( m_cache.isEmpty() ) - // qWarning("empty cache..."); - - while ( i < m_cache.count() ) - { - while ( (i < m_cache.count()) && !m_cache[i] ) - ++i; - - if ( i >= m_cache.count() ) - break; - - fid = m_cache[i]; - - r.start = i; - r.format = m_doc->formatScheme()->format(fid).toTextCharFormat(); - - while ( (i < m_cache.count()) && (m_cache[i] == fid) ) - ++i; - - if ( i >= m_cache.count() ) - break; - - r.length = i - r.start; - m_ranges << r; - - r.start = r.length = -1; - } - - if ( r.start != -1 ) - { - r.length = m_cache.count() - r.start; - m_ranges << r; - } - - return m_ranges; -} - -void QDocumentLineHandle::applyOverlays() const -{ - if ( !m_layout ) - return; - - //m_layout->setAdditionalFormats(decorations()); - - //setFlag(QDocumentLine::FormatsApplied, true); -} - -void QDocumentLineHandle::layout() const -{ - bool needLayout = false; - static QList<QChar::Direction> m_layoutRequirements = QList<QChar::Direction>() - << QChar::DirR - << QChar::DirAL - << QChar::DirRLE - << QChar::DirRLO - << QChar::DirPDF - << QChar::DirAN; - - for ( int i = 0; (i < m_text.length()) && !needLayout; ++i ) - { - QChar c = m_text.at(i); - - needLayout = m_layoutRequirements.contains(c.direction()); - } - - if ( needLayout ) - { - //qDebug("layout needed at line %i", this->line()); - - if ( !m_layout ) - { - m_layout = new QTextLayout(m_text, QDocument::font()); - } else { - m_layout->setText(m_text); - //m_layout->setFont(config()->font()); - } - - m_layout->setCacheEnabled(false); - // Initial setup of the QTextLayout. - - // Tab width - QTextOption opt; - opt.setFlags(QTextOption::IncludeTrailingSpaces); - opt.setTabStop(m_doc->tabStop() * QDocumentPrivate::m_spaceWidth); - - //opt.setWrapMode(QTextOption::NoWrap); - opt.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); - - // Find the first strong character in the string. - // If it is an RTL character, set the base layout direction of the string to RTL. - // - // See http://www.unicode.org/reports/tr9/#The_Paragraph_Level (Sections P2 & P3). - // Qt's text renderer ("scribe") version 4.2 assumes a "higher-level protocol" - // (such as KatePart) will specify the paragraph level, so it does not apply P2 & P3 - // by itself. If this ever change in Qt, the next code block could be removed. - if ( m_text.isRightToLeft() ) - opt.setTextDirection(Qt::RightToLeft); - - m_layout->setTextOption(opt); - - // Syntax highlighting, inbuilt and arbitrary - //m_layout->setAdditionalFormats(m_ranges); - - // Begin layouting - m_layout->beginLayout(); - - m_frontiers.clear(); - - int i = 0, rx = 0, height = 0, minwidth = 0; - - forever - { - QTextLine line = m_layout->createLine(); - - if ( !line.isValid() ) - { - //if ( m_layout->lineCount() > 1 ) - // qWarning("Troubles expected on line %i", this->line()); - - break; - } - - if ( m_doc->widthConstraint() ) - line.setLineWidth(m_doc->widthConstraint() - QDocumentPrivate::m_leftMargin); - else - line.setNumColumns(m_text.length()); - - rx += qRound(line.naturalTextWidth()); //qRound(line.cursorToX(line.textLength())); - - if ( m_doc->impl()->m_constrained && m_layout->textOption().textDirection() == Qt::RightToLeft ) - { - line.setPosition(QPoint(qRound(qreal(m_doc->widthConstraint() - 2 * QDocumentPrivate::m_leftMargin) - line.naturalTextWidth()), height)); - } else { - line.setPosition(QPoint(minwidth, height)); - - if ( !i ) - { - m_indent = minwidth = cursorToX(nextNonSpaceChar(0)) - QDocumentPrivate::m_leftMargin; - - if ( minwidth < 0 || minwidth >= m_doc->widthConstraint() ) - minwidth = 0; - } - } - - m_frontiers << qMakePair(line.textStart() + line.textLength(), rx); - - ++i; - - height += QDocumentPrivate::m_lineSpacing; - //height += QDocument::fontMetrics().height(); - } - - m_frontiers.pop_back(); - - m_layout->endLayout(); - } else { - if ( m_layout ) - delete m_layout; - - m_layout = 0; - //updateWrap(); - } - - setFlag(QDocumentLine::LayoutDirty, false); -} - -struct RenderRange -{ - int position; - int length; - quint16 format; - int wrap; -}; - -void QDocumentLineHandle::draw( QPainter *p, - int xOffset, - int vWidth, - const QSmallArray& sel, - const QSmallArray& cursor, - const QPalette& pal, - bool fullSel) const -{ - if ( hasFlag(QDocumentLine::LayoutDirty) ) - layout(); - - if ( m_layout && !hasFlag(QDocumentLine::FormatsApplied) ) - m_layout->setAdditionalFormats(decorations()); - - QMediumArray m_composited = compose(); - - if ( m_layout ) - { - //if ( !hasFlag(QDocumentLine::FormatsApplied) ) - // applyOverlays(); - - const int lh = QDocument::fontMetrics().height(); - - QVector<QTextLayout::FormatRange> selections; - - QTextCharFormat fmt; - fmt.setBackground(pal.highlight()); - fmt.setForeground(pal.highlightedText()); - - QTextLayout::FormatRange range; - if ( fullSel ) - { - range.start = 0; - range.format = fmt; - range.length = m_text.length(); - selections << range; - } else { - for ( int i = 0; i < sel.count(); ++i ) - { - range.start = sel[i]; - range.format = fmt; - - if ( (i + 1) < sel.count() ) - { - // regular selection subset - range.length = sel[++i] - range.start; - - } else if ( m_layout->lineCount() ) { - // span to end of line, not only text - range.length = m_text.length() - range.start; - qreal lineWidth = m_layout->lineAt(m_layout->lineCount() - 1).naturalTextWidth(); - const int endX = QDocumentPrivate::m_leftMargin + qRound(lineWidth) - xOffset; - - QRect area(endX, lh * i, vWidth - endX, lh); - - p->fillRect(area, fmt.background()); - } - - selections << range; - } - } - - QPoint off(QDocumentPrivate::m_leftMargin, 0); - - m_layout->draw(p, off, selections); - - for ( int i = 0; i < cursor.count(); ++i ) - m_layout->drawCursor(p, off, cursor[i]); - - //m_layout->clearAdditionalFormats(); - } else if ( m_text.isEmpty() ) { - // enforce selection drawing on empty lines - if ( sel.count() == 1 ) - p->fillRect( - qMax(xOffset, QDocumentPrivate::m_leftMargin), - 0, - vWidth, - QDocumentPrivate::m_lineSpacing, - pal.highlight() - ); - - // enforce cursor drawing on empty lines - if ( cursor.count() && (xOffset < QDocumentPrivate::m_leftMargin) ) - p->drawLine( - QDocumentPrivate::m_leftMargin, - 0, - QDocumentPrivate::m_leftMargin, - QDocumentPrivate::m_lineSpacing - ); - - } else if ( true ) { - - QVector<quint16> merged; - merged.fill(0, m_text.count()); - - QList<RenderRange> ranges; - - // find start of trailing whitespaces - int last = m_text.length(); - - while ( (last > 0) && m_text.at(last - 1).isSpace() ) - --last; - - // TODO : format-level (not format id) merging of formats and opverlays... - - // merge selection ranges with the rest (formats + overlays) - if ( true ) //m_composited.count() || sel.count() ) - { - //int max = qMin(m_text.count(), m_composited.count()); - - for ( int i = 0; i < m_text.count(); ++i ) - { - if ( m_composited.count() > i ) - merged[i] = m_composited.at(i); - - // separate spaces to ease rendering loop - if ( m_text.at(i).isSpace() ) - merged[i] |= 0x4000; - } - - for ( int i = 0; i < sel.count(); i += 2 ) - { - int max = m_text.length(); - - if ( (i + 1) < sel.count() ) - max = qMin(sel[i + 1], max); - - for ( int j = sel[i]; j < max; ++j ) - merged[j] |= 0x8000; - } - } - - // generate render ranges - if ( merged.count() ) - { - int i = 0, wrap = 0, max = m_text.count(), - frontier = m_frontiers.count() ? m_frontiers.first().first : max; - - while ( i < max ) - { - RenderRange r; - r.position = i; - r.length = 1; - r.wrap = wrap; - r.format = merged.at(i); - - while ( ((i + 1) < frontier) && (merged.at(i + 1) == r.format) ) - { - ++r.length; - ++i; - } - - ranges << r; - ++i; - - if ( i == frontier ) - { - ++wrap; - frontier = wrap < m_frontiers.count() ? m_frontiers.at(wrap).first : max; - } - } - } else if ( m_frontiers.count() ) { - // no formatting (nor selection) : simpler - int i = 0, wrap = 0, max = m_text.count(), - frontier = m_frontiers.count() ? m_frontiers.first().first : max; - - while ( i < max ) - { - RenderRange r; - r.position = i; - r.length = 1; - r.wrap = wrap; - r.format = fullSel ? 0x8000 : 0; - - while ( ((i + 1) < frontier) ) - { - ++r.length; - ++i; - } - - ranges << r; - ++i; - - if ( i == frontier ) - { - ++wrap; - frontier = wrap < m_frontiers.count() ? m_frontiers.at(wrap).first : max; - } - } - } else { - // neither formatting nor line wrapping : simple drawText() - RenderRange r; - r.position = 0; - r.length = m_text.length(); - r.format = fullSel ? 0x8000 : 0; - - ranges << r; - } - - quint16 fmt = fullSel ? 0x8000 : 0; - QDocumentPrivate *d = m_doc->impl(); - const int ts = d->m_tabStop; - const int maxWidth = xOffset + vWidth; - const bool unbounded = sel.count() & 1; - const QColor ht = pal.highlightedText().color(); - - const bool showTabs = QDocument::showSpaces() & QDocument::ShowTabs, - showLeading = QDocument::showSpaces() & QDocument::ShowLeading, - showTrailing = QDocument::showSpaces() & QDocument::ShowTrailing; - - //const int fns = nextNonSpaceChar(0); - int indent = qMax(m_indent, QDocumentPrivate::m_leftMargin); - - int cidx = 0; - int rngIdx = 0; - int column = 0; - bool continuingWave = false, brokenWave = false; - int dir = 0; // 0 = down; 1 = up - int wrap = 0, xpos = QDocumentPrivate::m_leftMargin, ypos = 0; - bool leading = ranges.first().format & 0x4000, pastLead = false; - - foreach ( const RenderRange& r, ranges ) - { - ++rngIdx; - - if ( wrap != r.wrap ) - { - continuingWave = false; - - if ( fmt & 0x8000 ) - { - // finish selection - p->fillRect( - xpos, ypos, - maxWidth - xpos, QDocumentPrivate::m_lineSpacing, - pal.highlight() - ); - - } - - if ( pastLead && (r.format & 0x4000) ) - { - indent = QDocumentPrivate::m_leftMargin; - } - - ++wrap; - column = 0; - ypos += QDocumentPrivate::m_lineSpacing; - xpos = indent; - - if ( r.format & 0x8000 ) - { - // finish selection - p->fillRect( - QDocumentPrivate::m_leftMargin, ypos, - xpos, QDocumentPrivate::m_lineSpacing, - pal.highlight() - ); - - } - } - if ( leading && !(r.format & 0x4000) ) - { - //indent = xpos; - leading = false; - pastLead = true; - } - - // TODO : clip more accurately (i.e inside ranges) - if ( xpos > maxWidth ) - break; - - if ( r.format != fmt ) - { - d->tunePainter(p, r.format & 0x0fff); - - fmt = r.format; - } - - int rwidth = 0; - int tcol = column; - const QString rng = m_text.mid(r.position, r.length); - - if ( r.format & 0x4000 ) - { - foreach ( QChar c, rng ) - { - if ( c.unicode() == '\t' ) - { - int toff = ts - (tcol % ts); - rwidth += toff * QDocumentPrivate::m_spaceWidth; - tcol += toff; - } else { - rwidth += QDocumentPrivate::m_spaceWidth; - ++tcol; - } - } - } else { - column += r.length; - - if ( QDocumentPrivate::m_fixedPitch ) - rwidth = QDocumentPrivate::m_spaceWidth * r.length; - else - rwidth = p->fontMetrics().width(rng); - } - - if ( (xpos + rwidth) <= xOffset ) - { - xpos += rwidth; - - if ( r.format & 0x4000 ) - column = tcol; - - continue; - } - - QFormat format; - int xspos = xpos; - const QPen oldpen = p->pen(); - const int baseline = ypos + QDocumentPrivate::m_ascent; - - if ( d->m_formatScheme ) - format = d->m_formatScheme->format(fmt & 0x0fff); - - if ( fullSel || (fmt & 0x8000) ) - { - p->setPen(ht); - - p->fillRect(xpos, ypos, - rwidth, QDocumentPrivate::m_lineSpacing, - pal.highlight()); - - } else { - if ( format.foreground.isValid() ) - { - p->setPen(format.foreground); - } else { - p->setBrush(pal.text()); - } - - if ( format.background.isValid() ) - { - p->fillRect(xpos, ypos, - rwidth, QDocumentPrivate::m_lineSpacing, - format.background); - } - } - - if ( r.format & 0x4000 ) - { - // spaces - int max = r.position + r.length; - - if ( rngIdx == ranges.count() ) - ++max; - - for ( int i = r.position; i < max; ++i ) - { - while ( cidx < cursor.count() ) - { - if ( cursor.at(cidx) == i ) - { - p->drawLine(xpos, ypos, xpos, ypos + QDocumentPrivate::m_lineSpacing); - - ++cidx; - } else { - break; - } - } - - if ( i == r.position + r.length ) - break; - - bool isTab = m_text.at(i).unicode() == '\t'; - - if ( isTab ) - { - int toff = ts - (column % ts); - column += toff; - int xoff = toff * QDocumentPrivate::m_spaceWidth; - /* - if ( r.format & 0x8000 ) - { - p->fillRect(xpos, ypos, - xoff, QDocumentPrivate::m_lineSpacing, - pal.highlight()); - - } - */ - if ( showTabs ) - { - p->translate(xpos - m_spaceSignOffset, ypos + QDocumentPrivate::m_ascent); - p->drawPoints(m_spaceSign, sizeof(m_spaceSign) / sizeof(QPoint)); - p->translate(m_spaceSignOffset - xpos,-ypos - QDocumentPrivate::m_ascent); - } - - xpos += xoff; - } else { - ++column; - /* - if ( r.format & 0x8000 ) - { - p->fillRect(xpos, ypos, - QDocumentPrivate::m_spaceWidth, QDocumentPrivate::m_lineSpacing, - pal.highlight()); - - } - */ - if ( - ( - leading - && - showLeading - ) - || - ( - (r.position >= last) - && - showTrailing - ) - ) - { - p->translate(xpos - m_spaceSignOffset, ypos + QDocumentPrivate::m_ascent); - p->drawPoints(m_spaceSign, sizeof(m_spaceSign) / sizeof(QPoint)); - p->translate(m_spaceSignOffset - xpos,-ypos - QDocumentPrivate::m_ascent); - } - - xpos += QDocumentPrivate::m_spaceWidth; - } - } - - /* - if ( leading ) - { - //indent = xpos; - leading = false; - pastLead = true; - } - */ - - } else { - p->drawText(xpos, baseline, rng); - - while ( cidx < cursor.count() ) - { - const int xcoff = cursor.at(cidx) - r.position; - - if ( xcoff < 0 ) - { - ++cidx; - continue; - } - - if ( xcoff < (rngIdx == ranges.count() ? r.length + 1 : r.length) ) - { - int xcpos = xpos; - - if ( xcoff ) - { - if ( QDocumentPrivate::m_fixedPitch ) - { - xcpos += xcoff * QDocumentPrivate::m_spaceWidth; - } else { - xcpos += p->fontMetrics().width(rng.left(xcoff)); - } - } - - //qDebug("drawing cursor %i (col %i, x=%i)", cidx, cursor.at(cidx), xcpos); - - p->drawLine(xcpos, ypos, xcpos, ypos + QDocumentPrivate::m_lineSpacing); - - ++cidx; - } else { - break; - } - } - - xpos += rwidth; - } - - //qDebug("underline pos : %i", p->fontMetrics().underlinePos()); - - if ( format.linescolor.isValid() ) - p->setPen(format.linescolor); - - const int ydo = qMin(baseline + p->fontMetrics().underlinePos(), ypos + QDocumentPrivate::m_lineSpacing - 1); - const int yin = baseline - p->fontMetrics().strikeOutPos(); - const int yup = qMax(baseline - p->fontMetrics().overlinePos() + 1, ypos); - - if ( format.overline ) - { - p->drawLine(xspos, yup, xpos, yup); - } - - if ( format.strikeout ) - { - p->drawLine(xspos, yin, xpos, yin); - } - - if ( format.underline ) - { - p->drawLine(xspos, ydo, xpos, ydo); - } - - if ( format.waveUnderline ) - { - /* - those goddamn font makers take liberties with common sense - and make it so damn harder to figure proper y offset for wave - underline (keeping the regular underline pos make it look - weird or even invisible on some fonts... reference rendering - with DejaVu Sans Mono) - */ - - // we used fixed wave amplitude of 3 (well strictly speaking - // amplitude would be 1.5 but let's forget about waves and - // focus on getting that code to work... - - // gotta center things - const int ycenter = ypos + QDocumentPrivate::m_lineSpacing - 3; - /* - qMin( - ypos + (QDocumentPrivate::m_ascent + QDocumentPrivate::m_lineSpacing) / 2, - ypos + QDocumentPrivate::m_lineSpacing - 3 - );*/ - - //if (format.waveUnderlineForeground.isValid()) - // p->setPen(format.waveUnderlineForeground); - - int cp = 0; - brokenWave = false; - - while ( cp < rwidth ) - { - if ( !cp && !continuingWave ) - { - dir = 0; - p->drawLine(xspos, ycenter, xspos + 1, ycenter + 1); - ++cp; - } else if ( !cp && brokenWave ) { - if ( !dir ) - p->drawLine(xspos, ycenter, xspos + 1, ycenter + 1); - else - p->drawLine(xspos, ycenter, xspos + 1, ycenter - 1); - - } else { - if ( cp + 2 > rwidth) - { - if ( !dir ) - p->drawLine(xspos + cp, ycenter - 1, xspos + cp + 1, ycenter); - else - p->drawLine(xspos + cp, ycenter + 1, xspos + cp + 1, ycenter); - - // trick to keep current direction - dir ^= 1; - - brokenWave = true; - ++cp; - } else { - if ( !dir ) - p->drawLine(xspos + cp, ycenter - 1, xspos + cp + 2, ycenter + 1); - else - p->drawLine(xspos + cp, ycenter + 1, xspos + cp + 2, ycenter - 1); - - cp += 2; - } - } - - dir ^= 1; - } - - continuingWave = true; - } else { - continuingWave = false; - dir = 0; - } - - p->setPen(oldpen); - } - - if ( unbounded ) - p->fillRect( - xpos, ypos, - maxWidth - xpos, QDocumentPrivate::m_lineSpacing, - pal.highlight() - ); - - } else { - QChar c; - - int maxWidth = xOffset + vWidth; - - const bool wrapped = m_frontiers.count(); - - int fmt = 0; - - bool leading = true, unbounded = false, leftSel = false, - showTabs = QDocument::showSpaces() & QDocument::ShowTabs, - showLeading = QDocument::showSpaces() & QDocument::ShowLeading, - showTrailing = QDocument::showSpaces() & QDocument::ShowTrailing; - - int cwidth, - ypos = 0, - indent = 0, - idx = 0, column = 0, - selidx = 0, sellen = 0, wrap = 0, - xpos = QDocumentPrivate::m_leftMargin; - - const int ts = QDocument::tabStop(); - - // find start of trailing whitespaces - int last = m_text.length(); - - while ( (last > 0) && m_text.at(last - 1).isSpace() ) - --last; - - //p->save(); - - //qDebug("drawing from %i to %i", xpos, maxWidth); - - while ( idx < m_text.length() ) - { - if ( (selidx < sel.count()) && (idx == sel[selidx]) ) - { - if ( (selidx + 1) < sel.count() ) - { - sellen = sel[selidx + 1] - sel[selidx]; - selidx += 2; - } else { - // unbounded selection - unbounded = true; - - ++selidx; - sellen = m_text.length() - idx; - - p->fillRect( - xpos, ypos, - maxWidth - xpos, QDocumentPrivate::m_lineSpacing, - pal.highlight() - ); - } - } - - c = m_text.at(idx); - - if ( c == '\t' ) - { - int toff = ts - (column % ts); - cwidth = toff * QDocumentPrivate::m_spaceWidth; - column += toff - 1; - } else if ( c == ' ' ) { - cwidth = QDocumentPrivate::m_spaceWidth; - } else if ( idx < m_composited.count() ) { - int nfmt = m_composited[idx]; - - if ( fmt != nfmt ) - { - m_doc->impl()->tunePainter(p, nfmt); - fmt = nfmt; - } - - // make sure bold/italicized/.. chars are taken into account... - cwidth = p->fontMetrics().width(c); - } else { - // char uses default font... - cwidth = QDocumentPrivate::m_fontMetrics->width(c); - } - - if ( (xpos + cwidth) > xOffset ) - { - // MUST be done after setting the proper chararcter width! - if ( wrapped && (wrap < m_frontiers.count()) && (idx >= m_frontiers.at(wrap).first) ) - { - if ( sellen || leftSel ) - { - p->fillRect( - xpos, ypos, - maxWidth - xpos, QDocumentPrivate::m_lineSpacing, - pal.highlight() - ); - - } - - ++wrap; - xpos = indent; - ypos += QDocumentPrivate::m_lineSpacing; - - if ( sellen || leftSel ) - { - p->fillRect( - QDocumentPrivate::m_leftMargin, ypos, - xpos - QDocumentPrivate::m_leftMargin + (leftSel ? 0 : cwidth), - QDocumentPrivate::m_lineSpacing, - pal.highlight() - ); - - } - - } else { - if ( sellen ) - { - p->fillRect( - xpos, ypos, - cwidth, QDocumentPrivate::m_lineSpacing, - pal.highlight() - ); - - } - } - - const int baseline = ypos + QDocumentPrivate::m_ascent; - - if ( !c.isSpace() ) - { - if ( leading ) - indent = xpos; - - leading = false; - - if ( fullSel || sellen ) - p->setPen(pal.highlightedText().color()); - - p->drawText(xpos, baseline, QString(c)); - } else if ( - ( - (c == ' ') - && - ( - ( - leading - && - showLeading - ) - || - ( - (idx > last) - && - showTrailing - ) - ) - ) - || - ( - (c == '\t') - && - showTabs - ) - ) - { - //p->drawText(xpos - m_spaceSignOffset, ypos + QDocumentPrivate::m_ascent, QChar(0x231E)); - - p->translate(xpos - m_spaceSignOffset, ypos + QDocumentPrivate::m_ascent); - p->drawPoints(m_spaceSign, sizeof(m_spaceSign) / sizeof(QPoint)); - p->translate(m_spaceSignOffset - xpos,-ypos - QDocumentPrivate::m_ascent); - } - - for ( int cidx = 0; cidx < cursor.count(); ++cidx ) - { - if ( cursor[cidx] == idx ) - p->drawLine(xpos, ypos, xpos, ypos + QDocumentPrivate::m_lineSpacing); - } - - if ( idx < m_composited.count() ) - { - QFormat format = m_doc->impl()->m_formatScheme->format(m_composited[idx]); - - //qDebug("underline pos : %i", p->fontMetrics().underlinePos()); - - const int ydo = baseline + p->fontMetrics().underlinePos(); - const int yin = baseline - p->fontMetrics().strikeOutPos(); - const int yup = baseline - p->fontMetrics().overlinePos(); - - if ( format.overline ) - { - p->drawLine(xpos, yup, xpos + cwidth, yup); - } - - if ( format.strikeout ) - { - p->drawLine(xpos, yin, xpos + cwidth, yin); - } - - if ( format.underline ) - { - p->drawLine(xpos, ydo, xpos + cwidth, ydo); - } - - if ( format.waveUnderline ) - { - QPen oldpen = p->pen(); - p->setPen(QColor(255, 0, 0)); - - p->drawLine(xpos, ydo, - xpos + cwidth / 2 , ypos + QDocumentPrivate::m_lineSpacing - 1); - - p->drawLine(xpos + cwidth / 2, ypos + QDocumentPrivate::m_lineSpacing - 1, - xpos + cwidth, ydo); - - p->setPen(oldpen); - } - } - } else { - if ( wrapped && (wrap < m_frontiers.count()) && (idx >= m_frontiers.at(wrap).first) ) - { - ++wrap; - xpos = indent; - ypos += QDocumentPrivate::m_lineSpacing; - } - - if ( !c.isSpace() ) - { - if ( leading ) - indent = xpos; - - leading = false; - } - } - - if ( sellen ) - leftSel = !(--sellen); - else - leftSel = false; - - if ( leftSel ) - { - p->setPen(pal.text().color()); - fmt = 0; - } - - xpos += cwidth; - ++column; - ++idx; - - if ( !wrapped && xpos > maxWidth ) - break; - } - - // ensure drawing of cursor at EOL - for ( int cidx = 0; cidx < cursor.count(); ++cidx ) - { - if ( cursor[cidx] == idx ) - p->drawLine(xpos, ypos, xpos, ypos + QDocumentPrivate::m_lineSpacing); - } - - if ( wrapped && unbounded ) - p->fillRect( - xpos, ypos, - maxWidth - xpos, QDocumentPrivate::m_lineSpacing, - pal.highlight() - ); - - } -} - -////////////////// - - -///////////////////////// -// QDocumentCursorHandle -///////////////////////// -QDocumentCursorHandle::QDocumentCursorHandle(QDocument *d, int line) - : m_flags(ColumnMemory), m_doc(d), - #if QT_VERSION >= 0x040400 - m_ref(0), - #endif - m_begOffset(0), m_endOffset(0), m_max(0), m_begLine(line), m_endLine(-1) -{ - #if QT_VERSION < 0x040400 - m_ref.init(0); - #endif - - //m_blocks.push(0); - //qDebug("Cursor handle created : 0x%x", this); -} - -QDocumentCursorHandle::~QDocumentCursorHandle() -{ - //qDebug("Cursor handle deleted : 0x%x", this); - Q_ASSERT(!m_ref); - - QDocumentCommand::disableAutoUpdate(this); -} - -void QDocumentCursorHandle::copy(const QDocumentCursorHandle *c) -{ - if ( !c ) - return; - - m_begLine = c->m_begLine; - m_begOffset = c->m_begOffset; - m_endLine = c->m_endLine; - m_endOffset = c->m_endOffset; - m_flags = c->m_flags; - m_max = c->m_max; -} - -QDocument* QDocumentCursorHandle::document() const -{ - return m_doc; -} - -QDocumentCursorHandle* QDocumentCursorHandle::clone() const -{ - QDocumentCursorHandle *c = new QDocumentCursorHandle(m_doc); - c->copy(this); - - c->setAutoUpdated(isAutoUpdated()); - - return c; -} - -bool QDocumentCursorHandle::atEnd() const -{ - if ( !m_doc ) - return true; - - bool atLineEnd; - QDocumentLine l = m_doc->line(m_begLine); - - //qDebug("Cursor handle : 0x%x->atEnd() => 0x%x", this, m_begLine.handle()); - - if ( l.isValid() ) - { - atLineEnd = m_begOffset == l.length(); - l = m_doc->line(m_begLine + 1); - } else { - //qWarning("Invalid cursor..."); - return true; - } - - return l.isNull() && atLineEnd; -} - -bool QDocumentCursorHandle::atStart() const -{ - if ( !m_doc ) - return true; - - QDocumentLine l = m_doc->line(m_begLine - 1); - - return l.isNull() && !m_begOffset; -} - -bool QDocumentCursorHandle::atBlockEnd() const -{ - return atLineEnd(); -} - -bool QDocumentCursorHandle::atBlockStart() const -{ - return atLineStart(); -} - -bool QDocumentCursorHandle::atLineEnd() const -{ - if ( !m_doc ) - return true; - - QDocumentLine l = m_doc->line(m_begLine); - - return l.isValid() ? l.length() == m_begOffset : false; -} - -bool QDocumentCursorHandle::atLineStart() const -{ - if ( !m_doc ) - return true; - - QDocumentLine l = m_doc->line(m_begLine); - - return l.isValid() ? !m_begOffset : false; -} - -bool QDocumentCursorHandle::hasSelection() const -{ - if ( !m_doc ) - return false; - - QDocumentLine l1 = m_doc->line(m_begLine), l2 = m_doc->line(m_endLine); - - return l1.isValid() && l2.isValid(); -} - -bool QDocumentCursorHandle::isSilent() const -{ - return hasFlag(Silent); -} - -void QDocumentCursorHandle::setSilent(bool y) -{ - if ( y ) - setFlag(Silent); - else - clearFlag(Silent); -} - -bool QDocumentCursorHandle::isAutoUpdated() const -{ - return QDocumentCommand::isAutoUpdated(this); -} - -void QDocumentCursorHandle::setAutoUpdated(bool y) -{ - if ( y ) - QDocumentCommand::enableAutoUpdate(this); - else - QDocumentCommand::disableAutoUpdate(this); -} - -QDocumentLine QDocumentCursorHandle::line() const -{ - if ( !m_doc ) - return QDocumentLine(); - - return m_doc->line(m_begLine); -} - -QDocumentLine QDocumentCursorHandle::anchorLine() const -{ - if ( !m_doc ) - return QDocumentLine(); - - return m_endLine != -1 ? m_doc->line(m_endLine) : line(); -} - -int QDocumentCursorHandle::lineNumber() const -{ - return m_begLine; -} - -int QDocumentCursorHandle::anchorLineNumber() const -{ - return m_endLine != -1 ? m_endLine : m_begLine; -} - -int QDocumentCursorHandle::anchorColumnNumber() const -{ - if ( !m_doc ) - return -1; - - return m_doc->line(m_endLine).isValid() ? m_endOffset : m_begOffset; -} - -int QDocumentCursorHandle::visualColumnNumber() const -{ - return QDocument::screenLength( - line().text().constData(), - m_begOffset, - QDocument::tabStop() - ); - -} - -int QDocumentCursorHandle::columnNumber() const -{ - return m_begOffset; -} - -void QDocumentCursorHandle::setColumnNumber(int c, int m) -{ - if ( !m_doc ) - return; - - QDocumentLine l1 = m_doc->line(m_begLine), l2 = m_doc->line(m_endLine); - - if ( m & QDocumentCursor::KeepAnchor ) - { - if ( l2.isNull() ) - { - m_endLine = m_begLine; - m_endOffset = m_begOffset; - } - - m_begOffset = c; //qBound(0, c, l1.length()); - } else { - m_endLine = -1; - m_endOffset = 0; - m_begOffset = c; //qBound(0, c, l1.length()); - } - - refreshColumnMemory(); -} - -QPoint QDocumentCursorHandle::documentPosition() const -{ - if ( !m_doc ) - return QPoint(); - - return QPoint(0, m_doc->y(m_begLine)) + m_doc->line(m_begLine).cursorToDocumentOffset(m_begOffset); -} - -QPoint QDocumentCursorHandle::anchorDocumentPosition() const -{ - if ( !m_doc ) - return QPoint(); - - if ( m_endLine < 0 || m_endOffset < 0 ) - return documentPosition(); - - return QPoint(0, m_doc->y(m_endLine)) + m_doc->line(m_endLine).cursorToDocumentOffset(m_endOffset); -} - -QPolygon QDocumentCursorHandle::documentRegion() const -{ - QPolygon poly; - QPoint p = documentPosition(), ap = anchorDocumentPosition(); - - int w = m_doc->width(); - const int lm = m_doc->impl()->m_leftMargin; - const int ls = m_doc->impl()->m_lineSpacing - 1; - - if ( p == ap ) - { - poly - << p - << QPoint(p.x() + 1, p.y()) - << QPoint(p.x() + 1, p.y() + ls) - << QPoint(p.x(), p.y() + ls); - } else if ( p.y() == ap.y() ) { - poly - << p - << ap - << QPoint(ap.x(), ap.y() + ls) - << QPoint(p.x(), p.y() + ls); - } else if ( p.y() < ap.y() ) { - poly - << p - << QPoint(w, p.y()); - - if ( ap.x() < w ) - poly << QPoint(w, ap.y()) << ap; - - poly - << QPoint(ap.x(), ap.y() + ls) - << QPoint(lm, ap.y() + ls) - << QPoint(lm, p.y() + ls); - - if ( p.x() > lm ) - poly << QPoint(p.x(), p.y() + ls); - } else { - poly - << ap - << QPoint(w, ap.y()); - - if ( p.x() < w ) - poly << QPoint(w, p.y()) << p; - - poly - << QPoint(p.x(), p.y() + ls) - << QPoint(lm, p.y() + ls) - << QPoint(lm, ap.y() + ls); - - if ( ap.x() > lm ) - poly << QPoint(ap.x(), ap.y() + ls); - } - - return poly; -} - -int QDocumentCursorHandle::position() const -{ - if ( !m_doc ) - return -1; - - int pos = m_doc->line(m_begLine).position(); - - return (pos != -1) ? pos + m_begOffset : pos; -} - -void QDocumentCursorHandle::shift(int offset) -{ - if ( !m_doc ) - return; - - QDocumentLine l1 = m_doc->line(m_begLine), l2 = m_doc->line(m_endLine); - - if ( l1.isValid() ) - m_begOffset = qBound(0, m_begOffset + offset, l1.length()); - - if ( l2.isValid() ) - m_endOffset = qBound(0, m_endOffset + offset, l2.length()); -} - -void QDocumentCursorHandle::refreshColumnMemory() -{ - //m_max = m_doc->line(line).cursorToX(offset); - m_max = hasFlag(ColumnMemory) ? m_doc->line(m_begLine).cursorToDocumentOffset(m_begOffset).x() : 0; -} - -bool QDocumentCursorHandle::hasColumnMemory() const -{ - return hasFlag(ColumnMemory); -} - -void QDocumentCursorHandle::setColumnMemory(bool y) -{ - if ( y ) - setFlag(ColumnMemory); - else - clearFlag(ColumnMemory); -} - -void QDocumentCursorHandle::setPosition(int pos, int m) -{ - Q_UNUSED(pos) - Q_UNUSED(m) - - qWarning("Set position to cursor using character index : forbidden..."); - /* - if ( m == QDocumentCursor::MoveAnchor ) - { - m_begLine = m_doc->findLine(pos); - m_begOffset = (m_begLine.isValid() ? pos : 0); - - m_endLine = QDocumentLine(); - m_endOffset = 0; - - m_max = m_begLine.cursorToX(m_begOffset); - } else { - m_endLine = m_doc->findLine(pos); - m_endOffset = (m_begLine.isValid() ? pos : 0); - - //m_max = 0; - } - */ -} - -bool QDocumentCursorHandle::movePosition(int count, int op, int m) -{ - if ( !m_doc ) - return false; - - QDocumentLine l, l1 = m_doc->line(m_begLine), l2 = m_doc->line(m_endLine); - - int &line = m_begLine; - int &offset = m_begOffset; - static QRegExp wordStart("\\b\\w+$"), wordEnd("^\\w+\\b"); - - if ( !(m & QDocumentCursor::KeepAnchor) ) - { - m_endLine = -1; - m_endOffset = 0; - } else if ( !l2.isValid() ) { - m_endLine = m_begLine; - m_endOffset = m_begOffset; - } - - int beg = 0, end = m_doc->lines(); - - switch ( op ) - { - case QDocumentCursor::Left : - { - if ( atStart() ) - return false; - - int remaining = offset; - - do - { - if ( remaining >= count ) - { - offset = remaining - count; - break; - } else if ( line == beg ) { - offset = 0; - break; - } - - do - { - --line; - } while ( (line > beg) && m_doc->line(line).hasFlag(QDocumentLine::Hidden) ); - - //*line = *it; - - count -= remaining + 1; // jumping a line is one char - offset = remaining = m_doc->line(line).length(); - } while ( count && remaining ); - - refreshColumnMemory(); - - break; - } - - case QDocumentCursor::Right : - { - if ( atEnd() ) - return false; - - int remaining = m_doc->line(line).length() - offset; - - do - { - if ( remaining >= count ) - { - offset += count; - break; - } else if ( (line + 1) == end ) { - offset = remaining; - break; - } - - do - { - ++line; - } while ( ((line+1) < end) && m_doc->line(line).hasFlag(QDocumentLine::Hidden) ); - - //*line = *it; - - offset = 0; - count -= remaining + 1; - remaining = m_doc->line(line).length(); - } while ( count && remaining ); - - refreshColumnMemory(); - - break; - } - - case QDocumentCursor::Up : - { - if ( atStart() ) - return false; - - //qDebug("%i, %i : up", line, offset); - - if ( m & QDocumentCursor::ThroughWrap ) - { - QPoint p = documentPosition(); - - if ( hasColumnMemory() ) - p.rx() = qMax(p.x(), m_max); - - p.ry() -= QDocumentPrivate::m_lineSpacing * count; - - if ( p.y() >= 0 ) - { - m_doc->cursorForDocumentPosition(p, line, offset); - } else { - line = 0; - offset = 0; - } - - return true; - } - - while ( count && (line > beg) ) - { - --line; - - if ( !m_doc->line(line).hasFlag(QDocumentLine::Hidden) ) - --count; - - } - - //*line = QDocumentLine(*it); - //*offset = line->xToCursor(qMin(line->cursorToX(*offset), m_max), 0); - l = m_doc->line(line); - - if ( count ) - offset = 0; - else if ( m == QDocumentCursor::MoveAnchor ) - offset = l.xToCursor( - qMax( - l.cursorToX( - qMin( - offset, - l.length() - ) - ), - m_max - ) - ); - else - offset = qMin(l.length(), offset); - - break; - } - - case QDocumentCursor::Down : - { - if ( atEnd() ) - return false; - - if ( m & QDocumentCursor::ThroughWrap ) - { - QPoint p = documentPosition(); - - if ( hasColumnMemory() ) - p.rx() = qMax(p.x(), m_max); - - p.ry() += QDocumentPrivate::m_lineSpacing * count; - - int oldLine = line, oldCol = offset; - m_doc->cursorForDocumentPosition(p, line, offset); - if ( oldLine == line && oldCol == offset ) - offset = m_doc->line(line).length(); - return true; - } - - while ( count && ((line + 1) < end) ) - { - ++line; - - if ( !m_doc->line(line).hasFlag(QDocumentLine::Hidden) ) - --count; - - } - - //*line = QDocumentLine(*it); - l = m_doc->line(line); - - if ( count ) - offset = l.length(); - else if ( m == QDocumentCursor::MoveAnchor ) - offset = l.xToCursor( - qMax( - l.cursorToX( - qMin( - offset, - l.length() - ) - ), - m_max - ) - ); - else - offset = qMin(l.length(), offset); - - break; - } - - case QDocumentCursor::Start : - if ( atStart() ) - return false; - - m_max = offset = 0; - line = 0; //m_doc->line(0); - break; - - case QDocumentCursor::End : - if ( atEnd() ) - return false; - - line = end - 1; //QDocumentLine(*(m_doc->impl()->end() - 1)); - offset = m_doc->line(line).length(); - refreshColumnMemory(); - break; - - case QDocumentCursor::StartOfBlock : - if ( atBlockStart() ) - return false; - - m_max = offset = 0; - break; - - case QDocumentCursor::EndOfBlock : - if ( atBlockEnd() ) - return false; - - offset = m_doc->line(line).length(); - refreshColumnMemory(); - break; - - case QDocumentCursor::NextBlock : - - if ( atEnd() ) - return false; - - while ( ((line + 1) < end) && count ) - { - ++line; - - if ( !m_doc->line(line).hasFlag(QDocumentLine::Hidden) ) - --count; - - } - - if ( !count ) - { - //*line = *it; - offset = 0; - } else { - //*line = QDocumentLine(*(m_doc->impl()->end() - 1)); - offset = m_doc->line(line).length(); - } - - break; - - case QDocumentCursor::PreviousBlock : - - if ( atStart() ) - return false; - - offset = 0; - - while ( (line > beg) && count ) - { - --line; - - if ( !m_doc->line(line).hasFlag(QDocumentLine::Hidden) ) - --count; - - } - - if ( !count ) - { - //*line = *it; - offset = m_doc->line(line).length(); - } else { - offset = 0; - //*line = QDocumentLine(*(m_doc->impl()->begin())); - } - - //*line = *it; - - break; - - case QDocumentCursor::WordLeft : - case QDocumentCursor::PreviousWord : - { - if ( atStart() ) - return false; - - l = m_doc->line(line); - - //for ( int loop = 0; loop <= 1; ++loop ) - //{ - // while ( l.isValid() ) - - // -- patch -- - /* eats up white space */ - while ( (offset > 0) && !isWord(l.text().at(offset - 1)) ) - --offset; - - /* start of line */ - if ( offset == 0 ) - { - /* first line, first char => nothing to do */ - if( line == beg ) - return true; - - do - // -- patch -- - { -// //offset = qMin(offset, l.length() - 1); -// bool next = (l.length() && offset >= 0) ? isWord(l.text().at(offset)) : true; -// -// if ( loop ) -// next = !next; -// -// if ( !next ) -// break; -// -// if ( offset > 0 ) -// { -// --offset; -// } else if ( line != beg ) { -// do -// { -// //*line = *(--it); -// --line; -// l = m_doc->line(line); -// offset = l.length() - 1; -// } while ( l.isValid() && (line != beg) && l.hasFlag(QDocumentLine::Hidden) ); -// } else { -// break; -// } -// } -// } -// -// while ( l.isValid() ) -// { -// offset = qMin(offset, l.length()); -// bool next = (offset <= 0) ? false : isWord(l.text().at(offset - 1)); -// -// if ( !next ) -// break; -// -// --offset; - - // -- patch -- - --line; - l = m_doc->line(line); - offset = l.length(); - } while ( (line != beg) && l.isValid() && l.hasFlag(QDocumentLine::Hidden) ); - return true; - // -- patch -- - } - - // -- patch -- - /* eats up whole word */ - while ( (offset > 0) && isWord(l.text().at(offset - 1)) ) - --offset; - // -- patch -- - - refreshColumnMemory(); - - break; - } - - case QDocumentCursor::WordRight : - case QDocumentCursor::NextWord : - { - if ( atEnd() ) - return false; - - l = m_doc->line(line); - int lineLength = l.text().length(); - -// for ( int loop = 0; loop <= 1; ++loop ) - // -- patch -- - /* end of line */ - if ( offset == lineLength ) - { -// while ( l.isValid() ) - /* last line, last char => nothing to do */ - if ( line == end ) - return true; - // -- patch -- - do - { -// //offset = qBound(0, offset, l.length() - 1); -// bool next = (offset < l.length()) ? isWord(l.text().at(offset)) : true; -// -// if ( loop ) -// next = !next; -// -// if ( !next ) -// break; -// -// if ( offset < l.length() ) -// { -// ++offset; -// } else if ( (line + 1) != end ) { -// offset = 0; -// do -// { -// ++line; -// l = m_doc->line(line); -// } while ( l.isValid() && ((line + 1) != end) && (l.hasFlag(QDocumentLine::Hidden) || !l.length()) ); -// } else { - // -- patch -- - ++line; - l = m_doc->line(line); - offset = 0; - } while ( (line != end) && l.isValid() && l.hasFlag(QDocumentLine::Hidden) ); - - lineLength = l.text().length(); - /* empty line */ - if ( lineLength == 0 ) - return true; - - /* eats up white space */ - while ( !isWord(l.text().at(offset)) ) - { - ++offset; - /* move to end of line */ - if ( offset == lineLength ) - break; - // -- patch -- -// } - } - // -- patch -- - return true; - // -- patch -- - } - - // -- patch -- - /* next char */ - ++offset; - /* eats up whole word */ - while ( (offset < lineLength) && isWord(l.text().at(offset)) ) - ++offset; - - /* eats up white space */ - while ( (offset < lineLength) && !isWord(l.text().at(offset)) ) - ++offset; - // -- patch -- - - refreshColumnMemory(); - - break; - } - - case QDocumentCursor::StartOfWord : - { - int x = wordStart.indexIn(m_doc->line(line).text().left(offset)); - - if ( x != -1 ) - { - offset = x; - } else { - qDebug("failed to find SOW : %i + %i != %i", - x, wordStart.matchedLength(), offset); - - return false; - } - - refreshColumnMemory(); - - break; - } - - case QDocumentCursor::EndOfWord : - { - int x = wordEnd.indexIn(m_doc->line(line).text(), offset, QRegExp::CaretAtOffset); - - if ( x == offset ) - { - offset += wordEnd.matchedLength(); - } else { - qDebug("failed to find EOW"); - return false; - } - - refreshColumnMemory(); - - break; - } - - default: - qWarning("Unhandled move operation..."); - return false; - }; - - return true; -} - -void QDocumentCursorHandle::moveTo(const QDocumentCursor &c) -{ - if ( !c.isValid() || !m_doc ) - return; - - m_begLine = c.handle()->m_begLine; - m_begOffset = c.handle()->m_begOffset; - - m_endLine = -1; - m_endOffset = 0; - - refreshColumnMemory(); -} - -void QDocumentCursorHandle::moveTo(int line, int column) -{ - m_begLine = line; - m_begOffset = column; - - m_endLine = -1; - m_endOffset = 0; - - refreshColumnMemory(); -} - -void QDocumentCursorHandle::insertText(const QString& s, bool keepAnchor) -{ - if ( !m_doc || s.isEmpty() || m_doc->line(m_begLine).isNull() ) - return; - - bool sel = hasSelection(); - - if ( sel ) - { - beginEditBlock(); - removeSelectedText(keepAnchor); - } - - QDocumentCommand *command = new QDocumentInsertCommand( - m_begLine, - m_begOffset, - s, - m_doc - ); - - command->setKeepAnchor(keepAnchor); - command->setTargetCursor(this); - execute(command); - - if ( sel ) - endEditBlock(); -} - -void QDocumentCursorHandle::eraseLine() -{ - if ( !m_doc ) - return; - - QDocumentCommand *command = 0; - - if ( m_endLine == -1 ) - { - command = new QDocumentEraseCommand( - m_begLine, - 0, - m_begLine + 1, - 0, - m_doc - ); - } else { - command = new QDocumentEraseCommand( - qMin(m_begLine, m_endLine), - 0, - qMax(m_begLine, m_endLine) + 1, - 0, - m_doc - ); - } - - command->setTargetCursor(this); - execute(command); -} - -QChar QDocumentCursorHandle::nextChar() const -{ - if ( !m_doc ) - return QChar(); - - QDocumentLine l = m_doc->line(m_begLine); - - if ( !l.isValid() ) - return QChar(); - - return m_begOffset < l.length() ? l.text().at(m_begOffset) : QLatin1Char('\n'); -} - -QChar QDocumentCursorHandle::previousChar() const -{ - if ( !m_doc || (m_begLine <= 0 && m_begOffset <= 0) ) - return QChar(); - - QDocumentLine l = m_doc->line(m_begLine); - - if ( !l.isValid() || m_begOffset > l.length() ) - return QChar(); - - return m_begOffset ? l.text().at(m_begOffset - 1) : QLatin1Char('\n'); -} - -void QDocumentCursorHandle::deleteChar() -{ - if ( !m_doc ) - return; - - QDocumentLine l = m_doc->line(m_begLine); - - if ( l.isNull() || atEnd() ) - return; - - QDocumentCommand *command = 0; - - if ( !atLineEnd() ) - { - command = new QDocumentEraseCommand( - m_begLine, - m_begOffset, - m_begLine, - m_begOffset + 1, - m_doc - ); - - } else { - // merge two blocks... - command = new QDocumentEraseCommand( - m_begLine, - m_begOffset, - m_begLine + 1, - 0, - m_doc - ); - - } - - command->setTargetCursor(this); - command->setUndoOffset(-1); - execute(command); -} - -void QDocumentCursorHandle::deletePreviousChar() -{ - if ( !m_doc ) - return; - - QDocumentLine l = m_doc->line(m_begLine); - - if ( l.isNull() || atStart() ) - return; - - QDocumentCommand *command = 0; - - if ( !atLineStart() ) - { - command = new QDocumentEraseCommand( - m_begLine, - m_begOffset - 1, - m_begLine, - m_begOffset, - m_doc - ); - - } else { - // merge two blocks... - QDocumentLine prev = m_doc->line(m_begLine - 1); - - command = new QDocumentEraseCommand( - m_begLine - 1, - prev.length(), - m_begLine, - m_begOffset, - m_doc - ); - - } - - command->setTargetCursor(this); - execute(command); -} - -void QDocumentCursorHandle::execute(QDocumentCommand *c) -{ - if ( !m_doc ) - return; - - if ( isSilent() && !c->isSilent() ) - c->setSilent(isSilent()); - - if ( m_blocks.count() ) - { - c->redo(); - m_blocks.top()->addCommand(c); - - } else if ( m_doc ) { - //qDebug("Cursor handle executing command : 0x%x", this); - - m_doc->execute(c); - } -} - -void QDocumentCursorHandle::beginEditBlock() -{ - m_blocks.push(new QDocumentCommandBlock(m_doc)); -} - -void QDocumentCursorHandle::endEditBlock() -{ - if ( !m_doc || m_blocks.isEmpty() ) - return; - - //qDebug("Cursor handle executing command : 0x%x [block]", this); - - QDocumentCommandBlock *block = m_blocks.pop(); - - // special trick to prevent double redo() while getting rid of - // bugs occuring in when inserting/erasing in overlapping lines - // inside a command block - block->setWeakLock(true); - - m_doc->execute(block); -} - -QDocumentCursor QDocumentCursorHandle::selectionStart() const -{ - if ( !m_doc ) - return QDocumentCursor(); - - if ( !hasSelection() ) - return QDocumentCursor(clone()); - - QDocumentCursor pos(m_doc, m_begLine, m_begOffset), - anc(m_doc, m_endLine, m_endOffset); - - return (pos < anc) ? pos : anc; -} - -QDocumentCursor QDocumentCursorHandle::selectionEnd() const -{ - if ( !m_doc ) - return QDocumentCursor(); - - if ( !hasSelection() ) - return QDocumentCursor(clone()); - - QDocumentCursor pos(m_doc, m_begLine, m_begOffset), - anc(m_doc, m_endLine, m_endOffset); - - return (pos > anc) ? pos : anc; -} - -bool QDocumentCursorHandle::eq(const QDocumentCursorHandle *h) -{ - return (m_begLine == h->m_begLine) && (m_begOffset == h->m_begOffset); - /* - if ( !hasSelection() ) - return (m_begLine == h->m_begLine) && (m_begOffset == h->m_begOffset); - - return - (m_begLine == h->m_begLine) - && - (m_begOffset == h->m_begOffset) - && - (m_endLine == h->m_endLine) - && - (m_endOffset == h->m_endOffset) - ; - */ -} - -bool QDocumentCursorHandle::lt(const QDocumentCursorHandle *h) -{ - return - (m_begLine < h->m_begLine) - || - ((m_begLine == h->m_begLine) && (m_begOffset < h->m_begOffset)) - ; -} - -bool QDocumentCursorHandle::gt(const QDocumentCursorHandle *h) -{ - return - (m_begLine > h->m_begLine) - || - ((m_begLine == h->m_begLine) && (m_begOffset > h->m_begOffset)) - ; -} - -QString QDocumentCursorHandle::selectedText() const -{ - if ( !m_doc ) - return QString(); - - QDocumentLine l1 = m_doc->line(m_begLine), l2 = m_doc->line(m_endLine); - - if ( l1.isNull() || l2.isNull() ) - return QString(); - - QString s; - - if ( m_begLine == m_endLine ) - { - int min = qMin(m_begOffset, m_endOffset), - max = qMax(m_begOffset, m_endOffset); - - s = l1.text().mid(min, max - min); - } else if ( m_begLine < m_endLine ) { - s = l1.text().mid(m_begOffset); - - int it = m_begLine; - //QDocumentConstIterator it = m_doc->impl()->index(m_begLine.handle()); - - while ( ++it < m_endLine ) - { - s += '\n'; - s += m_doc->line(it).text(); - } - - s += '\n'; - s += l2.text().left(m_endOffset); - } else { - s = l2.text().mid(m_endOffset); - - int it = m_endLine; - //QDocumentConstIterator it = m_doc->impl()->index(m_endLine.handle()); - - while ( ++it < m_begLine ) - { - s += '\n'; - s += m_doc->line(it).text(); - } - - s += '\n'; - s += l1.text().left(m_begOffset); - } - - return s; -} - -void QDocumentCursorHandle::clearSelection() -{ - if ( m_doc && m_doc->line(m_endLine).isValid() ) - { - //m_begLine = m_endLine; - //m_begOffset = m_endOffset; - - m_endLine = -1; - m_endOffset = -1; - } -} - -void QDocumentCursorHandle::replaceSelectedText(const QString& text) -{ - int begline, begcol; - beginBoundary(begline, begcol); - - bool atStart = (begline == m_begLine && begcol == m_begOffset); - - if ( text.isEmpty() ) - { - removeSelectedText(); - } else { - insertText(text, true); - - /* - Adjust selection around the new text and preserve the order - of position and anchor - */ - /* - if ( atStart ) - { - m_endLine = m_begLine; - m_begLine = begline; - m_endOffset = m_begOffset; - m_begOffset = begcol; - } else { - m_endLine = begline; - m_endOffset = begcol; - } - */ - } - - //qDebug("[%i, %i] => ( (%i, %i), (%i, %i) )", begline, begcol, m_begLine, m_begOffset, m_endLine, m_endOffset); -} - -void QDocumentCursorHandle::select(QDocumentCursor::SelectionType t) -{ - if ( !m_doc || !m_doc->line(m_begLine).isValid() ) - return; - - if ( t == QDocumentCursor::LineUnderCursor ) - { - movePosition(1, QDocumentCursor::StartOfLine, QDocumentCursor::MoveAnchor); - movePosition(1, QDocumentCursor::EndOfLine, QDocumentCursor::KeepAnchor); - - } else if ( t == QDocumentCursor::WordUnderCursor ) { - - movePosition(1, QDocumentCursor::StartOfWord, QDocumentCursor::MoveAnchor); - movePosition(1, QDocumentCursor::EndOfWord, QDocumentCursor::KeepAnchor); - } -} - -void QDocumentCursorHandle::setSelectionBoundary(const QDocumentCursor& c) -{ - if ( - !m_doc - || - (m_begLine == -1) - || - ( - (c.lineNumber() == m_begLine) - && - (c.columnNumber() == m_begOffset) - ) - ) - return; - - //qDebug("setting new selection boundary... "); - - if ( !hasSelection() ) - { - m_endLine = m_begLine; - m_endOffset = m_begOffset; - } - - m_begLine = c.lineNumber(); - m_begOffset = c.columnNumber(); -} - -bool QDocumentCursorHandle::isWithinSelection(const QDocumentCursor& c) const -{ - if ( !hasSelection() ) //|| c.hasSelection() ) - return false; - - int minOff, maxOff, min, max; - - if ( m_begLine > m_endLine ) - { - max = m_begLine; - maxOff = m_begOffset; - - min = m_endLine; - minOff = m_endOffset; - } else { - min = m_begLine; - minOff = m_begOffset; - - max = m_endLine; - maxOff = m_endOffset; - } - - return (m_begLine == m_endLine) - ? - ( - (c.lineNumber() == m_begLine) - && - (qMin(m_begOffset, m_endOffset) <= c.columnNumber()) - && - (qMax(m_begOffset, m_endOffset) >= c.columnNumber()) - ) - : - ( - ( - (c.lineNumber() > min) - && - (c.lineNumber() < max) - ) - || - ( - (c.lineNumber() == min) - && - (minOff <= c.columnNumber()) - ) - || - ( - (c.lineNumber() == max) - && - (maxOff >= c.columnNumber()) - ) - ) - ; - -} - -/* - beware when modifying these as their current form handle the special - case of no selection (m_endLine == -1) and a hasty change may break - that behavior : no selection -> both boundary are the cursor pos = (m_begLine, m_begOffset) -*/ -void QDocumentCursorHandle::beginBoundary(int& begline, int& begcol) const -{ - if ( m_begLine < m_endLine ) - { - begline = m_begLine; - begcol = m_begOffset; - } else { - begline = m_endLine; - begcol = (m_begLine == m_endLine && m_begOffset < m_endOffset) ? m_begOffset : m_endOffset; - } -} - -void QDocumentCursorHandle::endBoundary(int& endline, int& endcol) const -{ - if ( m_begLine < m_endLine ) - { - endline = m_endLine; - endcol = m_endOffset; - } else { - endline = m_begLine; - endcol = (m_begLine == m_endLine && m_begOffset < m_endOffset) ? m_endOffset : m_begOffset; - } -} - -void QDocumentCursorHandle::boundaries(int& begline, int& begcol, int& endline, int& endcol) const -{ - beginBoundary(begline, begcol); - endBoundary(endline, endcol); - - /* - if ( m_begLine == m_endLine ) - { - begline = m_begLine; - endline = m_endLine; - if ( m_begOffset < m_endOffset ) - { - begcol = m_begOffset; - endcol = m_endOffset; - } else { - endcol = m_begOffset; - begcol = m_endOffset; - } - } else if ( m_begLine < m_endLine ) { - begline = m_begLine; - endline = m_endLine; - begcol = m_begOffset; - endcol = m_endOffset; - } else { - endline = m_begLine; - begline = m_endLine; - endcol = m_begOffset; - begcol = m_endOffset; - } - */ -} - -void QDocumentCursorHandle::substractBoundaries(int lbeg, int cbeg, int lend, int cend) -{ - int tlmin, tlmax, tcmin, tcmax; - - boundaries(tlmin, tcmin, tlmax, tcmax); - - bool begFirst = tlmin == m_begLine && tcmin == m_begOffset; - - if ( tlmax < lbeg || tlmin > lend || (tlmax == lbeg && tcmax < cbeg) || (tlmin == lend && tcmin > cend) ) - { - // no intersection - return; - } - - int numLines = lend - lbeg; - bool beyondBeg = (tlmin > lbeg || (tlmin == lbeg && tcmin >= cbeg)); - bool beyondEnd = (tlmax < lend || (tlmax == lend && tcmax <= cend)); - - if ( beyondBeg && beyondEnd ) - { - //qDebug("(%i, %i : %i, %i) erased as in (%i, %i : %i, %i)", tlmin, tcmin, tlmax, tcmax, lbeg, cbeg, lend, cend); - // cursor erased... - m_begLine = m_endLine = lbeg; - m_begOffset = m_endOffset = cbeg; - } else if ( beyondEnd ) { - //qDebug("beyond end"); - if ( begFirst ) - { - m_endLine = lbeg; - m_endOffset = cbeg; - } else { - m_begLine = lbeg; - m_begOffset = cbeg; - } - } else if ( beyondBeg ) { - //qDebug("beyond beg"); - if ( begFirst ) - { - m_begLine = lend; - m_begOffset = cend; - if ( numLines ) - { - m_begLine -= numLines; - m_endLine -= numLines; - } else { - m_begOffset = cbeg; - } - if ( m_begLine == m_endLine ) - m_endOffset -= (cend - cbeg); - } else { - m_endLine = lend; - m_endOffset = cend; - if ( numLines ) - { - m_endLine -= numLines; - m_begLine -= numLines; - } else { - m_endOffset = cbeg; - } - if ( m_begLine == m_endLine ) - m_begOffset -= (cend - cbeg); - } - } else { - int off = cend - cbeg; - - //qDebug("correcting by %i", off); - - if ( begFirst ) - { - m_endLine -= numLines; - if ( tlmax == lend ) - { - m_endOffset -= off; - } - } else { - m_begLine -= numLines; - if ( tlmax == lend ) - { - m_begOffset -= off; - } - } - } - - //qDebug("(%i, %i : %i, %i) corrected to (%i, %i : %i, %i)", tlmin, tcmin, tlmax, tcmax, m_begLine, m_begOffset, m_endLine, m_endOffset); -} - -void QDocumentCursorHandle::intersectBoundaries(int& lbeg, int& cbeg, int& lend, int& cend) const -{ - int tlmin, tlmax, tcmin, tcmax, clmin, clmax, ccmin, ccmax; - - boundaries(tlmin, tcmin, tlmax, tcmax); - clmin = lbeg; - clmax = lend; - ccmin = cbeg; - ccmax = cend; - - if ( tlmax < clmin || tlmin > clmax || (tlmax == clmin && tcmax < ccmin) || (tlmin == clmax && tcmin > ccmax) ) - { - lbeg = cbeg = lend = cend = -1; - return; - } - - if ( tlmin == clmin ) - { - lbeg = tlmin; - cbeg = qMax(tcmin, ccmin); - } else if ( tlmin < clmin ) { - lbeg = clmin; - cbeg = ccmin; - } else { - lbeg = tlmin; - cbeg = tcmin; - } - - if ( tlmax == clmax ) - { - lend = tlmax; - cend = qMin(tcmax, ccmax); - } else if ( tlmax < clmax ) { - lend = tlmax; - cend = tcmax; - } else { - lend = clmax; - cend = ccmax; - } -} - -void QDocumentCursorHandle::intersectBoundaries(QDocumentCursorHandle *h, int& lbeg, int& cbeg, int& lend, int& cend) const -{ - int tlmin, tlmax, tcmin, tcmax, clmin, clmax, ccmin, ccmax; - - boundaries(tlmin, tcmin, tlmax, tcmax); - h->boundaries(clmin, ccmin, clmax, ccmax); - - if ( tlmax < clmin || tlmin > clmax || (tlmax == clmin && tcmax < ccmin) || (tlmin == clmax && tcmin > ccmax) ) - { - lbeg = cbeg = lend = cend = -1; - return; - } - - if ( tlmin == clmin ) - { - lbeg = tlmin; - cbeg = qMax(tcmin, ccmin); - } else if ( tlmin < clmin ) { - lbeg = clmin; - cbeg = ccmin; - } else { - lbeg = tlmin; - cbeg = tcmin; - } - - if ( tlmax == clmax ) - { - lend = tlmax; - cend = qMin(tcmax, ccmax); - } else if ( tlmax < clmax ) { - lend = tlmax; - cend = tcmax; - } else { - lend = clmax; - cend = ccmax; - } -} - -QDocumentCursor QDocumentCursorHandle::intersect(const QDocumentCursor& c) const -{ - if ( !hasSelection() ) - { - //if ( c.hasSelection() && c.isWithinSelection(QDocumentCursor(this)) ) - // return QDocumentCursor(clone()); - - } else if ( !c.hasSelection() ) { - - if ( isWithinSelection(c) ) - return c; - - } else { - QDocumentCursorHandle *h = c.handle(); - - int lbeg, lend, cbeg, cend; - intersectBoundaries(h, lbeg, cbeg, lend, cend); - - if ( lbeg != -1 ) - { - QDocumentCursor c(m_doc, lbeg, cbeg); - - if ( lend != -1 && (lbeg != lend || cbeg != cend) ) - { - c.setSelectionBoundary(QDocumentCursor(m_doc, lend, cend)); - } - - return c; - } - } - - return QDocumentCursor(); -} - -void QDocumentCursorHandle::removeSelectedText(bool keepAnchor) -{ - if ( !m_doc ) - return; - - QDocumentLine l1 = m_doc->line(m_begLine), l2 = m_doc->line(m_endLine); - - if ( l1.isNull() || l2.isNull() ) - return; - - QDocumentCommand *c; - - if ( m_begLine < m_endLine ) - { - c = new QDocumentEraseCommand( - m_begLine, - m_begOffset, - m_endLine, - m_endOffset, - m_doc - ); - - } else if ( m_begLine > m_endLine ) { - c = new QDocumentEraseCommand( - m_endLine, - m_endOffset, - m_begLine, - m_begOffset, - m_doc - ); - - //m_begLine = m_endLine; - //m_begOffset = m_endOffset; - - } else { - c = new QDocumentEraseCommand( - m_begLine, - qMin(m_begOffset, m_endOffset), - m_endLine, - qMax(m_begOffset, m_endOffset), - m_doc - ); - - //m_begOffset = qMin(m_begOffset, m_endOffset); - //m_endLine = -1; - //m_endOffset = -1; - } - - c->setKeepAnchor(keepAnchor); - c->setTargetCursor(this); - execute(c); -} - -////////////////// - -///////////////////////// -// QDocumentPrivate -///////////////////////// - -template <class T> T* getStaticDefault() { static T _globStatInst; return &_globStatInst; } - -QFont* QDocumentPrivate::m_font = 0;// = QApplication::font(); -QFontMetrics* QDocumentPrivate::m_fontMetrics = 0;//(m_font); - -int QDocumentPrivate::m_defaultTabStop = 4; -QFormatScheme* QDocumentPrivate::m_defaultFormatScheme = getStaticDefault<QFormatScheme>(); - -QList<QDocumentPrivate*> QDocumentPrivate::m_documents; - -bool QDocumentPrivate::m_fixedPitch; -int QDocumentPrivate::m_ascent;// = m_fontMetrics.ascent(); -int QDocumentPrivate::m_descent;// = m_fontMetrics.descent(); -int QDocumentPrivate::m_leading;// = m_fontMetrics.leading(); -int QDocumentPrivate::m_spaceWidth;// = m_fontMetrics.width(' '); -int QDocumentPrivate::m_lineHeight;// = m_fontMetrics.height(); -int QDocumentPrivate::m_lineSpacing;// = m_fontMetrics.lineSpacing(); - -int QDocumentPrivate::m_leftMargin = 5; -QDocument::WhiteSpaceMode QDocumentPrivate::m_showSpaces = QDocument::ShowNone; -QDocument::LineEnding QDocumentPrivate::m_defaultLineEnding = QDocument::Conservative; - -int QDocumentPrivate::m_wrapMargin = 15; - -QDocumentPrivate::QDocumentPrivate(QDocument *d) - : m_doc(d), - m_editCursor(0), - m_lastGroupId(-1), - m_constrained(false), - m_width(0), - m_height(0), - m_tabStop(m_defaultTabStop), - m_formatScheme(0), - m_language(0), - m_maxMarksPerLine(0), - _nix(0), - _dos(0), - _mac(0), - m_lineEnding(m_defaultLineEnding) -{ - m_documents << this; - updateFormatCache(); -} - -QDocumentPrivate::~QDocumentPrivate() -{ - m_marks.clear(); - m_largest.clear(); - - m_deleting = true; - - //qDeleteAll(m_lines); - foreach ( QDocumentLineHandle *h, m_lines ) - h->deref(); - - m_lines.clear(); - - m_deleting = false; - - m_commands.clear(); - - m_documents.removeAll(this); -} - -int QDocumentPrivate::findNextMark(int id, int from, int until) -{ - if ( from < 0 ) - from += m_lines.count(); - - QHash<QDocumentLineHandle*, QList<int> >::const_iterator e = m_marks.constEnd(); - - int max = until; - - if ( max < 0 ) - max += m_lines.count(); - else if ( max < from ) - max = m_lines.count() - 1; - - for ( int i = from; i <= max; ++i ) - { - QDocumentLineHandle *h = m_lines.at(i); - - QHash<QDocumentLineHandle*, QList<int> >::const_iterator it = m_marks.constFind(h); - - if ( it != e && it->contains(id) ) - return i; - - } - - if ( until > 0 && until < from ) - { - for ( int i = 0; i <= until; ++i ) - { - QDocumentLineHandle *h = m_lines.at(i); - - QHash<QDocumentLineHandle*, QList<int> >::const_iterator it = m_marks.constFind(h); - - if ( it != e && it->contains(id) ) - return i; - - } - } - - return -1; -} - -int QDocumentPrivate::findPreviousMark(int id, int from, int until) -{ - if ( from < 0 ) - from += m_lines.count(); - - if ( until < 0 ) - { - until += m_lines.count(); - } else if ( until >= m_lines.count() ) { - until = m_lines.count() - 1; - } - - QHash<QDocumentLineHandle*, QList<int> >::const_iterator e = m_marks.constEnd(); - - int min = until; - - if ( min > from ) - min = 0; - - for ( int i = from; i >= min; --i ) - { - QDocumentLineHandle *h = m_lines.at(i); - - QHash<QDocumentLineHandle*, QList<int> >::const_iterator it = m_marks.constFind(h); - - if ( it != e && it->contains(id) ) - return i; - - } - - if ( until > 0 && until > from ) - { - for ( int i = m_lines.count() - 1; i >= until; --i ) - { - QDocumentLineHandle *h = m_lines.at(i); - - QHash<QDocumentLineHandle*, QList<int> >::const_iterator it = m_marks.constFind(h); - - if ( it != e && it->contains(id) ) - return i; - - } - } - - return -1; -} - -void QDocumentPrivate::execute(QDocumentCommand *cmd) -{ - if ( !cmd ) - return; - - m_lastModified = QDateTime::currentDateTime(); - - //qDebug("adding a command..."); - - //cmd->setTarget(m_doc); - - m_commands.push(cmd); -} - -void QDocumentPrivate::draw(QPainter *p, QDocument::PaintContext& cxt) -{ - QDocumentLineHandle *h; - bool inSel = false, fullSel; - QList<QDocumentCursorHandle*>::iterator cit; - int i, realln, pos = 0, xOffset, - firstLine = qMax(0, cxt.yoffset / m_lineSpacing), - lastLine = qMax(0, firstLine + (cxt.height / m_lineSpacing)); - - if ( cxt.height % m_lineSpacing ) - ++lastLine; - - p->setFont(*m_font); - - QBrush bg, - base = cxt.palette.base(), - selbg = cxt.palette.highlight(), - alternate = QLineMarksInfoCenter::instance()->markType("current").color; - - if ( !alternate.color().isValid() ) - alternate = cxt.palette.alternateBase(); - - QSmallArray m_cursorLines(0), m_selectionBoundaries(0); - - int wrap = 0; - i = textLine(firstLine, &wrap); - firstLine -= wrap; - realln = firstLine; - - //qDebug("lines [%i, %i]", firstLine, lastLine); - - pos += firstLine * m_lineSpacing; - - // adjust first line to take selections into account... - foreach ( const QDocumentSelection& s, cxt.selections ) - { - if ( (s.startLine < i) && (s.endLine >= i) ) - { - inSel = true; - break; - } - } - - for ( ; realln <= lastLine; ++i ) - { - if ( i >= m_lines.count() ) - { - //qDebug("line %i not valid", i); - break; - } - - h = m_lines.at(i); - - // ugly workaround... - if( !m_fixedPitch ) - adjustWidth(i); - - const int wrap = h->m_frontiers.count(); - const bool wrapped = wrap; - - //if ( wrapped ) - // qDebug("line %i is wrapped over %i sublines", i, *wit); - - // selections stuff (must do it before whatever the visibility...) - m_selectionBoundaries.clear(); - - fullSel = false; - - if ( inSel ) - m_selectionBoundaries.prepend(0); - - foreach ( const QDocumentSelection& s, cxt.selections ) - { - if ( i == s.startLine ) - { - if ( !(m_selectionBoundaries.count() & 1) ) - m_selectionBoundaries.append(s.start); - - if ( i == s.endLine ) - { - m_selectionBoundaries.append(s.end); - } else { - //++selLevel; - inSel = true; - //selEnd = h->m_text.length(); - } - } else if ( inSel && (i == s.endLine) ) { - - if ( m_selectionBoundaries.count() % 2 ) - m_selectionBoundaries.append(s.end); - - //--selLevel; - inSel = false; - } - } - - if ( inSel && m_selectionBoundaries.count() == 1 && m_selectionBoundaries.at(0) == 0 ) - { - m_selectionBoundaries.clear(); - fullSel = true; - } - - if ( h->hasFlag(QDocumentLine::Hidden) ) - { - continue; - } else - ++realln; - - if ( wrapped ) - realln += wrap; - - m_cursorLines.clear(); - - bg = base; - - // idx = column = 0; - xOffset = m_leftMargin; // margin - - // cursor(s) stuff - cit = cxt.cursors.begin(); - - while ( cit != cxt.cursors.end() ) - { - if ( (*cit)->lineNumber() == i ) - { - if ( cxt.blinkingCursor ) - m_cursorLines.append((*cit)->columnNumber()); - - if ( cxt.fillCursorRect ) - bg = alternate; - - cit = cxt.cursors.erase(cit); - } else { - ++cit; - } - } - - cit = cxt.extra.begin(); - - while ( cit != cxt.extra.end() ) - { - if ( (*cit)->lineNumber() == i ) - { - m_cursorLines.append((*cit)->columnNumber()); - - cit = cxt.extra.erase(cit); - } else { - ++cit; - } - } - - qSort(m_cursorLines); - - QList<int> m = marks(h); - - // line marks stuff - if ( m.count() ) - { - QLineMarksInfoCenter *mic = QLineMarksInfoCenter::instance(); - - QColor c = mic->markType(mic->priority(m)).color; - - if ( c.isValid() ) - bg = c; - - } - - if ( realln < firstLine ) - continue; - - //qDebug("drawing line %i (visual %i)", i, realln); - - p->fillRect(qMax(cxt.xoffset, m_leftMargin), pos, - cxt.width, m_lineSpacing, - fullSel ? selbg : bg); - - if ( wrapped ) - p->fillRect(qMax(cxt.xoffset, m_leftMargin), pos + m_lineSpacing, - cxt.width, m_lineSpacing * wrap, fullSel ? selbg : bg); - - //p->fillRect(cxt.xoffset, pos + 1, - // cxt.width, m_lineHeight, - // bg); - - p->save(); - - // simplify line drawing - p->translate(0, pos); - - // draw text - h->draw(p, cxt.xoffset, cxt.width, m_selectionBoundaries, m_cursorLines, cxt.palette, fullSel); - - // see above - p->translate(0, -pos); - - // draw fold rect indicator - if ( h->hasFlag(QDocumentLine::CollapsedBlockStart) ) - { - p->setBrush(Qt::NoBrush); - p->setPen(QPen(Qt::blue, 1, Qt::DotLine)); - - //p->drawRect(cxt.xoffset + 2, pos, - // cxt.width - 4, m_lineSpacing - 1); - - p->drawRect(m_leftMargin, pos, - cxt.width - 4, m_lineSpacing * (wrap + 1) - 1); - - } - - p->restore(); - - pos += m_lineSpacing; - - if ( wrapped ) - { - pos += m_lineSpacing * wrap; - } - - //qDebug("drawing line %i in %i ms", i, t.elapsed()); - } - - //qDebug("painting done"); // in %i ms...", t.elapsed()); -} - -int QDocumentPrivate::position(const QDocumentLineHandle *l) const -{ - int pos = 0; - - int idx = m_lines.indexOf(const_cast<QDocumentLineHandle*>(l)); - - if ( idx == -1 ) - return -1; - - for ( int i = 0; i < idx; i++ ) - pos += m_lines.at(i)->length(); - - return pos; -} - -QDocumentLineHandle* QDocumentPrivate::lineForPosition(int& position) const -{ - int pos = 0, idx = 0; - - while ( (pos + m_lines.at(idx)->length()) < position ) - pos += m_lines.at(idx++)->length(); - - - return 0; -} - -void QDocumentPrivate::setWidth(int width) -{ - int oldConstraint = m_constrained; - m_constrained = width > 0; - - if ( m_constrained ) - { - int oldWidth = m_width; - - m_width = width; - - if ( oldConstraint && oldWidth < width ) - { - // expand : simply remove old wraps if possible - - QMap<int, int>::iterator it = m_wrapped.begin(); - - while ( it != m_wrapped.end() ) - { - QDocumentLineHandle *h = it.key() < m_lines.count() ? m_lines.at(it.key()) : 0; - - if ( h ) - h->updateWrap(); - - int sz = h ? h->m_frontiers.count() : 0; - - if ( sz ) - { - //qDebug("changing wrap at line %i from %i to %i", it.key(), *it, sz); - *it = sz; - ++it; - } else { - //qDebug("removing wrap at line %i", it.key()); - it = m_wrapped.erase(it); - } - } - } else if ( oldWidth > width ) { - // shrink : scan whole document and create new wraps wherever needed - //qDebug("global width scan [constraint on]"); - //m_wrapped.clear(); - setWidth(); - } - } else { - //qDebug("global width scan [constraint off]"); - m_wrapped.clear(); - setWidth(); - } - - if ( m_editCursor ) - { - m_editCursor->refreshColumnMemory(); - } - - emitWidthChanged(); - setHeight(); - - emitFormatsChanged(); -} - -void QDocumentPrivate::setWidth() -{ - m_largest.clear(); - const int max = m_lines.count(); - - if ( m_constrained ) - { - int first = -1; - - for ( int i = 0; i < max; ++i ) - { - QDocumentLineHandle *l = m_lines.at(i); - int olw = l->m_frontiers.count(); - - l->updateWrap(); - - int lw = l->m_frontiers.count(); - - if ( olw == lw ) - continue; - - if ( lw ) - { - //qDebug("added wrap on line %i", line); - m_wrapped[i] = lw; - } else { - //qDebug("removed wrap on line %i", line); - m_wrapped.remove(i); - } - - if ( first != -1 ) - first = i; - } - - if ( first != -1 ) - emitFormatsChange(first, -1); - } else { - int oldWidth = m_width; - - m_width = 0; - - foreach ( QDocumentLineHandle *l, m_lines ) - { - if ( l->hasFlag(QDocumentLine::Hidden) ) - continue; - - l->m_frontiers.clear(); - - int w = l->cursorToX(l->length()); - - if ( w > m_width ) - { - m_width = w; - - m_largest.clear(); - m_largest << qMakePair(l, w); - } - } - - if ( m_width != oldWidth ) - emitWidthChanged(); - } -} - -static const int widthCacheSize = 5; - -void QDocumentPrivate::adjustWidth(int line) -{ - if ( line < 0 || line >= m_lines.count() ) - return; - - QDocumentLineHandle *l = m_lines.at(line); - - if ( m_constrained ) - { - int olw = l->m_frontiers.count(); - - l->updateWrap(); - - int lw = l->m_frontiers.count(); - - if ( olw == lw ) - return; - - if ( l->m_layout ) - l->setFlag(QDocumentLine::LayoutDirty); - - if ( lw ) - { - //qDebug("added wrap on line %i", line); - m_wrapped[line] = lw; - } else { - //qDebug("removed wrap on line %i", line); - m_wrapped.remove(line); - } - - emitFormatsChange(line, -1); - setHeight(); - - } else { - l->m_frontiers.clear(); - - int w = l->cursorToX(l->length()); - - if ( w > m_width ) - { - m_width = w; - emitWidthChanged(); - - m_largest.clear(); - m_largest << qMakePair(l, w); - } else if ( m_largest.count() && (m_largest.at(0).first == l) ) { - int old = m_largest.at(0).second; - - if ( w < old ) - setWidth(); - } - } -} - -void QDocumentPrivate::setHeight() -{ - int oldHeight = m_height; - int last = visualLine(m_lines.count() - 1) + 1; - - if ( m_lines.count() ) - last += m_lines.last()->m_frontiers.count(); - - m_height = last * m_lineSpacing; - - if ( oldHeight != m_height ) - emitHeightChanged(); -} - -void QDocumentPrivate::setFont(const QFont& f) -{ - if ( !m_font ) - { - m_font = new QFont; - m_fontMetrics = new QFontMetrics(*m_font); - } - - *m_font = f; - - // ensures the font is fixed pitch to avoid idsplay glitches - // and inconsistency of column selections - // :( does not work well... - //m_font->setFixedPitch(true); - - // set the styling so that if the font is not found Courier one will be used - m_font->setStyleHint(QFont::Courier, QFont::PreferQuality); - - *m_fontMetrics = QFontMetrics(*m_font); - - m_spaceWidth = m_fontMetrics->width(' '); - m_lineSpacing = m_fontMetrics->lineSpacing(); - m_ascent = m_fontMetrics->ascent(); - m_descent = m_fontMetrics->descent(); - m_leading = m_fontMetrics->leading(); - - m_lineHeight = m_fontMetrics->height(); - //m_lineHeight = m_ascent + m_descent - 2; - - m_fixedPitch = QFontInfo(*m_font).fixedPitch(); - - //if ( !m_fixedPitch ) - // qDebug("unsafe computations..."); - - foreach ( QDocumentPrivate *d, m_documents ) - { - d->updateFormatCache(); - d->setWidth(); - d->setHeight(); - } -} - -void QDocumentPrivate::setFormatScheme(QFormatScheme *f) -{ - m_formatScheme = f; - updateFormatCache(); -} - -void QDocumentPrivate::tunePainter(QPainter *p, int fid) -{ - if ( fid < m_fonts.count() ) - { - p->setFont(m_fonts.at(fid)); - //p->setPen(m_colors.at(fid)); - } else { - p->setFont(*m_font); - //p->setPen(Qt::black); - } -} - -void QDocumentPrivate::updateFormatCache() -{ - m_fonts.clear(); - - if ( !m_font ) - return; - - if ( !m_formatScheme ) - { - m_fonts << *m_font; - return; - } - - QFont f(*m_font); - const int end = m_formatScheme->formatCount(); - - m_fonts.reserve(end); - - for ( int i = 0; i < end; i++ ) - { - QFormat fmt = m_formatScheme->format(i); - - f.setWeight(fmt.weight); - f.setItalic(fmt.italic); - - m_fonts << f; - } - - //foreach ( QDocumentPrivate *d, m_documents ) - // d->emitFormatsChanged(); - - emitFormatsChanged(); -} - -void QDocumentPrivate::emitWidthChanged() -{ - if ( !m_doc ) - return; - - emit m_doc->widthChanged(m_width); - - emit m_doc->sizeChanged(QSize(m_width, m_height)); -} - -void QDocumentPrivate::emitHeightChanged() -{ - if ( !m_doc ) - return; - - emit m_doc->heightChanged(m_height); - - emit m_doc->sizeChanged(QSize(m_width, m_height)); -} - -void QDocumentPrivate::insertLines(int after, const QList<QDocumentLineHandle*>& l) -{ - //qDebug("inserting : %i, %i", after, l.count()); - - int i = 0; - - foreach ( QDocumentLineHandle *h, l ) - { - h->setFlag(QDocumentLine::Hidden, false); - h->setFlag(QDocumentLine::CollapsedBlockStart, false); - h->setFlag(QDocumentLine::CollapsedBlockEnd, false); - h->m_frontiers.clear(); - } - - QMap<int, int>::iterator it = m_hidden.begin(); - - while ( it != m_hidden.end() ) - { - if ( (it.key() <= after) && ((it.key() + *it) > after) ) - { - *it += l.count(); - - foreach ( QDocumentLineHandle *h, l ) - h->setFlag(QDocumentLine::Hidden, true); - } - - ++it; - } - - ++after; - updateHidden(after, l.count()); - updateWrapped(after, l.count()); - - while ( i < l.count() ) - { - // TODO : move (and abstract somehow) inside the line (handle?) - l.at(i)->m_context.reset(); - - m_lines.insert(after + i, l.at(i)); - - adjustWidth(after + i); - - ++i; - } - - emit m_doc->lineCountChanged(m_lines.count()); - setHeight(); -} - -void QDocumentPrivate::removeLines(int after, int n) -{ - if ( (after >= 0) && (after < m_lines.count()) ) - m_lines.at(after)->setFlag(QDocumentLine::CollapsedBlockStart, false); - - QMap<int, int>::iterator it = m_hidden.begin(); - - //qDebug("translating %i", visualLine); - - while ( it != m_hidden.end() ) - { - if ( (it.key() >= after) && (it.key() < (after + n)) ) - { - int i = it.key(), end = i + *it, depth = 0; - - while ( i <= end ) - { - if ( !depth ) - m_lines.at(i)->setFlag(QDocumentLine::Hidden, false); - - if ( m_lines.at(i)->hasFlag(QDocumentLine::CollapsedBlockStart) ) - ++depth; - else if ( m_lines.at(i)->hasFlag(QDocumentLine::CollapsedBlockEnd) ) - --depth; - - ++i; - } - - it = m_hidden.erase(it); - - } else if ( (it.key() < after) && (it.key() + *it) >= after ) { - - if ( (it.key() + *it) > (after + n) ) - { - // fully inside - *it -= n; - ++it; - } else { - // goes beyond... - int i = it.key(), end = i + *it, depth = 0; - - while ( i <= end ) - { - if ( !depth ) - m_lines.at(i)->setFlag(QDocumentLine::Hidden, false); - - if ( m_lines.at(i)->hasFlag(QDocumentLine::CollapsedBlockStart) ) - ++depth; - else if ( m_lines.at(i)->hasFlag(QDocumentLine::CollapsedBlockEnd) ) - --depth; - - ++i; - } - - it = m_hidden.erase(it); - } - } else { - ++it; - } - } - - it = m_wrapped.begin(); - - while ( it != m_wrapped.end() ) - { - if ( (it.key() > after) && (it.key() <= (after + n)) ) - { - //qDebug("eraser %i", it.key()); - it = m_wrapped.erase(it); - } else { - ++it; - } - } - - ++after; - updateHidden(after, -n); - updateWrapped(after, -n); - m_lines.remove(after, n); - - emit m_doc->lineCountChanged(m_lines.count()); - setHeight(); -} - -QDocumentLineHandle* QDocumentPrivate::at(int line) const -{ - return ((line >= 0) && (line < m_lines.count())) ? m_lines.at(line) : 0; -} - -int QDocumentPrivate::indexOf(const QDocumentLineHandle *l) const -{ - return m_lines.indexOf(const_cast<QDocumentLineHandle*>(l)); -} - -QDocumentIterator QDocumentPrivate::index(const QDocumentLineHandle *l) -{ - QDocumentIterator i = m_lines.begin(); - - int idx = indexOf(l); - - return (idx != -1) ? i + idx : m_lines.end(); -} - -QDocumentConstIterator QDocumentPrivate::index(const QDocumentLineHandle *l) const -{ - QDocumentConstIterator i = m_lines.constBegin(); - - int idx = indexOf(l); - - return (idx != -1) ? i + idx : m_lines.end(); -} - -QDocumentLineHandle* QDocumentPrivate::next(const QDocumentLineHandle *l) const -{ - if ( !l ) - return m_lines.count() ? m_lines.first() : 0; - - int idx = m_lines.indexOf(const_cast<QDocumentLineHandle*>(l)); - - return ((idx != -1) && ((idx + 1) < m_lines.count())) ? m_lines.at(idx + 1) : 0; -} - -QDocumentLineHandle* QDocumentPrivate::previous(const QDocumentLineHandle *l) const -{ - if ( !l ) - return m_lines.count() ? m_lines.last() : 0; - - int idx = m_lines.indexOf(const_cast<QDocumentLineHandle*>(l)); - - return ((idx != -1) && (idx > 0)) ? m_lines.at(idx - 1) : 0; -} - -void QDocumentPrivate::beginChangeBlock() -{ - //qDebug("<macro>"); - m_commands.beginMacro(QString()); -} - -void QDocumentPrivate::endChangeBlock() -{ - m_commands.endMacro(); - //qDebug("</macro>"); -} - -/*! - \brief Acquire group id -*/ -int QDocumentPrivate::getNextGroupId() -{ - if ( m_freeGroupIds.count() ) - return m_freeGroupIds.takeFirst(); - - return ++m_lastGroupId; -} - -/*! - \brief Relase group id -*/ -void QDocumentPrivate::releaseGroupId(int groupId) -{ - if ( groupId == m_lastGroupId ) - { - --m_lastGroupId; - while ( m_freeGroupIds.removeAll(m_lastGroupId) ) - { - --m_lastGroupId; - } - } else { - m_freeGroupIds << groupId; - } -} - -/*! - \brief Clear matches -*/ -void QDocumentPrivate::clearMatches(int groupId) -{ - QHash<int, MatchList>::iterator mit = m_matches.find(groupId); - - if ( mit == m_matches.end() ) - { - return; - } - - MatchList& matches = *mit; - - foreach ( const Match& m, matches ) - { - m.h->removeOverlay(m.range); - } - - matches.index = matches.count(); -} - -/*! - \brief Highlight the matched sequences - - \note Both position are BEFORE the matched characters (cursor position). -*/ -void QDocumentPrivate::addMatch(int groupId, int line, int pos, int len, int format) -{ - //qDebug("match (%i, %i, %i)", line, pos, len); - - Match m; - m.line = line; - m.h = at(line); - m.range = QFormatRange(pos, len, format); - m_matches[groupId] << m; - - m.h->addOverlay(m.range); -} - -void QDocumentPrivate::flushMatches(int groupId) -{ - QHash<int, MatchList>::iterator mit = m_matches.find(groupId); - - if ( mit == m_matches.end() ) - { - return; - } - - MatchList& matches = *mit; - - QMap<int, int> areas; - - foreach ( const Match& m, matches ) - { - int n = 1; - int l = m.line; - - //qDebug("simple:(%i, %i)", l, 1); - - QMap<int, int>::iterator tmp, it = areas.find(l); - - if ( it != areas.end() ) - continue; - - it = areas.insert(m.line, n); - - if ( it != areas.end() && (it - 1) != areas.end() ) - { - tmp = it - 1; - int off = tmp.key() + *tmp - l; - - if ( off >= 0 && (off < n) ) - { - *tmp += n - off; - it = areas.erase(it) - 1; - } - } - - if ( it != areas.end() && (it + 1) != areas.end() ) - { - tmp = it + 1; - int off = it.key() + *it - tmp.key(); - - if ( off >= 0 && (off < *tmp) ) - { - *it += *tmp; - areas.erase(tmp); - } - } - //emitFormatsChange(m.line, 1); - } - - // remove old matches - while ( matches.index ) - { - matches.removeFirst(); - --matches.index; - } - - // send update messages - QMap<int, int>::const_iterator it = areas.constBegin(); - - while ( it != areas.constEnd() ) - { - //qDebug("merged:(%i, %i)", it.key(), *it); - emitFormatsChange(it.key(), *it); - - ++it; - } - - // update storage "meta-data" - if ( matches.isEmpty() ) - { - m_matches.remove(groupId); - - releaseGroupId(groupId); - } - //qDebug("done with matches"); -} - -QList<int> QDocumentPrivate::marks(QDocumentLineHandle *h) const -{ - //return QList<int>() << 1; //testcase - - return m_marks.contains(h) ? m_marks.value(h) : QList<int>(); -} - -void QDocumentPrivate::addMark(QDocumentLineHandle *h, int mid) -{ - QList<int>& l = m_marks[h]; - - l << mid; - - m_maxMarksPerLine = qMax(l.count(), m_maxMarksPerLine); - - emitMarkChanged(h, mid, true); -} - -void QDocumentPrivate::toggleMark(QDocumentLineHandle *h, int mid) -{ - if ( m_marks.value(h).contains(mid) ) - { - removeMark(h, mid); - } else { - addMark(h, mid); - } -} - -void QDocumentPrivate::removeMark(QDocumentLineHandle *h, int mid) -{ - QHash<QDocumentLineHandle*, QList<int> >::iterator it = m_marks.find(h); - - if ( it == m_marks.end() ) - return; - - int count = it->count(); - int n = it->removeAll(mid); - - if ( it->isEmpty() ) - m_marks.erase(it); - - if ( n && (count == m_maxMarksPerLine) ) - { - QHash<QDocumentLineHandle*, QList<int> >::const_iterator - rit = m_marks.constBegin(), - end = m_marks.constEnd(); - - m_maxMarksPerLine = 0; - - while ( rit != end ) - { - m_maxMarksPerLine = qMax(rit->count(), m_maxMarksPerLine); - ++rit; - } - } - - emitMarkChanged(h, mid, false); -} - -int QDocumentPrivate::visualLine(int textLine) const -{ - if ( textLine < 0 ) - return 0; - - int hiddenLines = 0, wrappedLines = 0; - QMap<int, int>::const_iterator hit, wit, he, we; - hit = m_hidden.constBegin(); - wit = m_wrapped.constBegin(); - he = m_hidden.constEnd(); - we = m_wrapped.constEnd(); - - //qDebug("translating %i", visualLine); - - while ( hit != he || wit != we ) - { - if ( hit != he && (wit == we || hit.key() <= wit.key()) ) - { - int hl = hit.key(); - - if ( hl >= textLine ) - break; - - int max = 0; - - do - { - max = qMax(max, hit.key() - hl + *hit); - ++hit; - } while ( (hit != he) && (hit.key() <= hl + max) ); - - hiddenLines += max; - - if ( wit != we && wit.key() == hl ) - { - wrappedLines += *wit; - ++wit; - } - - while ( wit != we ) - { - if ( wit.key() > hl + max ) - break; - - ++wit; - } - - } else { - if ( wit.key() >= textLine ) - break; - - if ( m_lines.at(wit.key())->hasFlag(QDocumentLine::Hidden) ) - { - ++wit; - continue; - } - - wrappedLines += *wit; - ++wit; - } - } - - //qDebug("translating %i => %i", textLine, textLine - hiddenLines + wrappedLines); - - return textLine - hiddenLines + wrappedLines; -} - -int QDocumentPrivate::textLine(int visualLine, int *wrap) const -{ - if ( visualLine < 0 ) - return 0; - - int hiddenLines = 0, wrappedLines = 0, vis = 0, txt = 0, mess = 0; - QMap<int, int>::const_iterator - h = m_hidden.constBegin(), - w = m_wrapped.constBegin(), - he = m_hidden.constEnd(), - we = m_wrapped.constEnd(); - - //qDebug("translating %i", visualLine); - - while ( vis < visualLine ) - { - if ( h != he ) - { - int hl = h.key(); - - if ( w == we || hl <= w.key() ) - { - if ( visualLine + mess <= hl ) - break; - - if ( w != we && w.key() == hl ) - { - //qDebug("trying to solve : h=(%i, %i), w=(%i, %i)", hl, *h, w.key(), *w); - const int off = (visualLine + mess) - hl; - if ( off <= *w ) - { - //qDebug("%i -> %i + %i", visualLine, hl, off); - if ( wrap ) - *wrap = off; - - return hl; - } - } - - int max = 0; - - do - { - max = qMax(max, h.key() - hl + *h); - ++h; - } while ( (h != he) && (h.key() <= hl + max) ); - - // very important : do not forget possible wrapping on folded block start - if ( w != we && w.key() == hl ) - { - wrappedLines += *w; - ++w; - } - - while ( w != we ) - { - if ( w.key() > txt + max ) - break; - - ++w; - } - - hiddenLines += max; - - } else { - txt = w.key(); - - if ( m_lines.at(txt)->hasFlag(QDocumentLine::Hidden) ) - { - ++w; - continue; - } - - if ( visualLine + mess < txt ) - break; - - wrappedLines += *w; - ++w; - } - } else if ( w != we ) { - txt = w.key(); - - if ( m_lines.at(txt)->hasFlag(QDocumentLine::Hidden) ) - { - ++w; - continue; - } - - if ( visualLine + mess < txt ) - break; - - wrappedLines += *w; - ++w; - } else { - break; - } - - mess = hiddenLines - wrappedLines; - vis = txt - mess; - } - - we = m_wrapped.constBegin(); - - if ( m_wrapped.count() && w != we ) - { - --w; - - int wl = w.key(); - bool hwrap = m_lines.at(wl)->hasFlag(QDocumentLine::Hidden); - - if ( !hwrap ) - { - int base = this->visualLine(wl); - - if ( visualLine >= base && visualLine <= base + *w ) - { - //qDebug("rebased : %i to %i", visualLine, base); - - if ( wrap ) - *wrap = visualLine - base; - - return wl; - } - } - } - - //qDebug("[visual:text] : %i : %i", visualLine, visualLine + mess); - int off = visualLine + mess - (m_lines.count() - 1); - - if ( off > 0 ) - { - if ( wrap ) - *wrap = m_lines.last()->m_frontiers.count(); - - return m_lines.count() - 1; - } - - return visualLine + mess; -} - -void QDocumentPrivate::hideEvent(int line, int count) -{ - m_hidden.insertMulti(line, count); - - setHeight(); - //emitFormatsChange(line, count); - emitFormatsChanged(); -} - -void QDocumentPrivate::showEvent(int line, int count) -{ - QMap<int, int>::iterator it = m_hidden.find(line); - - while ( (it != m_hidden.end()) && (it.key() == line) ) - { - if ( *it == count ) - { -// qDebug("showing %i lines from %i", count, line); - it = m_hidden.erase(it); - } else - ++it; - } - - setHeight(); - //emitFormatsChange(line, count); - emitFormatsChanged(); -} - -void QDocumentPrivate::updateHidden(int line, int count) -{ - if ( m_hidden.isEmpty() || (line > (m_hidden.constEnd() - 1).key() ) ) - return; - - QMap<int, int> prev = m_hidden; - m_hidden.clear(); - - QMap<int, int>::const_iterator it = prev.constBegin(); - - //qDebug("shifting by %i from %i", count, line); - - while ( it != prev.constEnd() ) - { - if ( it.key() < line ) - { - m_hidden.insertMulti(it.key(), *it); - } else { - m_hidden.insertMulti(it.key() + count, *it); - } - - ++it; - } -} - -void QDocumentPrivate::updateWrapped(int line, int count) -{ - if ( m_wrapped.isEmpty() || (line > (m_wrapped.constEnd() - 1).key() ) ) - return; - - QMap<int, int> prev = m_wrapped; - QMap<int, int>::iterator it = prev.begin(); - - m_wrapped.clear(); - - //qDebug("shifting by %i from %i", count, line); - - while ( it != prev.end() ) - { - if ( it.key() < line ) - { - m_wrapped.insert(it.key(), *it); - } else { - //qDebug("moved wrap from line %i to line %i", it.key(), it.key() + count); - m_wrapped.insert(it.key() + count, *it); - } - - ++it; - } -} - -void QDocumentPrivate::emitFormatsChange(int line, int lines) -{ - emit m_doc->formatsChange(line, lines); -} - -void QDocumentPrivate::emitContentsChange(int line, int lines) -{ - //for ( int i = line; i < (line + lines); i++ ) - // m_lines.at(i)->cache(); - - int n = lines; - - if ( m_language ) - { - n = m_language->tokenize(m_doc, line, lines); - } - //qDebug("%i, %i : %i", line, lines, n); - - emit m_doc->contentsChange(line, lines); - emit m_doc->contentsChanged(); - - if ( n > lines ) - emitFormatsChange(line + lines, n - lines); -} - -void QDocumentPrivate::emitFormatsChanged() -{ - emit m_doc->formatsChanged(); -} - -void QDocumentPrivate::emitContentsChanged() -{ - //emit m_doc->contentsChanged(); -} - -void QDocumentPrivate::emitLineDeleted(QDocumentLineHandle *h) -{ - if ( !m_deleting ) - { - m_marks.remove(h); - - int idx = m_lines.indexOf(h); - - if ( idx != -1 ) - { - //qDebug("removing line %i", idx); - - m_lines.remove(idx); - - if ( m_largest.count() && (m_largest.at(0).first == h) ) - { - m_largest.remove(0); - setWidth(); - } - - m_hidden.remove(idx); - m_wrapped.remove(idx); - - setHeight(); - } - } - - emit m_doc->lineDeleted(h); -} - -void QDocumentPrivate::emitMarkChanged(QDocumentLineHandle *l, int m, bool on) -{ - emitFormatsChanged(); - emit m_doc->markChanged(l, m, on); -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocument.h +++ /dev/null @@ -1,273 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QDOCUMENT_H_ -#define _QDOCUMENT_H_ - -#include "qce-config.h" - -/*! - \file qdocument.h - \brief Definition of the QDocument class - - \defgroup document Document related classes -*/ - -#include <QList> -#include <QVector> -#include <QLinkedList> - -#include <QObject> -#include <QPalette> -#include <QMetaType> - -class QFont; -class QRect; -class QPrinter; -class QDateTime; -class QFormatScheme; -class QLanguageDefinition; - -struct QCE_EXPORT QDocumentSelection -{ - int start, end; - int startLine, endLine; -}; - -class QDocumentLine; -class QDocumentCursor; -class QDocumentPrivate; -class QDocumentCommand; -class QDocumentLineHandle; -class QDocumentCursorHandle; - -typedef QVector<QDocumentLineHandle*>::iterator QDocumentIterator; -typedef QVector<QDocumentLineHandle*>::const_iterator QDocumentConstIterator; - -Q_DECLARE_METATYPE(QDocumentIterator) -Q_DECLARE_METATYPE(QDocumentConstIterator) - -class QCE_EXPORT QDocument : public QObject -{ - friend class QMatcher; - friend class QDocumentPrivate; - friend class QDocumentCommand; - - Q_OBJECT - - public: - struct PaintContext - { - int width; - int height; - int xoffset; - int yoffset; - QPalette palette; - bool blinkingCursor; - bool fillCursorRect; - QList<QDocumentCursorHandle*> extra; - QList<QDocumentCursorHandle*> cursors; - QList<QDocumentSelection> selections; - }; - - enum LineEnding - { - Conservative, - Local, - Unix, - Windows, - Mac, // backward compat only : use OldMac instead (more self-explanatory) - OldMac = Mac - }; - - enum TextProcessing - { - RemoveTrailingWS = 1, - PreserveIndent = 2, - RestoreTrailingIndent = 4 - }; - - enum WhiteSpaceFlag - { - ShowNone = 0x00, - ShowTrailing = 0x01, - ShowLeading = 0x02, - ShowTabs = 0x04 - }; - - Q_DECLARE_FLAGS(WhiteSpaceMode, WhiteSpaceFlag) - - explicit QDocument(QObject *p = 0); - virtual ~QDocument(); - - QString text(int mode) const; - QString text(bool removeTrailing = false, bool preserveIndent = true) const; - void setText(const QString& s); - - void startChunkLoading(); - void stopChunkLoading(); - void addChunk(const QString& txt); - - LineEnding lineEnding() const; - LineEnding originalLineEnding() const; - void setLineEnding(LineEnding le); - - QDateTime lastModified() const; - void setLastModified(const QDateTime& d); - - bool canUndo() const; - bool canRedo() const; - - int width() const; - int height() const; - int widthConstraint() const; - - int lines() const; - int lineCount() const; - int visualLines() const; - int visualLineCount() const; - - int visualLineNumber(int textLineNumber) const; - int textLineNumber(int visualLineNumber) const; - - int y(int line) const; - int lineNumber(int ypos, int *wrap = 0) const; - int y(const QDocumentLine& l) const; - - QRect lineRect(int line) const; - QRect lineRect(const QDocumentLine& l) const; - - QDocumentCursor* editCursor() const; - void setEditCursor(QDocumentCursor *c); - - QLanguageDefinition* languageDefinition() const; - void setLanguageDefinition(QLanguageDefinition *l); - - int maxMarksPerLine() const; - int findNextMark(int id, int from = 0, int until = -1) const; - int findPreviousMark(int id, int from = -1, int until = 0) const; - - QDocumentLine lineAt(const QPoint& p) const; - void cursorForDocumentPosition(const QPoint& p, int& line, int& column) const; - QDocumentCursor cursorAt(const QPoint& p) const; - - QDocumentLine line(int line) const; - QDocumentLine line(QDocumentConstIterator iterator) const; - - QDocumentCursor cursor(int line, int column = 0) const; - - QDocumentLine findLine(int& position) const; - - bool isLineModified(const QDocumentLine& l) const; - bool hasLineEverBeenModified(const QDocumentLine& l) const; - - virtual void draw(QPainter *p, PaintContext& cxt); - - void execute(QDocumentCommand *cmd); - - inline QDocumentPrivate* impl() { return m_impl; } - - QDocumentConstIterator begin() const; - QDocumentConstIterator end() const; - - QDocumentConstIterator iterator(int ln) const; - QDocumentConstIterator iterator(const QDocumentLine& l) const; - - void beginMacro(); - void endMacro(); - - QFormatScheme* formatScheme() const; - void setFormatScheme(QFormatScheme *f); - - int getNextGroupId(); - void releaseGroupId(int groupId); - void clearMatches(int groupId); - void flushMatches(int groupId); - void addMatch(int groupId, int line, int pos, int len, int format); - - static QFont font(); - static void setFont(const QFont& f); - static const QFontMetrics& fontMetrics(); - - static LineEnding defaultLineEnding(); - static void setDefaultLineEnding(LineEnding le); - - static int tabStop(); - static void setTabStop(int n); - - static WhiteSpaceMode showSpaces(); - static void setShowSpaces(WhiteSpaceMode y); - - static QFormatScheme* defaultFormatScheme(); - static void setDefaultFormatScheme(QFormatScheme *f); - - static QFormatScheme* formatFactory(); - static void setFormatFactory(QFormatScheme *f); - - static int screenLength(const QChar *d, int l, int tabStop); - static QString screenable(const QChar *d, int l, int tabStop); - - inline void markViewDirty() { formatsChanged(); } - - bool isClean() const; - - public slots: - void clear(); - - void undo(); - void redo(); - - void setClean(); - - void highlight(); - - void print(QPrinter *p); - - void clearWidthConstraint(); - void setWidthConstraint(int width); - - signals: - void cleanChanged(bool m); - - void undoAvailable(bool y); - void redoAvailable(bool y); - - void formatsChanged(); - void contentsChanged(); - - void formatsChange (int line, int lines); - void contentsChange(int line, int lines); - - void widthChanged(int width); - void heightChanged(int height); - void sizeChanged(const QSize& s); - - void lineCountChanged(int n); - void visualLineCountChanged(int n); - - void lineDeleted(QDocumentLineHandle *h); - void markChanged(QDocumentLineHandle *l, int m, bool on); - - void lineEndingChanged(int lineEnding); - - private: - QString m_leftOver; - QDocumentPrivate *m_impl; -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(QDocument::WhiteSpaceMode) - -#endif -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocument_p.h +++ /dev/null @@ -1,224 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QDOCUMENT_P_H_ -#define _QDOCUMENT_P_H_ - -#include "qce-config.h" - -/*! - \file qdocument_p.h - \brief Definition of the private document API -*/ - -#include "qdocument.h" -#include "qdocumentline.h" -#include "qdocumentcursor.h" - -#include <QHash> -#include <QFont> -#include <QStack> -#include <QQueue> -#include <QDateTime> -#include <QUndoStack> -#include <QStringList> -#include <QFontMetrics> -#include <QUndoCommand> - -class QDocument; -class QDocumentBuffer; -class QDocumentPrivate; -class QDocumentCommand; -class QDocumentCommandBlock; - -class QLanguageDefinition; - -Q_DECLARE_TYPEINFO(QDocumentSelection, Q_PRIMITIVE_TYPE); - -#include "qdocumentline_p.h" - -#include "qdocumentcursor_p.h" - -class QCE_EXPORT QDocumentPrivate -{ - friend class QEditConfig; - - friend class QDocument; - friend class QDocumentCommand; - friend class QDocumentLineHandle; - friend class QDocumentCursorHandle; - - public: - QDocumentPrivate(QDocument *d); - ~QDocumentPrivate(); - - void execute(QDocumentCommand *cmd); - - void draw(QPainter *p, QDocument::PaintContext& cxt); - - QDocumentLineHandle* lineForPosition(int& position) const; - int position(const QDocumentLineHandle *l) const; - - QDocumentLineHandle* at(int line) const; - int indexOf(const QDocumentLineHandle *l) const; - - QDocumentIterator index(const QDocumentLineHandle *l); - QDocumentConstIterator index(const QDocumentLineHandle *l) const; - - QDocumentLineHandle* next(const QDocumentLineHandle *l) const; - QDocumentLineHandle* previous(const QDocumentLineHandle *l) const; - - void adjustWidth(int l); - //int checkWidth(QDocumentLineHandle *l, int w); - //int checkWidth(QDocumentLineHandle *l, const QString& s); - - void setWidth(); - void setHeight(); - - static void setFont(const QFont& f); - - void beginChangeBlock(); - void endChangeBlock(); - - inline int maxMarksPerLine() const - { return m_maxMarksPerLine; } - - inline bool hasMarks() const - { return m_marks.count(); } - - QList<int> marks(QDocumentLineHandle *h) const; - - void addMark(QDocumentLineHandle *h, int mid); - void toggleMark(QDocumentLineHandle *h, int mid); - void removeMark(QDocumentLineHandle *h, int mid); - - int findNextMark(int id, int from = 0, int until = -1); - int findPreviousMark(int id, int from = -1, int until = 0); - - int getNextGroupId(); - void releaseGroupId(int groupId); - void clearMatches(int gid); - void flushMatches(int gid); - void addMatch(int gid, int line, int pos, int len, int format); - - void emitFormatsChange (int line, int lines); - void emitContentsChange(int line, int lines); - - int visualLine(int textLine) const; - int textLine(int visualLine, int *wrap = 0) const; - void hideEvent(int line, int count); - void showEvent(int line, int count); - - void setWidth(int width); - - void emitFormatsChanged(); - void emitContentsChanged(); - - void emitLineDeleted(QDocumentLineHandle *h); - void emitMarkChanged(QDocumentLineHandle *l, int m, bool on); - - inline QDocumentIterator begin() { return m_lines.begin(); } - inline QDocumentIterator end() { return m_lines.end(); } - - inline QDocumentConstIterator constBegin() const { return m_lines.constBegin(); } - inline QDocumentConstIterator constEnd() const { return m_lines.constEnd(); } - - protected: - void updateHidden(int line, int count); - void updateWrapped(int line, int count); - - void insertLines(int after, const QList<QDocumentLineHandle*>& l); - void removeLines(int after, int n); - - void emitWidthChanged(); - void emitHeightChanged(); - - void updateFormatCache(); - void setFormatScheme(QFormatScheme *f); - void tunePainter(QPainter *p, int fid); - - private: - QDocument *m_doc; - QUndoStack m_commands; - QDocumentCursor *m_editCursor; - - bool m_suspend, m_deleting; - QQueue<QPair<int, int> > m_notifications; - - QMap<int, int> m_hidden; - QMap<int, int> m_wrapped; - QVector< QPair<QDocumentLineHandle*, int> > m_largest; - - struct Match - { - int line; - QFormatRange range; - QDocumentLineHandle *h; - }; - - struct MatchList : QList<Match> - { - MatchList() : index(0) {} - - int index; - }; - - int m_lastGroupId; - QList<int> m_freeGroupIds; - QHash<int, MatchList> m_matches; - - bool m_constrained; - int m_width, m_height; - - int m_tabStop; - static int m_defaultTabStop; - - static QFont *m_font; - static bool m_fixedPitch; - static QFontMetrics *m_fontMetrics; - static int m_leftMargin; - static QDocument::WhiteSpaceMode m_showSpaces; - static QDocument::LineEnding m_defaultLineEnding; - static int m_lineHeight; - static int m_lineSpacing; - static int m_spaceWidth; - static int m_ascent; - static int m_descent; - static int m_leading; - static int m_wrapMargin; - - QFormatScheme *m_formatScheme; - QLanguageDefinition *m_language; - static QFormatScheme *m_defaultFormatScheme; - - QVector<QFont> m_fonts; - - static QList<QDocumentPrivate*> m_documents; - - int m_maxMarksPerLine; - QHash<QDocumentLineHandle*, QList<int> > m_marks; - QHash<QDocumentLineHandle*, QPair<int, int> > m_status; - - int _nix, _dos, _mac; - QString m_lineEndingString; - QDocument::LineEnding m_lineEnding; - - QDateTime m_lastModified; - - QDocumentBuffer *m_buffer; - QVector<QDocumentLineHandle*> m_lines; -}; - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentbuffer.cpp +++ /dev/null @@ -1,373 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qdocumentbuffer.h" - -/* - Notes on design : - - The idea is to fragment the storage to workaround the issue of Qt - containers alocation model (too much memory usage when number of items - grow) and provide faster modification of the content. - - The number one goal is to keep lookup by index as fast possible to avoid - significant impact on document iteration/drawing speed - - for such a storage to be useful the block size may not be fixed but instead - must be kept around an "average" value. -*/ - -QDocumentBuffer::QDocumentBuffer() - : m_safetyRoom(10), m_optimalSize(1000), m_forkThresold(1500), m_mergeThresold(100) -{ - -} - -QDocumentBuffer::~QDocumentBuffer() -{ - qDeleteAll(m_blocks); -} - -// for loading -void QDocumentBuffer::appendLine(QDocumentLineHandle *l) -{ - Block *b = m_blocks.last(); - - if ( b->size() >= m_optimalSize ) - { - b = new Block(); - m_blocks << b; - } - - b->lines.append(l); -} - -int QDocumentBuffer::blockForLine(int index) const -{ - // TODO : binary search? - for ( int i = 0; i < m_blocks.count(); ++i ) - { - if ( index < m_blocks.at(i)->end ) - return i; - } - - // too high... - return -1; -} - -QDocumentLineHandle* QDocumentBuffer::at(int index) const -{ - int blockIndex = blockForLine(index); - - return blockIndex != -1 ? m_blocks.at(blockIndex)->at(index) : 0; -} - -void QDocumentBuffer::insertLine(int index, QDocumentLineHandle *l) -{ - int blockIndex = blockForLine(index); - - if ( blockIndex == -1 ) - { - qWarning("cannot insert line at pos %i", index); - return; - } - - Block *b = m_blocks.at(blockIndex); - - if ( (b->size() + 1) >= m_forkThresold ) - { - // split block - int bounds = b->start + m_optimalSize; - - Block *nb = new Block(bounds); - nb->insert(bounds, b->lines.constData() + m_optimalSize, b->size() - m_optimalSize); - nb->lines.append(l); - nb->end = bounds + nb->size(); - m_blocks.insert(blockIndex + 1, nb); - - b->lines.resize(m_optimalSize); - b->end = bounds; - - blockIndex += 2; - } else { - b->insert(index, l); - } - - // update block boundaries - while ( blockIndex < m_blocks.count() ) - { - b = m_blocks.at(blockIndex); - ++b->start; - ++b->end; - } -} - -void QDocumentBuffer::removeLine(int index) -{ - int blockIndex = blockForLine(index); - - if ( blockIndex == -1 ) - { - qWarning("cannot remove line at pos %i", index); - return; - } - - Block *b = m_blocks.at(blockIndex); - - b->remove(index); - --b->end; - - // if block too small, merge it with blocks around? - - if ( !b->size() ) - { - // remove empty block - m_blocks.remove(blockIndex); - delete b; - } else if ( b->size() < m_mergeThresold ) { - // "merge" block with its neighbors - - int n = b->size(); - n += qMin(1, n / m_safetyRoom); - - int roomPrev = blockIndex ? m_forkThresold - m_blocks.at(blockIndex - 1)->size() : 0; - int roomNext = blockIndex + 1 < m_blocks.count() ? m_forkThresold - m_blocks.at(blockIndex + 1)->size() : 0; - - bool maxPrev = false; - int maxRoom = 0, minRoom = 0; - Block *moreRoom = 0, *lessRoom = 0; - - if ( roomPrev > roomNext ) - { - maxPrev = true; - maxRoom = roomPrev; - moreRoom = m_blocks.at(blockIndex - 1); - - minRoom = roomNext; - - if ( roomNext ) - lessRoom = m_blocks.at(blockIndex + 1); - } else { - maxRoom = roomNext; - - if ( roomNext ) - moreRoom = m_blocks.at(blockIndex + 1); - - minRoom = roomPrev; - - if ( roomPrev ) - lessRoom = m_blocks.at(blockIndex - 1); - } - - if ( maxRoom > n ) - { - // put everything in one - moreRoom->lines << b->lines; - moreRoom->end += b->size(); - - m_blocks.remove(blockIndex); - delete b; - } else if ( (maxRoom + minRoom) > n ) { - // try to alloc evenly - int part = b->size() * maxRoom / (maxRoom + minRoom); - - if ( maxPrev ) - { - moreRoom->append(b->lines.constData(), part); - lessRoom->prepend(b->lines.constData() + part, b->size() - part); - } else { - moreRoom->prepend(b->lines.constData(), part); - lessRoom->append(b->lines.constData() + part, b->size() - part); - } - - moreRoom->end += part; - lessRoom->end += b->size() - part; - - m_blocks.remove(blockIndex); - delete b; - } else { - // cannot merge simply... let's forget about it for now as it is not vital - ++blockIndex; - } - } else { - ++blockIndex; - } - - // update block boundaries - while ( blockIndex < m_blocks.count() ) - { - b = m_blocks.at(blockIndex); - --b->start; - --b->end; - } -} - -void QDocumentBuffer::insertLines(int after, const QVector<QDocumentLineHandle*>& l) -{ - int index = after + 1; - int blockIndex = blockForLine(index); - - if ( blockIndex == -1 ) - { - qWarning("cannot insert line at pos %i", index); - return; - } - - int n = l.count(); - Block *b = m_blocks.at(blockIndex); - - if ( (b->size() + 1) >= m_forkThresold ) - { - // split block - int bounds = b->start + m_optimalSize; - - Block *nb = new Block(bounds); - nb->insert(bounds, b->lines.constData() + m_optimalSize, b->size() - m_optimalSize); - nb->append(l.constData(), n); - nb->end = bounds + nb->size(); - m_blocks.insert(blockIndex + 1, nb); - - b->lines.resize(m_optimalSize); - b->end = bounds; - - blockIndex += 2; - } else { - b->insert(index, l.constData(), n); - } - - // update block boundaries - while ( blockIndex < m_blocks.count() ) - { - b = m_blocks.at(blockIndex); - b->start += n; - b->end += n; - } -} - -void QDocumentBuffer::removeLines(int after, int n) -{ - int index = after + 1; - int blockIndex = blockForLine(index); - - if ( blockIndex == -1 ) - { - qWarning("cannot remove line at pos %i", index); - return; - } - - // update block boundaries - int count = n; - Block *b = m_blocks.at(blockIndex); - - while ( count > 0 ) - { - int room = b->end - index; - int toRem = qMin(room, count); - - b->remove(index, toRem); - b->end -= toRem; - count -= toRem; - - if ( !b->size() ) - { - m_blocks.remove(blockIndex); - delete b; - } else { - ++blockIndex; - } - - if ( blockIndex >= m_blocks.count() ) - break; - - b = m_blocks.at(blockIndex); - b->start -= toRem; - } - - if ( index ) - { - qWarning("Troubles in line removal"); - } - - if ( b->size() < m_mergeThresold ) - { - // "merge" block with its neighbors - - int sz = b->size(); - sz += qMin(1, sz / m_safetyRoom); - - int roomPrev = blockIndex ? m_forkThresold - m_blocks.at(blockIndex - 1)->size() : 0; - int roomNext = blockIndex + 1 < m_blocks.count() ? m_forkThresold - m_blocks.at(blockIndex + 1)->size() : 0; - - bool maxPrev = false; - int maxRoom = 0, minRoom = 0; - Block *moreRoom = 0, *lessRoom = 0; - - if ( roomPrev > roomNext ) - { - maxPrev = true; - maxRoom = roomPrev; - moreRoom = m_blocks.at(blockIndex - 1); - - minRoom = roomNext; - - if ( roomNext ) - lessRoom = m_blocks.at(blockIndex + 1); - } else { - maxRoom = roomNext; - - if ( roomNext ) - moreRoom = m_blocks.at(blockIndex + 1); - - minRoom = roomPrev; - - if ( roomPrev ) - lessRoom = m_blocks.at(blockIndex - 1); - } - - if ( maxRoom > sz ) - { - // put everything in one - moreRoom->lines << b->lines; - moreRoom->end += b->size(); - - m_blocks.remove(blockIndex); - delete b; - } else if ( (maxRoom + minRoom) > sz ) { - // try to alloc evenly - int part = b->size() * maxRoom / (maxRoom + minRoom); - - moreRoom->append(b->lines.constData(), part); - moreRoom->end += part; - lessRoom->end += b->size() - part; - lessRoom->append(b->lines.constData() + part, b->size() - part); - - m_blocks.remove(blockIndex); - delete b; - } else { - // cannot merge simply... let's forget about it for now as it is not vital - ++blockIndex; - } - } else { - ++blockIndex; - } - - // update block boundaries - while ( blockIndex < m_blocks.count() ) - { - b = m_blocks.at(blockIndex); - b->start -= n; - b->end -= n; - } -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentbuffer.h +++ /dev/null @@ -1,149 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QDOCUMENT_BUFFER_H_ -#define _QDOCUMENT_BUFFER_H_ - -#include "qce-config.h" - -#include <QVector> - -#include "qdocumentline_p.h" - -class QDocumentLineHandle; - -class QCE_EXPORT QDocumentBuffer -{ - friend class QDocumentLineHandle; - - public: - class iterator - { - public: - iterator(const iterator& i); - - bool atEnd() const; - - int lineNumber() const; - QDocumentLineHandle* lineHandle() const; - - void move(int numLines); - - protected: - iterator(QDocumentBuffer *buffer, int block, int line); - - private: - int m_block; - int m_line; - QDocumentBuffer *m_buffer; - }; - - QDocumentBuffer(); - ~QDocumentBuffer(); - - QDocumentLineHandle* at(int index) const; - - void appendLine(QDocumentLineHandle *l); - - void insertLine(int index, QDocumentLineHandle *l); - void removeLine(int index); - - void insertLines(int after, const QVector<QDocumentLineHandle*>& l); - void removeLines(int after, int n); - - private: - static void cleanHelper(QVector<QDocumentLineHandle*>& l) - { - foreach ( QDocumentLineHandle *h, l ) - h->deref(); - } - - struct Block - { - inline Block() : start(-1), end(-1) {} - inline Block(int line) : start(line), end(line) {} - ~Block() { cleanHelper(lines); } - - inline void move(int numLines) { start += numLines; end += numLines; } - - inline int size() const { return lines.count(); } - inline QDocumentLineHandle* at(int index) const { return lines.at(index - start); } - - inline void append(QDocumentLineHandle *h) { lines.append(h); } - inline void prepend(QDocumentLineHandle *h) { lines.prepend(h); } - inline void insert(int index, QDocumentLineHandle *h) { lines.insert(index - start, h); } - inline void insert(int index, const QDocumentLineHandle* const* l, int n) - { - QDocumentLineHandle **d = const_cast<QDocumentLineHandle**>(l); - - int i = index - start; - lines.insert(i, n, 0); - - while ( n ) - { - lines[i++] = *d; - ++d; - --n; - } - } - - inline void append(const QDocumentLineHandle* const* l, int n) - { - QDocumentLineHandle **d = const_cast<QDocumentLineHandle**>(l); - - int i = lines.count(); - lines.insert(i, n, 0); - - while ( n ) - { - lines[i++] = *d; - ++d; - --n; - } - } - - inline void prepend(const QDocumentLineHandle* const* l, int n) - { - QDocumentLineHandle **d = const_cast<QDocumentLineHandle**>(l); - - int i = 0; - lines.insert(i, n, 0); - - while ( n ) - { - lines[i++] = *d; - ++d; - --n; - } - } - - inline void remove(int index) { lines.remove(index - start); } - inline void remove(int index, int count) { lines.remove(index - start, qMin(count, end - index)); } - - int start, end; - QVector<QDocumentLineHandle*> lines; - }; - - int blockForLine(int index) const; - - int m_safetyRoom; - int m_optimalSize; - int m_forkThresold; - int m_mergeThresold; - - QVector<Block*> m_blocks; -}; - -#endif // !_QDOCUMENT_BUFFER_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentcommand.cpp +++ /dev/null @@ -1,946 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qdocumentcommand.h" - -/*! - \file qdocumentcommand.cpp - \brief Implementation of the QDocumentCommand class and its basic heirs. -*/ - -#include "qdocument_p.h" - -/*! - \ingroup document - @{ -*/ - -/*! - \class QDocumentCommand - \brief The base class for document editing command -*/ - -QList<QDocumentCursorHandle*> QDocumentCommand::m_autoUpdated; - -/*! - \brief ctor -*/ -QDocumentCommand::QDocumentCommand(Command c, QDocument *d, QDocumentCommand *p) - : QUndoCommand(p), - m_state(false), m_first(true), m_doc(d), - m_redoOffset(0), m_undoOffset(0), - m_silent(false), m_keepAnchor(false), m_command(c), m_cursor(0) -{ - -} - -/*! - \brief dtor -*/ -QDocumentCommand::~QDocumentCommand() -{ - if ( m_cursor ) - { - // release the handle - m_cursor->deref(); - } -} - -/*! - \return command identifier -*/ -int QDocumentCommand::id() const -{ - return m_command; -} - -/*! - \brief Attempts to merge with another command - - Command merging is not implemented. -*/ -bool QDocumentCommand::mergeWith(const QUndoCommand *) -{ - return false; -} - -/*! - \brief Redo the command -*/ -void QDocumentCommand::redo() -{ - QUndoCommand::redo(); -} - -/*! - \brief Undo the command -*/ -void QDocumentCommand::undo() -{ - QUndoCommand::undo(); -} - -/*! - \return whether the command is silent - - Silent command do not update the editing cursor of the host document. -*/ -bool QDocumentCommand::isSilent() const -{ - return m_silent; -} - -/*! - \brief Set whether the command is silent -*/ -void QDocumentCommand::setSilent(bool y) -{ - m_silent = y; -} - -/*! - \return whether the command preserve selection of the target cursor - - When this property is true, cursor adjustement upon command execution - will preserve the anchor of target cursor and only alter its position - thus keeping a selection. - - \note This is disabled by default -*/ -bool QDocumentCommand::keepAnchor() const -{ - return m_keepAnchor; -} - -/*! - \brief Set whether the command preserve selection of the target cursor - - \note This is disabled by default -*/ -void QDocumentCommand::setKeepAnchor(bool y) -{ - m_keepAnchor = y; -} - -/*! - \brief Set the target cursor - - The position of the target cursor is update upon undo() and redo() -*/ -void QDocumentCommand::setTargetCursor(QDocumentCursorHandle *h) -{ - if ( m_cursor ) - { - // release the handle - m_cursor->deref(); - } - - m_cursor = h; - - if ( m_cursor ) - { - // make sure the handle does not get deleted while the command knows it - m_cursor->ref(); - } -} - -/*! - \brief ? -*/ -void QDocumentCommand::setRedoOffset(int off) -{ - m_redoOffset = off; -} - -/*! - \brief ? -*/ -void QDocumentCommand::setUndoOffset(int off) -{ - m_undoOffset = off; -} - -/*! - \brief Insert some text - \param line target line - \param pos target text position within line - \param s text to insert - - This helper method is provided so that subclasses may actually - modify the document contents without using private API. -*/ -void QDocumentCommand::insertText(int line, int pos, const QString& s) -{ - if ( !m_doc ) - return; - - QDocumentPrivate *pd = m_doc->impl(); - QDocumentLineHandle *h = pd->m_lines.at(line); - - if ( !h ) - return; - - h->textBuffer().insert(pos, s); - h->shiftOverlays(pos, s.length()); - - pd->adjustWidth(line); -} - -/*! - \brief Remove some text - \param line target line - \param pos target text position within line - \param length length of the text to remove - - This helper method is provided so that subclasses may actually - modify the document contents without using private API. -*/ -void QDocumentCommand::removeText(int line, int pos, int length) -{ - if ( !m_doc ) - return; - - QDocumentPrivate *pd = m_doc->impl(); - QDocumentLineHandle *h = pd->m_lines.at(line); - - if ( !h || !length ) - return; - - h->textBuffer().remove(pos, length); - h->shiftOverlays(pos, -length); - - pd->adjustWidth(line); -} - -/*! - \brief Insert some lines in the host document - \param after where to insert lines (line number) - \param l list of lines to insert - - This helper method is provided so that subclasses may actually - modify the document contents without using too much private API - (QDocumentLineHandle is part of the private API...) -*/ -void QDocumentCommand::insertLines(int after, const QList<QDocumentLineHandle*>& l) -{ - if ( l.isEmpty() || !m_doc->impl()->at(after) ) - return; - - m_doc->impl()->insertLines(after, l); -} - -void QDocumentCommand::updateCursorsOnInsertion(int line, int column, int prefixLength, int numLines, int suffixLength) -{ - //qDebug("inserting %i lines at (%i, %i) with (%i : %i) bounds", numLines, line, column, prefixLength, suffixLength); - - foreach ( QDocumentCursorHandle *ch, m_autoUpdated ) - { - if ( ch == m_cursor || ch->document() != m_doc ) - continue; - - //printf("[[watch:0x%x(%i, %i)]]", ch, ch->m_begLine, ch->m_begOffset); - - // TODO : better selection handling - if ( ch->hasSelection() ) - { - int lbeg = line, cbeg = column, lend = line, cend = column; - - ch->intersectBoundaries(lbeg, cbeg, lend, cend); - - if ( lbeg == line && cbeg == column ) - { - //qDebug("expand (%i, %i : %i, %i)", ch->m_begLine, ch->m_begOffset, ch->m_endLine, ch->m_endOffset); - if ( (ch->m_begLine > ch->m_endLine) || (ch->m_begLine == ch->m_endLine && ch->m_begOffset > ch->m_endOffset) ) - { - if ( numLines ) - { - if ( ch->m_begLine == line ) - ch->m_begOffset -= column; - ch->m_begLine += numLines; - ch->m_begOffset += suffixLength; - } else if ( ch->m_begLine == line ) { - ch->m_begOffset += prefixLength; - } - } else { - if ( numLines ) - { - if ( ch->m_endLine == line ) - ch->m_endOffset -= column; - ch->m_endLine += numLines; - ch->m_endOffset += suffixLength; - } else if ( ch->m_endLine == line ) { - ch->m_endOffset += prefixLength; - } - } - //qDebug("into (%i, %i : %i, %i)", ch->m_begLine, ch->m_begOffset, ch->m_endLine, ch->m_endOffset); - continue; - } - } - - // move - if ( ch->m_begLine > line ) - { - ch->m_begLine += numLines; - } else if ( ch->m_begLine == line && ch->m_begOffset >= column ) { - if ( numLines ) - { - ch->m_begLine += numLines; - ch->m_begOffset -= column; - ch->m_begOffset += suffixLength; - } else { - ch->m_begOffset += prefixLength; - } - } - - if ( ch->m_endLine > line ) - { - ch->m_endLine += numLines; - } else if ( ch->m_endLine == line && ch->m_endOffset >= column ) { - if ( numLines ) - { - ch->m_endLine += numLines; - ch->m_endOffset -= column; - ch->m_endOffset += suffixLength; - } else { - ch->m_endOffset += prefixLength; - } - } - } -} - -void QDocumentCommand::updateCursorsOnDeletion(int line, int column, int prefixLength, int numLines, int suffixLength) -{ - //qDebug("removing %i lines at (%i, %i) with (%i : %i) bounds", numLines, line, column, prefixLength, suffixLength); - - foreach ( QDocumentCursorHandle *ch, m_autoUpdated ) - { - if ( ch == m_cursor || ch->document() != m_doc ) - continue; - - //printf("[[watch:0x%x(%i, %i)]]", ch, ch->m_begLine, ch->m_begOffset); - - // TODO : better selection handling - if ( ch->hasSelection() ) - { - int lbeg = line, cbeg = column, lend = line + numLines, cend = numLines ? suffixLength : column + prefixLength; - - ch->intersectBoundaries(lbeg, cbeg, lend, cend); - //qDebug("intersection (%i, %i : %i, %i)", lbeg, cbeg, lend, cend); - - if ( lbeg != -1 && cbeg != -1 && lend != -1 && cend != -1 ) - { - //qDebug("shrink (%i, %i : %i, %i)", ch->m_begLine, ch->m_begOffset, ch->m_endLine, ch->m_endOffset); - //qDebug("of intersection (%i, %i : %i, %i)", lbeg, cbeg, lend, cend); - ch->substractBoundaries(lbeg, cbeg, lend, cend); - //qDebug("into (%i, %i : %i, %i)", ch->m_begLine, ch->m_begOffset, ch->m_endLine, ch->m_endOffset); - continue; - } - } - - // move - if ( ch->m_begLine > line + numLines ) - { - ch->m_begLine -= numLines; - } else if ( ch->m_begLine == line + numLines && ch->m_begOffset >= suffixLength ) { - if ( numLines ) - { - ch->m_begLine -= numLines; - ch->m_begOffset -= suffixLength; - ch->m_begOffset += column; - } else { - ch->m_begOffset -= prefixLength; - } - } else if ( ch->m_begLine > line || (ch->m_begLine == line && ch->m_begOffset > column) ) { - // cursor will become invalid in an unrecoverable way... - - } - - if ( ch->m_endLine > line + numLines ) - { - ch->m_endLine -= numLines; - } else if ( ch->m_endLine == line + numLines && ch->m_endOffset >= suffixLength ) { - if ( numLines ) - { - ch->m_endLine -= numLines; - ch->m_endOffset -= suffixLength; - ch->m_endOffset += column; - } else { - ch->m_endOffset -= prefixLength; - } - } else if ( ch->m_endLine > line || (ch->m_endLine == line && ch->m_endOffset > column) ) { - // cursor will become invalid in an unrecoverable way... - // except that it should have intersected in the first place... - } - } -} - -/*! - \brief Remove some lines from the host document - \param after where to remove lines (line number) - \param n number of lines to remove - - This helper method is provided so that subclasses may actually - modify the document contents without using the private API. -*/ -void QDocumentCommand::removeLines(int after, int n) -{ - if ( n <= 0 || !m_doc->impl()->at(after) || !m_doc->impl()->at(after + n) ) - return; - - m_doc->impl()->removeLines(after, n); -} - -/*! - \brief Update the target cursor - \param l target line - \param offset target text position within target line -*/ -void QDocumentCommand::updateTarget(int l, int offset) -{ - //QDocumentLineHandle *h = m_doc->impl()->at(l); - - // update command sender if any - if ( m_cursor ) - { -// qDebug("moving cursor [0x%x:beg] from (%i, %i) to line (%i, %i) as updating", -// m_cursor, -// m_cursor->m_begLine, -// m_cursor->m_begOffset, -// l, -// offset -// ); -// - while ( l && (offset < 0) ) - { - --l; - offset += m_doc->line(l).length() + 1; - } - - while ( (l + 1) < m_doc->lines() && m_doc->line(l).length() < offset ) - { - offset -= m_doc->line(l).length() + 1; - ++l; - } - - if ( !m_keepAnchor ) - { - m_cursor->m_endLine = -1; - m_cursor->m_endOffset = -1; - } else if ( m_cursor->m_endLine == -1 ) { - m_cursor->m_endLine = m_cursor->m_begLine; - m_cursor->m_endOffset = m_cursor->m_begOffset; - } - - m_cursor->m_begLine = qMax(0, l); - m_cursor->m_begOffset = qMax(0, offset); - - m_cursor->refreshColumnMemory(); - } -} - -/*! - \return whether a given cursor is auto updated -*/ -bool QDocumentCommand::isAutoUpdated(const QDocumentCursorHandle *h) -{ - return m_autoUpdated.contains(const_cast<QDocumentCursorHandle*>(h)); -} - -/*! - \brief Enable auto update for a given cursor -*/ -void QDocumentCommand::enableAutoUpdate(QDocumentCursorHandle *h) -{ - //qDebug("up(0x%x)", h); - - if ( !m_autoUpdated.contains(h) ) - m_autoUpdated << h; -} - -/*! - \brief Disable auto update for a given cursor -*/ -void QDocumentCommand::disableAutoUpdate(QDocumentCursorHandle *h) -{ - //qDebug("no-up(0x%x)", h); - m_autoUpdated.removeAll(h); -} - -void QDocumentCommand::discardHandlesFromDocument(QDocument *d) -{ - int idx = 0; - - while ( idx < m_autoUpdated.count() ) - { - if ( m_autoUpdated.at(idx)->document() == d ) - m_autoUpdated.removeAt(idx); - else - ++idx; - } -} - -/*! - \brief Change the modification status of a line -*/ -void QDocumentCommand::markRedone(QDocumentLineHandle *h, bool firstTime) -{ - QHash<QDocumentLineHandle*, QPair<int, int> >::iterator it = m_doc->impl()->m_status.find(h); - - if ( it != m_doc->impl()->m_status.end() ) - { - if ( firstTime && it->first < it->second ) - it->second = -1; - - ++it->first; - } else { - m_doc->impl()->m_status[h] = qMakePair(1, 0); - } -} - -/*! - \brief Change the modifiaction status of a line -*/ -void QDocumentCommand::markUndone(QDocumentLineHandle *h) -{ - QHash<QDocumentLineHandle*, QPair<int, int> >::iterator it = m_doc->impl()->m_status.find(h); - - if ( it != m_doc->impl()->m_status.end() ) - { - --it->first; - } else { - qDebug("warning: status data and/or undo stack corrupted..."); - m_doc->impl()->m_status[h] = qMakePair(-1, 0); - } -} - -//////////////////////////// - -/*! - \class QDocumentInsertCommand - \brief A specialized command to insert text -*/ - -/*! - \brief ctor - \param l target line - \param offset target text position within target line - \param text text to insert (can contain line feeds, "\n", which will result in the creation of new lines) - \param doc host document - \param p parent command -*/ -QDocumentInsertCommand::QDocumentInsertCommand( int l, int offset, - const QString& text, - QDocument *doc, - QDocumentCommand *p) - : QDocumentCommand(Insert, doc, p) -{ - QStringList lines = text.split(QLatin1Char('\n'), QString::KeepEmptyParts); - - if ( !m_doc || text.isEmpty() ) - qFatal("Invalid insert command"); - - m_data.lineNumber = l; - m_data.startOffset = offset; - - m_data.begin = lines.takeAt(0); - m_data.endOffset = lines.count() ? lines.last().length() : -1; - - foreach ( const QString& s, lines ) - m_data.handles << new QDocumentLineHandle(s, m_doc); - - QDocumentLine bl = m_doc->line(l); - - if ( m_data.handles.count() && (bl.length() > offset) ) - { - m_data.end = bl.text().mid(offset); - m_data.handles.last()->textBuffer().append(m_data.end); - } - - /* - if ( (text == "\n") && m_data.handles.isEmpty() ) - qWarning("Go fix it by hand..."); - */ -} - -/*! - \brief dtor -*/ -QDocumentInsertCommand::~QDocumentInsertCommand() -{ - if ( m_state ) - return; - - //foreach ( QDocumentLineHandle *h, m_data.handles ) - // h->deref(); - -} - -bool QDocumentInsertCommand::mergeWith(const QUndoCommand *) -{ - return false; -} - -void QDocumentInsertCommand::redo() -{ - // state : handles used by doc - m_state = true; - - //QDocumentIterator it = m_doc->impl()->index(m_data.lineNumber); - - //qDebug("inserting %i lines after %i", m_data.handles.count(), m_data.lineNumber); - - QDocumentLineHandle *hl = m_doc->impl()->at(m_data.lineNumber); - - if ( m_data.handles.count() ) - { - removeText(m_data.lineNumber, m_data.startOffset, m_data.end.count()); - } - - insertText(m_data.lineNumber, m_data.startOffset, m_data.begin); - - insertLines(m_data.lineNumber, m_data.handles); - - if ( m_data.handles.count() ) - { - QDocumentLineHandle *h = m_data.handles.last(); - - //updateTarget(h, h->text().length() - m_data.end.length()); - updateTarget(m_data.lineNumber + m_data.handles.count(), h->text().length() - m_data.end.length() + m_redoOffset); - } else { - updateTarget(m_data.lineNumber, m_data.startOffset + m_data.begin.length() + m_redoOffset); - } - - updateCursorsOnInsertion(m_data.lineNumber, m_data.startOffset, m_data.begin.length(), m_data.handles.count(), m_data.endOffset); - - m_doc->impl()->emitContentsChange(m_data.lineNumber, m_data.handles.count() + 1); - - markRedone(hl, m_first); - - foreach ( QDocumentLineHandle *h, m_data.handles ) - markRedone(h, m_first); - - //m_doc->impl()->emitContentsChanged(); - m_first = false; -} - -void QDocumentInsertCommand::undo() -{ - // state : handles !used by doc - m_state = false; - - //QDocumentIterator it = m_doc->impl()->index(m_data.line); - - QDocumentLineHandle *hl = m_doc->impl()->at(m_data.lineNumber); - - removeLines(m_data.lineNumber, m_data.handles.count()); - removeText(m_data.lineNumber, m_data.startOffset, m_data.begin.count()); - - if ( m_data.handles.count() ) - { - insertText(m_data.lineNumber, m_data.startOffset, m_data.end); - } - - updateTarget(m_data.lineNumber, m_data.startOffset + m_undoOffset); - - updateCursorsOnDeletion(m_data.lineNumber, m_data.startOffset, m_data.begin.length(), m_data.handles.count(), m_data.endOffset); - - m_doc->impl()->emitContentsChange(m_data.lineNumber, m_data.handles.count() + 1); - - markUndone(hl); - - foreach ( QDocumentLineHandle *h, m_data.handles ) - markUndone(h); - - //m_doc->impl()->emitContentsChanged(); -} - -/////////////////////////// - -/*! - \class QDocumentEraseCommand - \brief A specialized command to erase text -*/ - -/*! - \brief ctor - \param bl begin line of the target area - \param bo begin text position of the target area - \param el end line of the target area - \param eo end text position of the target area - \param doc host document - \param p parent command -*/ -QDocumentEraseCommand::QDocumentEraseCommand( int bl, int bo, - int el, int eo, - QDocument *doc, - QDocumentCommand *p) - : QDocumentCommand(Erase, doc, p) -{ - QDocumentLineHandle *start = m_doc->impl()->at(bl), - *end = m_doc->impl()->at(el); - - QDocumentConstIterator it = m_doc->impl()->begin() + bl; //index(start); - - m_data.lineNumber = bl; - m_data.startOffset = bo; - - if ( start == end ) - { - m_data.begin = start->text().mid(bo, eo - bo); - - m_data.end = QString(); - m_data.endOffset = -1; - - } else { - m_data.begin = start->text().mid(bo); - - m_data.endOffset = eo; - m_data.end = end->text().mid(eo); - - do - { - m_data.handles << *(++it); - } while ( *it != end ); - } - - m_state = true; -} - -/*! - \brief dtor -*/ -QDocumentEraseCommand::~QDocumentEraseCommand() -{ - if ( m_state ) - return; - - //qDeleteAll(m_data.handles); -} - -bool QDocumentEraseCommand::mergeWith(const QUndoCommand *) -{ - return false; -} - -void QDocumentEraseCommand::redo() -{ - // state : handles !used by doc - m_state = false; - - //QDocumentIterator it = m_doc->impl()->index(m_data.line); - - QDocumentLineHandle *hl = m_doc->impl()->at(m_data.lineNumber); - - if ( m_data.handles.isEmpty() ) - { - removeText(m_data.lineNumber, m_data.startOffset, m_data.begin.count()); - - m_doc->impl()->emitContentsChange(m_data.lineNumber, 1); - - } else { - removeText(m_data.lineNumber, m_data.startOffset, m_data.begin.count()); - - if ( m_data.endOffset != -1 ) - insertText(m_data.lineNumber, m_data.startOffset, m_data.end); - - removeLines(m_data.lineNumber, m_data.handles.count()); - - m_doc->impl()->emitContentsChange(m_data.lineNumber, m_data.handles.count() + 1); - } - - updateTarget(m_data.lineNumber, m_data.startOffset + m_redoOffset); - - updateCursorsOnDeletion(m_data.lineNumber, m_data.startOffset, m_data.begin.length(), m_data.handles.count(), m_data.endOffset); - - markRedone(hl, m_first); - - foreach ( QDocumentLineHandle *h, m_data.handles ) - markRedone(h, m_first); - - //m_doc->impl()->emitContentsChanged(); - m_first = false; -} - -void QDocumentEraseCommand::undo() -{ - // state : handles used by doc - m_state = true; - - //QDocumentIterator it = m_doc->impl()->index(m_data.line); - - QDocumentLineHandle *hl = m_doc->impl()->at(m_data.lineNumber); - - if ( m_data.handles.count() ) - { - insertLines(m_data.lineNumber, m_data.handles); - - if ( m_data.endOffset != -1 ) - removeText(m_data.lineNumber, m_data.startOffset, m_data.end.count()); - - insertText(m_data.lineNumber, m_data.startOffset, m_data.begin); - - m_doc->impl()->emitContentsChange(m_data.lineNumber, m_data.handles.count() + 1); - } else { - - insertText(m_data.lineNumber, m_data.startOffset, m_data.begin); - - m_doc->impl()->emitContentsChange(m_data.lineNumber, 1); - } - - if ( m_data.handles.count() ) - { - QDocumentLineHandle *h = m_data.handles.last(); - - //updateTarget(h, h->text().length() - m_data.end.length()); - updateTarget(m_data.lineNumber + m_data.handles.count(), h->text().length() - m_data.end.length() + m_undoOffset); - } else { - updateTarget(m_data.lineNumber, m_data.startOffset + m_data.begin.length() + m_undoOffset); - } - - updateCursorsOnInsertion(m_data.lineNumber, m_data.startOffset, m_data.begin.length(), m_data.handles.count(), m_data.endOffset); - - markUndone(hl); - - foreach ( QDocumentLineHandle *h, m_data.handles ) - markUndone(h); - - //m_doc->impl()->emitContentsChanged(); -} - -/////////////////////////// -/* -QDocumentReplaceCommand::QDocumentReplaceCommand(const QDocumentLine& l, int, int, const QString&) - : QDocumentCommand(Replace, l.document()) -{ - -} - -QDocumentReplaceCommand::~QDocumentReplaceCommand() -{ - -} - -bool QDocumentReplaceCommand::mergeWith(const QUndoCommand *) -{ - return false; -} - -void QDocumentReplaceCommand::redo() -{ - -} - -void QDocumentReplaceCommand::undo() -{ - -} -*/ - -////////////////////// - - -/*! - \class QDocumentCommandBlock - \brief A meta command used for command grouping -*/ - -/*! - \brief ctor - \param d host document -*/ -QDocumentCommandBlock::QDocumentCommandBlock(QDocument *d) - : QDocumentCommand(Custom, d), m_weakLocked(false) -{ - -} - -/*! - \brief dtor -*/ -QDocumentCommandBlock::~QDocumentCommandBlock() -{ - -} - -void QDocumentCommandBlock::redo() -{ - if ( isWeakLocked() ) - { - setWeakLock(false); - return; - } - - //foreach ( QDocumentCommand *c, m_commands ) - // c->redo(); - - for ( int i = 0; i < m_commands.count(); ++i ) - m_commands.at(i)->redo(); - -} - -void QDocumentCommandBlock::undo() -{ - //foreach ( QDocumentCommand *c, m_commands ) - // c->undo(); - - for ( int i = m_commands.count() - 1; i >= 0; --i ) - m_commands.at(i)->undo(); - -} - -/*! - \brief Set whether the block is weakly locked -*/ -void QDocumentCommandBlock::setWeakLock(bool l) -{ - m_weakLocked = l; -} - -/*! - \return whether the block is weakly locked - - Weak locking of command block is an obscure internal feature - which prevents the first redo() call from actually redo'ing - the grouped commands -*/ -bool QDocumentCommandBlock::isWeakLocked() const -{ - return m_weakLocked; -} - -/*! - \brief Add a command to the group - - \warning Doing that after having pushed the command on the undo/redo stack - is likely to result in corruption of the undo/redo stack -*/ -void QDocumentCommandBlock::addCommand(QDocumentCommand *c) -{ - m_commands << c; -} - -/*! - \brief Remove a command from the block - - \warning Doing that after having pushed the command on the undo/redo stack - is likely to result in corruption of the undo/redo stack -*/ -void QDocumentCommandBlock::removeCommand(QDocumentCommand *c) -{ - m_commands.removeAll(c); -} - -/*! @} */ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentcommand.h +++ /dev/null @@ -1,167 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QDOCUMENT_COMMAND_H_ -#define _QDOCUMENT_COMMAND_H_ - -#include "qce-config.h" - -/*! - \file qdocumentcommand.h - \brief Definition of the QDocumentCommand class -*/ - -#include <QUndoCommand> - -#include "qdocument.h" - -class QDocumentLine; -class QDocumentLineHandle; -class QDocumentCursorHandle; - -class QCE_EXPORT QDocumentCommand : public QUndoCommand -{ - public: - enum Command - { - None, - Insert, - Erase, - Replace, - Custom - }; - - struct TextCommandData - { - QString begin, end; - int lineNumber, startOffset, endOffset; - QList<QDocumentLineHandle*> handles; - }; - - QDocumentCommand(Command c, QDocument *d, QDocumentCommand *p = 0); - virtual ~QDocumentCommand(); - - virtual int id() const; - - virtual bool mergeWith(const QUndoCommand *command); - - virtual void redo(); - virtual void undo(); - - bool isSilent() const; - void setSilent(bool y); - - bool keepAnchor() const; - void setKeepAnchor(bool y); - - void setTargetCursor(QDocumentCursorHandle *h); - - void setRedoOffset(int off); - void setUndoOffset(int off); - - static bool isAutoUpdated(const QDocumentCursorHandle *h); - static void enableAutoUpdate(QDocumentCursorHandle *h); - static void disableAutoUpdate(QDocumentCursorHandle *h); - static void discardHandlesFromDocument(QDocument *d); - - protected: - bool m_state, m_first; - QDocument *m_doc; - int m_redoOffset, m_undoOffset; - - void markRedone(QDocumentLineHandle *h, bool firstTime); - void markUndone(QDocumentLineHandle *h); - - void updateTarget(int l, int offset); - - void insertText(int line, int pos, const QString& s); - void removeText(int line, int pos, int length); - - void insertLines(int after, const QList<QDocumentLineHandle*>& l); - void removeLines(int after, int n); - - void updateCursorsOnInsertion(int line, int column, int prefixLength, int numLines, int suffixLength); - void updateCursorsOnDeletion(int line, int column, int prefixLength, int numLines, int suffixLength); - - private: - bool m_silent; - bool m_keepAnchor; - Command m_command; - QDocumentCursorHandle *m_cursor; - - static QList<QDocumentCursorHandle*> m_autoUpdated; -}; - -Q_DECLARE_TYPEINFO(QDocumentCommand::TextCommandData, Q_MOVABLE_TYPE); - -class QCE_EXPORT QDocumentInsertCommand : public QDocumentCommand -{ - public: - QDocumentInsertCommand( int l, int offset, - const QString& text, - QDocument *doc, - QDocumentCommand *p = 0); - - virtual ~QDocumentInsertCommand(); - - virtual bool mergeWith(const QUndoCommand *command); - - virtual void redo(); - virtual void undo(); - - private: - TextCommandData m_data; -}; - -class QCE_EXPORT QDocumentEraseCommand : public QDocumentCommand -{ - public: - QDocumentEraseCommand( int bl, int bo, - int el, int eo, - QDocument *doc, - QDocumentCommand *p = 0); - - virtual ~QDocumentEraseCommand(); - - virtual bool mergeWith(const QUndoCommand *command); - - virtual void redo(); - virtual void undo(); - - private: - TextCommandData m_data; -}; - -class QCE_EXPORT QDocumentCommandBlock : public QDocumentCommand -{ - public: - QDocumentCommandBlock(QDocument *d); - virtual ~QDocumentCommandBlock(); - - virtual void redo(); - virtual void undo(); - - void setWeakLock(bool l); - bool isWeakLocked() const; - - virtual void addCommand(QDocumentCommand *c); - virtual void removeCommand(QDocumentCommand *c); - - private: - bool m_weakLocked; - QList<QDocumentCommand*> m_commands; -}; - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentcursor.cpp +++ /dev/null @@ -1,852 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -/*! - \file qdocumentcursor.cpp - \brief Implementation of the QDocumentCursor class -*/ - -#include "qdocumentcursor.h" - -/*! - \ingroup document - @{ -*/ - -#include "qdocument_p.h" - -#include "qdocumentline.h" - -/*! - \class QDocumentCursor - - \brief A cursor to navigate within documents and edit them - - QDocumentCursor is a central class of the public API. - - It is the best (as in fastest and easiest) way to iterate over - the content of a document. - - It is also the only class that allows to perform editing operations. - - A cursor position is defined by a line number and a text position - within the line. - - Every cursor can have one or two cursor positions. In the later - case, they delimit a selection. The first position set (before - selecting) is referred to as the "anchor" and the other (if it - is different from the anchor) is the actual cursor position. - - When the cursor does not have a selection, querying informations about - the anchor has the same result as querying informations about the cursor - position. - - Informations you can get about both the anchor and the posiotion : - <ul> - <li>the line number : the logical line to which the cursor position points inside the document - <li>the column number : the logical text column to which the cursor position points to, inside the pointed line. - <li>the wrapped line offset : when a cursor resides on a wrapped line, this indicates in which part of - the wrapped line it does - <li>the document position : document (x, y) coordinates corresponding to the place the cursor is drawn - </ul> - - The visual line to which a given cursor resides can be obtained as follows : - - \code - int visual_line = cursor.document()->visualLine(cursor.lineNumber()) + cursor.wrappedLineOffset(); - \endcode - - \note The line and column numbers passed to/returned by a cursor method - always start at zero. - - \note Quick overview of the various coordinate systems : - <ul> - <li>document coordinates aka viewport coordinates : (x, y) coords, in pixels, origin at the top left corner of - the rectangle occupied by the very first line of the document - <li>text coordinates : (line, column) in logical units (number of lines, number of characters) - <li>visual text coordinates : (line, column) in logical units but with a different mapping - </ul> -*/ - -QDocumentCursor::QDocumentCursor(QDocument *doc) - : m_handle(new QDocumentCursorHandle(doc)) -{ - m_handle->ref(); -} - -QDocumentCursor::QDocumentCursor(const QDocumentCursor& cursor) - : m_handle(0) -{ - if ( cursor.m_handle ) - { - m_handle = cursor.m_handle->clone(); - m_handle->ref(); - } -} - -QDocumentCursor::QDocumentCursor(QDocument *doc, int line, int column) - : m_handle(new QDocumentCursorHandle(doc, line)) -{ - m_handle->ref(); - - m_handle->setColumnNumber(column); -} - -/* -QDocumentCursor::QDocumentCursor(const QDocumentLine& line, int column) - : m_handle(new QDocumentCursorHandle(line.document(), line.lineNumber())) -{ - m_handle->ref(); - - m_handle->setColumnNumber(column); - //movePosition(qMin(column, line.length())); -} -*/ - -QDocumentCursor::QDocumentCursor(QDocumentCursorHandle *handle) - : m_handle(handle) -{ - if ( m_handle ) - m_handle->ref(); -} - -QDocumentCursor::~QDocumentCursor() -{ - if ( m_handle ) - m_handle->deref(); -} - -QDocumentCursor QDocumentCursor::clone() const -{ - return m_handle ? QDocumentCursor(m_handle->clone()) : QDocumentCursor(); -} - -QDocumentCursor& QDocumentCursor::operator = (const QDocumentCursor& c) -{ - #if 0 - if ( m_handle ) - m_handle->deref(); - - m_handle = c.m_handle ? c.m_handle->clone() : 0; - //m_handle = c.m_handle; - - if ( m_handle ) - m_handle->ref(); - #endif - - if ( c.m_handle ) - { - if ( m_handle ) - { - m_handle->copy(c.m_handle); - } else { - m_handle = c.m_handle->clone(); - m_handle->ref(); - } - } else if ( m_handle ) { - - //qWarning("Setting a cursor to null"); - - m_handle->deref(); - m_handle = 0; - } - - return *this; -} - -/*! - \brief comparision operator - - \note If any of the operand is an invalid cursor, false is returned -*/ -bool QDocumentCursor::operator == (const QDocumentCursor& c) const -{ - if ( !m_handle || !c.m_handle ) - return false; - - return m_handle->eq(c.m_handle); -} - -/*! - \brief comparision operator - - \note If any of the operand is an invalid cursor, true is returned (to preserve logical consistency with == ) -*/ -bool QDocumentCursor::operator != (const QDocumentCursor& c) const -{ - if ( !m_handle || !c.m_handle ) - return true; - - return !m_handle->eq(c.m_handle); -} - -/*! - \brief comparision operator - - \note If any of the operand is an invalid cursor, false is returned -*/ -bool QDocumentCursor::operator < (const QDocumentCursor& c) const -{ - if ( !m_handle || !c.m_handle ) - return false; - - return m_handle->lt(c.m_handle); -} - -/*! - \brief comparision operator - - \note If any of the operand is an invalid cursor, false is returned -*/ -bool QDocumentCursor::operator > (const QDocumentCursor& c) const -{ - if ( !m_handle || !c.m_handle ) - return false; - - return m_handle->gt(c.m_handle); -} - -/*! - \brief comparision operator - - \note If any of the operand is an invalid cursor, false is returned -*/ -bool QDocumentCursor::operator <= (const QDocumentCursor& c) const -{ - if ( !m_handle || !c.m_handle ) - return false; - - return m_handle->lt(c.m_handle) || m_handle->eq(c.m_handle); -} - -/*! - \brief comparision operator - - \note If any of the operand is an invalid cursor, false is returned -*/ -bool QDocumentCursor::operator >= (const QDocumentCursor& c) const -{ - if ( !m_handle || !c.m_handle ) - return false; - - return m_handle->gt(c.m_handle) || m_handle->eq(c.m_handle); -} - -/*! - \brief comparision operator -*/ -bool QDocumentCursor::isNull() const -{ - return !m_handle || !m_handle->document() || !line().isValid(); -} - -/*! - \brief comparision operator -*/ -bool QDocumentCursor::isValid() const -{ - return m_handle && m_handle->document() && line().isValid(); -} - -/*! - \return whether the cursor is at the end of the document -*/ -bool QDocumentCursor::atEnd() const -{ - return m_handle ? m_handle->atEnd() : false; -} - -/*! - \return whether the cursor is at the begining of the document -*/ -bool QDocumentCursor::atStart() const -{ - return m_handle ? m_handle->atStart() : false; -} - -/*! - \return whether the cursor is at the end of a block -*/ -bool QDocumentCursor::atBlockEnd() const -{ - return m_handle ? m_handle->atBlockEnd() : false; -} - -/*! - \return whether the cursor is at the start of a block -*/ -bool QDocumentCursor::atBlockStart() const -{ - return m_handle ? m_handle->atBlockStart() : false; -} - -/*! - \return whether the cursor is at the end of a line - - \note this may only differ from atBlockEnd() on wrapped lines -*/ -bool QDocumentCursor::atLineEnd() const -{ - return m_handle ? m_handle->atLineEnd() : false; -} - -/*! - \return whether the cursor is at the start of a line - - \note this may only differ from atBlockStart() on wrapped lines -*/ -bool QDocumentCursor::atLineStart() const -{ - return m_handle ? m_handle->atLineStart() : false; -} - -/*! - \return the document on which this cursor operates -*/ -QDocument* QDocumentCursor::document() const -{ - return m_handle ? m_handle->document() : 0; -} - -/*! - \return the text position (within the whole document) at which this cursor is - - \note available for compat with QTextCursor and ridiculously slow : avoid whenever possible -*/ -int QDocumentCursor::position() const -{ - return m_handle ? m_handle->position() : -1; -} - -/*! - \return the text column of the anchor -*/ -int QDocumentCursor::anchorColumnNumber() const -{ - return m_handle ? m_handle->anchorColumnNumber() : -1; -} - -/*! - \return the "visual" text column of the cursor - - \note this may only differ from columnNumber() when there are tabs on the line -*/ -int QDocumentCursor::visualColumnNumber() const -{ - return m_handle ? m_handle->visualColumnNumber() : -1; -} - -/*! - \return the text column of the cursor -*/ -int QDocumentCursor::columnNumber() const -{ - return m_handle ? m_handle->columnNumber() : -1; -} - -/*! - \brief Set the text column of the cursor - \param c text column to set - \param m move mode (determines whether text will be selected) -*/ -void QDocumentCursor::setColumnNumber(int c, MoveMode m) -{ - if ( m_handle ) - m_handle->setColumnNumber(c, m); -} - -/*! - \return The line number to which the cursor points -*/ -int QDocumentCursor::lineNumber() const -{ - return m_handle ? m_handle->lineNumber() : -1; -} - -/*! - \return The line number to which the cursor points -*/ -int QDocumentCursor::anchorLineNumber() const -{ - return m_handle ? m_handle->anchorLineNumber() : -1; -} - -/*! - \return The wrapped line on which the cursor resides - - Wrapped line are "sublines" of logical lines. -*/ -int QDocumentCursor::wrappedLineOffset() const -{ - return line().wrappedLineForCursor(columnNumber()); -} - -/*! - \return The line number on which the anchor resides -*/ -int QDocumentCursor::anchorWrappedLineOffset() const -{ - return anchorLine().wrappedLineForCursor(anchorColumnNumber()); -} - -/*! - \return the document position at which the cursor is - - Document position and viewport position are two terms used interchangeably. - The only difference is the former refers to model perception (QDocument) - whereas the later refers to view perception (QEditor) -*/ -QPoint QDocumentCursor::documentPosition() const -{ - return m_handle ? m_handle->documentPosition() : QPoint(); -} - -/*! - \return the document position of the anchor -*/ -QPoint QDocumentCursor::anchorDocumentPosition() const -{ - return m_handle ? m_handle->anchorDocumentPosition() : QPoint(); -} - -QPolygon QDocumentCursor::documentRegion() const -{ - return m_handle ? m_handle->documentRegion() : QPolygon(); -} - -/*! - \return The line object on which the cursor resides -*/ -QDocumentLine QDocumentCursor::line() const -{ - return m_handle ? m_handle->line() : QDocumentLine(); -} - -/*! - \return The line object on which the anchor resides -*/ -QDocumentLine QDocumentCursor::anchorLine() const -{ - return m_handle ? m_handle->anchorLine() : QDocumentLine(); -} - -/*! - \brief Shift cursor position (text column) by a number of columns (characters) -*/ -void QDocumentCursor::shift(int offset) -{ - if ( m_handle ) - m_handle->shift(offset); -} - -/*! - \brief Set the text position of the cursor (within the whole document) - - Remark made about position() applies. -*/ -void QDocumentCursor::setPosition(int pos, MoveMode m) -{ - if ( m_handle ) - m_handle->setPosition(pos, m); -} - -/*! - \brief Moves the cursor position - \param offset number of times the selected move will be done - \param op movement type - \param m movement mode (whether to select) - \return true on succes -*/ -bool QDocumentCursor::movePosition(int offset, MoveOperation op, MoveMode m) -{ - return m_handle ? m_handle->movePosition(offset, op, m) : false; -} - -/*! - \brief Jump to another cursor position - \param line target line number - \param colum target text column -*/ -void QDocumentCursor::moveTo(int line, int column) -{ - if ( m_handle ) - m_handle->moveTo(line, column); -} - -/*! - \brief Jump to the position of another cursor - \param c target cursor -*/ -void QDocumentCursor::moveTo(const QDocumentCursor &c) -{ - if ( m_handle ) - m_handle->moveTo(c); -} - -/*! - \brief Jump to another cursor position - \param l target line - \param column target text column - - \note Calls QDocumentLine::lineNumber() => SLOW : avoid whenever possible -*/ -void QDocumentCursor::moveTo(const QDocumentLine &l, int column) -{ - if ( m_handle ) - m_handle->moveTo(l.lineNumber(), column); -} - -/*! - \return the character at the position immediately after the cursor -*/ -QChar QDocumentCursor::nextChar() const -{ - return m_handle ? m_handle->nextChar() : QChar(); -} - -/*! - \return the character at the position immediately before the cursor -*/ -QChar QDocumentCursor::previousChar() const -{ - return m_handle ? m_handle->previousChar() : QChar(); -} - -/*! - \brief Delete the character at the position immediately after the cursor -*/ -void QDocumentCursor::deleteChar() -{ - if ( m_handle ) - m_handle->deleteChar(); -} - -/*! - \brief Delete the character at the position immediately before the cursor -*/ -void QDocumentCursor::deletePreviousChar() -{ - if ( m_handle ) - m_handle->deletePreviousChar(); -} - -/*! - \brief erase the whole line the cursor is on, newline included -*/ -void QDocumentCursor::eraseLine() -{ - if ( m_handle ) - m_handle->eraseLine(); -} - -/*! - \brief insert a new line at the cursor position -*/ -void QDocumentCursor::insertLine(bool keepAnchor) -{ - if ( m_handle ) - m_handle->insertText("\n", keepAnchor); -} - -/*! - \brief insert some text at the cursor position - - Selected text will be removed before insertion happens. - - \note Nothing happens if \a s is empty -*/ -void QDocumentCursor::insertText(const QString& s, bool keepAnchor) -{ - if ( m_handle ) - m_handle->insertText(s, keepAnchor); -} - -/*! - \return A cursor pointing at the position of the selection start. - - Selection start is the position of the selection that is nearest to document start. - - \note an invalid cursor is returned when the cursor does not have a selection -*/ -QDocumentCursor QDocumentCursor::selectionStart() const -{ - return m_handle ? m_handle->selectionStart() : QDocumentCursor(); -} - -/*! - \return A cursor pointing at the position of the selection end. - - Selection end is the position of the selection that is nearest to document end. - - \note an invalid cursor is returned when the cursor does not have a selection -*/ -QDocumentCursor QDocumentCursor::selectionEnd() const -{ - return m_handle ? m_handle->selectionEnd() : QDocumentCursor(); -} - -/*! - \return The selected text -*/ -QString QDocumentCursor::selectedText() const -{ - return m_handle ? m_handle->selectedText() : QString(); -} - -/*! - \brief Remove the selected text -*/ -void QDocumentCursor::removeSelectedText() -{ - if ( m_handle ) - m_handle->removeSelectedText(); -} - -/*! - \brief Replace the selected text - - This method differs from insertText() in two ways : - <ul> - <li>if \a text is empty the selection WILL be removed - <li>after the replacement happens this command will - cause the cursor to select the new text (note that this - information is NOT preserved by the undo/redo stack - however). - </ul> -*/ -void QDocumentCursor::replaceSelectedText(const QString& text) -{ - if ( m_handle ) - m_handle->replaceSelectedText(text); -} - -/*! - \brief Begin an edit block - - Edit blocks are command groups. All the commands in an edit block - are executed in a row when the edit block is ended with endEditBlock(). - - Edit blocks are considered as a single command as far as the undo/redo - stack is concerned. - - Edit blocks can be nested but that isn't of much use -*/ -void QDocumentCursor::beginEditBlock() -{ - if ( m_handle ) - m_handle->beginEditBlock(); -} - -/*! - \brief End an edit block -*/ -void QDocumentCursor::endEditBlock() -{ - if ( m_handle ) - m_handle->endEditBlock(); -} - -/*! - \return Whether the cursor is silent -*/ -bool QDocumentCursor::isSilent() const -{ - return m_handle ? m_handle->isSilent() : true; -} - -/*! - \brief Set whether the cursor is silent -*/ -void QDocumentCursor::setSilent(bool y) -{ - if ( m_handle ) - m_handle->setSilent(y); - -} - -/*! - \return whether the cursor is auto updated - - An auto updated cursor will remain on the actual line it points - to when the document is modified. - - \code - QDocumentCursor c1(10, 0, document), c2(10, 0, document), c(5, 0, document); - - c1.setAutoUpdated(true); - - c.insertLine(); - - // at this point c2 still points to line 10 whereas c1 points to line 11 - \endcode -*/ -bool QDocumentCursor::isAutoUpdated() const -{ - return m_handle ? m_handle->isAutoUpdated() : true; -} - -/*! - \brief Set whether the cursor is aut updated -*/ -void QDocumentCursor::setAutoUpdated(bool y) -{ - if ( m_handle ) - m_handle->setAutoUpdated(y); - -} - -/*! - \brief Refresh the column memory of the cursor - - This set the current column memory to the current column position. - - \note It is not recommended to call that yourself. The various - movement method should do that perfectly fine. -*/ -void QDocumentCursor::refreshColumnMemory() -{ - if ( m_handle ) - m_handle->refreshColumnMemory(); - -} - -/*! - \return Whether the cursor has column memory - - The column memory is a feature that allow a cursor - to remember its biggest column number so that moving - back and forth (with movePosition()) on lines of - different width does not result in the column to change. - -*/ -bool QDocumentCursor::hasColumnMemory() const -{ - return m_handle ? m_handle->hasColumnMemory() : false; -} - -/*! - \brief Set whether the cursor use column memory -*/ -void QDocumentCursor::setColumnMemory(bool y) -{ - if ( m_handle ) - m_handle->setColumnMemory(y); - -} - -/*! - \return whether the cursor has a selection -*/ -bool QDocumentCursor::hasSelection() const -{ - return m_handle ? m_handle->hasSelection() : false; -} - -/*! - \brief clear the selection -*/ -void QDocumentCursor::clearSelection() -{ - if ( m_handle ) - m_handle->clearSelection(); - -} - -/*! - \brief Select something -*/ -void QDocumentCursor::select(SelectionType t) -{ - if ( m_handle ) - m_handle->select(t); - -} - -/*! - \brief Set the selection boundary - - Select text between the current cursor anchor and the one - of \a c. - - \note We mean ANCHOR. If the cursor already has a selection the - anchor will not change, but the position will be set to that of - \a c. -*/ -void QDocumentCursor::setSelectionBoundary(const QDocumentCursor& c) -{ - if ( m_handle ) - m_handle->setSelectionBoundary(c); - -} - -/*! - \return whether a given cursor is within the selection -*/ -bool QDocumentCursor::isWithinSelection(const QDocumentCursor& c) const -{ - return m_handle ? m_handle->isWithinSelection(c) : false; -} - -/*! - \return selection information - - \note The QDocumentSelection object is not updated if the selection - changes later on : use it right away and do not store it. -*/ -QDocumentSelection QDocumentCursor::selection() const -{ - QDocumentSelection s; - - if ( isNull() || !hasSelection() ) - { - qDebug("NULL selection"); - - s.startLine = -1; - s.endLine = -1; - - s.start = -1; - s.end = -1; - } else if ( m_handle->m_begLine == m_handle->m_endLine ) { - - s.startLine = m_handle->m_begLine; - s.endLine = m_handle->m_begLine; - - s.start = qMin(m_handle->m_begOffset, m_handle->m_endOffset); - s.end = qMax(m_handle->m_begOffset, m_handle->m_endOffset); - - } else if ( m_handle->m_begLine > m_handle->m_endLine ) { - - s.startLine = m_handle->m_endLine; - s.endLine = m_handle->m_begLine; - - s.start = m_handle->m_endOffset; - s.end = m_handle->m_begOffset; - - //qDebug("[(%i,%i);(%i,%i)]", s.startLine.lineNumber(), s.start, s.endLine.lineNumber(), s.end); - } else { - s.startLine = m_handle->m_begLine; - s.endLine = m_handle->m_endLine; - - s.start = m_handle->m_begOffset; - s.end = m_handle->m_endOffset; - - //qDebug("[(%i,%i);(%i,%i)]", s.startLine.lineNumber(), s.start, s.endLine.lineNumber(), s.end); - } - - return s; -} - -/*! @} */ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentcursor.h +++ /dev/null @@ -1,195 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QDOCUMENT_CURSOR_H_ -#define _QDOCUMENT_CURSOR_H_ - -#include "qce-config.h" - -/*! - \file qdocumentcursor.h - \brief Definition of the QDocumentCursor class -*/ - -class QChar; -class QPoint; -class QString; -class QPolygon; - -class QDocument; -class QDocumentLine; -struct QDocumentSelection; -class QDocumentCursorHandle; - -class QCE_EXPORT QDocumentCursor -{ - public: - enum MoveFlag - { - MoveAnchor = 0, - KeepAnchor = 1, - ThroughWrap = 2 - }; - - Q_DECLARE_FLAGS(MoveMode, MoveFlag); - - enum MoveOperation - { - NoMove, - Up, - Down, - Left, - PreviousCharacter = Left, - Right, - NextCharacter = Right, - Start, - StartOfLine, - StartOfBlock = StartOfLine, - StartOfWord, - PreviousBlock, - PreviousLine = PreviousBlock, - PreviousWord, - WordLeft, - WordRight, - End, - EndOfLine, - EndOfBlock = EndOfLine, - EndOfWord, - NextWord, - NextBlock, - NextLine = NextBlock - }; - - enum SelectionType - { - WordUnderCursor, - LineUnderCursor - }; - - explicit QDocumentCursor(QDocument *doc); - QDocumentCursor(const QDocumentCursor& cursor); - QDocumentCursor(QDocument *doc, int line, int column = 0); - //QDocumentCursor(const QDocumentLine& line, int column = 0); - QDocumentCursor(QDocumentCursorHandle* handle = 0); - - ~QDocumentCursor(); - - QDocumentCursor clone() const; - - QDocumentCursor& operator = (const QDocumentCursor& c); - - bool operator == (const QDocumentCursor& c) const; - bool operator != (const QDocumentCursor& c) const; - - bool operator < (const QDocumentCursor& c) const; - bool operator > (const QDocumentCursor& c) const; - - bool operator <= (const QDocumentCursor& c) const; - bool operator >= (const QDocumentCursor& c) const; - - bool isNull() const; - bool isValid() const; - - bool atEnd() const; - bool atStart() const; - - bool atBlockEnd() const; - bool atBlockStart() const; - - bool atLineEnd() const; - bool atLineStart() const; - - bool hasSelection() const; - - bool isSilent() const; - void setSilent(bool y); - - bool isAutoUpdated() const; - void setAutoUpdated(bool y); - - int position() const; - - int lineNumber() const; - int columnNumber() const; - - int anchorLineNumber() const; - int anchorColumnNumber() const; - - int visualColumnNumber() const; - - void setColumnNumber(int c, MoveMode m = MoveAnchor); - - int wrappedLineOffset() const; - int anchorWrappedLineOffset() const; - - QPoint documentPosition() const; - QPoint anchorDocumentPosition() const; - - QPolygon documentRegion() const; - - QDocumentLine line() const; - QDocumentLine anchorLine() const; - - void shift(int offset); - void setPosition(int pos, MoveMode m = MoveAnchor); - bool movePosition(int offset, MoveOperation op = NextCharacter, MoveMode m = MoveAnchor); - - void moveTo(int line, int column); - void moveTo(const QDocumentCursor &c); - void moveTo(const QDocumentLine &l, int column); - - void eraseLine(); - void insertLine(bool keepAnchor = false); - void insertText(const QString& s, bool keepAnchor = false); - - QDocumentCursor selectionStart() const; - QDocumentCursor selectionEnd() const; - - QString selectedText() const; - - void clearSelection(); - void removeSelectedText(); - void replaceSelectedText(const QString& text); - - void select(SelectionType t); - void setSelectionBoundary(const QDocumentCursor& c); - - bool isWithinSelection(const QDocumentCursor& c) const; - - QChar nextChar() const; - QChar previousChar() const; - - void deleteChar(); - void deletePreviousChar(); - - void beginEditBlock(); - void endEditBlock(); - - void refreshColumnMemory(); - bool hasColumnMemory() const; - void setColumnMemory(bool y); - - QDocumentSelection selection() const; - - QDocument* document() const; - - inline QDocumentCursorHandle* handle() const - { return m_handle; } - - private: - QDocumentCursorHandle *m_handle; -}; - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentcursor_p.h +++ /dev/null @@ -1,178 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QDOCUMENT_CURSOR_P_H_ -#define _QDOCUMENT_CURSOR_P_H_ - -#include "qce-config.h" - -/*! - \file qdocumentcursor_p.h - \brief Definition of QDocumentCursorHandle -*/ - -#include "qdocumentcursor.h" - -#include <QStack> - -#if QT_VERSION < 0x040400 -#include <QAtomic> -#else -#include <QAtomicInt> -#endif - -class QPoint; -class QPolygon; - -class QDocument; -class QDocumentLine; -class QDocumentPrivate; -class QDocumentCommand; -class QDocumentCommandBlock; - -class QCE_EXPORT QDocumentCursorHandle -{ - friend class QDocumentCursor; - friend class QDocumentPrivate; - friend class QDocumentCommand; - - public: - enum Flags - { - Silent = 1, - ColumnMemory = 2, - MoveWithinWrapped = 4 - }; - - QDocument* document() const; - - bool atEnd() const; - bool atStart() const; - - bool atBlockEnd() const; - bool atBlockStart() const; - - bool atLineEnd() const; - bool atLineStart() const; - - bool hasSelection() const; - - bool isSilent() const; - void setSilent(bool y); - - bool isAutoUpdated() const; - void setAutoUpdated(bool y); - - QDocumentLine line() const; - QDocumentLine anchorLine() const; - - int lineNumber() const; - int columnNumber() const; - - int anchorLineNumber() const; - int anchorColumnNumber() const; - - int visualColumnNumber() const; - - void setColumnNumber(int c, int m = QDocumentCursor::MoveAnchor); - - QPoint documentPosition() const; - QPoint anchorDocumentPosition() const; - - QPolygon documentRegion() const; - - int position() const; - - void shift(int offset); - void setPosition(int pos, int m); - bool movePosition(int offset, int op, int m); - - void insertText(const QString& s, bool keepAnchor = false); - - QChar nextChar() const; - QChar previousChar() const; - - void eraseLine(); - void deleteChar(); - void deletePreviousChar(); - - QDocumentCursor selectionStart() const; - QDocumentCursor selectionEnd() const; - - bool eq(const QDocumentCursorHandle *h); - bool lt(const QDocumentCursorHandle *h); - bool gt(const QDocumentCursorHandle *h); - - QString selectedText() const; - - void clearSelection(); - void removeSelectedText(bool keepAnchor = false); - void replaceSelectedText(const QString& text); - - void select(QDocumentCursor::SelectionType t); - void setSelectionBoundary(const QDocumentCursor& c); - - bool isWithinSelection(const QDocumentCursor& c) const; - QDocumentCursor intersect(const QDocumentCursor& c) const; - - void beginBoundary(int& begline, int& begcol) const; - void endBoundary(int& endline, int& endcol) const; - void substractBoundaries(int lbeg, int cbeg, int lend, int cend); - void boundaries(int& begline, int& begcol, int& endline, int& endcol) const; - void intersectBoundaries(int& lbeg, int& cbeg, int& lend, int& cend) const; - void intersectBoundaries(QDocumentCursorHandle *h, int& lbeg, int& cbeg, int& lend, int& cend) const; - - void beginEditBlock(); - void endEditBlock(); - - void moveTo(int line, int column); - void moveTo(const QDocumentCursor &c); - - void copy(const QDocumentCursorHandle *c); - - void refreshColumnMemory(); - bool hasColumnMemory() const; - void setColumnMemory(bool y); - - virtual void execute(QDocumentCommand *c); - - inline void ref() { m_ref.ref(); } - inline void deref() { if ( m_ref ) m_ref.deref(); if ( !m_ref ) delete this; } - - inline bool hasFlag(int f) const { return m_flags & f; } - inline void setFlag(int f) { m_flags |= f; } - inline void clearFlag(int f) { m_flags &= ~f; } - - protected: - QDocumentCursorHandle(QDocument *d, int line = 0); - virtual ~QDocumentCursorHandle(); - - QDocumentCursorHandle* clone() const; - - private: - int m_flags; - QDocument *m_doc; -#if QT_VERSION < 0x040400 - QBasicAtomic m_ref; -#else - QAtomicInt m_ref; -#endif - int m_begOffset, m_endOffset, m_max, m_begLine, m_endLine; - QStack<QDocumentCommandBlock*> m_blocks; -}; - -Q_DECLARE_TYPEINFO(QDocumentCursorHandle*, Q_PRIMITIVE_TYPE); - -#endif // !_QDOCUMENT_CURSOR_P_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentline.cpp +++ /dev/null @@ -1,602 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qdocumentline.h" - -/*! - \file qdocumentline.cpp - \brief Implementation of the QDocumentLine class. -*/ - -#include "qdocument_p.h" - -/*! - \ingroup document - @{ -*/ - -/*! - \class QDocumentLine - - \brief A reference to line objects - - In QCodeEdit, documents are stored as a list of lines. A QDocumentLine holds - a pointer to the data of one line and gives access to its content. - - It is not meant to be used to iterate over the document, though it is possible - for conveneience and compatibility reasons. Indeed, QDocumentLine does not now - where in the document it is located. It can obtain that information but this is - a O(n) operation. Navigation within the document is one of the task devoted to - QDocumentCursor which can move around in O(1) (or amortized O(1) in some rare - cases). - - Lines can be given formatting in various way : "regular" formatting used for - highlighting, overlays used mainly to display search matches and similar informations - and marks. -*/ - -QDocumentLine::QDocumentLine(QDocument *doc) - : m_handle(doc ? doc->impl()->at(0) : 0) -{ - //m_lines_backing_store << this; - - if ( m_handle ) - m_handle->ref(); - -} - -QDocumentLine::QDocumentLine(const QDocumentLine& line) - : m_handle(line.m_handle) -{ - //m_lines_backing_store << this; - if ( m_handle ) - m_handle->ref(); - -} - -QDocumentLine::QDocumentLine(QDocumentLineHandle* handle) - : m_handle(handle) -{ - //m_lines_backing_store << this; - if ( m_handle ) - m_handle->ref(); - -} - -QDocumentLine::~QDocumentLine() -{ - if ( m_handle ) - m_handle->deref(); - - //m_lines_backing_store.removeAll(this); -} - -/*! - \brief Comparision operator -*/ -bool QDocumentLine::operator == (const QDocumentLine& l) const -{ - return m_handle == l.m_handle; - //return lineNumber() == l.lineNumber(); -} - -/*! - \brief Comparision operator -*/ -bool QDocumentLine::operator != (const QDocumentLine& l) const -{ - return m_handle != l.m_handle; - //return lineNumber() != l.lineNumber(); -} - -/*! - \brief Comparision operator - - \note Line number based : avoid whenever possible -*/ -bool QDocumentLine::operator < (const QDocumentLine& l) const -{ - return lineNumber() < l.lineNumber(); -} - -/*! - \brief Comparision operator - - \note Line number based : avoid whenever possible -*/ -bool QDocumentLine::operator >= (const QDocumentLine& l) const -{ - return lineNumber() >= l.lineNumber(); -} - -/*! - \brief Comparision operator - - \note Line number based : avoid whenever possible -*/ -bool QDocumentLine::operator > (const QDocumentLine& l) const -{ - return lineNumber() > l.lineNumber(); -} - -/*! - \brief Comparision operator - - \note Line number based : avoid whenever possible -*/ -bool QDocumentLine::operator <= (const QDocumentLine& l) const -{ - return lineNumber() <= l.lineNumber(); -} - -/*! - \brief Iterate forward over the document -*/ -QDocumentLine& QDocumentLine::operator ++ () -{ - operator = (next()); - return *this; -} - -/*! - \brief Iterate backward over the document -*/ -QDocumentLine& QDocumentLine::operator -- () -{ - operator = (previous()); - return *this; -} - -/*! - \brief Iterate forward over the document -*/ -void QDocumentLine::operator ++ (int) -{ - operator = (next()); -} - -/*! - \brief Iterate backward over the document -*/ -void QDocumentLine::operator -- (int) -{ - operator = (previous()); -} - -/*! - \brief copy operator - - QDocumentLine objects are just wrappers around the "real" line data. - Copies of a QDocumentLine all points to the same underlying data and - modifying one affect them all (no implicit sharing). -*/ -QDocumentLine& QDocumentLine::operator = (const QDocumentLine& l) -{ - if ( m_handle ) - m_handle->deref(); - - m_handle = l.m_handle; - - if ( m_handle ) - m_handle->ref(); - - return *this; -} - -/*! - \return the document to which that line belongs -*/ -QDocument* QDocumentLine::document() const -{ - return m_handle ? m_handle->document() : 0; -} - -/*! - \return the line number of the line within the document - - Starts at 0, -1 for invalid lines. - - \note Avoid whenever possible : O(n) complexity, n being document size in lines - Prefer cursors over lines if you need to navigate within the document -*/ -int QDocumentLine::lineNumber() const -{ - return m_handle ? m_handle->line() : -1; -} - -/*! - \return the position of the line within the document - - \note This function is there for compatibility with QTextDocument & co - Avoid it whenever possible, it is ridiculously slow. -*/ -int QDocumentLine::position() const -{ - return m_handle ? m_handle->position() : -1; -} - -/*! - \brief Check whether a given flag is set to the line -*/ -bool QDocumentLine::hasFlag(State s) const -{ - return m_handle ? m_handle->hasFlag(s) : false; -} - -/*! - \brief Check whether any of the flags in a given combination is set to the line -*/ -bool QDocumentLine::hasAnyFlag(int s) const -{ - return m_handle ? m_handle->hasFlag(s) : false; -} - -/*! - \brief Set a flag of the line - - \warning Do not mess with flags unless you know what you are doing -*/ -void QDocumentLine::setFlag(State s, bool y) -{ - if ( m_handle ) - m_handle->setFlag(s, y); - -} - -/*! - \return whether the line object is null (i.e invalid) -*/ -bool QDocumentLine::isNull() const -{ - return m_handle ? !m_handle->document() : true; -} - -/*! - \return whether the line object is valid -*/ -bool QDocumentLine::isValid() const -{ - return m_handle ? m_handle->document() : false; -} - -/*! - \return the text of the line -*/ -QString QDocumentLine::text() const -{ - return m_handle ? m_handle->text() : QString(); -} - -/*! - \return The length of the line, in characters -*/ -int QDocumentLine::length() const -{ - return m_handle ? m_handle->text().length() : 0; -} - -/*! - \return the number of visual lines occupied by the line - - This is NOT set to zero when the line is hidden (e.g due to folding). -*/ -int QDocumentLine::lineSpan() const -{ - return m_handle && m_handle->document() ? m_handle->m_frontiers.count() + 1 : 0; -} - -/*! - \brief Returns the position of the first non-whitespace character - \return position of first non-whitespace char or -1 if there is none -*/ -int QDocumentLine::firstChar() const -{ - return nextNonSpaceChar(0); -} - -/*! - \brief Returns the position of the last non-whitespace character - \return position of last non-whitespace char or -1 if there is none -*/ -int QDocumentLine::lastChar() const -{ - return previousNonSpaceChar(length() - 1); -} - -int QDocumentLine::indent() const -{ - return m_handle ? m_handle->indent() : 0; -} - -/*! - Find the position of the next char that is not a space. - \param pos Column of the character which is examined first. - \return True if the specified or a following character is not a space - Otherwise false. -*/ -int QDocumentLine::nextNonSpaceChar(int pos) const -{ - return m_handle ? m_handle->nextNonSpaceChar(pos) : -1; -} - -/*! - \brief Find the position of the previous char that is not a space. - \param pos Column of the character which is examined first. - \return The position of the first non-whitespace character preceding pos, - or -1 if none is found. -*/ -int QDocumentLine::previousNonSpaceChar(int pos) const -{ - return m_handle ? m_handle->previousNonSpaceChar(pos) : -1; -} - -/*! - \return The previous line - - \note Avoid using this function whenever possible, especially - inside loops or time-consuming processing : it is SLOW for big - documents as determination of the line number is O(n), n being - the total number of lines in the document -*/ -QDocumentLine QDocumentLine::next() const -{ - return QDocumentLine(m_handle->next()); -} - -/*! - \return The next line - - \note Avoid using this function whenever possible, especially - inside loops or time-consuming processing : it is SLOW for big - documents as determination of the line number is O(n), n being - the total number of lines in the document -*/ -QDocumentLine QDocumentLine::previous() const -{ - return QDocumentLine(m_handle->previous()); -} - -/*! - \brief Converts a cursor position (column) to a document position (unconstrained viewport) - - \deprecated Use cursorToDocOffset() instead - - This function is kept for compatribility only. It dates back to the time before line wrapping - was implemented. Due to the limitation of its design (i.e signature) it works in a somewhat - awkard way : the x position returned is that the cursor would have in an unconstrained viewport, - even when the line is wrapped so it does not map to an actual viewport coordinate, unless of - course no wrapping is used. -*/ -int QDocumentLine::cursorToX(int cpos) const -{ - return m_handle ? m_handle->cursorToX(cpos) : -1; -} - -/*! - \brief Converts a document position (unconstrained viewport) to a cursor position (column) - - \deprecated Use cursorToDocOffset() instead - - \see cursorToX() for more informations about this function -*/ -int QDocumentLine::xToCursor(int xpos) const -{ - return m_handle ? m_handle->xToCursor(xpos) : -1; -} - -/*! - \return The wrapped line (i.e "subline") to which a given cursor position resides - \param cpos cursor position, as a text column -*/ -int QDocumentLine::wrappedLineForCursor(int cpos) const -{ - return m_handle ? m_handle->wrappedLineForCursor(cpos) : -1; -} - -/*! - \brief Converts a document offset (viewport) to a cursor position (character / text column) - - The (x, y) coordinates given by this function are relative to the absolute - position of the line, which can be obtained from the document. -*/ -int QDocumentLine::documentOffsetToCursor(int x, int y) const -{ - return m_handle ? m_handle->documentOffsetToCursor(x, y) : -1; -} - -/*! - \brief Converts a cursor position (character / text column) to a document offset (viewport) - - The (x, y) coordinates given by this function are relative to the absolute - position of the line, which can be obtained from the document. -*/ -void QDocumentLine::cursorToDocumentOffset(int cpos, int& x, int& y) const -{ - if ( m_handle ) - m_handle->cursorToDocumentOffset(cpos, x, y); -} - -/*! - \overload -*/ -QPoint QDocumentLine::cursorToDocumentOffset(int cpos) const -{ - return m_handle ? m_handle->cursorToDocumentOffset(cpos) : QPoint(); -} - -/*! - \brief Toggle a mark on the line -*/ -void QDocumentLine::addMark(int id) -{ - if ( !document() ) - return; - - document()->impl()->addMark(m_handle, id); -} - -/*! - \brief Toggle a mark on the line -*/ -void QDocumentLine::toggleMark(int id) -{ - if ( !document() ) - return; - - document()->impl()->toggleMark(m_handle, id); -} - -/*! - \brief Remove a mark from the line -*/ -void QDocumentLine::removeMark(int id) -{ - if ( !document() ) - return; - - document()->impl()->removeMark(m_handle, id); -} - -/*! - \return the list of marks set on this line -*/ -QList<int> QDocumentLine::marks() const -{ - return document() ? document()->impl()->marks(m_handle) : QList<int>(); -} - -/*! - \return Whether a given mark has been set on the line -*/ -bool QDocumentLine::hasMark(int id) const -{ - return marks().contains(id); -} - -/*! - \brief Set the formatting of the line - - \note this method is made available for syntax engine use. - If you want to apply extra formatting on a line use overlays - instead - - \see addOverlay() -*/ -void QDocumentLine::setFormats(const QVector<int>& formats) -{ - if ( !m_handle ) - return; - - m_handle->setFormats(formats); -} - -/*! - \return whether the line has at least one overlay of a given format id -*/ -bool QDocumentLine::hasOverlay(int fid) const -{ - if ( !m_handle ) - return false; - - foreach ( const QFormatRange& r, m_handle->m_overlays ) - if ( r.format == fid ) - return true; - - return false; -} - -/*! - \brief Clear all overlays applied to the line -*/ -QList<QFormatRange> QDocumentLine::overlays() const -{ - if ( !m_handle ) - return QList<QFormatRange>(); - - return m_handle->m_overlays; -} - -/*! - \brief Clear all overlays applied to the line -*/ -void QDocumentLine::clearOverlays() -{ - if ( !m_handle ) - return; - - m_handle->clearOverlays(); -} - -/*! - \brief Add an overlay to the line - - Overlays are format range that get applied on top of regular formatting. - - They are typically used to display search matches, matching braces, ... -*/ -void QDocumentLine::addOverlay(const QFormatRange& over) -{ - if ( !m_handle ) - return; - - m_handle->addOverlay(over); -} - -/*! - \brief Remove an overlay from the line -*/ -void QDocumentLine::removeOverlay(const QFormatRange& over) -{ - if ( !m_handle ) - return; - - m_handle->removeOverlay(over); -} - -/*! - \return the list of parentheses present on the line - - \note This is language dependent. -*/ -const QVector<QParenthesis>& QDocumentLine::parentheses() const -{ - Q_CHECK_PTR(m_handle); - - return m_handle->m_parens; -} - -/*! - \brief Set the parentheses present on that line - - \note this should only be used by syntax engines -*/ -void QDocumentLine::setParentheses(const QVector<QParenthesis>& parentheses) -{ - if ( !m_handle ) - return; - - m_handle->m_parens = parentheses; -} - -/*! - Reserved to syntax engines. do not mess with this unless you know what you are doing. -*/ -QNFAMatchContext* QDocumentLine::matchContext() -{ - return m_handle ? &m_handle->m_context : 0; -} - -/*! @} */ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentline.h +++ /dev/null @@ -1,189 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QDOCUMENT_LINE_H_ -#define _QDOCUMENT_LINE_H_ - -#include "qce-config.h" - -/*! - \file qdocumentline.h - \brief Definition of the QDocumentLine class -*/ - -#include "qformat.h" - -class QPoint; -class QString; - -class QDocument; -class QDocumentLineHandle; - -struct QNFAMatchContext; - -struct QParenthesis -{ - enum Role - { - Open = 1, - Close = 2, - Indent = 4, - Fold = 8, - Match = 16 - }; - - inline QParenthesis() - : id(0), role(0), offset(0), length(0) - {} - - inline QParenthesis(int i, quint8 r, int pos, int len) - : id(i), role(r), offset(pos), length(len) - {} - - int id; - int role; - int offset; - int length; -}; - -Q_DECLARE_TYPEINFO(QParenthesis, Q_MOVABLE_TYPE); - -class QCE_EXPORT QDocumentLine -{ - friend class QDocumentLineHandle; - friend class QDocumentCursorHandle; - - public: - enum State - { - None = 0, - Hidden = 1, - CollapsedBlockStart = 2, - CollapsedBlockEnd = 4, - - LayoutDirty = 16, - FormatsApplied = 32 - }; - - Q_DECLARE_FLAGS(States, State); - - explicit QDocumentLine(QDocument *doc); - QDocumentLine(const QDocumentLine& line); - QDocumentLine(QDocumentLineHandle *h = 0); - - ~QDocumentLine(); - - bool isNull() const; - bool isValid() const; - - inline bool operator == (const QDocumentLineHandle* h) const - { - return m_handle == h; - } - - inline bool operator != (const QDocumentLineHandle* h) const - { - return m_handle != h; - } - - bool operator == (const QDocumentLine& l) const; - bool operator != (const QDocumentLine& l) const; - - bool operator < (const QDocumentLine& l) const; - bool operator >= (const QDocumentLine& l) const; - - bool operator > (const QDocumentLine& l) const; - bool operator <= (const QDocumentLine& l) const; - - QDocumentLine& operator ++ (); - QDocumentLine& operator -- (); - - void operator ++ (int); - void operator -- (int); - - QDocumentLine& operator = (const QDocumentLine& l); - - int lineNumber() const; - int position() const; - - QString text() const; - - int length() const; - int lineSpan() const; - - int firstChar() const; - int lastChar() const; - - int indent() const; - - int nextNonSpaceChar(int pos) const; - int previousNonSpaceChar(int pos) const; - - inline QString indentation() const - { int idx = firstChar(); return idx != -1 ? text().left(idx) : text(); } - - inline bool isHidden() const - { return hasFlag(Hidden); } - - bool hasFlag(State s) const; - bool hasAnyFlag(int s) const; - void setFlag(State s, bool y = true); - - QDocumentLine next() const; - QDocumentLine previous() const; - - QDocument* document() const; - - int xToCursor(int x) const; - int cursorToX(int cpos) const; - - int wrappedLineForCursor(int cpos) const; - - int documentOffsetToCursor(int x, int y) const; - void cursorToDocumentOffset(int cpos, int& x, int& y) const; - - QPoint cursorToDocumentOffset(int cpos) const; - - void addMark(int id); - void removeMark(int id); - void toggleMark(int id); - - QList<int> marks() const; - bool hasMark(int id) const; - - bool hasOverlay(int fid) const; - QList<QFormatRange> overlays() const; - - void clearOverlays(); - void addOverlay(const QFormatRange& over); - void removeOverlay(const QFormatRange& over); - - void setFormats(const QVector<int>& formats); - - const QVector<QParenthesis>& parentheses() const; - void setParentheses(const QVector<QParenthesis>& parentheses); - - inline QDocumentLineHandle* handle() const - { return m_handle; } - - QNFAMatchContext* matchContext(); - - private: - QDocumentLineHandle *m_handle; -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(QDocumentLine::States) - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentline_p.h +++ /dev/null @@ -1,153 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QDOCUMENT_LINE_P_H_ -#define _QDOCUMENT_LINE_P_H_ - -#include "qce-config.h" - -/*! - \file qdocumentline_p.h - \brief Definition of QDocumentLineHandle -*/ - -#include "qnfa.h" - -#include "qformat.h" - -#include "qdocumentline.h" - -#include <QPair> -#include <QList> -#include <QString> -#include <QVector> - -#include <QTextLayout> - -#if QT_VERSION < 0x040400 -#include <QAtomic> -#else -#include <QAtomicInt> -#endif - -typedef QVector<int> QSmallArray; -typedef QVector<int> QMediumArray; - -class QPoint; - -class QDocument; -class QDocumentLine; -class QDocumentBuffer; -class QDocumentPrivate; - -class QCE_EXPORT QDocumentLineHandle -{ - friend class QDocument; - friend class QDocumentLine; - friend class QDocumentBuffer; - friend class QDocumentPrivate; - - public: - QDocumentLineHandle(QDocument *d); - QDocumentLineHandle(const QString& s, QDocument *d); - - int count() const; - int length() const; - - int position() const; - - QString text() const; - - int line() const; - - int xToCursor(int x) const; - int cursorToX(int i) const; - - int wrappedLineForCursor(int cpos) const; - - int documentOffsetToCursor(int x, int y) const; - void cursorToDocumentOffset(int cpos, int& x, int& y) const; - - QPoint cursorToDocumentOffset(int cpos) const; - - int indent() const; - - int nextNonSpaceChar(uint pos) const; - int previousNonSpaceChar(int pos) const; - - bool hasFlag(int flag) const; - void setFlag(int flag, bool y = true) const; - - QDocument* document() const; - - QDocumentLineHandle* next() const; - QDocumentLineHandle* previous() const; - - void updateWrap() const; - - void setFormats(const QVector<int>& formats); - - void clearOverlays(); - void addOverlay(const QFormatRange& over); - void removeOverlay(const QFormatRange& over); - - void shiftOverlays(int position, int offset); - - void draw( QPainter *p, - int xOffset, - int vWidth, - const QSmallArray& sel, - const QSmallArray& cursors, - const QPalette& pal, - bool fullSel) const; - - inline QString& textBuffer() { setFlag(QDocumentLine::LayoutDirty, true); return m_text; } - - inline void ref() { m_ref.ref(); } - inline void deref() { if ( m_ref ) m_ref.deref(); if ( !m_ref ) delete this; } - - protected: - ~QDocumentLineHandle(); - - private: - void layout() const; - void applyOverlays() const; - - QMediumArray compose() const; - QList<QTextLayout::FormatRange> decorations() const; - - QString m_text; - QDocument *m_doc; -#if QT_VERSION < 0x040400 - QBasicAtomic m_ref; -#else - QAtomicInt m_ref; -#endif - mutable int m_indent; - mutable quint16 m_state; - mutable QTextLayout *m_layout; - mutable QVector<int> m_cache; - mutable QVector< QPair<int, int> > m_frontiers; - - QNFAMatchContext m_context; - - QVector<int> m_formats; - QVector<QParenthesis> m_parens; - QList<QFormatRange> m_overlays; -}; - -Q_DECLARE_TYPEINFO(QDocumentLineHandle*, Q_PRIMITIVE_TYPE); - -#endif // !_QDOCUMENT_LINE_P_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentsearch.cpp +++ /dev/null @@ -1,663 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -/*! - \file qdocumentsearch.cpp - \brief Implementation of QDocumentSearch -*/ - -#include "qdocumentsearch.h" - -/*! - \ingroup document - @{ -*/ - -#include "qeditor.h" -#include "qdocument.h" -#include "qdocument_p.h" -#include "qdocumentline.h" -#include "qformatscheme.h" - -#include <QMessageBox> - -/*! - \class QDocumentSearch - \brief An helper class to perform search in document - - QDocumentSearch offer means to perform complex search in documents. -*/ - -QDocumentSearch::QDocumentSearch(QEditor *e, const QString& f, Options opt, const QString& r) - : m_group(-1), m_option(opt), m_string(f), m_replace(r), m_editor(e) -{ - -} - -QDocumentSearch::~QDocumentSearch() -{ - clearMatches(); -} - -QDocumentSearch::Options QDocumentSearch::options() const -{ - return m_option; -} - -/*! - \brief Position of the current match among the indexed matches -*/ -int QDocumentSearch::currentMatchIndex() const -{ - return m_highlight.count() ? m_index : -1; -} - -/*! - \brief Number of availables indexed matches - - Indexed matches are only available when the whole scope is searched, - i.e when either the HighlightAll option is set to true or when next() - is called with the all parameter set to true. -*/ -int QDocumentSearch::indexedMatchCount() const -{ - return m_highlight.count(); -} - -/*! - \return A cursor pointing to the n-th index match - \param idx index of the match to lookup - - The cursor returned, if valid, delimits the match through its selection. -*/ -QDocumentCursor QDocumentSearch::match(int idx) const -{ - return idx >= 0 && idx < m_highlight.count() ? m_highlight.at(idx) : QDocumentCursor(); -} - -/*! - \brief Clear matches - - This function should be called anytime you perform a search with the HighlightAll option, - once you're done iterating over the matches. -*/ -void QDocumentSearch::clearMatches() -{ - if ( !m_editor || !m_editor->document() ) - return; - - //qDebug("clearing matches"); - m_cursor = QDocumentCursor(); - - if ( m_group != -1 ) - { - m_editor->document()->clearMatches(m_group); - m_editor->document()->flushMatches(m_group); - m_group = -1; - } - - m_highlight.clear(); -} - -/*! - \return The search pattern -*/ -QString QDocumentSearch::searchText() const -{ - return m_string; -} - -/*! - \brief Set the search pattern -*/ -void QDocumentSearch::setSearchText(const QString& f) -{ - m_string = f; - - clearMatches(); -} - -/*! - \brief Test whether a given option is enabled -*/ -bool QDocumentSearch::hasOption(Option opt) const -{ - return m_option & opt; -} - -/*! - \brief Set a search option - \param opt option to set - \param on whether to enable the option -*/ -void QDocumentSearch::setOption(Option opt, bool on) -{ - if ( on ) - m_option |= opt; - else - m_option &= ~opt; - - if ( (opt & QDocumentSearch::HighlightAll) && m_highlight.count() ) - { - QDocument *d = m_editor->document(); - - if ( m_group != -1 && !on ) - { - d->clearMatches(m_group); - d->flushMatches(m_group); - m_group = -1; - } else if ( m_group == -1 && on ) { - m_group = d->getNextGroupId(); - - QFormatScheme *f = d->formatScheme(); - - if ( !f ) - f = QDocument::formatFactory(); - - if ( !f ) - { - qWarning("No format scheme set to the document and no global default one available.\n" - "-> highlighting of search matches disabled."); - return; - } - - int sid = f->id("search"); - - foreach ( const QDocumentCursor& c, m_highlight ) - { - //QFormatRange r(c.anchorColumnNumber(), c.columnNumber() - c.anchorColumnNumber(), sid); - - d->addMatch(m_group, - c.lineNumber(), - c.anchorColumnNumber(), - c.columnNumber() - c.anchorColumnNumber(), - sid); - } - - //qDebug("%i matches in group %i", indexedMatchCount(), m_group); - d->flushMatches(m_group); - } - } else if ( - (m_option & QDocumentSearch::HighlightAll) - && - ( - (opt & QDocumentSearch::RegExp) - || - (opt & QDocumentSearch::WholeWords) - || - (opt & QDocumentSearch::CaseSensitive) - ) - ) - { - // matches may have become invalid : update them - clearMatches(); - next(false); - } -} - -/*! - \return the replacement text -*/ -QString QDocumentSearch::replaceText() const -{ - return m_replace; -} - -/*! - \brief Set the replacement text -*/ -void QDocumentSearch::setReplaceText(const QString& r) -{ - m_replace = r; - - clearMatches(); -} - -/*! - \return The current cursor position - - This is useful to examine matches after performing a search. -*/ -QDocumentCursor QDocumentSearch::origin() const -{ - return m_origin; -} - -/*! - \brief Set the cursor - - If the related option is set, search will start from that cursor position - - This also changes the cursor() -*/ -void QDocumentSearch::setOrigin(const QDocumentCursor& c) -{ - m_cursor = QDocumentCursor(); - - if ( c == m_origin ) - return; - - m_origin = c; - - clearMatches(); -} - -/*! - \return The current cursor position - - This is useful to examine matches after performing a search. -*/ -QDocumentCursor QDocumentSearch::cursor() const -{ - return m_cursor; -} - -/*! - \brief Set the cursor - - If the related option is set, search will start from that cursor position -*/ -void QDocumentSearch::setCursor(const QDocumentCursor& c) -{ - m_cursor = c; -} - -/*! - \return The scope of the search - - An invalid cursor indicate that the scope is the whole document, otherwise - the scope is the selection of the returned cursor. -*/ -QDocumentCursor QDocumentSearch::scope() const -{ - return m_scope; -} - -/*! - \brief Set the search scope - - If the given cursor has no selection (a fortiori if it is invalid) then - the scope is the whole document. -*/ -void QDocumentSearch::setScope(const QDocumentCursor& c) -{ - if ( c == m_scope ) - return; - - if ( c.hasSelection() ) - m_scope = c; - else - m_scope = QDocumentCursor(); - - clearMatches(); -} - -/*! - \brief Test whether the end of the search scope has been reached -*/ -bool QDocumentSearch::end(bool backward) const -{ - bool absEnd = backward ? m_cursor.atStart() : m_cursor.atEnd(); - - if ( m_scope.isValid() && m_scope.hasSelection() ) - { - absEnd |= !m_scope.isWithinSelection(m_cursor); - /* - qDebug( - "(%i, %i, %i) %s in {(%i, %i), (%i, %i)}", - m_cursor.lineNumber(), - m_cursor.anchorColumnNumber(), - m_cursor.columnNumber(), - absEnd ? "is not" : "is", - m_scope.selectionStart().lineNumber(), - m_scope.selectionStart().columnNumber(), - m_scope.selectionEnd().lineNumber(), - m_scope.selectionEnd().columnNumber() - ); - */ - } - - return absEnd; -} - -/*! - \brief Perform a search - \param backward whether to go backward or forward - \param all if true, the whole document will be searched first, all matches recorded and available for further navigation - - \note Technically speaking the all parameter make search behave similarly to the HighlightAll option, except that the former - option does not alter the formatting of the document. -*/ -void QDocumentSearch::next(bool backward, bool all) -{ - if ( m_string.isEmpty() ) - return; - - if ( !hasOption(Replace) && (all || hasOption(HighlightAll)) && m_highlight.count() ) - { - if ( !backward ) - ++m_index; - - //m_index = m_index + (backward ? -1 : 1); - - if ( (m_index < 0 || m_index >= m_highlight.count()) ) - { - if ( hasOption(Silent) ) - { - m_cursor = QDocumentCursor(); - return; - } - - int ret = - QMessageBox::question( - m_editor, - tr("Failure"), - tr( - "End of matches reached.\n" - "Restart from the begining ?" - ), - QMessageBox::Yes - | QMessageBox::No, - QMessageBox::Yes - ); - - if ( ret == QMessageBox::Yes ) - { - m_index = backward ? m_highlight.count() : 0; - --m_index; - next(backward); - return; - } - } else { - m_cursor = m_highlight.at(m_index); - - if ( m_editor && !hasOption(Silent) ) - m_editor->setCursor(m_cursor); - } - - if ( backward ) - --m_index; - - return; - } - - if ( m_cursor.isNull() ) - { - m_cursor = m_origin; - } - - if ( m_cursor.isNull() ) - { - if ( m_scope.isValid() && m_scope.hasSelection() ) - { - if ( backward ) - m_cursor = m_scope.selectionEnd(); - else - m_cursor = m_scope.selectionStart(); - } else if ( m_editor ) { - - m_cursor = QDocumentCursor(m_editor->document()); - - if ( backward ) - m_cursor.movePosition(1, QDocumentCursor::End); - - } else { - QMessageBox::warning(0, 0, "Unable to perform search operation"); - } - } - - /* - qDebug( - "searching %s from line %i (column %i)", - backward ? "backward" : "forward", - m_cursor.lineNumber(), - m_cursor.columnNumber() - ); - */ - - m_index = 0; - QRegExp m_regexp; - Qt::CaseSensitivity cs = hasOption(CaseSensitive) - ? - Qt::CaseSensitive - : - Qt::CaseInsensitive; - - if ( hasOption(RegExp) ) - { - m_regexp = QRegExp(m_string, cs, QRegExp::RegExp); - } else if ( hasOption(WholeWords) ) { - m_regexp = QRegExp( - QString("\\b%1\\b").arg(QRegExp::escape(m_string)), - cs, - QRegExp::RegExp - ); - } else { - m_regexp = QRegExp(m_string, cs, QRegExp::FixedString); - } - - bool found = false; - QDocumentCursor::MoveOperation move; - QDocument *d = m_editor ? m_editor->document() : m_origin.document(); - QFormatScheme *f = d->formatScheme() ? d->formatScheme() : QDocument::formatFactory(); - int sid = f ? f->id("search") : 0; - - if ( !sid ) - qWarning("Highlighting of search matches disabled due to unavailability of a format scheme."); - - move = backward ? QDocumentCursor::PreviousBlock : QDocumentCursor::NextBlock; - - QDocumentSelection boundaries; - bool bounded = m_scope.isValid() && m_scope.hasSelection(); - - // condition only to avoid debug messages... - if ( bounded ) - boundaries = m_scope.selection(); - - while ( !end(backward) ) - { - if ( backward && !m_cursor.columnNumber() ) - { - m_cursor.movePosition(1, QDocumentCursor::PreviousCharacter); - continue; - } - - int ln = m_cursor.lineNumber(); - QDocumentLine l = m_cursor.line(); - - int coloffset = 0; - QString s = l.text(); - - if ( backward ) - { - if ( bounded && (boundaries.startLine == ln) ) - { - s = s.mid(boundaries.start); - coloffset = boundaries.start; - } - - s = s.left(m_cursor.columnNumber()); - } else { - if ( bounded && (boundaries.endLine == ln) ) - s = s.left(boundaries.end); - - } - - int column = backward - ? - m_regexp.lastIndexIn(s, m_cursor.columnNumber() - 1) - : - m_regexp.indexIn(s, m_cursor.columnNumber()) - ; - - /* - qDebug("searching %s in %s => %i", - qPrintable(m_regexp.pattern()), - qPrintable(s), - column); - */ - - if ( column != -1 && (backward || column >= m_cursor.columnNumber()) ) - { - column += coloffset; - - if ( backward ) - { - m_cursor.setColumnNumber(column + m_regexp.matchedLength()); - m_cursor.setColumnNumber(column, QDocumentCursor::KeepAnchor); - - /* - m_cursor.movePosition(m_regexp.matchedLength(), - QDocumentCursor::PreviousCharacter, - QDocumentCursor::KeepAnchor); - */ - } else { - m_cursor.setColumnNumber(column); - m_cursor.setColumnNumber(column + m_regexp.matchedLength(), QDocumentCursor::KeepAnchor); - - /* - m_cursor.movePosition(m_regexp.matchedLength(), - QDocumentCursor::NextCharacter, - QDocumentCursor::KeepAnchor); - */ - } - - if ( m_editor && !hasOption(Silent) && !hasOption(HighlightAll) ) - m_editor->setCursor(m_cursor); - - if ( hasOption(Replace) ) - { - bool rep = true; - - if ( hasOption(Prompt) ) - { - int ret = QMessageBox::question(m_editor, tr("Replacement prompt"), - tr("Shall it be replaced?"), - QMessageBox::Yes - | QMessageBox::No - | QMessageBox::Cancel, - QMessageBox::Yes); - - if ( ret == QMessageBox::Yes ) - { - rep = true; - } else if ( ret == QMessageBox::No ) { - rep = false; - } else if ( QMessageBox::Cancel ) { - //m_cursor.setColumnNumber(m_cursor.columnNumber()); - return; - } - } - - // - if ( rep ) - { - QString replacement = m_replace; - - for ( int i = m_regexp.numCaptures(); i >= 0; --i ) - replacement.replace(QString("\\") + QString::number(i), - m_regexp.cap(i)); - - m_cursor.beginEditBlock(); - m_cursor.removeSelectedText(); - m_cursor.insertText(replacement); - m_cursor.endEditBlock(); - - if ( backward ) - m_cursor.movePosition(replacement.length(), QDocumentCursor::PreviousCharacter); - } else { - //qDebug("no rep"); - } - } else if ( all || hasOption(HighlightAll) ) { - - if ( sid && hasOption(HighlightAll) ) - { - if ( m_group == -1 ) - m_group = d->getNextGroupId(); - - d->addMatch(m_group, - m_cursor.lineNumber(), - m_cursor.anchorColumnNumber(), - m_cursor.columnNumber() - m_cursor.anchorColumnNumber(), - sid); - //QFormatRange r( - // m_cursor.anchorColumnNumber(), - // m_cursor.columnNumber() - m_cursor.anchorColumnNumber(), - // m_editor->document()->formatScheme()->id("search") - // ); - - //qDebug("(%i, %i, %i)", r.offset, r.length, r.format); - //m_cursor.line().addOverlay(r); - } - - m_highlight << m_cursor; - m_highlight.last().setAutoUpdated(true); - } - - found = true; - - if ( !(all || hasOption(HighlightAll)) ) - break; - - } else { - m_cursor.movePosition(1, move); - } - } - - if ( !hasOption(Replace) && hasOption(HighlightAll) && m_highlight.count() ) - { - //qDebug("%i matches in group %i", indexedMatchCount(), m_group); - if ( indexedMatchCount() ) - { - m_editor->document()->flushMatches(m_group); - } else { - m_editor->document()->releaseGroupId(m_group); - m_group = -1; - } - - m_index = backward ? m_highlight.count() : 0; - --m_index; - return next(backward); - } - - if ( !found ) - { - m_cursor = QDocumentCursor(); - - if ( hasOption(Silent) ) - return; - - int ret = - QMessageBox::question( - m_editor, - tr("Failure"), - tr( - "End of scope reached with no match.\n" - "Restart from the begining ?" - ), - QMessageBox::Yes - | QMessageBox::No, - QMessageBox::Yes - ); - - if ( ret == QMessageBox::Yes ) - { - m_origin = QDocumentCursor(); - next(backward); - } - } -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/document/qdocumentsearch.h +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QDOCUMENT_SEARCH_H_ -#define _QDOCUMENT_SEARCH_H_ - -#include "qce-config.h" - -/*! - \file qdocumentsearch.h - \brief Definition of the QDocumentSearch class -*/ - -#include <QString> -#include <QRegExp> -#include <QPointer> -#include <QCoreApplication> - -#include "qdocumentcursor.h" - -class QEditor; - -class QCE_EXPORT QDocumentSearch -{ - Q_DECLARE_TR_FUNCTIONS(QDocumentSearch) - - public: - enum Option - { - WholeWords = 1, - CaseSensitive = 2, - RegExp = 4, - Replace = 8, - Prompt = 16, - Silent = 32, - HighlightAll = 64 - }; - - Q_DECLARE_FLAGS(Options, Option); - - QDocumentSearch(QEditor *e, const QString& f, Options opt, const QString& r = QString()); - ~QDocumentSearch(); - - int currentMatchIndex() const; - int indexedMatchCount() const; - QDocumentCursor match(int idx) const; - - QString searchText() const; - void setSearchText(const QString& f); - - Options options() const; - bool hasOption(Option opt) const; - void setOption(Option opt, bool on); - - QString replaceText() const; - void setReplaceText(const QString& r); - - QDocumentCursor origin() const; - void setOrigin(const QDocumentCursor& c); - - QDocumentCursor cursor() const; - void setCursor(const QDocumentCursor& c); - - QDocumentCursor scope() const; - void setScope(const QDocumentCursor& c); - - void next(bool backward, bool all = false); - - private: - bool end(bool backward) const; - - void clearMatches(); - - int m_group; - int m_index; - Options m_option; - QString m_string; - QString m_replace; - QPointer<QEditor> m_editor; - QDocumentCursor m_cursor, m_scope, m_origin; - QList<QDocumentCursor> m_highlight; -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(QDocumentSearch::Options) - -#endif // !_QDOCUMENT_SEARCH_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/lib.pri +++ /dev/null @@ -1,103 +0,0 @@ -DEFINES += _QCODE_EDIT_BUILD_ - -CONFIG *= qnfa console - -QT *= xml - -# Input - -HEADERS += qce-config.h \ - qeditor.h \ - qeditorfactory.h \ - qeditorinputbindinginterface.h \ - qeditorinputbinding.h \ - qeditsession.h \ - qcodeedit.h \ - qpanellayout.h \ - qformatfactory.h \ - qformatscheme.h \ - qlinemarksinfocenter.h \ - qreliablefilewatch.h \ - document/qdocument.h \ - document/qdocument_p.h \ - document/qdocumentcommand.h \ - document/qdocumentcursor.h \ - document/qdocumentline.h \ - document/qdocumentsearch.h \ - qcodecompletionengine.h \ - qlanguagedefinition.h \ - qlanguagefactory.h \ - widgets/qpanel.h \ - widgets/qlinenumberpanel.h \ - widgets/qlinemarkpanel.h \ - widgets/qlinechangepanel.h \ - widgets/qfoldpanel.h \ - widgets/qstatuspanel.h \ - widgets/qgotolinepanel.h \ - widgets/qsearchreplacepanel.h \ - widgets/qgotolinedialog.h \ - widgets/qeditconfig.h \ - widgets/qformatconfig.h \ - widgets/qsimplecolorpicker.h \ - widgets/qcalltip.h \ - snippets/qsnippet.h \ - snippets/qsnippet_p.h \ - snippets/qsnippetpatternloader.h \ - snippets/qsnippetmanager.h \ - snippets/qsnippetedit.h \ - snippets/qsnippetbinding.h - -SOURCES += qeditor.cpp \ - qeditorfactory.cpp \ - qeditorinputbinding.cpp \ - qeditsession.cpp \ - qcodeedit.cpp \ - qpanellayout.cpp \ - qformatscheme.cpp \ - qlinemarksinfocenter.cpp \ - qreliablefilewatch.cpp \ - document/qdocument.cpp \ - document/qdocumentcommand.cpp \ - document/qdocumentcursor.cpp \ - document/qdocumentline.cpp \ - document/qdocumentsearch.cpp \ - qcodecompletionengine.cpp \ - qlanguagedefinition.cpp \ - qlanguagefactory.cpp \ - widgets/qpanel.cpp \ - widgets/qlinenumberpanel.cpp \ - widgets/qlinemarkpanel.cpp \ - widgets/qlinechangepanel.cpp \ - widgets/qfoldpanel.cpp \ - widgets/qstatuspanel.cpp \ - widgets/qgotolinepanel.cpp \ - widgets/qsearchreplacepanel.cpp \ - widgets/qgotolinedialog.cpp \ - widgets/qeditconfig.cpp \ - widgets/qformatconfig.cpp \ - widgets/qsimplecolorpicker.cpp \ - widgets/qcalltip.cpp \ - snippets/qsnippet.cpp \ - snippets/qsnippetmanager.cpp \ - snippets/qsnippetedit.cpp \ - snippets/qsnippetbinding.cpp - -FORMS += widgets/searchreplace.ui \ - widgets/gotoline.ui \ - widgets/gotolinedialog.ui \ - widgets/editconfig.ui \ - widgets/formatconfig.ui \ - snippets/snippetedit.ui - -qnfa { - DEFINES += QNFA_BUILD - - HEADERS += qnfa/qnfa.h \ - qnfa/qnfadefinition.h \ - qnfa/light_vector.h - - SOURCES += qnfa/qnfa.cpp \ - qnfa/qnfadefinition.cpp \ - qnfa/xml2qnfa.cpp -} -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/lib.pro +++ /dev/null @@ -1,22 +0,0 @@ -###################################################################### -# Automatically generated by qmake (2.01a) ven. juin 8 21:29:34 2007 -###################################################################### - -TEMPLATE = lib -TARGET = qcodeedit -DESTDIR = .. -CONFIG += staticlib - -DEPENDPATH += . document language widgets qnfa -INCLUDEPATH += . document language widgets qnfa - -CONFIG += qnfa - -QT += xml - -UI_DIR = -MOC_DIR = moc-dir -OBJECTS_DIR = objects.dir - -# Input -include(lib.pri)
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qce-config.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QCE_CONFIG_H_ -#define _QCE_CONFIG_H_ - -/*! - \file qce-config.h - \brief Utility file for shared library creation -*/ - -#include <qglobal.h> - -/*! - \macro QCE_EXPORT - \brief Macro needed for cross-platform shared libraries creation -*/ -#ifdef QCE_EXPORT - // QCE_EXPORT manually defined, trust the user -#else - #ifdef _QCODE_EDIT_BUILD_ - #ifdef _QCODE_EDIT_EMBED_ - #define QCE_EXPORT - #else - #define QCE_EXPORT Q_DECL_EXPORT - #endif - #else - #define QCE_EXPORT Q_DECL_IMPORT - #endif -#endif - -class QString; -class QStringList; - -namespace QCE -{ - QString fetchDataFile(const QString& file); - - QStringList dataPathes(); - void addDataPath(const QString& path); - - template <typename Registerable> - class Registar - { - public: - Registar() - { - Registerable::_register(); - } - }; -} - -#define QCE_AUTO_REGISTER(T) \ - static QCE::Registar<T> _auto_##T##_registar; \ - - - -#endif // !_QCE_CONFIG_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qcodecompletionengine.cpp +++ /dev/null @@ -1,322 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qcodecompletionengine.h" - -/*! - \file qcompletionengine.cpp - \brief Implementation of the QCodeCompletionEngine class. -*/ - -#include "qeditor.h" - -#include <QAction> -#include <QKeyEvent> -#include <QTextCursor> - -#ifdef _QCODE_MODEL_ -#include "qcodebuffer.h" -#endif - -/*! - -*/ -QCodeCompletionEngine::QCodeCompletionEngine(QObject *p) - : QObject(p), m_max(0) -{ - pForcedTrigger = new QAction(tr("&Trigger completion"), this); - - connect(pForcedTrigger , SIGNAL( triggered() ), - this , SLOT ( complete() ) ); - -} - -/*! - -*/ -QCodeCompletionEngine::~QCodeCompletionEngine() -{ - -} - -/*! - \return -*/ -QAction* QCodeCompletionEngine::triggerAction() const -{ - return pForcedTrigger; -} - -/*! - -*/ -void QCodeCompletionEngine::retranslate() -{ - pForcedTrigger->setText(tr("&Trigger completion")); -} - -/*! - -*/ -QStringList QCodeCompletionEngine::triggers() const -{ - return m_triggers; -} - -/*! - -*/ -void QCodeCompletionEngine::addTrigger(const QString& s) -{ - if ( m_triggers.contains(s) ) - return; - - if ( s.count() > m_max ) - m_max = s.count(); - - m_triggers << s; -} - -/*! - -*/ -void QCodeCompletionEngine::removeTrigger(const QString& s) -{ - m_triggers.removeAll(s); -} - -/*! - -*/ -void QCodeCompletionEngine::setCodeModel(QCodeModel *m) -{ - Q_UNUSED(m) -} - -/*! - -*/ -QEditor* QCodeCompletionEngine::editor() const -{ - return pEdit; -} - -/*! - \brief Attach the completion engine instance to a new editor object -*/ -void QCodeCompletionEngine::setEditor(QEditor *e) -{ - if ( pEdit ) - { - pEdit->removeAction(pForcedTrigger, "&Edit"); - //pEdit->removeEventFilter(this); - - disconnect( pEdit , SIGNAL( textEdited(QKeyEvent*) ), - this , SLOT ( textEdited(QKeyEvent*) ) ); - } - - pEdit = e; - - if ( pEdit ) - { - //pEdit->installEventFilter(this); - pEdit->addAction(pForcedTrigger, "&Edit"); - - connect(pEdit , SIGNAL( textEdited(QKeyEvent*) ), - this , SLOT ( textEdited(QKeyEvent*) ) ); - } -} - -/*! - \internal -*/ -void QCodeCompletionEngine::run() -{ - if ( m_cur.isNull() ) - return; - - //qDebug("complete!"); - - complete(m_cur, m_trig); - - m_cur = QDocumentCursor(); - m_trig.clear(); -} - -/*! - \brief Forced completion trigger -*/ -void QCodeCompletionEngine::complete() -{ - complete(editor()->cursor(), QString()); -} - -/*! - \brief Standard completion entry point for QEditor - \param e QKeyEvent that caused a modification of the text - - \note This slot is only called when editing happens without - any cursor mirrors -*/ -void QCodeCompletionEngine::textEdited(QKeyEvent *k) -{ - QString s, txt = s = k->text(); - QDocumentCursor cur = editor()->cursor(); - - int count = txt.count(); - - if ( txt.isEmpty() || m_triggers.isEmpty() ) - return; - - //qDebug("should trigger completion? (bis)"); - - if ( count > m_max ) - { - txt = txt.right(m_max); - - } else if ( count < m_max ) { - - QDocumentCursor c(cur); - c.movePosition(m_max, QDocumentCursor::Left, QDocumentCursor::KeepAnchor); - - //qDebug("prev text : %s", qPrintable(c.selectedText())); - - txt = c.selectedText(); - } - - //qDebug("text : %s", qPrintable(txt)); - - foreach ( QString trig, m_triggers ) - { - if ( txt.endsWith(trig) ) - { - cur = editor()->cursor(); - cur.movePosition(trig.count(), QDocumentCursor::PreviousCharacter); - - // notify completion trigger - emit completionTriggered(trig); - - //get rid of previous calltips/completions - editor()->setFocus(); - - // trigger completion - complete(cur, trig); - } - } -} - -/*! - \internal -*/ -bool QCodeCompletionEngine::eventFilter(QObject *o, QEvent *e) -{ - if ( !e || !o || (e->type() != QEvent::KeyPress) || (o != pEdit) ) - return false; - - //qDebug("should trigger completion?"); - - QDocumentCursor cur = editor()->cursor(); - QKeyEvent *k = static_cast<QKeyEvent*>(e); - - QString s, txt = s = k->text(); - - int count = txt.count(); - - if ( txt.isEmpty() || m_triggers.isEmpty() ) - return false; // QThread::eventFilter(o, e); - - //qDebug("should trigger completion? (bis)"); - - if ( count > m_max ) - { - txt = txt.right(m_max); - - } else if ( count < m_max ) { - - QDocumentCursor c(cur); - c.movePosition(m_max - count, QDocumentCursor::Left, QDocumentCursor::KeepAnchor); - - //qDebug("prev text : %s", qPrintable(c.selectedText())); - - txt.prepend(c.selectedText()); - } - - //qDebug("text : %s", qPrintable(txt)); - - foreach ( QString trig, m_triggers ) - { - if ( txt.endsWith(trig) ) - { - editor()->write(s); - - cur = editor()->cursor(); - cur.movePosition(trig.count(), QDocumentCursor::PreviousCharacter); - - // notify completion trigger - emit completionTriggered(trig); - - //get rid of previous calltips/completions - editor()->setFocus(); - - // trigger completion - complete(cur, trig); - - return true; - } - } - - return false; -} - -/*! - \brief Completion callback -*/ -void QCodeCompletionEngine::complete(const QDocumentCursor& c, const QString& trigger) -{ - #ifdef _QCODE_MODEL_ - // TODO : - // * use a more efficient design by avoiding deep copy of the data - // * only lex the requested part (stop at cursor or topmost frame required for proper class hierarchy) - - QDocumentCursor cc = c; - cc.movePosition(1, QDocumentCursor::Start, QDocumentCursor::KeepAnchor); - - //qDebug("%s", qPrintable(cc.selectedText())); - - QCodeBuffer buffer(cc.selectedText()); - //QCodeBuffer buffer(c.document()->text()); - complete(&buffer, trigger); - #else - Q_UNUSED(c) - Q_UNUSED(trigger) - qWarning("From complete(QDocumentCursor, QString)"); - qWarning("QCodeCompletionEngine is not self-sufficient : subclasses should " - "reimplement at least on of the complete() method..."); - #endif -} - -/*! - \overload - \brief Overloaded completion callback -*/ -void QCodeCompletionEngine::complete(QCodeStream *s, const QString& trigger) -{ - Q_UNUSED(s) - Q_UNUSED(trigger) - - qWarning("From complete(QCodeStream*, QString)"); - qWarning("QCodeCompletionEngine is not self-sufficient : subclasses should" - "reimplement at least on of the complete() method..."); -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qcodecompletionengine.h +++ /dev/null @@ -1,92 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QCOMPLETION_ENGINE_H_ -#define _QCOMPLETION_ENGINE_H_ - -#include "qce-config.h" - -/*! - \file qcompletionengine.h - \brief Definition of the QCodeCompletionEngine class. -*/ - -#include "qdocumentcursor.h" - -#include <QObject> -#include <QPointer> -#include <QStringList> - -class QEditor; -class QAction; -class QKeyEvent; -class QCodeModel; -class QCodeStream; - -class QCE_EXPORT QCodeCompletionEngine : public QObject -{ - Q_OBJECT - - public: - QCodeCompletionEngine(QObject *p = 0); - virtual ~QCodeCompletionEngine(); - - virtual QCodeCompletionEngine* clone() = 0; - - virtual QString language() const = 0; - virtual QStringList extensions() const = 0; - - QAction* triggerAction() const; - - QEditor* editor() const; - void setEditor(QEditor *e); - - QStringList triggers() const; - - void addTrigger(const QString& s); - void removeTrigger(const QString& s); - - virtual void setCodeModel(QCodeModel *m); - - virtual void retranslate(); - - signals: - void popup(); - void cloned(QCodeCompletionEngine *e); - void completionTriggered(const QString& s); - - public slots: - void complete(); - void textEdited(QKeyEvent *e); - - protected: - virtual void run(); - virtual bool eventFilter(QObject *o, QEvent *e); - - virtual void complete(QCodeStream *s, const QString& trigger); - virtual void complete(const QDocumentCursor& c, const QString& trigger); - - private: - int m_max; - QString m_trig; - QDocumentCursor m_cur; - QAction *pForcedTrigger; - - QStringList m_triggers; - - QPointer<QEditor> pEdit; -}; - -#endif // _QCOMPLETION_ENGINE_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qcodeedit.cpp +++ /dev/null @@ -1,489 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qcodeedit.h" - -/*! - \file qcodeedit.cpp - \brief Implementation of the QCodeEdit class -*/ - -#include "qpanel.h" -#include "qeditor.h" -#include "qpanellayout.h" - -#include <QDir> -#include <QMenu> -#include <QEvent> -#include <QAction> -#include <QFileInfo> -#include <QStringList> -#include <QMetaObject> - -/*! - \class QCodeEdit - \brief A thin layer over QEditor - - The QCodeEdit class provides simple means to associate panels with editors and manage them. -*/ - -/*! - \internal - \class QPanelWatcher - - A class designed to work around some limitations of the hide/show event system and allow - proper setting and conservation of default visibility for panels. -*/ -class QPanelWatcher : public QObject -{ - public: - QPanelWatcher(QCodeEdit *e) - : qce(e) - { - - } - - bool eventFilter(QObject *o, QEvent *e) - { - QPanel *p = qobject_cast<QPanel*>(o); - QAction *a = qce->toggleViewAction(p); - - if ( a ) - { - bool sig = a->signalsBlocked(); - a->blockSignals(true); - - if ( a->isChecked() && e->type() == QEvent::Hide ) - a->setChecked(false); - else if ( !a->isChecked() && e->type() == QEvent::Show ) - a->setChecked(true); - - a->blockSignals(sig); - } - - return QObject::eventFilter(o, e); - } - - private: - QCodeEdit *qce; -}; - -QStringList __qce_data_path; - -/*! - \brief Centralized access point to data fetching -*/ -QString QCE::fetchDataFile(const QString& file) -{ - if ( QFileInfo(file).isAbsolute() ) - return file; - - foreach ( QString dp, __qce_data_path ) - { - QDir d(dp); - - if ( d.exists(file) ) - return d.absoluteFilePath(file); - } - - return file; -} - -/*! - \return The list of pathes used by QCE to fetch data -*/ -QStringList QCE::dataPathes() -{ - return __qce_data_path; -} - -/*! - \brief Add a path to the list of pathes used to fetch data -*/ -void QCE::addDataPath(const QString& path) -{ - if ( !__qce_data_path.contains(path) ) - __qce_data_path << path; -} - -QList<QCodeEdit*> QCodeEdit::m_instances; - -/*! - \brief ctor - - The created editor object comes with builtin actions. -*/ -QCodeEdit::QCodeEdit(QWidget *p) - : m_panelsMenu(0) -{ - m_editor = new QEditor(p); - m_watcher = new QPanelWatcher(this); - m_layout = new QPanelLayout(m_editor); - - m_instances << this; -} - -/*! - \brief ctor - \param actions whether the QEditor object should create builtin actions -*/ -QCodeEdit::QCodeEdit(bool actions, QWidget *p) - : m_panelsMenu(0) -{ - m_editor = new QEditor(actions, p); - m_watcher = new QPanelWatcher(this); - m_layout = new QPanelLayout(m_editor); - - m_instances << this; -} - -/*! - \brief ctor - \param layout structure of the panel layout - - The created editor object comes with builtin actions. -*/ -QCodeEdit::QCodeEdit(const QString& layout, QWidget *p) - : m_panelsMenu(0) -{ - m_editor = new QEditor(p); - m_watcher = new QPanelWatcher(this); - m_layout = new QPanelLayout(layout, m_editor); - - m_instances << this; -} - -/*! - \brief ctor - \param layout structure of the panel layout - \param actions whether the QEditor object should create builtin actions -*/ -QCodeEdit::QCodeEdit(const QString& layout, bool actions, QWidget *p) - : m_panelsMenu(0) -{ - m_editor = new QEditor(actions, p); - m_watcher = new QPanelWatcher(this); - m_layout = new QPanelLayout(layout, m_editor); - - m_instances << this; -} - -/*! - \brief ctor - \param e editor to manage - \param p panel layout to associate with the editor -*/ -QCodeEdit::QCodeEdit(QEditor *e, QPanelLayout *p) - : m_panelsMenu(0) -{ - m_editor = e; - m_watcher = new QPanelWatcher(this); - m_layout = p ? p : new QPanelLayout(m_editor); - - m_instances << this; -} - -/*! - \brief ctor - \param e editor to manage - \param l structure of the panel layout -*/ -QCodeEdit::QCodeEdit(QEditor *e, const QString& l) - : m_panelsMenu(0) -{ - m_editor = e; - m_watcher = new QPanelWatcher(this); - m_layout = new QPanelLayout(l, m_editor); - - m_instances << this; -} - -/*! - \brief dtor - - \warning Destroyes the editor and the panel layout it manages -*/ -QCodeEdit::~QCodeEdit() -{ - m_instances.removeAll(this); - - delete m_watcher; - delete m_editor; - delete m_layout; -} - -/*! - \return the managed editor -*/ -QEditor* QCodeEdit::editor() const -{ - return m_editor; -} - -/*! - \return the panel layout associated with the managed editor -*/ -QPanelLayout* QCodeEdit::panelLayout() const -{ - return m_layout; -} - -/*! - \brief Add a panel - \return Toggle view action for the added panel - \param panel panel to add - \param pos position of the panel in the layout - \param _add whether to add the show action of the panel to the menu of the editor -*/ -QAction* QCodeEdit::addPanel(QPanel *panel, Position pos, bool _add) -{ - panel->attach(m_editor); - - QAction *a = new QAction(panel->type(), m_editor); - a->setCheckable(true); - a->setChecked(panel->defaultVisibility()); - - QObject::connect(a , SIGNAL( toggled(bool) ), - panel , SLOT ( setVisible(bool) ) ); - - m_layout->addWidget(panel, QPanelLayout::Position(pos)); - m_layout->update(); - - m_actions << a; - - panel->installEventFilter(m_watcher); - - if ( _add ) - { - if ( !m_panelsMenu ) - { - m_panelsMenu = new QMenu(QEditor::tr("Panels"), m_editor); - m_panelsMenu->menuAction()->setObjectName("panels"); - m_editor->addAction(m_panelsMenu->menuAction(), QEditor::tr("&View"), QString()); - } - - m_panelsMenu->addAction(a); - } - - return a; -} - -/*! - \overload - \return Toggle view action for the added panel - \param name name of panel to add - \param pos position of the panel in the layout - \param _add whether to add the show action of the panel to the menu of the editor -*/ -QAction* QCodeEdit::addPanel(const QString& name, Position pos, bool _add) -{ - return addPanel(QPanel::panel(name, m_editor), pos, _add); -} - -/*! - \return whether the editor has a panel of the given \a type -*/ -bool QCodeEdit::hasPanel(const QString& type) const -{ - if ( !m_layout ) - return false; - - QList<QPanel*> l = m_layout->panels(); - - foreach ( QPanel *p, l ) - if ( p->type() == type ) - return true; - - return false; -} - -/*! - \return a list of panels added to the editor - \param type Type of panel to look for (no filtering is performed if empty) -*/ -QList<QPanel*> QCodeEdit::panels(const QString& type) const -{ - if ( !m_layout ) - return QList<QPanel*>(); - - QList<QPanel*> l = m_layout->panels(); - - if ( type.isEmpty() ) - return l; - - int i = 0; - - while ( i < l.count() ) - { - if ( l.at(i)->type() == type ) - { - ++i; - } else { - l.removeAt(i); - } - } - - return l; -} - -/*! - \return the toggle view action of a given panel -*/ -QAction* QCodeEdit::toggleViewAction(QPanel *p) const -{ - int idx = panels().indexOf(p); - return idx == -1 ? 0 : m_actions.at(idx); -} - -/*! - \brief Send a command to every panel of a given type - \param signature method name suitable for QMetaObject::invokeMethod() - \param args list of arguments suitable for QMetaObject::invokeMethod() - - Example use : - \code - sendPanelCommand("Status", "setVisible" Q_COMMAND << Q_ARG(bool, false)); - \endcode -*/ -void QCodeEdit::sendPanelCommand( const QString& type, - const char *signature, - const QList<QGenericArgument>& args) -{ - QList<QPanel*> lp = panels(); - - //qDebug("looking for panel of type %s", qPrintable(type)); - - foreach ( QPanel *p, lp ) - { - if ( p && (p->type() == type) ) - { - //qDebug("found."); - - // TODO : ask trolltech to provide an overloaded invokeMetaMethod() - // taking a QList<> instead of nine defaulted args... - - if ( args.isEmpty() ) - QMetaObject::invokeMethod(p, signature); - else if ( args.count() == 1 ) - QMetaObject::invokeMethod( p, signature, - args.at(0)); - else if ( args.count() == 2 ) - QMetaObject::invokeMethod( p, signature, - args.at(0), - args.at(1)); - else if ( args.count() == 3 ) - QMetaObject::invokeMethod( p, signature, - args.at(0), - args.at(1), - args.at(2)); - else if ( args.count() == 4 ) - QMetaObject::invokeMethod( p, signature, - args.at(0), - args.at(1), - args.at(2), - args.at(3)); - else if ( args.count() == 5 ) - QMetaObject::invokeMethod( p, signature, - args.at(0), - args.at(1), - args.at(2), - args.at(3), - args.at(4)); - else if ( args.count() == 6 ) - QMetaObject::invokeMethod( p, signature, - args.at(0), - args.at(1), - args.at(2), - args.at(3), - args.at(4), - args.at(5)); - else if ( args.count() == 7 ) - QMetaObject::invokeMethod( p, signature, - args.at(0), - args.at(1), - args.at(2), - args.at(3), - args.at(4), - args.at(5), - args.at(6)); - else if ( args.count() == 7 ) - QMetaObject::invokeMethod( p, signature, - args.at(0), - args.at(1), - args.at(2), - args.at(3), - args.at(4), - args.at(5), - args.at(6)); - else if ( args.count() == 8 ) - QMetaObject::invokeMethod( p, signature, - args.at(0), - args.at(1), - args.at(2), - args.at(3), - args.at(4), - args.at(5), - args.at(6), - args.at(7)); - else if ( args.count() == 9 ) - QMetaObject::invokeMethod( p, signature, - args.at(0), - args.at(1), - args.at(2), - args.at(3), - args.at(4), - args.at(5), - args.at(7), - args.at(8)); - else if ( args.count() == 10 ) - QMetaObject::invokeMethod( p, signature, - args.at(0), - args.at(1), - args.at(2), - args.at(3), - args.at(4), - args.at(5), - args.at(7), - args.at(8), - args.at(9)); - - } - } -} - -/*! - \return The QCodeEdit object managing a given editor or a null point if the given editor is unmanaged -*/ -QCodeEdit* QCodeEdit::manager(QEditor *e) -{ - foreach ( QCodeEdit *m, m_instances ) - if ( m->m_editor == e ) - return m; - - return 0; -} - -/*! - \brief The (first) managed editor editing a given file or a null pointer if none found -*/ -QEditor* QCodeEdit::managed(const QString& f) -{ - foreach ( QCodeEdit *m, m_instances ) - if ( m && m->m_editor && (m->m_editor->fileName() == f) ) - return m->m_editor; - - return 0; -} -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qcodeedit.h +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QCODE_EDIT_H_ -#define _QCODE_EDIT_H_ - -#include "qce-config.h" - -/*! - \file qcodeedit.h - \brief Definition of the QCodeEdit class -*/ - -#include <QList> -#include <QPointer> -#include <QGenericArgument> - -class QMenu; -class QPanel; -class QEditor; -class QWidget; -class QString; -class QAction; -class QPanelLayout; -class QPanelWatcher; - -#define Q_COMMAND QList<QGenericArgument>() - -class QCE_EXPORT QCodeEdit -{ - friend class QPanelWatcher; - - public: - enum Position - { - West, - North, - South, - East - }; - - QCodeEdit(QWidget *p = 0); - QCodeEdit(bool actions, QWidget *p = 0); - QCodeEdit(const QString& layout, QWidget *p = 0); - QCodeEdit(const QString& layout, bool actions, QWidget *p = 0); - virtual ~QCodeEdit(); - - QEditor* editor() const; - QPanelLayout* panelLayout() const; - - QAction* addPanel(QPanel *panel, Position pos, bool _add = false); - QAction* addPanel(const QString& name, Position pos, bool _add = false); - - bool hasPanel(const QString& type) const; - QList<QPanel*> panels(const QString& type = QString()) const; - - QAction* toggleViewAction(QPanel *p) const; - - void sendPanelCommand( const QString& type, - const char *signature, - const QList<QGenericArgument>& args = Q_COMMAND); - - static QCodeEdit* manager(QEditor *e); - static QEditor* managed(const QString& f); - - //protected: - QCodeEdit(QEditor *e, QPanelLayout *p); - QCodeEdit(QEditor *e, const QString& l); - - private: - QPanelWatcher *m_watcher; - QPointer<QEditor> m_editor; - QPointer<QPanelLayout> m_layout; - - QMenu *m_panelsMenu; - QList<QAction*> m_actions; - - static QList<QCodeEdit*> m_instances; -}; - -#endif // _QCODE_EDIT_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qeditor.cpp +++ /dev/null @@ -1,4879 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qeditor.h" - -/*! - \file qeditor.cpp - \brief Implementation of the QEditor class -*/ - -#include "qeditorinputbindinginterface.h" - -#include "qdocument.h" -#include "qdocument_p.h" -#include "qdocumentline.h" -#include "qdocumentcursor.h" - -#include "qlanguagedefinition.h" -#include "qcodecompletionengine.h" - -#include "qcodeedit.h" -#include "qpanellayout.h" -#include "qgotolinedialog.h" -#include "qlinemarksinfocenter.h" - -#include "qreliablefilewatch.h" - -#include <QFile> -#include <QMenu> -#include <QTimer> -#include <QStyle> -#include <QDebug> -#include <QAction> -#include <QPointer> -#include <QPainter> -#include <QPrinter> -#include <QKeyEvent> -#include <QMimeData> -#include <QFileInfo> -#include <QClipboard> -#include <QScrollBar> -#include <QTextCodec> -#include <QFileDialog> -#include <QTextStream> -#include <QMessageBox> -#include <QPrintDialog> -#include <QApplication> -#include <QActionGroup> - -//#define Q_GL_EDITOR - -#ifdef _QMDI_ -#include "qmdiserver.h" -#endif - -#ifdef _EDYUK_ -#include "edyukapplication.h" -#include "qshortcutmanager.h" - -#define Q_SHORTCUT(a, s, c) EDYUK_SHORTCUT(a, tr(c), tr(s)) -#else -#define Q_SHORTCUT(a, s, c) a->setShortcut( QKeySequence( tr(s, c) ) ) -#endif - -#ifdef Q_GL_EDITOR -#include <QGLWidget> -#endif - -#define QCE_ACTION(name, action) { QAction *_a_ = m_actions.value(name); if ( _a_ ) _a_ action; } -#define QCE_TR_ACTION(name, label) { QAction *_a_ = m_actions.value(name); if ( _a_ ) _a_->setText(label); } -#define QCE_ENABLE_ACTION(name, yes) { QAction *_a_ = m_actions.value(name); if ( _a_ ) _a_->setEnabled(yes); } - -/*! - \ingroup editor - @{ - - \class QEditor - \brief A text editing widget - - QEditor is the central widget in QCE. It allows user to view and edit a - document. - - QEditor has an API similar to that of QTextEdit and it behaves in a very - similar way. - - Notable differences are : - <ul> - <li>QEditor can be given an InputBinding which can change the way it - handle user inputs which enables such things as implementing emacs-like - or Vi-like editing (almost) effortlessly.</li> - <li>QEditor has actions instead of hard coded shortcuts and expose them - so that, among other things, they can be easily added to menus/toolbars - and their shortcuts can be changed</li> - <li>QEditor brings the notion of cursor mirrors. Column selection and - column editing are just special use case of cursor mirrors.</li> - <li>QEditor brings the notion of placeholders, snippets-editing is just - as special use case of placeholders.</li> - <li>QEditor allows easy encodings management</li> - </ul> - - QEditor can gain features when it is managed by a QCodeEdit class which - is responsible for panels management. -*/ - - -/*! - \enum QEditor::CodecUpdatePolicy - \brief Specify the actions to take when changing the default codec - -*/ - - -/*! - \enum QEditor::EditFlag - \brief Flag holding information about the state of an editor - - Some of these are public and can be modified freely and some - others are only meant to be used internally though they can - still be read. - -*/ - -/*! - \struct QEditor::PlaceHolder - \brief A small structure holding placeholder data - - Placeholders are basically lists of cursors. When several palceholders coexist, it is - possible to navigate among them using the key assigned to that function by the current - input binding (CTRL+arrows by default). - - Each placeholder consist of a primary cursor and a list of mirrors (modeling the internals - of QEditor and allowing extended snippet replacements easily). - - Additionaly a placeholder can have an Affector which allows the text of the mirrors to be - modified in any imaginable way -*/ - -/*! - \class QEditor::PlaceHolder::Affector - \brief A small class allowing "placeholder scripting" - - The purpose of this class is to affect/process/reformat (whichever word you understand/like - most) the content of placeholder mirrors. - - The main placeholder instance (primary cursor) will always contain the text typed by the user, - only mirrors can be affected. - - To allow a large panel of processing to be done the affector is passed the following data : - <ul> - <li>A stringlist containing placeholder contents (primary cursor of all placeholders present in the editor) - <li>The index of the current placeholder among these - <li>The key event leading to a modification of the current placeholder - <li>The index of the current mirror - <li>A reference to the text of that placeholder mirror. This text has already been modified according - to the key event. The original text can be retrieved from the first argument (stringlist). This text - can be modified in any way you see fit or left as it is. - </ul> -*/ - -//////////////////////////////////////////////////////////////////////// -// Bindings handling -//////////////////////////////////////////////////////////////////////// - -QList<QEditor*> QEditor::m_editors; -QEditorInputBindingInterface* QEditor::m_defaultBinding = 0; -QHash<QString, QEditorInputBindingInterface*> QEditor::m_registeredBindings; - -/*! - \return A list of available input bindings -*/ -QStringList QEditor::registeredInputBindingIds() -{ - return m_registeredBindings.keys(); -} - -/*! - \return the name of the default input binding - - \note The "Default" name (or its translation, obtained via QEditor::tr()) - is used to indicate that no default input binding has been set. -*/ -QString QEditor::defaultInputBindingId() -{ - return m_defaultBinding ? m_defaultBinding->name() : tr("Default"); -} - -/*! - \brief Add an input binding to make it available for all editors -*/ -void QEditor::registerInputBinding(QEditorInputBindingInterface *b) -{ - m_registeredBindings[b->id()] = b; - - foreach ( QEditor *e, m_editors ) - e->updateBindingsMenu(); - -} - -/*! - \brief Remove an input binding from the pool of publicly available ones -*/ -void QEditor::unregisterInputBinding(QEditorInputBindingInterface *b) -{ - m_registeredBindings.remove(b->id()); - - foreach ( QEditor *e, m_editors ) - e->updateBindingsMenu(); - -} - -/*! - \brief Set the default input binding - - \note This does not change the current input binding of existing editors -*/ -void QEditor::setDefaultInputBinding(QEditorInputBindingInterface *b) -{ - m_defaultBinding = b; -} - -/*! - \brief Set the default input binding - - \note If no binding of the given name is available the default (null) - binding will be set back as default binding. - - \note This does not change the current input binding of existing editors -*/ -void QEditor::setDefaultInputBinding(const QString& b) -{ - m_defaultBinding = m_registeredBindings.value(b); -} - -//////////////////////////////////////////////////////////////////////// - -/*! - \return A pointer to the global "reliable" file monitor used by QEditor to avoid file conflicts - - The point of using a custom file watcher is to work around a bug (limitation) of QFileSystemWatcher - which sometimes emit multiple signals for a single file save. It also enables to use a single - object shared by all QEditor instances and reduce memory footprint. -*/ -QReliableFileWatch* QEditor::watcher() -{ - static QPointer<QReliableFileWatch> _qce_shared; - - if ( !_qce_shared ) - _qce_shared = new QReliableFileWatch; - - return _qce_shared; -} - -//////////////////////////////////////////////////////////////////////// - -int QEditor::m_defaultFlags = QEditor::AutoIndent | QEditor::AdjustIndent; -QTextCodec* QEditor::m_defaultCodec = 0; - -/*! - \return The default flags set to every QEditor upon construction - \note the default flags are a configuration-oriented feature which only expose "user" flags -*/ -int QEditor::defaultFlags() -{ - return m_defaultFlags; -} - -/*! - \brief Set the default editor flags - - Setting editor flags result in them being applied to ALL existing editors - and editors to be created later on. - - These can of course be modified on a per-editor basis later on. -*/ -void QEditor::setDefaultFlags(int flags) -{ - m_defaultFlags = flags & Accessible; - - foreach ( QEditor *e, m_editors ) - { - bool ontoWrap = (m_defaultFlags & LineWrap) && !(e->m_state & LineWrap); - bool outOfWrap = !(m_defaultFlags & LineWrap) && (e->m_state & LineWrap); - - e->m_state &= Internal; - e->m_state |= m_defaultFlags; - - if ( ontoWrap ) - { - e->document()->setWidthConstraint(e->wrapWidth()); - } else if ( outOfWrap ) { - e->document()->clearWidthConstraint(); - } - - QAction *a = e->m_actions.value("wrap"); - - if ( a && (a->isChecked() != (bool)(e->m_state & LineWrap)) ) - a->setChecked(e->m_state & LineWrap); - - } -} - -/*! - \return The default text codec used to load and save document contents - - \note a null pointer indicates that local 8 bit encoding is used. -*/ -QTextCodec* QEditor::defaultCodec() -{ - return m_defaultCodec; -} - -/*! - \overload - \param mib codec identifier - \param update Update policy -*/ -void QEditor::setDefaultCodec(int mib, int update) -{ - setDefaultCodec(QTextCodec::codecForMib(mib), update); -} - -/*! - \overload - \param name name of the codec to use - \param update Update policy -*/ -void QEditor::setDefaultCodec(const char *name, int update) -{ - setDefaultCodec(QTextCodec::codecForName(name), update); -} - -/*! - \overload - \param name name of the codec to use - \param update Update policy -*/ -void QEditor::setDefaultCodec(const QByteArray& name, int update) -{ - setDefaultCodec(QTextCodec::codecForName(name), update); -} - -/*! - \brief Set the default text codec - \param c codec to use - \param update Update policy - - The update policy determines whether existing editors are - affected by the change of the default codec. -*/ -void QEditor::setDefaultCodec(QTextCodec *c, int update) -{ - foreach ( QEditor *e, m_editors ) - { - if ( e->codec() == m_defaultCodec ) - { - if ( update & UpdateOld ) - e->setCodec(c); - } else if ( e->codec() ) { - if ( update & UpdateCustom ) - e->setCodec(c); - } else { - if ( update & UpdateDefault ) - e->setCodec(c); - } - } - - //qDebug("new codec is : 0x%x (%s)", c, c ? c->name().constData() : "System"); - - m_defaultCodec = c; -} - -/*! - \brief ctor - - \note Creates builtin menus/actions -*/ -QEditor::QEditor(QWidget *p) - : QAbstractScrollArea(p), - pMenu(0), m_lineEndingsMenu(0), m_lineEndingsActions(0), - m_bindingsMenu(0), aDefaultBinding(0), m_bindingsActions(0), - m_doc(0), m_codec(m_defaultCodec), m_definition(0), m_curPlaceHolder(-1), m_state(defaultFlags()) -{ - m_editors << this; - - m_saveState = Undefined; - - init(); -} - -/*! - \brief ctor - \param actions Whether builtin actions and menus should be created -*/ -QEditor::QEditor(bool actions, QWidget *p) - : QAbstractScrollArea(p), - pMenu(0), m_lineEndingsMenu(0), m_lineEndingsActions(0), - m_bindingsMenu(0), aDefaultBinding(0), m_bindingsActions(0), - m_doc(0), m_codec(m_defaultCodec), m_definition(0), m_curPlaceHolder(-1), m_state(defaultFlags()) -{ - m_editors << this; - - m_saveState = Undefined; - - init(actions); -} - -/*! - \brief ctor - \param s file to load - - \note Creates builtin menus/actions -*/ -QEditor::QEditor(const QString& s, QWidget *p) - : QAbstractScrollArea(p), - pMenu(0), m_lineEndingsMenu(0), m_lineEndingsActions(0), - m_bindingsMenu(0), aDefaultBinding(0), m_bindingsActions(0), - m_doc(0), m_codec(m_defaultCodec), m_definition(0), m_curPlaceHolder(-1), m_state(defaultFlags()) -{ - m_editors << this; - - m_saveState = Undefined; - - init(); - - setText(s); -} - -/*! - \brief ctor - \param s file to load - \param actions Whether builtin actions and menus should be created - \note Creates builtin menus/action -*/ -QEditor::QEditor(const QString& s, bool actions, QWidget *p) - : QAbstractScrollArea(p), - pMenu(0), m_lineEndingsMenu(0), m_lineEndingsActions(0), - m_bindingsMenu(0), aDefaultBinding(0), m_bindingsActions(0), - m_doc(0), m_codec(m_defaultCodec), m_definition(0), m_curPlaceHolder(-1), m_state(defaultFlags()) -{ - m_editors << this; - - m_saveState = Undefined; - - init(actions); - - setText(s); -} - -/*! - \brief dtor -*/ -QEditor::~QEditor() -{ - m_editors.removeAll(this); - - if ( m_completionEngine ) - delete m_completionEngine; - - if ( m_doc ) - delete m_doc; - - if ( m_editors.isEmpty() ) - { - delete watcher(); - } else { - watcher()->removeWatch(this); - } -} - -/*! - \internal -*/ -void QEditor::init(bool actions) -{ - #ifdef Q_GL_EDITOR - setViewport(new QGLWidget); - #endif - - viewport()->setCursor(Qt::IBeamCursor); - viewport()->setBackgroundRole(QPalette::Base); - //viewport()->setAttribute(Qt::WA_OpaquePaintEvent, true); - viewport()->setAttribute(Qt::WA_KeyCompression, true); - viewport()->setAttribute(Qt::WA_InputMethodEnabled, true); - - verticalScrollBar()->setSingleStep(1); - horizontalScrollBar()->setSingleStep(20); - - setAcceptDrops(true); - //setDragEnabled(true); - setFrameShadow(QFrame::Plain); - setFocusPolicy(Qt::WheelFocus); - setAttribute(Qt::WA_KeyCompression, true); - setAttribute(Qt::WA_InputMethodEnabled, true); - - connect(this , - SIGNAL( markChanged(QString, QDocumentLineHandle*, int, bool) ), - QLineMarksInfoCenter::instance(), - SLOT ( markChanged(QString, QDocumentLineHandle*, int, bool) ) ); - - m_doc = new QDocument(this); - - connect(m_doc , SIGNAL( formatsChange (int, int) ), - this , SLOT ( repaintContent(int, int) ) ); - - connect(m_doc , SIGNAL( contentsChange(int, int) ), - this , SLOT ( updateContent (int, int) ) ); - - connect(m_doc , SIGNAL( formatsChanged() ), - viewport() , SLOT ( update() ) ); - - connect(m_doc , SIGNAL( widthChanged(int) ), - this , SLOT ( documentWidthChanged(int) ) ); - - connect(m_doc , SIGNAL( heightChanged(int) ), - this , SLOT ( documentHeightChanged(int) ) ); - - connect(m_doc , SIGNAL( cleanChanged(bool) ), - this , SLOT ( setContentClean(bool) ) ); - - connect(m_doc , SIGNAL( undoAvailable(bool) ), - this , SIGNAL( undoAvailable(bool) ) ); - - connect(m_doc , SIGNAL( redoAvailable(bool) ), - this , SIGNAL( redoAvailable(bool) ) ); - - connect(m_doc , SIGNAL( markChanged(QDocumentLineHandle*, int, bool) ), - this , SLOT ( markChanged(QDocumentLineHandle*, int, bool) ) ); - - connect(m_doc , SIGNAL( lineEndingChanged(int) ), - this , SLOT ( lineEndingChanged(int) ) ); - - m_cursor = QDocumentCursor(m_doc); - m_cursor.setAutoUpdated(true); - - if ( m_defaultBinding ) - { - m_bindings << m_defaultBinding; - } - - if ( actions ) - { - pMenu = new QMenu; - - QAction *a, *sep; - - a = new QAction(QIcon(":/undo.png"), tr("&Undo"), this); - a->setObjectName("undo"); - Q_SHORTCUT(a, "Ctrl+Z", "Edit"); - a->setEnabled(false); - connect(this , SIGNAL( undoAvailable(bool) ), - a , SLOT ( setEnabled(bool) ) ); - connect(a , SIGNAL( triggered() ), - this , SLOT ( undo() ) ); - - addAction(a, "&Edit", "Edit"); - - a = new QAction(QIcon(":/redo.png"), tr("&Redo"), this); - a->setObjectName("redo"); - Q_SHORTCUT(a, "Ctrl+Y", "Edit"); - a->setEnabled(false); - connect(this , SIGNAL( redoAvailable(bool) ), - a , SLOT ( setEnabled(bool) ) ); - connect(a , SIGNAL( triggered() ), - this , SLOT ( redo() ) ); - - addAction(a, "&Edit", "Edit"); - - sep = new QAction(this); - sep->setSeparator(true); - addAction(sep, "&Edit", "Edit"); - - a = new QAction(QIcon(":/cut.png"), tr("Cu&t"), this); - a->setObjectName("cut"); - Q_SHORTCUT(a, "Ctrl+X", "Edit"); - a->setEnabled(false); - connect(this, SIGNAL( copyAvailable(bool) ), - a , SLOT ( setEnabled(bool) ) ); - connect(a , SIGNAL( triggered() ), - this, SLOT ( cut() ) ); - - addAction(a, "&Edit", "Edit"); - - a = new QAction(QIcon(":/copy.png"), tr("&Copy"), this); - a->setObjectName("copy"); - Q_SHORTCUT(a, "Ctrl+C", "Edit"); - a->setEnabled(false); - connect(this , SIGNAL( copyAvailable(bool) ), - a , SLOT ( setEnabled(bool) ) ); - connect(a , SIGNAL( triggered() ), - this , SLOT ( copy() ) ); - - addAction(a, "&Edit", "Edit"); - - a = new QAction(QIcon(":/paste.png"), tr("&Paste"), this); - a->setObjectName("paste"); - //aPaste->setEnabled(QApplication::clipboard()->text().count()); - Q_SHORTCUT(a, "Ctrl+V", "Edit"); - connect(QApplication::clipboard() , SIGNAL( dataChanged() ), - this , SLOT ( checkClipboard() ) ); - - connect(a , SIGNAL( triggered() ), - this, SLOT ( paste() ) ); - - addAction(a, "&Edit", "Edit"); - - sep = new QAction(this); - sep->setSeparator(true); - addAction(sep, "&Edit", "Edit"); - - a = new QAction(QIcon(":/indent.png"), tr("&Indent"), this); - a->setObjectName("indent"); - Q_SHORTCUT(a, "Ctrl+I", "Edit"); - connect(a , SIGNAL( triggered() ), - this, SLOT ( indentSelection() ) ); - - addAction(a, "&Edit", "Edit"); - - a = new QAction(QIcon(":/unindent.png"), tr("&Unindent"), this); - a->setObjectName("unindent"); - Q_SHORTCUT(a, "Ctrl+Shift+I", "Edit"); - connect(a , SIGNAL( triggered() ), - this, SLOT ( unindentSelection() ) ); - - addAction(a, "&Edit", "Edit"); - - sep = new QAction(this); - sep->setSeparator(true); - addAction(sep, "&Edit", ""); - - a = new QAction(QIcon(":/comment.png"), tr("Co&mment"), this); - a->setObjectName("comment"); - Q_SHORTCUT(a, "Ctrl+D", "Edit"); - connect(a , SIGNAL( triggered() ), - this, SLOT ( commentSelection() ) ); - - addAction(a, "&Edit", "Edit"); - - a = new QAction(QIcon(":/uncomment.png"), tr("Unc&omment"), this); - a->setObjectName("uncomment"); - Q_SHORTCUT(a, "Ctrl+Shift+D", "Edit"); - connect(a , SIGNAL( triggered() ), - this, SLOT ( uncommentSelection() ) ); - - addAction(a, "&Edit", "Edit"); - - sep = new QAction(this); - sep->setSeparator(true); - addAction(sep, "&Edit", ""); - - a = new QAction(tr("&Select all"), this); - a->setObjectName("selectAll"); - Q_SHORTCUT(a, "Ctrl+A", "Edit"); - connect(a , SIGNAL( triggered() ), - this, SLOT ( selectAll() ) ); - - addAction(a, "&Edit", "Edit"); - - sep = new QAction(this); - sep->setSeparator(true); - addAction(sep, QString()); - - a = new QAction(QIcon(":/find.png"), tr("&Find"), this); - a->setObjectName("find"); - Q_SHORTCUT(a, "Ctrl+F", "Search"); - connect(a , SIGNAL( triggered() ), - this, SLOT ( find() ) ); - - addAction(a, "&Search", "Search"); - - a = new QAction(QIcon(":/next.png"), tr("Fin&d next"), pMenu); - a->setObjectName("findNext"); - Q_SHORTCUT(a, "F3", "Search"); - connect(a , SIGNAL( triggered() ), - this, SLOT ( findNext() ) ); - - addAction(a, "&Search", "Search"); - - a = new QAction(QIcon(":/replace.png"), tr("&Replace"), this); - a->setObjectName("replace"); - Q_SHORTCUT(a, "Ctrl+R", "Search"); - connect(a , SIGNAL( triggered() ), - this, SLOT ( replace() ) ); - - addAction(a, "&Search", "Search"); - - sep = new QAction(this); - sep->setSeparator(true); - addAction(sep, "&Search", "Search"); - - a = new QAction(QIcon(":/goto.png"), tr("&Goto line..."), this); - a->setObjectName("goto"); - Q_SHORTCUT(a, "Ctrl+G", "Search"); - connect(a , SIGNAL( triggered() ), - this, SLOT ( gotoLine() ) ); - - addAction(a, "&Search", "Search"); - - sep = new QAction(this); - sep->setSeparator(true); - addAction(sep, "&Edit", ""); - - a = new QAction(tr("Dynamic line wrapping"), this); - a->setObjectName("wrap"); - a->setCheckable(true); - a->setChecked(flag(LineWrap)); - - addAction(a, "&Edit", ""); - - Q_SHORTCUT(a, "F10", "Edit"); - connect(a , SIGNAL( toggled(bool) ), - this, SLOT ( setLineWrapping(bool) ) ); - - - m_bindingsMenu = new QMenu(tr("Input binding"), this); - m_bindingsActions = new QActionGroup(m_bindingsMenu); - //m_bindingsActions->setExclusive(true); - - connect(m_bindingsActions , SIGNAL( triggered(QAction*) ), - this , SLOT ( bindingSelected(QAction*) ) ); - - aDefaultBinding = new QAction(tr("Default"), m_bindingsMenu); - aDefaultBinding->setCheckable(true); - aDefaultBinding->setData("default"); - - m_bindingsMenu->addAction(aDefaultBinding); - m_bindingsMenu->addSeparator(); - m_bindingsActions->addAction(aDefaultBinding); - m_registeredBindings["default"] = 0; - - updateBindingsMenu(); - - m_bindingsMenu->menuAction()->setObjectName("bindings"); - addAction(m_bindingsMenu->menuAction(), "&Edit", ""); - - sep = new QAction(this); - sep->setSeparator(true); - addAction(sep, QString()); - - m_lineEndingsMenu = new QMenu(tr("Line endings"), this); - m_lineEndingsActions = new QActionGroup(m_lineEndingsMenu); - m_lineEndingsActions->setExclusive(true); - - connect(m_lineEndingsActions, SIGNAL( triggered(QAction*) ), - this , SLOT ( lineEndingSelected(QAction*) ) ); - - m_lineEndingsActions->addAction(tr("Conservative"))->setData("conservative"); - m_lineEndingsActions->addAction(tr("Local"))->setData("local"); - m_lineEndingsActions->addAction(tr("Unix/Linux"))->setData("unix"); - m_lineEndingsActions->addAction(tr("Dos/Windows"))->setData("dos"); - m_lineEndingsActions->addAction(tr("Old Mac"))->setData("mac"); - - QList<QAction*> lle = m_lineEndingsActions->actions(); - - foreach ( QAction *a, lle ) - { - a->setCheckable(true); - m_lineEndingsMenu->addAction(a); - } - - lle.at(0)->setChecked(true); - - m_lineEndingsMenu->menuAction()->setObjectName("lineEndings"); - addAction(m_lineEndingsMenu->menuAction(), "&Edit", ""); - - /* - sep = new QAction(this); - sep->setSeparator(true); - addAction(sep, QString()); - */ - } -} - -/*! - \return wether the flag \a f is set -*/ -bool QEditor::flag(EditFlag f) const -{ - return m_state & f; -} - -/*! - \brief Sets the flag \a f -*/ -void QEditor::setFlag(EditFlag f, bool b) -{ - if ( b ) - { - m_state |= f; - - if ( f == LineWrap ) - { - if ( isVisible() ) - m_doc->setWidthConstraint(wrapWidth()); - - m_cursor.refreshColumnMemory(); - - QAction *a = m_actions.value("wrap"); - - if ( a && !a->isChecked() ) - a->setChecked(true); - } - } else { - m_state &= ~f; - - if ( f == LineWrap ) - { - if ( isVisible() ) - m_doc->clearWidthConstraint(); - - m_cursor.refreshColumnMemory(); - - QAction *a = m_actions.value("wrap"); - - if ( a && a->isChecked() ) - a->setChecked(false); - } - } - - // TODO : only update cpos if cursor used to be visible? - if ( f == LineWrap ) - ensureCursorVisible(); - -} - -/*! - \return whether it is possible to call undo() -*/ -bool QEditor::canUndo() const -{ - return m_doc ? m_doc->canUndo() : false; -} - -/*! - \return whether it is possible to call redo() -*/ -bool QEditor::canRedo() const -{ - return m_doc ? m_doc->canRedo() : false; -} - -/*! - \brief Set line wrapping - \param on line wrap on/off - - \note the function also enables "cursor movement within wrapped lines" - which can be disabled manually using setFlag(QEditor::CursorJumpPastWrap, false); -*/ -void QEditor::setLineWrapping(bool on) -{ - setFlag(LineWrap, on); - setFlag(CursorJumpPastWrap, on); -} - -/*! - \return The whole text being edited -*/ -QString QEditor::text() const -{ - return m_doc ? m_doc->text() : QString(); -} - -/*! - \return The text at a given line - \param line text line to extract, using C++ array conventions (start at zero) -*/ -QString QEditor::text(int line) const -{ - return m_doc ? m_doc->line(line).text() : QString(); -} - -/*! - \brief Set the text of the underlying document and update display -*/ -void QEditor::setText(const QString& s) -{ - clearPlaceHolders(); - - if ( m_doc ) - m_doc->setText(s); - - setCursor(QDocumentCursor(m_doc)); - - documentWidthChanged(m_doc->width()); - documentHeightChanged(m_doc->height()); - viewport()->update(); -} - -/*! - \brief Save the underlying document to a file - - \see fileName() -*/ -void QEditor::save() -{ - if ( !m_doc ) - return; - - QString oldFileName = fileName(); - - if ( fileName().isEmpty() ) - { - QString fn = QFileDialog::getSaveFileName(); - - if ( fn.isEmpty() ) - return; - - setFileName(fn); - } else if ( isInConflict() ) { - int ret = QMessageBox::warning(this, - tr("Conflict!"), - tr( - "%1\nhas been modified by another application.\n" - "Press \"Save\" to overwrite the file on disk\n" - "Press \"Reset\"to be reload the file from disk.\n" - "Press \"Discard\" to ignore this warning.\n" - ).arg(fileName()), - QMessageBox::Save - | - QMessageBox::Reset - | - QMessageBox::Discard - | - QMessageBox::Cancel - ); - if ( ret == QMessageBox::Save ) - { - m_saveState = Undefined; - } else if ( ret == QMessageBox::Reset ) { - load(fileName()); - m_saveState = Undefined; - return; - } else if ( ret == QMessageBox::Discard ) { - m_saveState = Undefined; - return; - } else { - return; - } - } - - m_saveState = Saving; - - if ( oldFileName.count() ) - { - watcher()->removeWatch(oldFileName, this); - } - - QFile f(fileName()); - - if ( !f.open(QFile::WriteOnly) ) - { - m_saveState = Undefined; - reconnectWatcher(); - - return; - } - - //QTextStream s(&f); - //s << text(); - QString txt = m_doc->text(flag(RemoveTrailing), flag(PreserveTrailingIndent)); - - if ( m_codec ) - f.write(m_codec->fromUnicode(txt)); - else - f.write(txt.toLocal8Bit()); - - m_doc->setClean(); - - emit saved(this, fileName()); - m_saveState = Saved; - - QTimer::singleShot(100, this, SLOT( reconnectWatcher() )); - - update(); -} - -/*! - \brief Save the content of the editor to a file - - \note This method renames the editor, stop monitoring the old - file and monitor the new one -*/ -void QEditor::save(const QString& fn) -{ - if ( fileName().count() ) - { - watcher()->removeWatch(fileName(), this); - } - - QFile f(fn); - - if ( !f.open(QFile::WriteOnly) ) - { - m_saveState = Undefined; - reconnectWatcher(); - - return; - } - - QString txt = m_doc->text(flag(RemoveTrailing), flag(PreserveTrailingIndent)); - - if ( m_codec ) - f.write(m_codec->fromUnicode(txt)); - else - f.write(txt.toLocal8Bit()); - - m_doc->setClean(); - - setFileName(fn); - emit saved(this, fn); - m_saveState = Saved; - - QTimer::singleShot(100, this, SLOT( reconnectWatcher() )); -} - -/*! - \internal -*/ -void QEditor::checkClipboard() -{ - // LOOKS LIKE THIS FUNCTION NEVER GETS CALLED DESPITE THE CONNECTION... - - //const QMimeData *d = QApplication::clipboard()->mimeData(); - - //qDebug("checking clipboard : %s", d); - - //QCE_ENABLE_ACTION("paste", d && d->hasText()) -} - -/*! - \internal -*/ -void QEditor::reconnectWatcher() -{ - watcher()->addWatch(fileName(), this); -} - -/*! - \internal -*/ -void QEditor::fileChanged(const QString& file) -{ - if ( (file != fileName()) || (m_saveState == Saving) ) - return; - - /* - if ( m_saveState == Saved ) - { - qApp->processEvents(); - - m_saveState = Undefined; - return; - } - */ - - if ( !isContentModified() ) - { - // silently reload file if the editor contains no modification? - // -> result in undo/redo history loss, still ask confirmation ? - bool autoReload = true; - - if ( canUndo() || canRedo() ) - { - int ret = QMessageBox::warning(this, - tr("File changed"), - tr( - "%1\nhas been modified by another application.\n\n" - "Undo/Redo stack would be discarded by the auto-reload.\n" - "Do you wish to keep up to date by reloading the file?" - ).arg(fileName()), - QMessageBox::Yes - | - QMessageBox::No - ); - - if ( ret == QMessageBox::No ) - autoReload = false; - } - - if ( autoReload ) - { - load(fileName()); - m_saveState = Undefined; - return; - } - } - - // TODO : check for actual modification (using a checksum?) - // TODO : conflict reversible (checksum again?) - - //qDebug("conflict!"); - m_saveState = Conflict; -} - -/*! - \return Whether a file conflict has been detected - - File conflicts happen when the loaded file is modified - on disk by another application if the text has been - modified in QCE -*/ -bool QEditor::isInConflict() const -{ - return m_saveState == Conflict; -} - -/*! - \brief Print the content of the editor -*/ -void QEditor::print() -{ - if ( !m_doc ) - return; - - QPrinter printer; - - // TODO : create a custom print dialog, page range sucks, lines range would be better - QPrintDialog dialog(&printer, this); - dialog.setEnabledOptions(QPrintDialog::PrintToFile | QPrintDialog::PrintPageRange); - - if ( dialog.exec() == QDialog::Accepted ) - { - m_doc->print(&printer); - } -} - -/*! - \brief Show the search/replace panel, if any -*/ -void QEditor::find() -{ - QCodeEdit *m = QCodeEdit::manager(this); - - if ( m ) - { - // makes sense hiding this one if present... - m->sendPanelCommand("Goto", "hide"); - - m->sendPanelCommand("Search", - "display", - Q_COMMAND - << Q_ARG(int, 1) - << Q_ARG(bool, false) - ); - - } else { - qDebug("Unmanaged QEditor"); - } -} - -/*! - \brief Ask the search/replace panel, if any, to move to next match -*/ -void QEditor::findNext() -{ - QCodeEdit *m = QCodeEdit::manager(this); - - if ( m ) - { - // makes sense hiding this one if present... - m->sendPanelCommand("Goto", "hide"); - - m->sendPanelCommand("Search", - "find", - Q_COMMAND - << Q_ARG(int, -1) - ); - - } else { - qDebug("Unmanaged QEditor"); - } -} - -/*! - \brief Show the search/replace panel, if any -*/ -void QEditor::replace() -{ - QCodeEdit *m = QCodeEdit::manager(this); - - if ( m ) - { - // makes sense hiding this one if present... - m->sendPanelCommand("Goto", "hide"); - - m->sendPanelCommand("Search", - "display", - Q_COMMAND - << Q_ARG(int, 1) - << Q_ARG(bool, true) - ); - - } else { - qDebug("Unmanaged QEditor"); - } -} - -/*! - \brief Show a panel or dialog to go to a specific line -*/ -void QEditor::gotoLine() -{ - QCodeEdit *m = QCodeEdit::manager(this); - - if ( m && m->hasPanel("Goto") ) - { - // makes sense hiding this one if present... - m->sendPanelCommand("Search", "hide"); - - m->sendPanelCommand("Goto", "show"); - } else { - QGotoLineDialog dlg(this); - - dlg.exec(this); - } -} - -/*! - \brief Run time translation entry point for compat with Edyuk -*/ -void QEditor::retranslate() -{ - QCE_TR_ACTION("undo", tr("&Undo")) - QCE_TR_ACTION("redo", tr("&Redo")) - - QCE_TR_ACTION("cut", tr("Cu&t")) - QCE_TR_ACTION("copy", tr("&Copy")) - QCE_TR_ACTION("paste", tr("&Paste")) - - QCE_TR_ACTION("indent", tr("&Indent")) - QCE_TR_ACTION("unindent", tr("&Unindent")) - QCE_TR_ACTION("comment", tr("Co&mment")) - QCE_TR_ACTION("uncomment", tr("Unc&omment")) - - QCE_TR_ACTION("selectAll", tr("&Select all")) - - QCE_TR_ACTION("find", tr("&Find")) - QCE_TR_ACTION("findNext", tr("Fin&d next")) - QCE_TR_ACTION("replace", tr("&Replace")) - - QCE_TR_ACTION("goto", tr("&Goto line...")) - - if ( m_completionEngine ) - m_completionEngine->retranslate(); - - if ( m_bindingsMenu ) - m_bindingsMenu->setTitle(tr("Input binding")); - - if ( aDefaultBinding ) - aDefaultBinding->setText(tr("Default")); - - #ifdef _QMDI_ - menus.setTranslation("&Edit", tr("&Edit")); - menus.setTranslation("&Search", tr("&Search")); - - toolbars.setTranslation("Edit", tr("Edit")); - toolbars.setTranslation("Search", tr("Search")); - #endif -} - -/*! - \return the action associated with a given name, if the QEditor has been created with actions on -*/ -QAction* QEditor::action(const QString& s) -{ - QHash<QString, QAction*>::const_iterator it = m_actions.constFind(s); - - return it != m_actions.constEnd() ? *it : 0; -} - -/*! - \brief Add an action to the editor - \param a action to add - \param menu if not empty (and if QCE is built with qmdilib support) the action will be added to that menu - \param toolbar similar to \a menu but acts on toolbars - - \see removeAction() -*/ -void QEditor::addAction(QAction *a, const QString& menu, const QString& toolbar) -{ - if ( !a ) - return; - - QWidget::addAction(a); - - m_actions[a->objectName()] = a; - - if ( pMenu && menu.count() ) - { - pMenu->addAction(a); - - #ifdef _QMDI_ - menus[menu]->addAction(a); - #endif - } - - if ( toolbar.count() ) - { - #ifdef _QMDI_ - toolbars[toolbar]->addAction(a); - #endif - } -} - -/*! - \brief remove an action form the editor - \param a action to add - \param menu if not empty (and if QCE is built with qmdilib support) the action will be added to that menu - \param toolbar similar to \a menu but acts on toolbars - - \see addAction() -*/ -void QEditor::removeAction(QAction *a, const QString& menu, const QString& toolbar) -{ - if ( !a ) - return; - - QWidget::removeAction(a); - - //m_actions.remove(a->objectName()); - - if ( pMenu ) - pMenu->removeAction(a); - - #ifdef _QMDI_ - if ( menu.count() ) - { - menus[menu]->removeAction(a); - } - - if ( toolbar.count() ) - { - toolbars[toolbar]->removeAction(a); - } - #else - Q_UNUSED(menu) - Q_UNUSED(toolbar) - #endif -} - -/*! - \brief load a text file - \param file file to load - - If the file cannot be loaded, previous content is cleared. -*/ -void QEditor::load(const QString& file) -{ - QFile f(file); - - // gotta handle line endings ourselves if we want to detect current line ending style... - //if ( !f.open(QFile::Text | QFile::ReadOnly) ) - if ( !f.open(QFile::ReadOnly) ) - { - setText(QString()); - return; - } - - const int size = f.size(); - //const int size = m_lastFileState.size = f.size(); - - if ( size < 500000 ) - { - // instant load for files smaller than 500kb - QByteArray d = f.readAll(); - //m_lastFileState.checksum = qChecksum(d.constData(), d.size()); - if ( m_codec ) - setText(m_codec->toUnicode(d)); - else - setText(QString::fromLocal8Bit(d)); - } else { - // load by chunks of 100kb otherwise to avoid huge peaks of memory usage - // and driving mad the disk drivers - - int count = 0; - QByteArray ba; - - m_doc->startChunkLoading(); - //m_lastFileState.checksum = 0; - - do - { - ba = f.read(100000); - count += ba.count(); - - //m_lastFileState.checksum ^= qChecksum(ba.constData(), ba.size()); - - if ( m_codec ) - m_doc->addChunk(m_codec->toUnicode(ba)); - else - m_doc->addChunk(QString::fromLocal8Bit(ba)); - - } while ( (count < size) && ba.count() ); - - m_doc->stopChunkLoading(); - - setCursor(QDocumentCursor(m_doc)); - - documentWidthChanged(m_doc->width()); - documentHeightChanged(m_doc->height()); - } - - m_doc->setLastModified(QFileInfo(file).lastModified()); - - //qDebug("checksum = %i", m_lastFileState.checksum); - - if ( m_lineEndingsActions ) - { - // TODO : update Conservative to report original line endings - static const QRegExp rx(" \\[\\w+\\]"); - QAction *a = m_lineEndingsActions->actions().at(0); - - if ( a ) - { - QDocument::LineEnding le = m_doc->originalLineEnding(); - - QString det, txt = a->text(); - txt.remove(rx); - - if ( le == QDocument::Windows ) - det = tr("Windows"); - else if ( le == QDocument::OldMac ) - det = tr("Old Mac"); - else if ( le == QDocument::Unix ) - det = tr("Unix"); - - if ( det.count() ) - { - txt += " ["; - txt += det; - txt += ']'; - } - - a->setText(txt); - } - } - - setFileName(file); - - emit loaded(this, file); -} - -/*! - \return a pointer to the underlying QDocument object -*/ -QDocument* QEditor::document() const -{ - return m_doc; -} - -/*! - \internal -*/ -void QEditor::setDocument(QDocument *d) -{ - Q_UNUSED(d) - - qWarning("QEditor::setDocument() is not working yet..."); -} - -/*! - \return The text codec to use for load/save operations -*/ -QTextCodec* QEditor::codec() const -{ - return m_codec; -} - -/*! - \overload -*/ -void QEditor::setCodec(int mib) -{ - setCodec(QTextCodec::codecForMib(mib)); -} - -/*! - \overload -*/ -void QEditor::setCodec(const char *name) -{ - setCodec(QTextCodec::codecForName(name)); -} - -/*! - \overload -*/ -void QEditor::setCodec(const QByteArray& name) -{ - setCodec(QTextCodec::codecForName(name)); -} - -/*! - \brief Set the text codec to use for load/save operations -*/ -void QEditor::setCodec(QTextCodec *c) -{ - if ( c == m_codec ) - return; - - m_codec = c; - - // TODO : reload file? - if ( fileName().count() && QFile::exists(fileName()) ) - { - if ( !isContentModified() ) - { - load(fileName()); - } - } -} - -/*! - \brief Force a full re-highlighting of the document -*/ -void QEditor::highlight() -{ - m_doc->highlight(); - //updateContent(0, m_doc->lines()); -} - -/*! - \return the current InputBinding -*/ -QList<QEditorInputBindingInterface*> QEditor::inputBindings() const -{ - return m_bindings; -} - -/*! - \brief Set the current input binding -*/ -void QEditor::addInputBinding(QEditorInputBindingInterface *b) -{ - if ( b ) - m_bindings << b; - - if ( !aDefaultBinding || !m_bindingsActions ) - return; - - QString id = b ? b->id() : QString(); - aDefaultBinding->setChecked(!b); - - if ( !b ) - return; - - QList<QAction*> actions = m_bindingsActions->actions(); - - foreach ( QAction *a, actions ) - { - if ( a->data().toString() != id ) - a->setChecked(true); - } -} - -/*! - \brief Set the current input binding -*/ -void QEditor::removeInputBinding(QEditorInputBindingInterface *b) -{ - int n = m_bindings.removeAll(b); - - if ( !aDefaultBinding || !m_bindingsActions || !n ) - return; - - QString id = b ? b->id() : QString(); - aDefaultBinding->setChecked(!b); - - if ( !b ) - return; - - QList<QAction*> actions = m_bindingsActions->actions(); - - foreach ( QAction *a, actions ) - { - if ( a->data().toString() != id ) - a->setChecked(false); - } -} - -/*! - \brief Set the current input binding -*/ -void QEditor::setInputBinding(QEditorInputBindingInterface *b) -{ - m_bindings.clear(); - - if ( b ) - m_bindings << b; - - if ( !aDefaultBinding || !m_bindingsActions ) - return; - - QString id = b ? b->id() : QString(); - aDefaultBinding->setChecked(!b); - - if ( !b ) - return; - - QList<QAction*> actions = m_bindingsActions->actions(); - - foreach ( QAction *a, actions ) - { - if ( a ) - a->setChecked(a->data().toString() != id); - } -} - -/*! - \internal -*/ -void QEditor::updateBindingsMenu() -{ - if ( !aDefaultBinding || !m_bindingsMenu || !m_bindingsActions ) - return; - - QStringList bindings = registeredInputBindingIds(); - QList<QAction*> actions = m_bindingsActions->actions(); - - aDefaultBinding->setChecked(m_bindings.contains(m_defaultBinding)); - - foreach ( QAction *a, actions ) - { - int idx = bindings.indexOf(a->data().toString()); - - if ( idx == -1 ) - { - m_bindingsMenu->removeAction(a); - m_bindingsActions->removeAction(a); - delete a; - } else { - bindings.removeAt(idx); - - foreach ( QEditorInputBindingInterface *b, m_bindings ) - if ( a->data().toString() == b->id() ) - a->setChecked(true); - - } - } - - bindings.removeAll("default"); - - foreach ( QString s, bindings ) - { - QEditorInputBindingInterface *b = m_registeredBindings.value(s); - - if ( !b ) - continue; - - QAction *a = new QAction(b->name(), m_bindingsMenu); - a->setData(b->id()); - a->setCheckable(true); - - m_bindingsActions->addAction(a); - m_bindingsMenu->addAction(a); - } -} - -/*! - \internal -*/ -void QEditor::bindingSelected(QAction *a) -{ - //a = m_bindingsActions->checkedAction(); - - if ( !a ) - return; - - QEditorInputBindingInterface *b = m_registeredBindings.value(a->data().toString()); - - if ( a->isChecked() ) - addInputBinding(b); - else - removeInputBinding(b); - - //qDebug("setting binding to %s [0x%x]", qPrintable(a->data().toString()), m_binding); - - updateMicroFocus(); -} - -/*! - \internal -*/ -void QEditor::lineEndingSelected(QAction *a) -{ - a = m_lineEndingsActions->checkedAction(); - - if ( !a ) - return; - - QString le = a->data().toString(); - - if ( le == "conservative" ) - m_doc->setLineEnding(QDocument::Conservative); - else if ( le == "local" ) - m_doc->setLineEnding(QDocument::Local); - else if ( le == "unix" ) - m_doc->setLineEnding(QDocument::Unix); - else if ( le == "dos" ) - m_doc->setLineEnding(QDocument::Windows); - else if ( le == "mac" ) - m_doc->setLineEnding(QDocument::OldMac); - - - updateMicroFocus(); -} - -/*! - \internal -*/ -void QEditor::lineEndingChanged(int lineEnding) -{ - if ( !m_lineEndingsActions ) - return; - - QAction *a = m_lineEndingsActions->checkedAction(), - *n = m_lineEndingsActions->actions().at(lineEnding); - - if ( a != n ) - n->setChecked(true); - -} - -/*! - \return the current cursor -*/ -QDocumentCursor QEditor::cursor() const -{ - QDocumentCursor copy = m_cursor; - copy.setAutoUpdated(false); - return copy; -} - -/*! - \brief Set the document cursor -*/ -void QEditor::setCursor(const QDocumentCursor& c) -{ - repaintCursor(); - - m_cursor = c.isValid() ? c : QDocumentCursor(m_doc); - m_cursor.setAutoUpdated(true); - clearCursorMirrors(); - - if ( m_curPlaceHolder != -1 ) - { - const PlaceHolder& ph = m_placeHolders[m_curPlaceHolder]; - - if ( !ph.cursor.isWithinSelection(m_cursor) ) - { - m_curPlaceHolder = -1; - viewport()->update(); - } - } - - emitCursorPositionChanged(); - - setFlag(CursorOn, true); - repaintCursor(); - ensureCursorVisible(); - selectionChange(); - - updateMicroFocus(); -} - -/*! - \brief Set the cursor - \param line document line to move the cursor to (start at zero) - \param index column index of the new cursor (start at zero) -*/ -void QEditor::setCursorPosition(int line, int index) -{ - setCursor(QDocumentCursor(m_doc, line, index)); -} - -/*! - \brief Write the current cursor position to to integers -*/ -void QEditor::getCursorPosition(int &line, int &index) -{ - line = m_cursor.lineNumber(); - index = m_cursor.columnNumber(); -} - -/*! - \return the number of cursor mirrors currently used -*/ -int QEditor::cursorMirrorCount() const -{ - return m_mirrors.count(); -} - -/*! - \return the cursor mirror at index \a i - - Index has no extra meaning : you cannot deduce anything about - the cursor mirror it corresponds to from it. For instance, the - cursor mirror at index 0 is neither the first mirror added nor - the one at smallest document position (well : it *might* be but - that would be a coincidence...) -*/ -QDocumentCursor QEditor::cursorMirror(int i) const -{ - return i >= 0 && i < m_mirrors.count() ? m_mirrors.at(i) : QDocumentCursor(); -} - -/*! - \brief Clear all placeholders -*/ -void QEditor::clearPlaceHolders() -{ - bool updateView = m_placeHolders.count() && m_curPlaceHolder != -1; - - m_curPlaceHolder = -1; - - for ( int i = 0; i < m_placeHolders.count(); ++i ) - { - PlaceHolder& ph = m_placeHolders[i]; - - ph.cursor.setAutoUpdated(false); - - for ( int j = 0; j < ph.mirrors.count(); ++j ) - { - ph.mirrors[j].setAutoUpdated(false); - } - - ph.mirrors.clear(); - } - - m_placeHolders.clear(); - - if ( updateView ) - viewport()->update(); - -} - -/*! - \brief Add a placeholder - \param p placeholder data - \param autoUpdate whether to force auto updating of all cursors used by the placeholder - - Auto update is on by default and it is recommended not to disable it unless you know what you are doing. -*/ -void QEditor::addPlaceHolder(const PlaceHolder& p, bool autoUpdate) -{ - m_placeHolders << p; - - PlaceHolder& ph = m_placeHolders.last(); - - ph.cursor.setAutoUpdated(autoUpdate); - ph.cursor.movePosition(ph.length, QDocumentCursor::NextCharacter, QDocumentCursor::KeepAnchor); - - for ( int i = 0; i < ph.mirrors.count(); ++i ) - { - ph.mirrors[i].setAutoUpdated(autoUpdate); - ph.mirrors[i].movePosition(ph.length, QDocumentCursor::NextCharacter, QDocumentCursor::KeepAnchor); - } -} - -/*! - \brief Remove a placeholder - \param i placeholder index - - \note if the current placeholder is removed there will be NO automatic switching to a remaining one. -*/ -void QEditor::removePlaceHolder(int id) -{ - if ( id == m_curPlaceHolder) - clearCursorMirrors(); - - PlaceHolder& ph = m_placeHolders[id]; - - for ( int i = 0; i < ph.mirrors.count(); ++i ) - ph.mirrors[i].setAutoUpdated(false); - - ph.mirrors.clear(); - ph.cursor.setAutoUpdated(false); - m_placeHolders.removeAt(id); - - if ( id < m_curPlaceHolder ) - --m_curPlaceHolder; - -} - -/*! - \return the number of placeholders currently set -*/ -int QEditor::placeHolderCount() const -{ - return m_placeHolders.count(); -} - -/*! - \return the id of the current placeholder -*/ -int QEditor::currentPlaceHolder() const -{ - return m_curPlaceHolder; -} - -/*! - \brief Set the current placeholder to use - - This function change the cursor and the cursor mirrors. -*/ -void QEditor::setPlaceHolder(int i) -{ - if ( i < 0 || i >= m_placeHolders.count() ) - return; - - clearCursorMirrors(); - - const PlaceHolder& ph = m_placeHolders.at(i); - QDocumentCursor cc = ph.cursor; - - setCursor(cc); - - /* - ditch cursor mirrors in favor of QDocumentCursor::replaceSelectedText() - - * workaround mirror limitations re movement (no way to ensure proper - synchronization when moving up/down) - - * make it relatively easy to implement affectors - */ - - m_curPlaceHolder = i; - - viewport()->update(); -} - -/*! - \brief Move to next placeholder - - \see setPlaceHolder -*/ -void QEditor::nextPlaceHolder() -{ - if ( m_placeHolders.isEmpty() ) - return; - - ++m_curPlaceHolder; - - if ( m_curPlaceHolder >= m_placeHolders.count() ) - m_curPlaceHolder = 0; - - setPlaceHolder(m_curPlaceHolder); -} - -/*! - \brief Move to previous placeholder - - \see setPlaceHolder -*/ -void QEditor::previousPlaceHolder() -{ - if ( m_placeHolders.isEmpty() ) - return; - - if ( m_curPlaceHolder <= 0 ) - m_curPlaceHolder = m_placeHolders.count(); - - --m_curPlaceHolder; - - setPlaceHolder(m_curPlaceHolder); -} - -/*! - \return the code completion engine set to this editor, if any -*/ -QCodeCompletionEngine* QEditor::completionEngine() const -{ - return m_completionEngine; -} - -/*! - \brief Set a code completion engine to the editor - - \warning Most completion engines can only be attached - to a single editor due to issues in the widget used to - dispaly matches so you got to clone them and, as a consequence - QEditor will take ownership of the completion engines - and delete them. -*/ -void QEditor::setCompletionEngine(QCodeCompletionEngine *e) -{ - if ( m_completionEngine ) - { - m_completionEngine->setEditor(0); - m_completionEngine->deleteLater(); - } - - m_completionEngine = e; - - if ( m_completionEngine ) - { - m_completionEngine->setEditor(this); - } -} - -/*! - \return the language definition set to this editor, if any -*/ -QLanguageDefinition* QEditor::languageDefinition() const -{ - return m_definition; -} - -/*! - \brief Set a language definition to the editor -*/ -void QEditor::setLanguageDefinition(QLanguageDefinition *d) -{ - m_definition = d; - - if ( m_doc ) - m_doc->setLanguageDefinition(d); - - if ( m_definition ) - { - bool cuc = d->singleLineComment().count(); - - QCE_ENABLE_ACTION("comment", cuc) - QCE_ENABLE_ACTION("uncomment", cuc) - } else { - QCE_ENABLE_ACTION("comment", false) - QCE_ENABLE_ACTION("uncomment", false) - } -} - -/*! - \return the line at a given viewport position -*/ -QDocumentLine QEditor::lineAtPosition(const QPoint& p) const -{ - return m_doc ? m_doc->lineAt(p) : QDocumentLine(); -} - -/*! - \return The cursor object nearest to the given viewport position -*/ -QDocumentCursor QEditor::cursorForPosition(const QPoint& p) const -{ - //qDebug("cursor for : (%i, %i)", p.x(), p.y()); - - return m_doc ? m_doc->cursorAt(p) : QDocumentCursor(); -} - -/*! - \brief Set the cursor to that nearest to a given viewport position -*/ -void QEditor::setCursorPosition(const QPoint& p) -{ - //qDebug("cursor for : (%i, %i)", p.x(), p.y()); - - QDocumentCursor c = cursorForPosition(p); - - if ( c.isValid() ) - { - setCursor(c); - } -} - -/*! - \brief Emitted whenever the position of the cursor changes -*/ -void QEditor::emitCursorPositionChanged() -{ - emit cursorPositionChanged(); - emit copyAvailable(m_cursor.hasSelection()); - - if ( m_definition ) - m_definition->match(m_cursor); - - if ( m_doc->impl()->hasMarks() ) - QLineMarksInfoCenter::instance()->cursorMoved(this); - -} - -/*! - \brief Undo the last editing operation, if any on the stack -*/ -void QEditor::undo() -{ - if ( m_doc ) - { - if ( m_definition ) - m_definition->clearMatches(m_doc); - - m_doc->undo(); - - selectionChange(); - ensureCursorVisible(); - setFlag(CursorOn, true); - emitCursorPositionChanged(); - repaintCursor(); - } -} - -/*! - \brief Redo the last undone editing operation, if any on the stack -*/ -void QEditor::redo() -{ - if ( m_doc ) - { - if ( m_definition ) - m_definition->clearMatches(m_doc); - - m_doc->redo(); - - selectionChange(); - ensureCursorVisible(); - setFlag(CursorOn, true); - emitCursorPositionChanged(); - repaintCursor(); - } -} - -/*! - \brief Cut the selected text, if any -*/ -void QEditor::cut() -{ - copy(); - - bool macro = m_mirrors.count(); - - if ( macro ) - m_doc->beginMacro(); - - m_cursor.removeSelectedText(); - - for ( int i = 0; i < m_mirrors.count(); ++i ) - m_mirrors[i].removeSelectedText(); - - if ( macro ) - m_doc->endMacro(); - - clearCursorMirrors(); - - ensureCursorVisible(); - setFlag(CursorOn, true); - emitCursorPositionChanged(); - repaintCursor(); -} - -/*! - \brief Copy the selected text, if any - - \note Column selection may be created but the can only be copied properly in a QCE editor -*/ -void QEditor::copy() -{ - if ( !m_cursor.hasSelection() ) - return; - - QMimeData *d = createMimeDataFromSelection(); - QApplication::clipboard()->setMimeData(d); - - //qDebug("%s", qPrintable(m_cursor.selectedText())); - //QApplication::clipboard()->setText(m_cursor.selectedText()); -} - -/*! - \brief Paste text from the clipboard to the current cursor position - - \note May paste column selections from other QCE editors -*/ -void QEditor::paste() -{ - const QMimeData *d = QApplication::clipboard()->mimeData(); - - if ( d ) - insertFromMimeData(d); -} - -static bool unindent(const QDocumentCursor& cur) -{ - QDocumentLine beg(cur.line()); - int r = 0, n = 0, t = QDocument::tabStop(); - QString txt = beg.text().left(beg.firstChar()); - - while ( txt.count() && (n < t) ) - { - if ( txt.at(txt.length() - 1) == '\t' ) - n += t - (n % t); - else - ++n; - - ++r; - txt.chop(1); - } - - if ( !r ) - return false; - - QDocumentCursor c(cur); - c.setSilent(true); - c.movePosition(1, QDocumentCursor::StartOfBlock, QDocumentCursor::MoveAnchor); - c.movePosition(r, QDocumentCursor::Right, QDocumentCursor::KeepAnchor); - c.removeSelectedText(); - - return true; -} - -static void insert(const QDocumentCursor& cur, const QString& txt) -{ - QDocumentCursor c(cur); - c.setSilent(true); - c.setColumnNumber(0); - c.insertText(txt); -} - -static void removeFromStart(const QDocumentCursor& cur, const QString& txt) -{ - QDocumentLine l = cur.line(); - int pos = l.firstChar(); - - if ( l.text().mid(pos, txt.length()) != txt ) - return; - - QDocumentCursor c(cur.document(), cur.lineNumber(), pos); - c.setSilent(true); - c.movePosition(txt.length(), - QDocumentCursor::NextCharacter, - QDocumentCursor::KeepAnchor); - c.removeSelectedText(); -} - -/*! - \brief Indent the selection -*/ -void QEditor::indentSelection() -{ - // TODO : respect tab stops in case of screwed up indent (correct it?) - - QString txt = flag(ReplaceTabs) ? QString(m_doc->tabStop(), ' ') : QString("\t"); - - if ( m_mirrors.count() ) - { - m_doc->beginMacro(); - - if ( !protectedCursor(m_cursor) ) - insert(m_cursor, txt); - - foreach ( const QDocumentCursor& m, m_mirrors ) - if ( !protectedCursor(m) ) - insert(m, txt); - - m_doc->endMacro(); - - } else if ( !m_cursor.hasSelection() ) { - if ( !protectedCursor(m_cursor) ) - insert(m_cursor, txt); - } else if ( !protectedCursor(m_cursor) ) { - QDocumentSelection s = m_cursor.selection(); - QDocumentCursor c(m_doc, s.startLine); - c.setSilent(true); - c.beginEditBlock(); - - while ( c.isValid() && (c.lineNumber() <= s.endLine) ) - { - c.insertText(txt); - c.movePosition(1, QDocumentCursor::NextLine); - - if ( c.atEnd() ) - break; - } - - c.endEditBlock(); - } -} - -/*! - \brief Unindent the selection -*/ -void QEditor::unindentSelection() -{ - if ( !m_cursor.line().firstChar() ) - return; - - if ( m_mirrors.count() ) - { - m_doc->beginMacro(); - - if ( !protectedCursor(m_cursor) ) - unindent(m_cursor); - - foreach ( const QDocumentCursor& m, m_mirrors ) - unindent(m); - - m_doc->endMacro(); - - } else if ( !m_cursor.hasSelection() ) { - unindent(m_cursor); - } else if ( !protectedCursor(m_cursor) ) { - QDocumentSelection s = m_cursor.selection(); - - m_doc->beginMacro(); - - for ( int i = s.startLine; i <= s.endLine; ++i ) - { - unindent(QDocumentCursor(m_doc, i)); - } - - m_doc->endMacro(); - } -} - -/*! - \brief Comment the selection (or the current line) using single line comments supported by the language -*/ -void QEditor::commentSelection() -{ - if ( !m_definition ) - return; - - QString txt = m_definition->singleLineComment(); - - if ( txt.isEmpty() ) - return; - - if ( m_mirrors.count() ) - { - m_doc->beginMacro(); - - if ( !protectedCursor(m_cursor) ) - insert(m_cursor, txt); - - foreach ( const QDocumentCursor& m, m_mirrors ) - if ( !protectedCursor(m) ) - insert(m, txt); - - m_doc->endMacro(); - - } else if ( !m_cursor.hasSelection() ) { - if ( !protectedCursor(m_cursor) ) - insert(m_cursor, txt); - } else if ( !protectedCursor(m_cursor) ) { - QDocumentSelection s = m_cursor.selection(); - QDocumentCursor c(m_doc, s.startLine); - c.setSilent(true); - c.beginEditBlock(); - - while ( c.isValid() && (c.lineNumber() <= s.endLine) ) - { - c.insertText(txt); - c.movePosition(1, QDocumentCursor::NextLine); - - if ( c.atEnd() ) - break; - } - - c.endEditBlock(); - } -} - -/*! - \brief Uncomment the selection (or current line), provided it has been commented with single line comments -*/ -void QEditor::uncommentSelection() -{ - if ( !m_definition ) - return; - - QString txt = m_definition->singleLineComment(); - - if ( txt.isEmpty() ) - return; - - if ( m_mirrors.count() ) - { - m_doc->beginMacro(); - - if ( !protectedCursor(m_cursor) ) - removeFromStart(m_cursor, txt); - - foreach ( const QDocumentCursor& m, m_mirrors ) - if ( !protectedCursor(m) ) - removeFromStart(m, txt); - - m_doc->endMacro(); - - } else if ( !m_cursor.hasSelection() ) { - if ( !protectedCursor(m_cursor) ) - removeFromStart(m_cursor, txt); - } else if ( !protectedCursor(m_cursor) ) { - QDocumentSelection s = m_cursor.selection(); - - m_doc->beginMacro(); - - for ( int i = s.startLine; i <= s.endLine; ++i ) - { - removeFromStart(QDocumentCursor(m_doc, i), txt); - } - - m_doc->endMacro(); - } -} - -/*! - \brief Select the whole text -*/ -void QEditor::selectAll() -{ - clearCursorMirrors(); - - m_cursor.movePosition(1, QDocumentCursor::Start); - m_cursor.movePosition(1, QDocumentCursor::End, QDocumentCursor::KeepAnchor); - - emitCursorPositionChanged(); - selectionChange(true); - - viewport()->update(); -} - -/*! - \internal -*/ -bool QEditor::event(QEvent *e) -{ - bool r = QAbstractScrollArea::event(e); - - if ( (e->type() == QEvent::Resize || e->type() == QEvent::Show) && m_doc ) - verticalScrollBar()->setMaximum(qMax(0, 1 + (m_doc->height() - viewport()->height()) / m_doc->fontMetrics().lineSpacing())); - - if ( e->type() == QEvent::Resize && flag(LineWrap) ) - { - //qDebug("resize adjust (1) : wrapping to %i", viewport()->width()); - m_doc->setWidthConstraint(wrapWidth()); - ensureCursorVisible(); - } - - return r; -} - -/*! - \internal -*/ -void QEditor::paintEvent(QPaintEvent *e) -{ - if ( !m_doc ) - return; - - QPainter p(viewport()); - const int yOffset = verticalOffset(); - const int xOffset = horizontalOffset(); - - #ifdef Q_GL_EDITOR - //QRect r(e->rect()); - QRect r(0, 0, viewport()->width(), viewport()->height()); - #else - QRect r(e->rect()); - #endif - - //qDebug() << r; - - //p.setClipping(false); - p.translate(-xOffset, -yOffset); - - QDocument::PaintContext ctx; - ctx.xoffset = xOffset; - ctx.yoffset = r.y() + yOffset; - ctx.width = viewport()->width(); - ctx.height = qMin(r.height(), viewport()->height()); - ctx.palette = palette(); - ctx.cursors << m_cursor.handle(); - ctx.fillCursorRect = true; - ctx.blinkingCursor = flag(CursorOn); - - if ( m_cursor.hasSelection() ) - { - //qDebug("atempting to draw selected text"); - QDocumentSelection s = m_cursor.selection(); - - ctx.selections << s; - } - - // cursor mirrors :D - foreach ( const QDocumentCursor& m, m_mirrors ) - { - if ( ctx.blinkingCursor ) - ctx.extra << m.handle(); - - if ( m.hasSelection() ) - { - QDocumentSelection s = m.selection(); - - ctx.selections << s; - } - } - - if ( m_dragAndDrop.isValid() ) - { - ctx.extra << m_dragAndDrop.handle(); - } - - p.save(); - m_doc->draw(&p, ctx); - p.restore(); - - if ( m_curPlaceHolder >= 0 && m_curPlaceHolder < m_placeHolders.count() ) - { - const PlaceHolder& ph = m_placeHolders.at(m_curPlaceHolder); - - p.setPen(Qt::red); - p.drawConvexPolygon(ph.cursor.documentRegion()); - - p.setPen(Qt::yellow); - foreach ( const QDocumentCursor& m, ph.mirrors ) - { - if ( m.isValid() ) - p.drawConvexPolygon(m.documentRegion()); - } - } - - if ( viewport()->height() > m_doc->height() ) - { - p.fillRect( 0, - m_doc->height(), - viewport()->width(), - viewport()->height() - m_doc->height(), - palette().base() - ); - } -} - -/*! - \internal -*/ -void QEditor::timerEvent(QTimerEvent *e) -{ - int id = e->timerId(); - - if ( id == m_blink.timerId() ) - { - bool on = !flag(CursorOn); - - if ( m_cursor.hasSelection() ) - on &= style()->styleHint(QStyle::SH_BlinkCursorWhenTextSelected, - 0, - this) != 0; - - setFlag(CursorOn, on); - - repaintCursor(); - - } else if ( id == m_drag.timerId() ) { - m_drag.stop(); - //startDrag(); - } else if ( id == m_click.timerId() ) { - m_click.stop(); - } -} - -static int max(const QList<QDocumentCursor>& l) -{ - int ln = 0; - - foreach ( const QDocumentCursor& c, l ) - if ( c.lineNumber() > ln ) - ln = c.lineNumber(); - - return ln; -} - -static int min(const QList<QDocumentCursor>& l) -{ - // beware the sign bit... - int ln = 0x7fffffff; - - foreach ( const QDocumentCursor& c, l ) - if ( (c.lineNumber() < ln) || (ln < 0) ) - ln = c.lineNumber(); - - return ln; -} - -bool QEditor::protectedCursor(const QDocumentCursor& c) const -{ - if ( c.hasSelection() ) - { - int line = qMin(c.lineNumber(), c.anchorLineNumber()), end = qMax(c.lineNumber(), c.anchorLineNumber()); - - while ( line <= end ) - { - if ( m_doc->line(line).hasAnyFlag(QDocumentLine::Hidden | QDocumentLine::CollapsedBlockStart | QDocumentLine::CollapsedBlockEnd) ) - return true; - - ++line; - } - - } else { - return m_doc->line(c.lineNumber()).hasAnyFlag(QDocumentLine::Hidden | QDocumentLine::CollapsedBlockStart | QDocumentLine::CollapsedBlockEnd); - } - - return false; -} - -/*! - \internal -*/ -void QEditor::keyPressEvent(QKeyEvent *e) -{ - foreach ( QEditorInputBindingInterface *b, m_bindings ) - if ( b->keyPressEvent(e, this) ) - return; - - forever - { - bool leave = false; - - // try mirrors bindings first - if ( (e->modifiers() & Qt::AltModifier) && (e->modifiers() & Qt::ControlModifier) ) - { - int ln = - 1; - QDocumentLine l; - - if ( e->key() == Qt::Key_Up ) - { - ln = m_cursor.lineNumber(); - - if ( m_mirrors.count() ) - ln = qMin(ln, min(m_mirrors)); - - //qDebug("first %i", ln); - - l = m_doc->line(--ln); - } else if ( e->key() == Qt::Key_Down ) { - ln = m_cursor.lineNumber(); - - if ( m_mirrors.count() ) - ln = qMax(ln, max(m_mirrors)); - - l = m_doc->line(++ln); - } - - if ( l.isValid() ) - { - addCursorMirror(QDocumentCursor(m_doc, ln, m_cursor.anchorColumnNumber())); - repaintCursor(); - emitCursorPositionChanged(); - - break; - } - } - - selectionChange(); - - // placeholders handling - bool bHandled = false; - - if ( m_placeHolders.count() && e->modifiers() == Qt::ControlModifier ) - { - if ( e->key() == Qt::Key_Up || e->key() == Qt::Key_Left ) - { - bHandled = true; - previousPlaceHolder(); - } else if ( e->key() == Qt::Key_Down || e->key() == Qt::Key_Right ) { - bHandled = true; - nextPlaceHolder(); - } - } - - // default shortcuts - if ( e->matches(QKeySequence::Undo) ) - { - undo(); - break; - } else if ( e->matches(QKeySequence::Redo) ) { - redo(); - break; - } else if ( e->matches(QKeySequence::Copy) ) { - copy(); - break; - } else if ( e->matches(QKeySequence::Paste) ) { - paste(); - break; - } else if ( e->matches(QKeySequence::Cut) ) { - cut(); - break; - } else if ( e->matches(QKeySequence::Print) ) { - print(); - break; - } else if ( e->matches(QKeySequence::SelectAll) ) { - selectAll(); - break; - } else if ( e->matches(QKeySequence::Find) ) { - find(); - break; - } else if ( e->matches(QKeySequence::FindNext) ) { - findNext(); - break; - } else if ( e->matches(QKeySequence::Replace) ) { - replace(); - break; - } - - // regular moves - if ( !bHandled ) - { - if ( moveKeyEvent(m_cursor, e, &leave) ) - { - e->accept(); - - //setFlag(CursorOn, true); - //ensureCursorVisible(); - - if ( !leave ) - for ( int i = 0; !leave && (i < m_mirrors.count()); ++i ) - moveKeyEvent(m_mirrors[i], e, &leave); - - if ( leave && m_mirrors.count() ) - { - for ( int i = 0; i < m_mirrors.count(); ++i ) - { - m_mirrors[i].setAutoUpdated(false); - } - - clearCursorMirrors(); - viewport()->update(); - } else { - repaintCursor(); - selectionChange(); - } - - bHandled = true; - } - } - - bool bOk = true; - if ( !bHandled ) - { - int offset = 0; - bool pke = isProcessingKeyEvent(e, &offset); - bool prot = protectedCursor(m_cursor); - - foreach ( const QDocumentCursor& c, m_mirrors ) - prot |= protectedCursor(c); - - if ( !pke || prot ) - { - bHandled = false; - } else { - - // clear matches to avoid offsetting and subsequent remanence of matches - if ( m_definition ) - m_definition->clearMatches(m_doc); - - bool hasPH = m_placeHolders.count() && m_curPlaceHolder != -1; - bool macroing = hasPH || m_mirrors.count(); - - if ( macroing ) - m_doc->beginMacro(); - - QStringList prevText; - - if ( hasPH ) - { - for ( int k = 0; k < m_placeHolders.count(); ++k ) - prevText << m_placeHolders.at(k).cursor.selectedText(); - - } - - bHandled = processCursor(m_cursor, e, bOk); - - if ( hasPH ) - { - PlaceHolder& ph = m_placeHolders[m_curPlaceHolder]; - - QString baseText = ph.cursor.selectedText(); - - for ( int phm = 0; phm < ph.mirrors.count(); ++phm ) - { - QString s = baseText; - - if ( ph.affector ) - ph.affector->affect(prevText, m_curPlaceHolder, e, phm, s); - - ph.mirrors[phm].replaceSelectedText(s); - } - } - - if ( m_mirrors.isEmpty() ) - { - // this signal is NOT emitted when cursor mirrors are used ON PURPOSE - // as it is the "standard" entry point for code completion, which cannot - // work properly with cursor mirrors (art least not always and not simply) - if ( bHandled ) - emit textEdited(e); - - } else { - - for ( int i = 0; bOk && (i < m_mirrors.count()); ++i ) - processCursor(m_mirrors[i], e, bOk); - - } - - if ( macroing ) - m_doc->endMacro(); - - } - } - - if ( !bHandled ) - { - QAbstractScrollArea::keyPressEvent(e); - - break; - } - - e->accept(); - emitCursorPositionChanged(); - setFlag(CursorOn, true); - ensureCursorVisible(); - repaintCursor(); - selectionChange(); - break; - } - - foreach ( QEditorInputBindingInterface *b, m_bindings ) - b->postKeyPressEvent(e, this); - -} - -/*! - \internal -*/ -void QEditor::inputMethodEvent(QInputMethodEvent* e) -{ - foreach ( QEditorInputBindingInterface *b, m_bindings ) - if ( b->inputMethodEvent(e, this) ) - return; - - /* - if ( m_doc->readOnly() ) - { - e->ignore(); - return; - } - */ - - m_cursor.beginEditBlock(); - - if ( e->commitString().count() ) - m_cursor.insertText(e->commitString()); - - m_cursor.endEditBlock(); - - foreach ( QEditorInputBindingInterface *b, m_bindings ) - b->postInputMethodEvent(e, this); - -} - -/*! - \internal -*/ -void QEditor::mouseMoveEvent(QMouseEvent *e) -{ - foreach ( QEditorInputBindingInterface *b, m_bindings ) - if ( b->mouseMoveEvent(e, this) ) - return; - - forever - { - if ( !(e->buttons() & Qt::LeftButton) ) - break; - - if ( !( flag(MousePressed) || m_doubleClick.hasSelection() ) ) - break; - - if ( flag(MaybeDrag) ) - { - m_drag.stop(); - - if ( (e->globalPos() - m_dragPoint).manhattanLength() > - QApplication::startDragDistance() - ) - startDrag(); - - //emit clearAutoCloseStack(); - break; - } - - repaintCursor(); - selectionChange(); - - const QPoint mousePos = mapToContents(e->pos()); - - if ( m_scroll.isActive() ) - { - if ( viewport()->rect().contains(e->pos()) ) - m_scroll.stop(); - } else { - if ( !viewport()->rect().contains(e->pos()) ) - m_scroll.start(100, this); - } - - QDocumentCursor newCursor = cursorForPosition(mousePos); - - if ( newCursor.isNull() ) - break; - - if ( e->modifiers() & Qt::ControlModifier ) - { - - // get column number for column selection - int org = m_cursor.anchorColumnNumber(); - int dst = newCursor.columnNumber(); - // TODO : adapt to line wrapping... - - clearCursorMirrors(); - //m_cursor.clearSelection(); - int min = qMin(m_cursor.lineNumber(), newCursor.lineNumber()); - int max = qMax(m_cursor.lineNumber(), newCursor.lineNumber()); - - if ( min != max ) - { - for ( int l = min; l <= max; ++l ) - { - if ( l != m_cursor.lineNumber() ) - addCursorMirror(QDocumentCursor(m_doc, l, org)); - - } - - if ( e->modifiers() & Qt::ShiftModifier ) - { - m_cursor.setColumnNumber(dst, QDocumentCursor::KeepAnchor); - - for ( int i = 0; i < m_mirrors.count(); ++i ) - m_mirrors[i].setColumnNumber(dst, QDocumentCursor::KeepAnchor); - } - } else { - m_cursor.setSelectionBoundary(newCursor); - } - } else { - m_cursor.setSelectionBoundary(newCursor); - //setFlag(FoldedCursor, isCollapsed()); - } - - selectionChange(true); - ensureCursorVisible(); - //emit clearAutoCloseStack(); - emitCursorPositionChanged(); - - repaintCursor(); - break; - } - - foreach ( QEditorInputBindingInterface *b, m_bindings ) - b->postMouseMoveEvent(e, this); - -} - -/*! - \internal -*/ -void QEditor::mousePressEvent(QMouseEvent *e) -{ - foreach ( QEditorInputBindingInterface *b, m_bindings ) - if ( b->mousePressEvent(e, this) ) - return; - - forever - { - if ( !(e->buttons() & Qt::LeftButton) ) - break; - - QPoint p = mapToContents(e->pos()); - - setFlag(MousePressed, true); - setFlag(MaybeDrag, false); - - repaintCursor(); - selectionChange(); - - if ( m_click.isActive() && - (( e->globalPos() - m_clickPoint).manhattanLength() < - QApplication::startDragDistance() )) - { - #if defined(Q_WS_MAC) - m_cursor.select(QDocumentCursor::LineUnderCursor); - m_doubleClick = m_cursor; - #else - m_cursor.movePosition(1, QDocumentCursor::StartOfBlock); - m_cursor.movePosition(1, QDocumentCursor::EndOfBlock, QDocumentCursor::KeepAnchor); - #endif - - m_click.stop(); - } else { - QDocumentCursor cursor = cursorForPosition(p); - - if ( cursor.isNull() ) - break; - - if ( e->modifiers() == Qt::ShiftModifier ) - { - clearCursorMirrors(); - m_cursor.setSelectionBoundary(cursor); - } else if ( e->modifiers() & Qt::ControlModifier && ((e->modifiers() & Qt::ShiftModifier) || (e->modifiers() & Qt::AltModifier)) ) { - //m_mirrors << cursor; - if ( e->modifiers() & Qt::ShiftModifier ) - { - // get column number for column selection - int org = m_cursor.anchorColumnNumber(); - int dst = cursor.columnNumber(); - // TODO : fix and adapt to line wrapping... - - clearCursorMirrors(); - //m_cursor.clearSelection(); - int min = qMin(m_cursor.lineNumber(), cursor.lineNumber()); - int max = qMax(m_cursor.lineNumber(), cursor.lineNumber()); - - if ( min != max ) - { - for ( int l = min; l <= max; ++l ) - { - if ( l != m_cursor.lineNumber() ) - addCursorMirror(QDocumentCursor(m_doc, l, org)); - - } - - if ( e->modifiers() & Qt::ShiftModifier ) - { - m_cursor.setColumnNumber(dst, QDocumentCursor::KeepAnchor); - - for ( int i = 0; i < m_mirrors.count(); ++i ) - m_mirrors[i].setColumnNumber(dst, QDocumentCursor::KeepAnchor); - } - } else { - m_cursor.setSelectionBoundary(cursor); - } - } else if ( (e->modifiers() & Qt::AltModifier) ) { - addCursorMirror(cursor); - } - } else { - - const QDocumentCursor& cur = m_cursor; - - if ( m_cursor.hasSelection() ) - { - bool inSel = cur.isWithinSelection(cursor); - - if ( !inSel ) - { - foreach ( const QDocumentCursor& m, m_mirrors ) - { - inSel = m.isWithinSelection(cursor); - - if ( inSel ) - break; - } - } - - if ( inSel ) - { - setFlag(MaybeDrag, true); - - m_dragPoint = e->globalPos(); - m_drag.start(QApplication::startDragTime(), this); - - break; - } - } - - m_doubleClick = QDocumentCursor(); - setCursor(cursor); - break; - } - } - - ensureCursorVisible(); - //emit clearAutoCloseStack(); - emitCursorPositionChanged(); - repaintCursor(); - selectionChange(); - break; - } - - foreach ( QEditorInputBindingInterface *b, m_bindings ) - b->postMousePressEvent(e, this); - -} - -/*! - \internal -*/ -void QEditor::mouseReleaseEvent(QMouseEvent *e) -{ - foreach ( QEditorInputBindingInterface *b, m_bindings ) - if ( b->mouseReleaseEvent(e, this) ) - return; - - m_scroll.stop(); - - repaintCursor(); - selectionChange(); - - if ( flag(MaybeDrag) ) - { - setFlag(MousePressed, false); - setCursorPosition(mapToContents(e->pos())); - - m_cursor.clearSelection(); - } - - if ( flag(MousePressed) ) - { - setFlag(MousePressed, false); - - setClipboardSelection(); - } else if ( e->button() == Qt::MidButton - && QApplication::clipboard()->supportsSelection()) { - setCursorPosition(mapToContents(e->pos())); - //setCursorPosition(viewport()->mapFromGlobal(e->globalPos())); - - const QMimeData *md = QApplication::clipboard() - ->mimeData(QClipboard::Selection); - - if ( md ) - insertFromMimeData(md); - } - - repaintCursor(); - - if ( m_drag.isActive() ) - m_drag.stop(); - - selectionChange(); - - foreach ( QEditorInputBindingInterface *b, m_bindings ) - b->postMouseReleaseEvent(e, this); - -} - -/*! - \internal -*/ -void QEditor::mouseDoubleClickEvent(QMouseEvent *e) -{ - foreach ( QEditorInputBindingInterface *b, m_bindings ) - if ( b->mouseDoubleClickEvent(e, this) ) - return; - - forever - { - if ( e->button() != Qt::LeftButton ) - { - e->ignore(); - break; - } - - setFlag(MaybeDrag, false); - - repaintCursor(); - selectionChange(); - clearCursorMirrors(); - setCursorPosition(mapToContents(e->pos())); - - //setFlag(FoldedCursor, isCollapsed()); - - if ( m_cursor.isValid() ) - { - m_cursor.select(QDocumentCursor::WordUnderCursor); - - setClipboardSelection(); - //emit clearAutoCloseStack(); - emitCursorPositionChanged(); - - repaintCursor(); - selectionChange(); - } else { - //qDebug("invalid cursor"); - } - - m_doubleClick = m_cursor; - - m_clickPoint = e->globalPos(); - m_click.start(qApp->doubleClickInterval(), this); - break; - } - - foreach ( QEditorInputBindingInterface *b, m_bindings ) - b->postMouseDoubleClickEvent(e, this); - -} - -/*! - \internal -*/ -void QEditor::dragEnterEvent(QDragEnterEvent *e) -{ - if ( - e - && - e->mimeData() - && - ( - e->mimeData()->hasFormat("text/plain") - || - e->mimeData()->hasFormat("text/html") - ) - && - !e->mimeData()->hasFormat("text/uri-list") - ) - e->acceptProposedAction(); - else - return; - - m_dragAndDrop = QDocumentCursor(); -} - -/*! - \internal -*/ -void QEditor::dragLeaveEvent(QDragLeaveEvent *) -{ - const QRect crect = cursorRect(m_dragAndDrop); - m_dragAndDrop = QDocumentCursor(); - - if ( crect.isValid() ) - viewport()->update(crect); - -} - -/*! - \internal -*/ -void QEditor::dragMoveEvent(QDragMoveEvent *e) -{ - if ( - e - && - e->mimeData() - && - ( - e->mimeData()->hasFormat("text/plain") - || - e->mimeData()->hasFormat("text/html") - ) - && - !e->mimeData()->hasFormat("text/uri-list") - ) - e->acceptProposedAction(); - else - return; - - QDocumentCursor c = cursorForPosition(mapToContents(e->pos())); - - if ( c.isValid() ) - { - QRect crect = cursorRect(m_dragAndDrop); - - if ( crect.isValid() ) - viewport()->update(crect); - - m_dragAndDrop = c; - - crect = cursorRect(m_dragAndDrop); - viewport()->update(crect); - } - - //e->acceptProposedAction(); -} - -/*! - \internal -*/ -void QEditor::dropEvent(QDropEvent *e) -{ - m_dragAndDrop = QDocumentCursor(); - - QDocumentCursor c(cursorForPosition(mapToContents(e->pos()))); - - if ( (e->source() == this) && (m_cursor.isWithinSelection(c)) ) - return; - - if ( - e - && - e->mimeData() - && - ( - e->mimeData()->hasFormat("text/plain") - || - e->mimeData()->hasFormat("text/html") - ) - && - !e->mimeData()->hasFormat("text/uri-list") - && - !flag(FoldedCursor) - ) - { - e->acceptProposedAction(); - } else { - return; - } - - //repaintSelection(); - - m_doc->beginMacro(); - //m_cursor.beginEditBlock(); - - if ( - (e->dropAction() == Qt::MoveAction) - && - ( - (e->source() == this) - || - (e->source() == viewport()) - ) - ) - { - m_cursor.removeSelectedText(); - - for ( int i = 0; i < m_mirrors.count(); ++i ) - m_mirrors[i].removeSelectedText(); - - } else { - //qDebug("action : %i", e->dropAction()); - m_cursor.clearSelection(); - } - - clearCursorMirrors(); - m_cursor.moveTo(cursorForPosition(mapToContents(e->pos()))); - insertFromMimeData(e->mimeData()); - //m_cursor.endEditBlock(); - - m_doc->endMacro(); - - selectionChange(); -} - -/*! - \internal -*/ -void QEditor::changeEvent(QEvent *e) -{ - QAbstractScrollArea::changeEvent(e); - - if ( - e->type() == QEvent::ApplicationFontChange - || - e->type() == QEvent::FontChange - ) - { - if ( !m_doc ) - return; - - m_doc->setFont(font()); - //setTabStop(iTab); - - } else if ( e->type() == QEvent::ActivationChange ) { - if ( !isActiveWindow() ) - m_scroll.stop(); - } -} - -/*! - \internal -*/ -void QEditor::showEvent(QShowEvent *e) -{ - QCodeEdit *ce = QCodeEdit::manager(this); - - if ( ce ) - ce->panelLayout()->update(); - - QAbstractScrollArea::showEvent(e); - - if ( flag(LineWrap) ) - { - m_doc->setWidthConstraint(wrapWidth()); - } - - if ( flag(EnsureVisible) ) - ensureCursorVisible(); - -} - -/*! - \internal - \brief Zoom in/out upon ctrl+wheel -*/ -void QEditor::wheelEvent(QWheelEvent *e) -{ - if ( e->modifiers() & Qt::ControlModifier ) - { - const int delta = e->delta(); - - if ( delta > 0 ) - zoom(-1); - else if ( delta < 0 ) - zoom(1); - - //viewport()->update(); - - return; - } - - QAbstractScrollArea::wheelEvent(e); - updateMicroFocus(); - //viewport()->update(); -} - -/*! - \internal -*/ -void QEditor::resizeEvent(QResizeEvent *) -{ - const QSize viewportSize = viewport()->size(); - - if ( flag(LineWrap) ) - { - //qDebug("resize t (2) : wrapping to %i", viewport()->width()); - - m_doc->setWidthConstraint(wrapWidth()); - } else { - horizontalScrollBar()->setMaximum(qMax(0, m_doc->width() - viewportSize.width())); - horizontalScrollBar()->setPageStep(viewportSize.width()); - } - - const int ls = m_doc->fontMetrics().lineSpacing(); - verticalScrollBar()->setMaximum(qMax(0, 1 + (m_doc->height() - viewportSize.height()) / ls)); - verticalScrollBar()->setPageStep(viewportSize.height() / ls); - - //qDebug("page step : %i", viewportSize.height() / ls); - - //if ( isCursorVisible() && flag(LineWrap) ) - // ensureCursorVisible(); -} - -/*! - \internal -*/ -void QEditor::focusInEvent(QFocusEvent *e) -{ - setFlag(CursorOn, true); - m_blink.start(QApplication::cursorFlashTime() / 2, this); - //ensureCursorVisible(); - - QAbstractScrollArea::focusInEvent(e); -} - -/*! - \internal -*/ -void QEditor::focusOutEvent(QFocusEvent *e) -{ - setFlag(CursorOn, false); - m_blink.stop(); - - QAbstractScrollArea::focusOutEvent(e); -} - -/*! - \brief Context menu event - - All the (managed) actions added to the editor are showed in it by default. -*/ -void QEditor::contextMenuEvent(QContextMenuEvent *e) -{ - foreach ( QEditorInputBindingInterface *b, m_bindings ) - if ( b->contextMenuEvent(e, this) ) - return; - - if ( !pMenu ) - { - e->ignore(); - return; - } - - selectionChange(); - - e->accept(); - - pMenu->exec(e->globalPos()); -} - -/*! - \brief Close event - - When build with qmdilib support (e.g in Edyuk) this check for - modifications and a dialog pops up to offer various options - (like saving, discarding or canceling) -*/ -void QEditor::closeEvent(QCloseEvent *e) -{ - #ifdef _QMDI_ - bool bOK = true; - - if ( isContentModified() ) - bOK = server()->maybeSave(this); - - if ( bOK ) - { - e->accept(); - notifyDeletion(); - } else { - e->ignore(); - } - #else - QAbstractScrollArea::closeEvent(e); - #endif -} - -#ifndef _QMDI_ -/*! - \return Whether the document has been modified. -*/ -bool QEditor::isContentModified() const -{ - return m_doc ? !m_doc->isClean() : false; -} -#endif - -/*! - \brief Notify that the content is clean (modifications undone or document saved) - - \note Don't mess with this. The document knows better. -*/ -void QEditor::setContentClean(bool y) -{ - setContentModified(!y); -} - -/*! - \brief Notify that the content has been modified - - \note Don't mess with this. The document knows better. -*/ -void QEditor::setContentModified(bool y) -{ - #ifdef _QMDI_ - qmdiClient::setContentModified(y); - #endif - - setWindowModified(y); - emit contentModified(y); -} - -/*! - \brief Changes the file name - - This method does not affect files on disk (no save/load/move occurs) -*/ -void QEditor::setFileName(const QString& f) -{ - QString prev = fileName(); - - if ( f == prev ) - return; - - /* - QStringList l = m_watcher->files(); - - if ( l.count() ) - m_watcher->removePaths(l); - */ - - watcher()->removeWatch(QString(), this); - - #ifdef _QMDI_ - qmdiClient::setFileName(f); - #else - m_fileName = f; - m_name = QFileInfo(f).fileName(); - #endif - - //if ( fileName().count() ) - // m_watcher->addPath(fileName()); - - if ( fileName().count() ) - watcher()->addWatch(fileName(), this); - - setTitle(name().count() ? name() : "untitled"); -} - -/*! - \brief Set the title of the widget - - Take care of adding a "[*]" prefix so that document changes are visible - on title bars. -*/ -void QEditor::setTitle(const QString& title) -{ - QString s(title); - - if ( !s.contains("[*]") ) - s.prepend("[*]"); - - setWindowTitle(s); - emit titleChanged(title); -} - -#ifndef _QMDI_ -/*! - \return The name of the file being edited (without its path) -*/ -QString QEditor::name() const -{ - return m_name; -} - -/*! - \return The full filename of the file being edited -*/ -QString QEditor::fileName() const -{ - return m_fileName; -} -#endif - -/*! - \brief Prevent tab key press to be considered as widget navigation -*/ -bool QEditor::focusNextPrevChild(bool) -{ - // make sure we catch tabs :) - - return false; -} - -/*! - \brief Start a drag and drop operation using the current selection -*/ -void QEditor::startDrag() -{ - setFlag(MousePressed, false); - QMimeData *data = createMimeDataFromSelection(); - - QDrag *drag = new QDrag(this); - drag->setMimeData(data); - - Qt::DropActions actions = Qt::CopyAction | Qt::MoveAction; - Qt::DropAction action = drag->start(actions); - - if ( (action == Qt::MoveAction) && (drag->target() != this) ) - { - m_cursor.removeSelectedText(); - - for ( int i = 0; i < m_mirrors.count(); ++i ) - m_mirrors[i].removeSelectedText(); - } -} - -/*! - \brief Handle cursor movements upon key event -*/ -bool QEditor::moveKeyEvent(QDocumentCursor& cursor, QKeyEvent *e, bool *leave) -{ - QDocumentCursor::MoveMode mode = e->modifiers() & Qt::ShiftModifier - ? QDocumentCursor::KeepAnchor - : QDocumentCursor::MoveAnchor; - - if ( flag(LineWrap) && flag(CursorJumpPastWrap) ) - mode |= QDocumentCursor::ThroughWrap; - - QDocumentCursor::MoveOperation op = QDocumentCursor::NoMove; -#ifdef Q_WS_MAC - // There can be only one modifier (+ shift), but we also need to make sure - // that we have a "move key" pressed before we reject it. - bool twoModifiers - = ((e->modifiers() & (Qt::ControlModifier | Qt::AltModifier)) - == (Qt::ControlModifier | Qt::AltModifier)) - || ((e->modifiers() & (Qt::ControlModifier | Qt::MetaModifier)) - == (Qt::ControlModifier | Qt::MetaModifier)) - || ((e->modifiers() & (Qt::AltModifier | Qt::MetaModifier)) - == (Qt::AltModifier | Qt::MetaModifier)); -#else - if (e->modifiers() & (Qt::AltModifier | - Qt::MetaModifier | Qt::KeypadModifier) ) - { - e->ignore(); - if ( leave ) *leave = false; - return false; - } -#endif - - switch ( e->key() ) - { -#ifndef Q_WS_MAC // Use the default Windows bindings. - case Qt::Key_Up: - op = QDocumentCursor::Up; - break; - case Qt::Key_Down: - op = QDocumentCursor::Down; - /* - if (mode == QDocumentCursor::KeepAnchor) { - QTextBlock block = cursor.block(); - QTextLine line = currentTextLine(cursor); - if (!block.next().isValid() - && line.isValid() - && line.lineNumber() == block.layout()->lineCount() - 1) - op = QDocumentCursor::End; - } - */ - break; - case Qt::Key_Left: - op = e->modifiers() & Qt::ControlModifier - ? QDocumentCursor::WordLeft - : QDocumentCursor::Left; - break; - case Qt::Key_Right: - op = e->modifiers() & Qt::ControlModifier - ? QDocumentCursor::WordRight - : QDocumentCursor::Right; - break; - case Qt::Key_Home: - op = e->modifiers() & Qt::ControlModifier - ? QDocumentCursor::Start - : QDocumentCursor::StartOfLine; - break; - case Qt::Key_End: - op = e->modifiers() & Qt::ControlModifier - ? QDocumentCursor::End - : QDocumentCursor::EndOfLine; - break; -#else -/* - Except for pageup and pagedown, Mac OS X has very different behavior, we - don't do it all, but here's the breakdown: - - Shift still works as an anchor, but only one of the other keys can be dow - Ctrl (Command), Alt (Option), or Meta (Control). - - Command/Control + Left/Right -- Move to left or right of the line - + Up/Down -- Move to top bottom of the file. - (Control doesn't move the cursor) - - Option + Left/Right -- Move one word Left/right. - + Up/Down -- Begin/End of Paragraph. - - Home/End Top/Bottom of file. (usually don't move the cursor, but will select) -*/ - case Qt::Key_Up: - if (twoModifiers) { - QApplication::beep(); - if ( leave ) *leave = false; - return true; - } else { - if (e->modifiers() & (Qt::ControlModifier | Qt::MetaModifier)) - op = QDocumentCursor::Start; - else if (e->modifiers() & Qt::AltModifier) - op = QDocumentCursor::StartOfBlock; - else - op = QDocumentCursor::Up; - } - break; - case Qt::Key_Down: - if (twoModifiers) { - QApplication::beep(); - if ( leave ) *leave = false; - return true; - } else { - if (e->modifiers() & (Qt::ControlModifier | Qt::MetaModifier)) - { - op = QDocumentCursor::End; - } else if (e->modifiers() & Qt::AltModifier) { - op = QDocumentCursor::EndOfBlock; - } else { - op = QDocumentCursor::Down; - /* - if (mode == QDocumentCursor::KeepAnchor) { - QTextBlock block = cursor.block(); - QTextLine line = currentTextLine(cursor); - if (!block.next().isValid() - && line.isValid() - && line.lineNumber() == - block.layout()->lineCount() - 1) - op = QDocumentCursor::End; - } - */ - } - } - break; - case Qt::Key_Left: - if (twoModifiers) { - QApplication::beep(); - if ( leave ) *leave = false; - return true; - } else { - if (e->modifiers() & (Qt::ControlModifier | Qt::MetaModifier)) - op = QDocumentCursor::StartOfLine; - else if (e->modifiers() & Qt::AltModifier) - op = QDocumentCursor::WordLeft; - else - op = QDocumentCursor::Left; - } - break; - case Qt::Key_Right: - if ( twoModifiers ) - { - QApplication::beep(); - if ( leave ) *leave = false; - return true; - } else { - if (e->modifiers() & (Qt::ControlModifier | Qt::MetaModifier)) - op = QDocumentCursor::EndOfLine; - else if (e->modifiers() & Qt::AltModifier) - op = QDocumentCursor::WordRight; - else - op = QDocumentCursor::Right; - } - break; - case Qt::Key_Home: - if (e->modifiers() & (Qt::ControlModifier | - Qt::MetaModifier | Qt::AltModifier) ) - { - QApplication::beep(); - if ( leave ) *leave = false; - return true; - } else { - op = QDocumentCursor::Start; - } - break; - case Qt::Key_End: - if (e->modifiers() & (Qt::ControlModifier | - Qt::MetaModifier | Qt::AltModifier)) - { - QApplication::beep(); - if ( leave ) *leave = false; - return true; - } else { - op = QDocumentCursor::End; - } - break; -#endif - case Qt::Key_PageDown: - if ( leave ) *leave = true; - pageDown(mode); - return true; - - case Qt::Key_PageUp: - if ( leave ) *leave = true; - pageUp(mode); - return true; - - case Qt::Key_Insert : - if ( !e->modifiers() ) - { - if ( leave ) *leave = false; - setFlag(Overwrite, !flag(Overwrite)); - - // hack to make sure status panel gets updated... - // TODO : emit signals on flag change? - emitCursorPositionChanged(); - return false; - } - - default: - return false; - } - - int prev = cursor.lineNumber(); - - //const bool moved = - cursor.movePosition(1, op, mode); - - if ( prev != cursor.lineNumber() ) - { - if ( m_curPlaceHolder >= 0 && m_curPlaceHolder < m_placeHolders.count() ) - { - // allow mirror movement out of line while in placeholder - PlaceHolder& ph = m_placeHolders[m_curPlaceHolder]; - if ( ph.cursor.isWithinSelection(cursor) ) - return true; - for ( int i = 0; i < ph.mirrors.count(); ++i ) - if ( ph.mirrors.at(i).isWithinSelection(cursor) ) - return true; - } - //moved = true; - if ( leave ) *leave = true; - m_curPlaceHolder = -1; - } - - return true; -} - -/*! - \brief Go up by one page - - \note This method clears all cursor mirrors and suspend placeholder edition. -*/ -void QEditor::pageUp(QDocumentCursor::MoveMode moveMode) -{ - clearCursorMirrors(); - m_curPlaceHolder = -1; - - if ( m_cursor.atStart() ) - return; - - int n = viewport()->height() / QDocument::fontMetrics().lineSpacing(); - - repaintCursor(); - m_cursor.movePosition(n, QDocumentCursor::Up, moveMode); - - ensureCursorVisible(); - emitCursorPositionChanged(); - //updateMicroFocus(); -} - -/*! - \brief Go down by one page - - \note This method clears all cursor mirrors. -*/ -void QEditor::pageDown(QDocumentCursor::MoveMode moveMode) -{ - clearCursorMirrors(); - m_curPlaceHolder = -1; - - if ( m_cursor.atEnd() ) - return; - - int n = viewport()->height() / QDocument::fontMetrics().lineSpacing(); - - repaintCursor(); - m_cursor.movePosition(n, QDocumentCursor::Down, moveMode); - - ensureCursorVisible(); - emitCursorPositionChanged(); -} - -/*! - \brief Determine whether a given key event is an editing operation -*/ -bool QEditor::isProcessingKeyEvent(QKeyEvent *e, int *offset) -{ - if ( flag(FoldedCursor) ) - return false; - - switch ( e->key() ) - { - case Qt::Key_Backspace : - //--*offset; - break; - - case Qt::Key_Delete : - //--*offset; - break; - - case Qt::Key_Enter : - case Qt::Key_Return : - if ( offset ) - ++*offset; - break; - - default : - { - QString text = e->text(); - - if ( text.isEmpty() || !(text.at(0).isPrint() || (text.at(0) == '\t')) ) - return false; - - //if ( offset ) - // *offset += text.length(); - - break; - } - } - - return true; -} - -/*! - \internal - \brief Process a key event for a given cursor - - This method only take care of editing operations, not movements. -*/ -bool QEditor::processCursor(QDocumentCursor& c, QKeyEvent *e, bool& b) -{ - if ( !b ) - return false; - - bool hasSelection = c.hasSelection(); - - switch ( e->key() ) - { - case Qt::Key_Backspace : - if ( flag(FoldedCursor) ) - return false; - - if ( hasSelection ) - c.removeSelectedText(); - else - c.deletePreviousChar(); - - break; - - case Qt::Key_Delete : - if ( flag(FoldedCursor) ) - return false; - - if ( hasSelection ) - - c.removeSelectedText(); - else - c.deleteChar(); - - //emit clearAutoCloseStack(); - break; - - case Qt::Key_Enter : - case Qt::Key_Return : - { - if ( flag(FoldedCursor) ) - return false; - - c.beginEditBlock(); - - if ( hasSelection ) - c.removeSelectedText(); - else if ( flag(Overwrite) ) - c.deleteChar(); - - QString indent; - - if ( flag(AutoIndent) && (m_curPlaceHolder == -1) ) - { - if ( m_definition ) - { - indent = m_definition->indent(c); - } else { - // default : keep leading ws from previous line... - QDocumentLine l = c.line(); - const int idx = qMin(l.firstChar(), c.columnNumber()); - - indent = l.text(); - - if ( idx != -1 ) - indent.resize(idx); - - } - } - - if ( indent.count() ) - { - indent.prepend("\n"); - c.insertText(indent); - } else { - c.insertLine(); - } - - c.endEditBlock(); - - break; - } - - default : - { - QString text = e->text(); - - if ( text.isEmpty() || !(text.at(0).isPrint() || (text.at(0) == '\t')) ) - { - b = false; - return false; - } - - if ( flag(ReplaceTabs) ) - { - text.replace("\t", QString(m_doc->tabStop(), ' ')); - } - - c.beginEditBlock(); - insertText(c, text); - c.endEditBlock(); - - break; - } - } - - selectionChange(); - - return true; -} - -void QEditor::preInsert(QDocumentCursor& c, const QString& s) -{ - if ( - flag(AutoIndent) - && - (m_curPlaceHolder == -1) - && - c.columnNumber() - && - m_definition - && - m_definition->unindent(c, s) - ) - { - int firstNS = 0; - QString txt = c.line().text(); - - while ( (firstNS < txt.length()) && txt.at(firstNS).isSpace() ) - ++firstNS; - - if ( !firstNS ) - return; - - const int off = c.columnNumber() - firstNS; - - if ( off > 0 ) - c.movePosition(off, QDocumentCursor::PreviousCharacter); - - /* - It might be possible to improve that part to have a more natural/smarter unindenting - by trying to guess the scheme used by the user... - */ - - if ( txt.at(firstNS - 1) == '\t' ) - { - c.movePosition(1, QDocumentCursor::Left, QDocumentCursor::KeepAnchor); - } else { - const int ts = m_doc->tabStop(); - - do - { - --firstNS; - c.movePosition(1, QDocumentCursor::Left, QDocumentCursor::KeepAnchor); - } while ( QDocument::screenLength(txt.constData(), firstNS, ts) % ts ); - } - - c.removeSelectedText(); - - if ( off > 0 ) - c.movePosition(off, QDocumentCursor::NextCharacter); - - } -} - -/*! - \brief Insert some text at a given cursor position - - This function is provided to keep indenting/outdenting working when editing -*/ -void QEditor::insertText(QDocumentCursor& c, const QString& text) -{ - if ( protectedCursor(c) ) - return; - - bool hasSelection = c.hasSelection(); - - if ( hasSelection ) - c.removeSelectedText(); - - if ( !hasSelection && flag(Overwrite) ) - c.deleteChar(); - - QStringList lines = text.split('\n', QString::KeepEmptyParts); - - if ( (lines.count() == 1) || !flag(AdjustIndent) ) - { - preInsert(c, lines.first()); - - if ( flag(ReplaceTabs) ) - { - // TODO : replace tabs by spaces properly - } - - c.insertText(text); - } else { - - preInsert(c, lines.first()); - c.insertText(lines.takeFirst()); - - QString indent; - // FIXME ? work on strings to make sure command grouping does not interfere with cursor state... - - indent = c.line().text().left(qMax(0, qMin(c.line().firstChar(), c.columnNumber()))); - - foreach ( QString l, lines ) - { - int n = 0; - - while ( n < l.count() && l.at(n).isSpace() ) - ++n; - - l.remove(0, n); - - if ( m_definition ) - { - // FIXME ? work on strings to make sure command grouping does not interfere with cursor state... - indent = m_definition->indent(c); - - if ( flag(ReplaceTabs) ) - indent.replace("\t", QString(m_doc->tabStop(), ' ')); - } - - c.insertLine(); - c.insertText(indent); - - preInsert(c, l); - - c.insertText(l); - } - } -} - -/*! - \brief Write some text at the current cursor position - - This function is provided to make editing operations easier - from the outside and to keep them compatible with cursor - mirrors. -*/ -void QEditor::write(const QString& s) -{ - m_doc->beginMacro(); - - insertText(m_cursor, s); - - for ( int i = 0; i < m_mirrors.count(); ++i ) - insertText(m_mirrors[i], s); - - m_doc->endMacro(); - - emitCursorPositionChanged(); - setFlag(CursorOn, true); - ensureCursorVisible(); - repaintCursor(); - selectionChange(); -} - -/*! - \brief Zoom - \param n relative zoom factor - - Zooming is achieved by changing the point size of the font as follow : - - fontPointSize += \a n -*/ -void QEditor::zoom(int n) -{ - if ( !m_doc ) - return; - - QFont f = m_doc->font(); - f.setPointSize(qMax(1, f.pointSize() + n)); - m_doc->setFont(f); -} - -/*! - \brief Obtain the value of panel margins - \param l left margin - \param t top margin - \param r right margin - \param b bottom margin -*/ -void QEditor::getPanelMargins(int *l, int *t, int *r, int *b) const -{ - m_margins.getCoords(l, t, r, b); -} - -/*! - \brief Change the viewport margins to make room for panels - \param l left margin - \param t top margin - \param r right margin - \param b bottom margin -*/ -void QEditor::setPanelMargins(int l, int t, int r, int b) -{ - m_margins.setCoords(l, t, r, b); - - setViewportMargins(l, t, r, b); - - if ( flag(LineWrap) ) - { - //qDebug("panel adjust : wrapping to %i", viewport()->width()); - m_doc->setWidthConstraint(wrapWidth()); - } -} - -/*! - \deprecated - \brief Does not do anything anymore... -*/ -void QEditor::selectionChange(bool force) -{ - Q_UNUSED(force) - // TODO : repaint only selection rect - /* - if ( false )//force ) - { - //qDebug("repainting selection... [%i]", force); - viewport()->update(); - } else if ( m_cursor.hasSelection() ) { - viewport()->update(selectionRect()); - } - - m_selection = m_cursor.hasSelection(); - */ -} - -/*! - \brief Request repaint (using QWidget::update()) for the region occupied by the cursor -*/ -void QEditor::repaintCursor() -{ - if ( m_mirrors.count() ) - viewport()->update(); - - QRect r = cursorRect(); - - if ( m_crect != r ) - { - viewport()->update(m_crect.translated(horizontalOffset(), 0)); - m_crect = r; - viewport()->update(m_crect.translated(horizontalOffset(), 0)); - } else { - viewport()->update(m_crect.translated(horizontalOffset(), 0)); - } -} - -/*! - \return whether the cursor is currently visible -*/ -bool QEditor::isCursorVisible() const -{ - QPoint pos = m_cursor.documentPosition(); - - const QRect cursor(pos.x(), pos.y(), 1, QDocument::fontMetrics().lineSpacing()); - const QRect display(horizontalOffset(), verticalOffset(), viewport()->width(), viewport()->height()); - - //qDebug() << pos << " belongs to " << display << " ?"; - - return display.contains(pos); //cursor); -} - -/*! - \brief Ensure that the current cursor is visible -*/ -void QEditor::ensureCursorVisible() -{ - if ( !isVisible() ) - { - setFlag(EnsureVisible, true); - return; - } - - QPoint pos = m_cursor.documentPosition(); - - const int ls = QDocument::fontMetrics().lineSpacing(); - - int ypos = pos.y(), - yval = verticalOffset(), - ylen = viewport()->height(), - yend = ypos + ls; - - if ( ypos < yval ) - verticalScrollBar()->setValue(ypos / ls); - else if ( yend > (yval + ylen) ) - verticalScrollBar()->setValue(1 + (yend - ylen) / ls); - - int xval = horizontalOffset(), - xlen = viewport()->width(), - xpos = pos.x(); - - if ( xpos < xval ) - { - //qDebug("scroll leftward"); - horizontalScrollBar()->setValue(qMax(0, xpos - 4)); - } else if ( xpos > (xval + xlen - 4) ) { - //qDebug("scroll rightward : %i", xpos - xlen + 4); - horizontalScrollBar() - ->setValue(qMax(horizontalScrollBar()->value(), xpos - xlen + 4)); - } - - setFlag(EnsureVisible, false); -} - -/*! - \brief ensure that a given line is visible by updating scrollbars if needed -*/ -void QEditor::ensureVisible(int line) -{ - if ( !m_doc ) - return; - - const int ls = QDocument::fontMetrics().lineSpacing(); - int ypos = m_doc->y(line), - yval = verticalOffset(), - ylen = viewport()->height(), - yend = ypos + ls; - - if ( ypos < yval ) - verticalScrollBar()->setValue(ypos / ls); - else if ( yend > (yval + ylen) ) - verticalScrollBar()->setValue(1 + (yend - ylen) / ls); - -} - -/*! - \brief Ensure that a given rect is visible by updating scrollbars if needed -*/ -void QEditor::ensureVisible(const QRect &rect) -{ - if ( !m_doc ) - return; - - const int ls = QDocument::fontMetrics().lineSpacing(); - int ypos = rect.y(), - yval = verticalOffset(), - ylen = viewport()->height(), - yend = ypos + rect.height(); - - if ( ypos < yval ) - verticalScrollBar()->setValue(ypos / ls); - else if ( yend > (yval + ylen) ) - verticalScrollBar()->setValue(1 + (yend - ylen) / ls); - - //verticalScrollBar()->setValue(rect.y()); -} - -/*! - \return the rectangle occupied by the current cursor - - This will either return a cursorRect for the current cursor or - the selectionRect() if the cursor has a selection. - - The cursor position, which would be the top left corner of the actual - rectangle occupied by the cursor can be obtained using QDocumentCursor::documentPosition() - - The behavior of this method may surprise newcomers but it is actually quite sensible - as this rectangle is mainly used to specify the update rect of the widget and the whole - line needs to be updated to properly update the line background whenever the cursor move - from a line to another. -*/ -QRect QEditor::cursorRect() const -{ - return m_cursor.hasSelection() ? selectionRect() : cursorRect(m_cursor); -} - -/*! - \return the rectangle occupied by the selection in viewport coordinates - - If the current cursor does not have a selection, its cursorRect() is returned. - - The returned rectangle will always be bigger than the actual selection has - it is actually the union of all the rectangles occupied by all lines the selection - spans over. -*/ -QRect QEditor::selectionRect() const -{ - if ( !m_cursor.hasSelection() ) - return cursorRect(m_cursor); - - QDocumentSelection s = m_cursor.selection(); - - if ( s.startLine == s.endLine ) - return cursorRect(m_cursor); - - int y = m_doc->y(s.startLine); - QRect r = m_doc->lineRect(s.endLine); - int height = r.y() + r.height() - y; - - r = QRect(0, y, viewport()->width(), height); - r.translate(-horizontalOffset(), -verticalOffset()); - return r; -} - -/*! - \return the rectangle occupied by the given line, in viewport coordinates - - The width of the returned rectangle will always be the viewport width. -*/ -QRect QEditor::lineRect(int line) const -{ - if ( !m_doc ) - return QRect(); - - QRect r = m_doc->lineRect(line); - r.setWidth(viewport()->width()); - r.translate(-horizontalOffset(), -verticalOffset()); - - return r; -} - -/*! - \overload - - \note This function relies on QDocumentLine::lineNumber() so avoid - it whenever possible as it is much slower than providing a line number - directly. -*/ -QRect QEditor::lineRect(const QDocumentLine& l) const -{ - //qFatal("bad practice..."); - - if ( !m_doc ) - return QRect(); - - QRect r = m_doc->lineRect(l); - r.setWidth(viewport()->width()); - r.translate(-horizontalOffset(), -verticalOffset()); - - return r; -} - -/*! - \return The line rect of the given cursor -*/ -QRect QEditor::cursorRect(const QDocumentCursor& c) const -{ - return lineRect(c.lineNumber()); -} - -/*! - \brief creates a valid QMimeData object depending on the selection -*/ -QMimeData* QEditor::createMimeDataFromSelection() const -{ - QMimeData *d = new QMimeData; - - if ( !m_cursor.hasSelection() ) - { - qWarning("Generated empty MIME data"); - return d; - } - - if ( m_mirrors.isEmpty() ) - { - d->setText(m_cursor.selectedText()); - } else { - QString serialized = m_cursor.selectedText(); - - foreach ( const QDocumentCursor& m, m_mirrors ) - { - serialized += '\n'; - serialized += m.selectedText(); - } - - d->setText(serialized); - d->setData("text/column-selection", serialized.toLocal8Bit()); - } - - //qDebug("generated selection from : \"%s\"", qPrintable(d->text())); - - return d; -} - -static void fixLineEndings(QString& text) -{ - // deal with Dos first to avoid line endings duplication - text.replace("\r\n", "\n"); - - text.replace('\r', '\n'); -} - -/*! - \brief Inserts the content of a QMimeData object at the cursor position - - \note Only plain text is supported... \see QMimeData::hasText() -*/ -void QEditor::insertFromMimeData(const QMimeData *d) -{ - bool s = m_cursor.hasSelection(); - - if ( !d ) - return; - - if ( d->hasFormat("text/uri-list") ) - { - - return; - } - - if ( m_cursor.isValid() ) - { - if ( d->hasFormat("text/column-selection") ) - { - clearCursorMirrors(); - - QStringList columns = QString::fromLocal8Bit( - d->data("text/column-selection") - ).split('\n'); - - m_doc->beginMacro(); - - if ( s ) - m_cursor.removeSelectedText(); - - int col = m_cursor.columnNumber(); - //m_cursor.insertText(columns.takeFirst()); - insertText(m_cursor, columns.takeFirst()); - QDocumentCursor c = m_cursor; - - while ( columns.count() ) - { - // check for end of doc and add line if needed... - c.setColumnNumber(c.line().length()); - - if ( c.atEnd() ) - c.insertText("\n"); - else - c.movePosition(1, QDocumentCursor::NextCharacter); - - // align - c.setColumnNumber(qMin(col, c.line().length())); - - // copy content of clipboard - //c.insertText(columns.takeFirst()); - insertText(c, columns.takeFirst()); - addCursorMirror(c); - } - - m_doc->endMacro(); - - } else { - m_doc->beginMacro(); - - //if ( s ) - //{ - // m_cursor.removeSelectedText(); - //} - - QString txt; - - if ( d->hasFormat("text/plain") ) - txt = d->text(); - else if ( d->hasFormat("text/html") ) - txt = d->html(); - - fixLineEndings(txt); - - insertText(m_cursor, txt); - - for ( int i = 0; i < m_mirrors.count(); ++i ) - { - insertText(m_mirrors[i], txt); - } - - m_doc->endMacro(); - } - - ensureCursorVisible(); - setFlag(CursorOn, true); - - emitCursorPositionChanged(); - } -} - -/*! - \brief Removes all cursor mirrors -*/ -void QEditor::clearCursorMirrors() -{ - if ( m_mirrors.isEmpty() ) - return; - - m_curPlaceHolder = -1; - repaintCursor(); - - for ( int i = 0; i < m_mirrors.count(); ++i ) - { - m_mirrors[i].setAutoUpdated(false); - } - - m_mirrors.clear(); - - viewport()->update(); -} - -/*! - \brief Add a cursor mirror -*/ -void QEditor::addCursorMirror(const QDocumentCursor& c) -{ - if ( c.isNull() || (c == m_cursor) || m_mirrors.contains(c) ) - return; - - m_mirrors << c; - - // necessary for smooth mirroring - m_mirrors.last().setSilent(true); - m_mirrors.last().setAutoUpdated(true); -} - -/*! - \internal - \brief Copy the selection to the clipboard -*/ -void QEditor::setClipboardSelection() -{ - QClipboard *clipboard = QApplication::clipboard(); - - if ( !clipboard->supportsSelection() || !m_cursor.hasSelection() ) - return; - - QMimeData *data = createMimeDataFromSelection(); - - clipboard->setMimeData(data, QClipboard::Selection); -} - -/*! - \internal - \brief Scroll contents - - Refer to QAbstractScrollArea doc for more info. -*/ -void QEditor::scrollContentsBy(int dx, int dy) -{ - #ifdef Q_GL_EDITOR - viewport()->update(); - #else - const int ls = m_doc->fontMetrics().lineSpacing(); - viewport()->scroll(dx, dy * ls); - #endif -} - -/*! - \internal - \brief Workaround inconsistent width determination of viewport width - accross platfroms when scrollbars are visible... -*/ -int QEditor::wrapWidth() const -{ - #ifdef Q_WS_WIN - //if ( verticalScrollBar()->isVisible() ) - // return viewport()->width() - verticalScrollBar()->width(); - #endif - return viewport()->width(); -} - -/*! - \internal - \brief Slot called whenever document width changes - - Horizontal scrollbar is updated here. - - \note ensureCursorVisible() is NOT called. -*/ -void QEditor::documentWidthChanged(int newWidth) -{ - if ( flag(LineWrap) ) - { - horizontalScrollBar()->setMaximum(0); - return; - } - - int nv = qMax(0, newWidth - wrapWidth()); - - horizontalScrollBar()->setMaximum(nv); - - //ensureCursorVisible(); -} - -/*! - \internal - \brief Slot called whenever document height changes - - Vertical scrollbar is updated here (maximum is changed - and value is modified if needed to ensure that the cursor is visible) -*/ -void QEditor::documentHeightChanged(int newHeight) -{ - if ( flag(LineWrap) ) - { - m_doc->setWidthConstraint(wrapWidth()); - } - const int ls = m_doc->fontMetrics().lineSpacing(); - verticalScrollBar()->setMaximum(qMax(0, 1 + (newHeight - viewport()->height()) / ls)); - //ensureCursorVisible(); -} - -/*! - \internal - \brief Request paint event upon modification - \param i first modified line - \param n number of modified lines -*/ -void QEditor::repaintContent(int i, int n) -{ - if ( !m_doc ) - return; - - #ifdef Q_GL_EDITOR - viewport()->update(); - #else - if ( n <= 0 ) - { - viewport()->update(); - } - - QRect frect = m_doc->lineRect(i); - - const int yoff = verticalOffset() + viewport()->height(); - - if ( frect.y() > yoff ) - return; - - if ( n == 1 ) - { - frect.translate(0, -verticalOffset()); - //qDebug() << frect; - viewport()->update(frect); - return; - } - - QRect lrect = m_doc->lineRect(i + n - 1); - - if ( (n > 0) && (lrect.y() + lrect.height()) < verticalOffset() ) - return; - - //qDebug("repainting %i lines starting from %ith one", n, i); - - //rect.setWidth(viewport()->width()); - //rect.setHeight(qMin(viewport()->height(), rect.height() * n)); - - const int paintOffset = frect.y() - verticalOffset(); - const int paintHeight = lrect.y() + lrect.height() - frect.y(); - const int maxPaintHeight = viewport()->height() - paintOffset; - - QRect rect = QRect( - frect.x(), - paintOffset, - viewport()->width(), - (n <= 0) - ? - maxPaintHeight - : - qMin(maxPaintHeight, paintHeight) - ); - - //qDebug() << rect; - - viewport()->update(rect); - #endif -} - -/*! - \internal - \brief Update function called upon editing action - \param i First modified line - \param n Number of modified lines - - If more than one line has been modified this function - causes a repaint from the first visible line to the end - of the viewport due to the way QAbstractScrollArea - handles scrolling. - - \note This function used to update formatting but - the highlighting has been moved to QDocument recently -*/ -void QEditor::updateContent (int i, int n) -{ - if ( !m_doc ) - return; - - //qDebug("updating %i, %i", i, n); - - bool cont = n > 1; - - repaintContent(i, cont ? -1 : n); -} - -/*! - \internal -*/ -void QEditor::markChanged(QDocumentLineHandle *l, int mark, bool on) -{ - emit markChanged(fileName(), l, mark, on); -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qeditor.h +++ /dev/null @@ -1,471 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QEDITOR_H_ -#define _QEDITOR_H_ - -#include "qce-config.h" - -/*! - \file qeditor.h - \brief Definition of the QEditor class -*/ - -#include <QHash> -#include <QPointer> -#include <QScrollBar> -#include <QBasicTimer> -#include <QFontMetrics> -#include <QAbstractScrollArea> - -#include "qdocument.h" -#include "qdocumentcursor.h" - -#ifdef _QMDI_ - #include "qmdiclient.h" -#endif - -class QMenu; -class QAction; -class QMimeData; -class QTextCodec; -class QActionGroup; - -class QReliableFileWatch; - -class QDocumentLineHandle; - -class QLanguageDefinition; -class QCodeCompletionEngine; - -class QEditorInputBindingInterface; - -class QCE_EXPORT QEditor : public QAbstractScrollArea -#ifdef _QMDI_ -, public qmdiClient -#endif -{ - friend class QEditConfig; - friend class QEditorFactory; - - Q_OBJECT - - public: - enum CodecUpdatePolicy - { - NoUpdate = 0, - UpdateOld = 1, - UpdateDefault = 2, - UpdateCustom = 4, - - UpdateAll = 7 - }; - - enum EditFlag - { - None = 0, - - Overwrite = 0x001, - CursorOn = 0x002, - ReadOnly = 0x004, - MousePressed = 0x008, - MaybeDrag = 0x010, - Selection = 0x020, - EnsureVisible = 0x040, - - FoldedCursor = 0x100, - - Internal = 0x00000fff, - - LineWrap = 0x00001000, - - CtrlNavigation = 0x00010000, - CursorJumpPastWrap = 0x00020000, - - ReplaceTabs = 0x00100000, - RemoveTrailing = 0x00200000, - PreserveTrailingIndent = 0x00400000, - AdjustIndent = 0x00800000, - - AutoCloseChars = 0x01000000, - AutoIndent = 0x02000000, - - Accessible = 0xfffff000 - }; - - Q_DECLARE_FLAGS(State, EditFlag) - - struct PlaceHolder - { - class Affector - { - public: - virtual ~Affector() {} - virtual void affect(const QStringList& base, int ph, const QKeyEvent *e, int mirror, QString& after) const = 0; - }; - - PlaceHolder() : length(0), autoRemove(false), affector(0) {} - PlaceHolder(const PlaceHolder& ph) : length(ph.length), autoRemove(ph.autoRemove), affector(ph.affector) - { - cursor = ph.cursor; - mirrors << ph.mirrors; - } - - int length; - bool autoRemove; - Affector *affector; - QDocumentCursor cursor; - QList<QDocumentCursor> mirrors; - }; - - QEditor(QWidget *p = 0); - QEditor(bool actions, QWidget *p = 0); - QEditor(const QString& s, QWidget *p = 0); - QEditor(const QString& s, bool actions, QWidget *p = 0); - virtual ~QEditor(); - - bool flag(EditFlag) const; - - bool canUndo() const; - bool canRedo() const; - - QString text() const; - QString text(int line) const; - - QTextCodec* codec() const; - QDocument* document() const; - - QList<QEditorInputBindingInterface*> inputBindings() const; - - bool isCursorVisible() const; - QDocumentCursor cursor() const; - - int cursorMirrorCount() const; - QDocumentCursor cursorMirror(int i) const; - - QLanguageDefinition* languageDefinition() const; - QCodeCompletionEngine* completionEngine() const; - - QAction* action(const QString& s); - - virtual QRect cursorRect() const; - virtual QRect selectionRect() const; - virtual QRect lineRect(int line) const; - virtual QRect lineRect(const QDocumentLine& l) const; - virtual QRect cursorRect(const QDocumentCursor& c) const; - - #ifndef _QMDI_ - QString name() const; - QString fileName() const; - - bool isContentModified() const; - #endif - - bool isInConflict() const; - - int wrapWidth() const; - - inline int horizontalOffset() const - { return horizontalScrollBar()->isVisible() ? horizontalScrollBar()->value() : 0; } - inline int verticalOffset() const - { return verticalScrollBar()->isVisible() ? verticalScrollBar()->value() * m_doc->fontMetrics().lineSpacing() : 0; } - - inline QPoint mapToContents(const QPoint &point) const - { - return QPoint( point.x() + horizontalOffset(), - point.y() + verticalOffset() ); - } - - inline QPoint mapFromContents(const QPoint &point) const - { - return QPoint( point.x() - horizontalOffset(), - point.y() - verticalOffset() ); - } - - virtual bool protectedCursor(const QDocumentCursor& c) const; - - static int defaultFlags(); - static void setDefaultFlags(int f); - - static QTextCodec* defaultCodec(); - static void setDefaultCodec(int mib, int update); - static void setDefaultCodec(QTextCodec *c, int update); - static void setDefaultCodec(const char *name, int update); - static void setDefaultCodec(const QByteArray& name, int update); - - static QEditorInputBindingInterface* registeredInputBinding(const QString& n); - static QString defaultInputBindingId(); - static QStringList registeredInputBindingIds(); - static void registerInputBinding(QEditorInputBindingInterface *b); - static void unregisterInputBinding(QEditorInputBindingInterface *b); - static void setDefaultInputBinding(QEditorInputBindingInterface *b); - static void setDefaultInputBinding(const QString& b); - - static inline const QList<QEditor*>& editors() { return m_editors; } - - public slots: - void undo(); - void redo(); - - void cut(); - void copy(); - void paste(); - - void selectAll(); - - void find(); - void findNext(); - void replace(); - - void gotoLine(); - - void indentSelection(); - void unindentSelection(); - - void commentSelection(); - void uncommentSelection(); - - void setLineWrapping(bool on); - - virtual void save(); - void save(const QString& filename); - - virtual void print(); - - virtual void retranslate(); - - virtual void write(const QString& s); - - void addAction(QAction *a, const QString& menu, const QString& toolbar = QString()); - void removeAction(QAction *a, const QString& menu, const QString& toolbar = QString()); - - void load(const QString& file); - void setText(const QString& s); - - void setCodec(int mib); - void setCodec(QTextCodec *c); - void setCodec(const char *name); - void setCodec(const QByteArray& name); - - void setDocument(QDocument *d); - - void addInputBinding(QEditorInputBindingInterface *b); - void removeInputBinding(QEditorInputBindingInterface *b); - void setInputBinding(QEditorInputBindingInterface *b); - - void setCursor(const QDocumentCursor& c); - - void setLanguageDefinition(QLanguageDefinition *d); - - void setCompletionEngine(QCodeCompletionEngine *e); - - void zoom(int n); - - void setPanelMargins(int l, int t, int r, int b); - void getPanelMargins(int *l, int *t, int *r, int *b) const; - - void setTitle(const QString& title); - - void highlight(); - - void clearPlaceHolders(); - void removePlaceHolder(int i); - void addPlaceHolder(const PlaceHolder& p, bool autoUpdate = true); - - int placeHolderCount() const; - int currentPlaceHolder() const; - - void nextPlaceHolder(); - void previousPlaceHolder(); - void setPlaceHolder(int i); - - virtual void setFileName(const QString& f); - - signals: - void loaded(QEditor *e, const QString& s); - void saved(QEditor *e, const QString& s); - - void contentModified(bool y); - void titleChanged(const QString& title); - - void textEdited(QKeyEvent *e); - void cursorPositionChanged(); - - void copyAvailable(bool y); - - void undoAvailable(bool y); - void redoAvailable(bool y); - - void markChanged(const QString& f, QDocumentLineHandle *l, int mark, bool on); - - public slots: - void checkClipboard(); - void reconnectWatcher(); - void fileChanged(const QString& f); - - void setContentClean(bool y); - - void emitCursorPositionChanged(); - - virtual void setContentModified(bool y); - - protected: - virtual bool event(QEvent *e); - - virtual void paintEvent(QPaintEvent *e); - virtual void timerEvent(QTimerEvent *e); - - virtual void keyPressEvent(QKeyEvent *e); - - virtual void inputMethodEvent(QInputMethodEvent* e); - - virtual void mouseMoveEvent(QMouseEvent *e); - virtual void mousePressEvent(QMouseEvent *e); - virtual void mouseReleaseEvent(QMouseEvent *e); - virtual void mouseDoubleClickEvent(QMouseEvent *e); - - virtual void dragEnterEvent(QDragEnterEvent *e); - virtual void dragLeaveEvent(QDragLeaveEvent *e); - virtual void dragMoveEvent(QDragMoveEvent *e); - virtual void dropEvent(QDropEvent *e); - - virtual void changeEvent(QEvent *e); - virtual void showEvent(QShowEvent *); - virtual void wheelEvent(QWheelEvent *e); - virtual void resizeEvent(QResizeEvent *e); - virtual void focusInEvent(QFocusEvent *e); - virtual void focusOutEvent(QFocusEvent *e); - - virtual void contextMenuEvent(QContextMenuEvent *e); - - virtual void closeEvent(QCloseEvent *e); - - virtual bool focusNextPrevChild(bool next); - - virtual bool moveKeyEvent(QDocumentCursor& c, QKeyEvent *e, bool *leave); - virtual bool isProcessingKeyEvent(QKeyEvent *e, int *offset = 0); - virtual bool processCursor(QDocumentCursor& c, QKeyEvent *e, bool& b); - - virtual void startDrag(); - virtual QMimeData* createMimeDataFromSelection() const; - virtual void insertFromMimeData(const QMimeData *d); - - virtual void scrollContentsBy(int dx, int dy); - - // got to make it public for bindings - public: - void setFlag(EditFlag f, bool b); - - void pageUp(QDocumentCursor::MoveMode moveMode); - void pageDown(QDocumentCursor::MoveMode moveMode); - - void selectionChange(bool force = false); - - void repaintCursor(); - void ensureCursorVisible(); - void ensureVisible(int line); - void ensureVisible(const QRect &rect); - - void preInsert(QDocumentCursor& c, const QString& text); - void insertText(QDocumentCursor& c, const QString& text); - - QDocumentLine lineAtPosition(const QPoint& p) const; - QDocumentCursor cursorForPosition(const QPoint& p) const; - - void setClipboardSelection(); - void setCursorPosition(const QPoint& p); - - void setCursorPosition(int line, int index); - void getCursorPosition(int &line, int &index); - - void clearCursorMirrors(); - void addCursorMirror(const QDocumentCursor& c); - - protected slots: - void documentWidthChanged(int newWidth); - void documentHeightChanged(int newWidth); - - void repaintContent(int i, int n); - void updateContent (int i, int n); - - void markChanged(QDocumentLineHandle *l, int mark, bool on); - - void bindingSelected(QAction *a); - - void lineEndingSelected(QAction *a); - void lineEndingChanged(int lineEnding); - - protected: - enum SaveState - { - Undefined, - Saving, - Saved, - Conflict - }; - - void init(bool actions = true); - void updateBindingsMenu(); - - #ifndef _QMDI_ - QString m_name, m_fileName; - #endif - - QMenu *pMenu; - QHash<QString, QAction*> m_actions; - - QMenu *m_lineEndingsMenu; - QActionGroup *m_lineEndingsActions; - - QMenu *m_bindingsMenu; - QAction *aDefaultBinding; - QActionGroup *m_bindingsActions; - - char m_saveState; - quint16 m_checksum; - - QDocument *m_doc; - QTextCodec *m_codec; - QList<QEditorInputBindingInterface*> m_bindings; - - QLanguageDefinition *m_definition; - QPointer<QCodeCompletionEngine> m_completionEngine; - - QDocumentCursor m_cursor, m_doubleClick, m_dragAndDrop; - - QList<QDocumentCursor> m_mirrors; - - int m_curPlaceHolder, m_cphOffset; - QList<PlaceHolder> m_placeHolders; - - int m_state; - bool m_selection; - QRect m_crect, m_margins; - QPoint m_clickPoint, m_dragPoint; - QBasicTimer m_blink, m_scroll, m_click, m_drag; - - static QReliableFileWatch* watcher(); - - static int m_defaultFlags; - static QTextCodec *m_defaultCodec; - - static QList<QEditor*> m_editors; - static QEditorInputBindingInterface *m_defaultBinding; - static QHash<QString, QEditorInputBindingInterface*> m_registeredBindings; -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(QEditor::State); - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qeditorfactory.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qeditorfactory.h" - -#ifdef _QSAFE_SHARED_SETTINGS_ - -/*! - \file qeditorfactory.cpp - \brief Implementation of the QEditorFactory class. -*/ - -#include "qcodeedit.h" - -#include "qformatscheme.h" -#include "qlanguagefactory.h" -#include "qcodecompletionengine.h" - -#include "qfoldpanel.h" -#include "qlinemarkpanel.h" -#include "qlinenumberpanel.h" -#include "qlinechangepanel.h" -#include "qgotolinepanel.h" -#include "qstatuspanel.h" -#include "qsearchreplacepanel.h" - -#include "qeditor.h" -#include "qlinemarksinfocenter.h" - -#include "qsettingsserver.h" - -#include <QDir> -#include <QFile> -#include <QFileInfo> -#include <QTextStream> -#include <QApplication> - -/*! - \ingroup editor - @{ - - \class QEditorFactory - \brief Convenience class that manages editors. - - QCodeEdit widgets are created through QEditorFactory using a simple - QString representing a panel id. Each panel id is associated to a - serialized panel layout (\see QPanelLayout::serialized() ). - - \see QCodeEdit - \see QLanguageFactory - \see QFormatScheme -*/ - -/*! - \brief Construct a working editor factory -*/ -QEditorFactory::QEditorFactory(QSettingsServer *s) - : -#ifdef _QMDI_ - qmdiClientFactory(s), -#else - QObject(s), -#endif - QSettingsClient(s, "editor") -{ - m_defaultScheme = new QFormatScheme(QCE::fetchDataFile("formats.qxf"), this); - - QDocument::setFormatFactory(m_defaultScheme); - - m_languageFactory = new QLanguageFactory(m_defaultScheme, this); - - foreach ( QString dp, QCE::dataPathes() ) - { - m_languageFactory->addDefinitionPath(dp); - } - - if ( value("version").toInt() != 3 ) - { - setValue("version", 3); - - // setup default layouts... - beginGroup("layouts"); - - setValue("default", "default"); - - beginGroup("availables"); - - beginGroup("empty"); - setValue("struct", QString()); - setValue("name", "No panels"); - endGroup(); - - beginGroup("default"); - setValue("struct", - QString::number(QCodeEdit::West) - + "{" - + Q_PANEL_ID(QLineMarkPanel) - + "," - + Q_PANEL_ID(QLineNumberPanel) - + "," - + Q_PANEL_ID(QFoldPanel) - + "," - + Q_PANEL_ID(QLineChangePanel) - + "}" - - + QString::number(QCodeEdit::South) - + "{" - + Q_PANEL_ID(QStatusPanel) - + "," - + Q_PANEL_ID(QGotoLinePanel) - + "," - + Q_PANEL_ID(QSearchReplacePanel) - + "}" - ); - - setValue("name", "Default panel layout"); - endGroup(); - - beginGroup("simple"); - setValue("struct", - QString::number(QCodeEdit::West) - + "{" - + Q_PANEL_ID(QLineNumberPanel) - + "," - + Q_PANEL_ID(QFoldPanel) - + "}" - - + QString::number(QCodeEdit::South) - + "{" - + Q_PANEL_ID(QStatusPanel) - + "}" - ); - - setValue("name", "Trimmed-down panel layout"); - endGroup(); - - endGroup(); - - endGroup(); - } - -} - -/*! - \brief dtor -*/ -QEditorFactory::~QEditorFactory() -{ - -} - -/*! - \reimp - \brief Creates an editor with default layout for the given file - \param filename file to load in the editor - \return a managed QEditor object -*/ -qmdiClient* QEditorFactory::createClient(const QString& filename) const -{ - return editor(filename, defaultLayout())->editor(); -} - -/*! - \brief Create a managed editor - \param f file to load - \param layout panel layout to use -*/ -QCodeEdit* QEditorFactory::editor(const QString& f, const QString& layout) const -{ - QCodeEdit *e = new QCodeEdit(layout.isEmpty() ? defaultLayout() : layout); - - //m_config->hookEditor(def, e); - - connect(e->editor() , SIGNAL( loaded(QEditor*, QString) ), - this , SLOT ( loaded(QEditor*, QString) ) ); - - connect(e->editor() , SIGNAL( saved(QEditor*, QString) ), - this , SLOT ( saved(QEditor*, QString) ) ); - - // set syntax handlers - m_languageFactory->setLanguage(e->editor(), f); - - if ( f.count() && QFile::exists(f) ) - { - // load contents - e->editor()->load(f); - - // set line marks back... - QLineMarksInfoCenter::instance()->flush(f); - } else { - e->editor()->setTitle(tr("untitled")); - e->editor()->setContentModified(true); - } - - return e; -} - -/*! - \overload - \param f file to load - \param l language definition to use - \param s format scheme to use - \param en code completion engine to use - \param layout panel layout to use -*/ -QCodeEdit* QEditorFactory::editor( const QString& f, - QLanguageDefinition *l, - QFormatScheme *s, - QCodeCompletionEngine *en, - const QString& layout) const -{ - QCodeEdit *e = new QCodeEdit(layout.isEmpty() ? defaultLayout() : layout); - - //m_config->hookEditor(def, e); - - connect(e->editor() , SIGNAL( loaded(QEditor*, QString) ), - this , SLOT ( loaded(QEditor*, QString) ) ); - - connect(e->editor() , SIGNAL( saved(QEditor*, QString) ), - this , SLOT ( saved(QEditor*, QString) ) ); - - // set syntax handlers - //m_languageFactory->setLanguage(e->editor(), l, en); - e->editor()->setLanguageDefinition(l); - e->editor()->document()->setFormatScheme(s ? s : m_defaultScheme); - e->editor()->setCompletionEngine(en ? en->clone() : 0); - - if ( f.count() && QFile::exists(f) ) - { - // load contents - e->editor()->load(f); - - // set line marks back... - QLineMarksInfoCenter::instance()->flush(f); - } else { - e->editor()->setTitle(tr("untitled")); - e->editor()->setContentModified(true); - } - - return e; -} - -/*! - \brief Called whenever a managed editor save its content - - Update the language definition/code completion engine if needed - and emits the fileSaved signal -*/ -void QEditorFactory::saved(QEditor *e, const QString& f) -{ - if ( !e || !e->document() ) - return; - - m_languageFactory->setLanguage(e, f); - emit fileSaved(f); -} - -/*! - \brief Placeholder -*/ -void QEditorFactory::loaded(QEditor *e, const QString& f) -{ - Q_UNUSED(f) - - if ( !e || !e->document() ) - return; - -} - -/*! - \return The default panel layout -*/ -QString QEditorFactory::defaultLayout() const -{ - QSettingsClient c(*this); - - c.beginGroup("layouts"); - QString a = c.value("default").toString(); - - if ( a.isEmpty() ) - { - c.beginGroup("availables"); - - a = childGroups().at(0); - - c.endGroup(); - } - - c.endGroup(); - - return layout(a); -} - -/*! - \return The layout structure associated with a given layout alias -*/ -QString QEditorFactory::layout(const QString& alias) const -{ - return value("layouts/availables/" + alias + "/struct").toString(); -} - -/*! - \brief Register a layout - \param a layout alias - \param layout layout structure -*/ -void QEditorFactory::registerLayout(const QString& a, const QString& layout) -{ - beginGroup("layouts"); - beginGroup("availables"); - beginGroup(a); - setValue("struct", layout); - setValue("name", a); - endGroup(); - endGroup(); - endGroup(); -} - -/*! - \return an accessor to the settings associated with a given layout alias -*/ -QSettingsClient QEditorFactory::settings(const QString& alias) -{ - return QSettingsClient(*this, "layouts/availables/" + alias); -} - -/*! @} */ - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qeditorfactory.h +++ /dev/null @@ -1,97 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QEDITOR_FACTORY_H_ -#define _QEDITOR_FACTORY_H_ - -#include "qce-config.h" - -/*! - \file qeditorfactory.h - \brief Definition of the QEditorFactory class -*/ - -#ifdef _QSAFE_SHARED_SETTINGS_ - -#ifndef _QMDI_ - #define Q_EDITOR_FACTORY_BASE QObject - #define Q_EDITOR_FACTORY_EMIT(client) -#else - #include "qmdiclientfactory.h" - - #define Q_EDITOR_FACTORY_BASE qmdiClientFactory - #define Q_EDITOR_FACTORY_EMIT(client) emit clientCreated(client); -#endif - -#include "qsettingsclient.h" - -#include <QStringList> - -class QEditor; -class QCodeEdit; -class QFormatScheme; -class QLanguageFactory; -class QCodeCompletionEngine; -class QLanguageDefinition; -class QEditorConfiguration; - -class QCE_EXPORT QEditorFactory : public Q_EDITOR_FACTORY_BASE, public QSettingsClient -{ - Q_OBJECT - - public: - QEditorFactory(QSettingsServer *s); - virtual ~QEditorFactory(); - - inline QFormatScheme* defaultFormatScheme() const - { return m_defaultScheme; } - - inline QLanguageFactory* languageFactory() const - { return m_languageFactory; } - - virtual qmdiClient* createClient(const QString& filename) const; - - QCodeEdit* editor( const QString& file, - const QString& layout = QString()) const; - - QCodeEdit* editor( const QString& file, - QLanguageDefinition *l, - QFormatScheme *s = 0, - QCodeCompletionEngine *e = 0, - const QString& layout = QString()) const; - - QString defaultLayout() const; - QString layout(const QString& alias) const; - void registerLayout(const QString& alias, const QString& layout); - - QSettingsClient settings(const QString& alias); - - signals: - void fileSaved(const QString& f); - - private slots: - void saved(QEditor *e, const QString& f); - void loaded(QEditor *e, const QString& f); - - private: - QEditorConfiguration *m_config; - - QFormatScheme *m_defaultScheme; - QLanguageFactory *m_languageFactory; -}; - -#endif // _QSAFE_SHARED_SETTINGS_ - -#endif // ! _QEDITOR_FACTORY_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qeditorinputbinding.cpp +++ /dev/null @@ -1,306 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qeditorinputbinding.h" - -#include "qeditor.h" -#include "qdocument.h" -#include "qdocumentcursor.h" - -#include <QKeyEvent> - -/*! - \class QEditorInputBindingInterface - \brief A class designed to allow extending user input in a transparent way - - An input binding interface, when set to an editor, can intercept all the events the - editor receive and radically change the behavior. - - The main purpose of this class is twofold : - <ul> - <li>Allow vi-like (or emacs-like, ...) editing to be implemented with little extra work. - And allow the user to easily switch between input modes</li> - <li>Allow applications using QCE to easily add extra features (e.g extended code - navigation within projects, jump to documentation, ...) with little extra work</li> - </ul> -*/ - -/*! - \class QEditorInputBinding - \brief A "managed" input binding interface - - This subclass of QEditorInputBindingInterface is meant to make the creatio of input - bindings easier and more intuitive by abstracting away most of the low-level event - handling logic. -*/ - -///////////////////////////////////////////////////////////////////////////// - -QEditorInputBinding::MotionCommand::MotionCommand(QDocumentCursor::MoveOperation op, QDocumentCursor::MoveMode m, int n) - : count(n), mode(m), operation(op) -{ - -} - -void QEditorInputBinding::MotionCommand::exec(QEditor *e) -{ - QDocumentCursor c = e->cursor(); - c.movePosition(count, operation, mode); - e->setCursor(c); -} - -QEditorInputBinding::EditCommand::EditCommand(Operation op) - : operation(op) -{ - -} - -void QEditorInputBinding::EditCommand::exec(QEditor *e) -{ - QDocumentCursor c = e->cursor(); - - switch ( operation ) - { - case ClearSelection : - c.clearSelection(); - break; - - case SelectWord : - c.select(QDocumentCursor::WordUnderCursor); - break; - - case SelectLine : - c.select(QDocumentCursor::LineUnderCursor); - break; - - case SelectDocument : - c.movePosition(1, QDocumentCursor::Start, QDocumentCursor::MoveAnchor); - c.movePosition(1, QDocumentCursor::End, QDocumentCursor::KeepAnchor); - break; - - case DeleteChar : - c.deleteChar(); - break; - - case DeletePreviousChar : - c.deletePreviousChar(); - break; - - case DeleteLine : - c.eraseLine(); - break; - - case DeleteSelection : - c.removeSelectedText(); - break; - - case InsertLine : - c.insertLine(); - break; - - case InsertClipBoard : - e->paste(); - return; - - default: - - break; - } - - e->setCursor(c); -} - -QEditorInputBinding::WriteCommand::WriteCommand(const QString& t) - : text(t) -{ - -} - -void QEditorInputBinding::WriteCommand::exec(QEditor *e) -{ - e->write(text); -} - -void QEditorInputBinding::GroupCommand::addCommand(Command *c) -{ - commands << c; -} - -void QEditorInputBinding::GroupCommand::exec(QEditor *e) -{ - foreach ( Command *c, commands ) - c->exec(e); -} - -///////////////////////////////////////////////////////////////////////////// - -QEditorInputBinding::QEditorInputBinding() -{ -} - -QEditorInputBinding::~QEditorInputBinding() -{ - qDeleteAll(m_actions); -} - -void QEditorInputBinding::setMapping(const QKeySequence& ks, Command *cmd) -{ - for ( int i = 0; i < m_keys.count(); ++i ) - { - if ( m_keys.at(i) == ks ) - { - delete m_actions[i]; - m_actions[i] = cmd; - return; - } - } - - m_index << 0; - m_keys << ks; - m_actions << cmd; -} - -bool QEditorInputBinding::isExclusive() const -{ - return false; -} - -bool QEditorInputBinding::keyPressEvent(QKeyEvent *event, QEditor *editor) -{ - bool filter = false; - - for ( int i = 0; i < m_keys.count(); ++i ) - { - int idx = m_index.at(i); - const QKeySequence& ks = m_keys.at(i); - - if ( idx < (int)ks.count() ) - { - if ( ks[idx] == event->key() ) - { - ++idx; - - if ( idx == (int)ks.count() ) - { - //qDebug("match"); - - // key sequence matched - m_actions.at(i)->exec(editor); - - // cancel other in progress matches ? - m_index.fill(0); - - //return true; - } else { - //qDebug("step"); - m_index[i] = idx; - } - - // filter out the event - filter = true; - } else { - m_index[i] = 0; - } - } else { - m_index[i] = 0; - } - } - - return filter; -} - -void QEditorInputBinding::postKeyPressEvent(QKeyEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) -} - -bool QEditorInputBinding::inputMethodEvent(QInputMethodEvent* event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) - - return false; -} - -void QEditorInputBinding::postInputMethodEvent(QInputMethodEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) -} - -bool QEditorInputBinding::mouseMoveEvent(QMouseEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) - - return false; -} - -void QEditorInputBinding::postMouseMoveEvent(QMouseEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) -} - -bool QEditorInputBinding::mousePressEvent(QMouseEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) - - return false; -} - -void QEditorInputBinding::postMousePressEvent(QMouseEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) -} - -bool QEditorInputBinding::mouseReleaseEvent(QMouseEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) - - return false; -} - -void QEditorInputBinding::postMouseReleaseEvent(QMouseEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) -} - -bool QEditorInputBinding::mouseDoubleClickEvent(QMouseEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) - - return false; -} - -void QEditorInputBinding::postMouseDoubleClickEvent(QMouseEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) -} - -bool QEditorInputBinding::contextMenuEvent(QContextMenuEvent *event, QEditor *editor) -{ - Q_UNUSED(event) - Q_UNUSED(editor) - - return false; -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qeditorinputbinding.h +++ /dev/null @@ -1,134 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QEDITOR_INPUT_BINDING_H_ -#define _QEDITOR_INPUT_BINDING_H_ - -#include "qeditorinputbindinginterface.h" - -#include "qdocumentcursor.h" - -#include <QList> -#include <QVector> -#include <QString> -#include <QKeySequence> - -class QCE_EXPORT QEditorInputBinding : public QEditorInputBindingInterface -{ - public: - class Command - { - public: - virtual ~Command() {} - - virtual void exec(QEditor *e) = 0; - }; - - class MotionCommand : public Command - { - public: - MotionCommand(QDocumentCursor::MoveOperation op, QDocumentCursor::MoveMode m, int n = 1); - - virtual void exec(QEditor *e); - - private: - int count; - QDocumentCursor::MoveMode mode; - QDocumentCursor::MoveOperation operation; - }; - - class EditCommand : public Command - { - public: - enum Operation - { - ClearSelection, - SelectWord, - SelectLine, - SelectDocument, - - DeleteChar, - DeletePreviousChar, - DeleteSelection, - DeleteLine, - - InsertLine, - InsertClipBoard, - }; - - EditCommand(Operation op); - - virtual void exec(QEditor *e); - - private: - Operation operation; - }; - - class WriteCommand : public Command - { - public: - WriteCommand(const QString& t); - - virtual void exec(QEditor *e); - - private: - QString text; - }; - - class GroupCommand : public Command - { - public: - void addCommand(Command *c); - - virtual void exec(QEditor *e); - - private: - QList<Command*> commands; - }; - - QEditorInputBinding(); - ~QEditorInputBinding(); - - void setMapping(const QKeySequence& ks, Command *cmd); - - virtual bool isExclusive() const; - - virtual bool keyPressEvent(QKeyEvent *event, QEditor *editor); - virtual void postKeyPressEvent(QKeyEvent *event, QEditor *editor); - - virtual bool inputMethodEvent(QInputMethodEvent* event, QEditor *editor); - virtual void postInputMethodEvent(QInputMethodEvent *event, QEditor *editor); - - virtual bool mouseMoveEvent(QMouseEvent *event, QEditor *editor); - virtual void postMouseMoveEvent(QMouseEvent *event, QEditor *editor); - - virtual bool mousePressEvent(QMouseEvent *event, QEditor *editor); - virtual void postMousePressEvent(QMouseEvent *event, QEditor *editor); - - virtual bool mouseReleaseEvent(QMouseEvent *event, QEditor *editor); - virtual void postMouseReleaseEvent(QMouseEvent *event, QEditor *editor); - - virtual bool mouseDoubleClickEvent(QMouseEvent *event, QEditor *editor); - virtual void postMouseDoubleClickEvent(QMouseEvent *event, QEditor *editor); - - virtual bool contextMenuEvent(QContextMenuEvent *event, QEditor *editor); - - private: - QVector<int> m_index; - QVector<Command*> m_actions; - QVector<QKeySequence> m_keys; -}; - -#endif // _QEDITOR_INPUT_BINDING_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qeditorinputbindinginterface.h +++ /dev/null @@ -1,60 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QEDITOR_INPUT_BINDING_INTERFACE_H_ -#define _QEDITOR_INPUT_BINDING_INTERFACE_H_ - -#include "qce-config.h" - -class QEditor; - -class QString; -class QKeyEvent; -class QMouseEvent; -class QInputMethodEvent; -class QContextMenuEvent; - -class QEditorInputBindingInterface -{ - public: - virtual ~QEditorInputBindingInterface() {} - - virtual QString id() const = 0; - virtual QString name() const = 0; - - virtual bool isExclusive() const = 0; - - virtual bool keyPressEvent(QKeyEvent *event, QEditor *editor) = 0; - virtual void postKeyPressEvent(QKeyEvent *event, QEditor *editor) = 0; - - virtual bool inputMethodEvent(QInputMethodEvent* event, QEditor *editor) = 0; - virtual void postInputMethodEvent(QInputMethodEvent *event, QEditor *editor) = 0; - - virtual bool mouseMoveEvent(QMouseEvent *event, QEditor *editor) = 0; - virtual void postMouseMoveEvent(QMouseEvent *event, QEditor *editor) = 0; - - virtual bool mousePressEvent(QMouseEvent *event, QEditor *editor) = 0; - virtual void postMousePressEvent(QMouseEvent *event, QEditor *editor) = 0; - - virtual bool mouseReleaseEvent(QMouseEvent *event, QEditor *editor) = 0; - virtual void postMouseReleaseEvent(QMouseEvent *event, QEditor *editor) = 0; - - virtual bool mouseDoubleClickEvent(QMouseEvent *event, QEditor *editor) = 0; - virtual void postMouseDoubleClickEvent(QMouseEvent *event, QEditor *editor) = 0; - - virtual bool contextMenuEvent(QContextMenuEvent *event, QEditor *editor) = 0; -}; - -#endif // _QEDITOR_INPUT_BINDING_INTERFACE_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qeditsession.cpp +++ /dev/null @@ -1,534 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qeditsession.h" - -/*! - \file qeditsession.cpp - \brief Implementation of the QEditSession class. -*/ - -#include "qeditor.h" -#include "qdocument.h" -#include "qdocument_p.h" -#include "qdocumentline.h" -#include "qdocumentcursor.h" - -#include "qlinemarksinfocenter.h" - -#include <QFile> -#include <QFileInfo> -#include <QDataStream> -#include <QScrollBar> - -/*! - \class QEditSession - - \brief A session recording class - - The purpose of this class is to collect session data from several QEditor object, - to serialize it and to re-create the same session by deserializing the stored data. -*/ - -/*! - \brief ctor -*/ -QEditSession::QEditSession(QObject *p) - : QObject(p), m_id(-1), m_delay(0) -{ - -} - -/*! - \brief ctor -*/ -QEditSession::QEditSession(const QString& f, QObject *p) - : QObject(p), m_id(-1), m_delay(0) -{ - setFileName(f); -} - -/*! - \brief dtor -*/ -QEditSession::~QEditSession() -{ - -} - -/*! - \return The update interval, in milliseconds - - A value of zero means the data is NOT automatically updated. - - \see updateData() -*/ -int QEditSession::autoUpdateInterval() const -{ - return m_delay; -} - -/*! - \brief Set the update interval - - If \a ms is strictly positive then the data will be - updated every \a ms milliseconds - - If the session has been given a valid filename, the updated - data will automatically be saved to that file. -*/ -void QEditSession::setAutoUpdateInterval(int ms) -{ - if ( m_delay ) - { - killTimer(m_id); - m_id = -1; - } - - m_delay = ms; - - if ( m_delay ) - { - m_id = startTimer(m_delay); - } -} - -/*! - \return The file name used as storage - - If it is empty then no auto-save is performed. -*/ -QString QEditSession::fileName() const -{ - return m_fileName; -} - -/*! - \brief Set the storage destination - - Every time the data is updated, either when the autoupdate timer - ticks or when updateData() is called programmatically, it will be - written to that file, provided the filename is valid and points - to a writeable location. - - \see updateData() - \see autoUpdateInterval() -*/ -void QEditSession::setFileName(const QString& filename, bool r) -{ - m_fileName = filename; - - if ( r ) - restore(); - -} - -/*! - \brief Add an editor to the session -*/ -void QEditSession::addEditor(QEditor *e) -{ - if ( m_editors.contains(e) ) - return; - - //qDebug("+ 0x%x", e); - - Document *d = new Document; - - m_editors << e; - m_sessionData << d; - - connect(e , SIGNAL( destroyed(QObject*) ), - this, SLOT ( destroyed(QObject*) ) ); - - connect(e , SIGNAL( saved(QEditor*, QString) ), - this, SLOT ( saved(QEditor*, QString) ) ); - - connect(e , SIGNAL( loaded(QEditor*, QString) ), - this, SLOT ( loaded(QEditor*, QString) ) ); - - update(e, d); -} - -/*! - \brief Remove an editor from the session -*/ -void QEditSession::removeEditor(QEditor *e) -{ - int idx = m_editors.indexOf(e); - - if ( idx == -1 ) - return; - - //qDebug("- 0x%x", e); - - disconnect( e , SIGNAL( destroyed(QObject*) ), - this, SLOT ( destroyed(QObject*) ) ); - - disconnect( e , SIGNAL( saved(QEditor*, QString) ), - this, SLOT ( saved(QEditor*, QString) ) ); - - disconnect( e , SIGNAL( loaded(QEditor*, QString) ), - this, SLOT ( loaded(QEditor*, QString) ) ); - - m_editors.removeAt(idx); - delete m_sessionData.takeAt(idx); -} - -/*! - -*/ -void QEditSession::clear(bool cleanup) -{ - if ( cleanup ) - qDeleteAll(m_editors); - - qDeleteAll(m_sessionData); - - m_editors.clear(); - m_sessionData.clear(); -} - -/*! - \brief Serialize session data -*/ -void QEditSession::save() -{ - QFile f(m_fileName); - - if ( f.open(QFile::WriteOnly) ) - { - QDataStream s(&f); - - save(s); - } -} - -/*! - \brief Serialize session data -*/ -void QEditSession::restore() -{ - QFile f(m_fileName); - - if ( f.open(QFile::ReadOnly) ) - { - QDataStream s(&f); - - restore(s); - } -} - -static const char _magic[] = "QES "; - -/*! - \brief Serialize session data -*/ -void QEditSession::save(QDataStream& s) -{ - //qDebug("saving"); - - s << *(reinterpret_cast<const quint32*>(_magic)); - s << m_sessionData.count(); - - foreach ( Document *d, m_sessionData ) - { - //qDebug("> %s", qPrintable(d->fileName)); - - s << d->fileName; - s << d->timeStamp; - - s << d->cursors.count(); - - foreach ( const Cursor& c, d->cursors ) - s << c.beginLine << c.beginColumn << c.endLine << c.endColumn; - - s << d->marks.count(); - - QHash<int, QList<int> >::const_iterator it = d->marks.constBegin(); - const QHash<int, QList<int> >::const_iterator end = d->marks.constEnd(); - - while ( it != end ) - { - s << it.key() << *it; - } - - s << d->scrollX; - s << d->scrollY; - } -} - -/*! - \brief Deserialize session data -*/ -void QEditSession::restore(QDataStream& s) -{ - //qDebug("restoring"); - - quint32 magic; - - s >> magic; - - if ( magic != *(reinterpret_cast<const quint32*>(_magic)) ) - { - qDebug("header mismatch : %i, %i", magic, s.status()); - return; - } - - int documentCount = 0; - - s >> documentCount; - - for ( int i = 0; i < documentCount; ++i ) - { - Document *d = new Document; - - s >> d->fileName; - s >> d->timeStamp; - - //qDebug("> %s", qPrintable(d->fileName)); - - int cursorCount = 0; - - s >> cursorCount; - - bool exist = QFile::exists(d->fileName); - QEditor *e = exist ? createEditor() : 0; - - if ( e ) - e->load(d->fileName); - - for ( int j = 0; j < cursorCount; ++j ) - { - Cursor c; - - s >> c.beginLine; - s >> c.beginColumn; - s >> c.endLine; - s >> c.endColumn; - - d->cursors << c; - } - - int markCount = 0; - s >> markCount; - - for ( int j = 0; j < markCount; ++j ) - { - int line = 0; - QList<int> marks; - - s >> line; - s >> marks; - - d->marks[line] = marks; - - foreach ( int mark, marks ) - e->document()->line(line).addMark(mark); - } - - s >> d->scrollX; - s >> d->scrollY; - - if ( e && cursorCount ) - { - QDocumentCursor c = d->cursors.first().toDocumentCursor(e->document()); - - e->setCursor(c); - - for ( int j = 1; j < cursorCount; ++j ) - { - e->addCursorMirror(d->cursors.at(j).toDocumentCursor(e->document())); - } - } - - // TODO : defer. it does not seem to work properly that way - // TODO : view size independency (store the first visible line number) - e->verticalScrollBar()->setValue(d->scrollY); - e->horizontalScrollBar()->setValue(d->scrollX); - - if ( e ) - { - connect(e , SIGNAL( destroyed(QObject*) ), - this, SLOT ( destroyed(QObject*) ) ); - - connect(e , SIGNAL( saved(QEditor*, QString) ), - this, SLOT ( saved(QEditor*, QString) ) ); - - connect(e , SIGNAL( loaded(QEditor*, QString) ), - this, SLOT ( loaded(QEditor*, QString) ) ); - - m_editors << e; - m_sessionData << d; - - emit restored(e); - } else { - delete d; - } - } -} - -/*! - \brief Updates the data - - Fetches up-to-date session data from the attached editors. - - If the session has been given a valid filename the data will - automatically be saved. - - \note This will NOT affect the automatic updates timing -*/ -void QEditSession::updateData() -{ - for ( int i = 0; i < m_editors.count(); ++i ) - { - QEditor *e = m_editors.at(i); - Document *d = m_sessionData.at(i); - - update(e, d); - } - - save(); -} - -void QEditSession::destroyed(QObject *o) -{ - //qDebug("~ 0x%x", o); - - for ( int i = 0; i < m_editors.count(); ++i ) - { - QEditor *e = m_editors.at(i); - - if ( !e || ((QObject*)e == o) ) - { - delete m_sessionData.takeAt(i); - m_editors.removeAt(i); - break; - } - } -} - -/*! - \brief Called whenever an editor is saved - - This handler is responsible for updating file names and time stamps - which is needed to avoid data loss upon session restoration -*/ -void QEditSession::saved(QEditor *e, const QString& fn) -{ - int idx = m_editors.indexOf(e); - - if ( idx == -1 ) - return; - - //qDebug("saved : %s", qPrintable(fn)); - - Document *d = m_sessionData.at(idx); - - //d->timeStamp = QDateTime::currentDateTime(); - - update(e, d); -} - -/*! - \brief Called whenever an editor is loaded with new content - - This handler is responsible for updating file names and time stamps - which is needed to avoid data loss upon session restoration -*/ -void QEditSession::loaded(QEditor *e, const QString& fn) -{ - int idx = m_editors.indexOf(e); - - if ( idx == -1 ) - return; - - //qDebug("loaded : %s", qPrintable(fn)); - - Document *d = m_sessionData.at(idx); - - //d->timeStamp = QDateTime::currentDateTime(); - - update(e, d); -} - -void QEditSession::update(QEditor *e, Document *d) -{ - if ( !e || !d ) - return; - - //qDebug(">>%s", qPrintable(e->fileName())); - - d->fileName = e->fileName(); - d->timeStamp = QFileInfo(d->fileName).lastModified(); - - d->cursors.clear(); - d->cursors << Cursor(e->cursor()); - - for ( int i = 0; i < e->cursorMirrorCount(); ++i ) - d->cursors << Cursor(e->cursorMirror(i)); - - QLineMarkList marks = QLineMarksInfoCenter::instance()->marks(d->fileName); - - foreach ( const QLineMark& mark, marks ) - { - d->marks[mark.line] << mark.mark; - } - - d->scrollX = e->verticalScrollBar()->value(); - d->scrollY = e->horizontalScrollBar()->value(); -} - -/*! - \internal -*/ -void QEditSession::timerEvent(QTimerEvent *e) -{ - if ( e->timerId() == m_id ) - { - updateData(); - } -} - -QEditor* QEditSession::createEditor() -{ - return new QEditor; -} - -QEditSession::Cursor::Cursor(const QDocumentCursor& c) -{ - beginLine = c.lineNumber(); - beginColumn = c.columnNumber(); - endLine = c.hasSelection() ? c.anchorLineNumber() : -1; - endColumn = c.hasSelection() ? c.anchorColumnNumber() : -1; - - //qDebug("((%i, %i), (%i, %i))", beginLine, beginColumn, endLine, endColumn); -} - -QDocumentCursor QEditSession::Cursor::toDocumentCursor(QDocument *d) const -{ - //qDebug("((%i, %i), (%i, %i))", beginLine, beginColumn, endLine, endColumn); - - QDocumentCursor beg(d, beginLine, beginColumn); - QDocumentCursor end(d, endLine, endColumn); - - if ( endLine != -1 ) - { - end.setSelectionBoundary(beg); - return end; - } - - return beg; -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qeditsession.h +++ /dev/null @@ -1,127 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QEDIT_SESSION_H_ -#define _QEDIT_SESSION_H_ - -#include "qce-config.h" - -/*! - \file qeditsession.h - \brief Definition of the QEditSession class. -*/ - -#include <QHash> -#include <QObject> -#include <QPointer> -#include <QDateTime> -#include <QStringList> - -class QEditor; - -class QDocument; -class QDocumentCursor; -class QDocumentCommand; - -class QDataStream; - -class QCE_EXPORT QEditSession : public QObject -{ - Q_OBJECT - - public: - QEditSession(QObject *p = 0); - QEditSession(const QString& f, QObject *p = 0); - virtual ~QEditSession(); - - int autoUpdateInterval() const; - - QString fileName() const; - - public slots: - virtual void addEditor(QEditor *e); - virtual void removeEditor(QEditor *e); - - virtual void updateData(); - - virtual void setAutoUpdateInterval(int ms); - - virtual void setFileName(const QString& filename, bool restore = false); - - virtual void clear(bool cleanup = false); - - virtual void save(); - virtual void restore(); - - virtual void save(QDataStream& s); - virtual void restore(QDataStream& s); - - signals: - void restored(QEditor *e); - - protected slots: - virtual void destroyed(QObject *o); - - virtual void saved(QEditor *e, const QString& fn); - virtual void loaded(QEditor *e, const QString& fn); - - protected: - virtual void timerEvent(QTimerEvent *e); - - virtual QEditor* createEditor(); - - struct Cursor - { - Cursor() - : beginLine(-1), beginColumn(-1), endLine(-1), endColumn(-1) {} - - Cursor(int line, int column) - : beginLine(line), beginColumn(column), endLine(-1), endColumn(-1) {} - - Cursor(const Cursor& c) - : beginLine(c.beginLine), beginColumn(c.beginColumn), endLine(c.endLine), endColumn(c.endColumn) {} - - Cursor(const QDocumentCursor& c); - - QDocumentCursor toDocumentCursor(QDocument *d) const; - - int beginLine; - int beginColumn; - int endLine; - int endColumn; - }; - - struct Document - { - QString fileName; - QDateTime timeStamp; - - int scrollX, scrollY; - - QList<Cursor> cursors; - QHash<int, QList<int> > marks; - }; - - virtual void update(QEditor *e, Document *d); - - int m_id; - int m_delay; - QString m_fileName; - - QList<QEditor*> m_editors; - QList<Document*> m_sessionData; -}; - -#endif // ! _QEDIT_SESSION_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qformat.h +++ /dev/null @@ -1,178 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QFORMAT_H_ -#define _QFORMAT_H_ - -/*! - \file qformat.h - \brief Definition of the QFormat class -*/ - -#include <QFont> -#include <QColor> -#include <QTextCharFormat> - -template <typename T> -class QVector; - -struct QFormat -{ - inline QFormat() - : weight(QFont::Normal), italic(false), overline(false), underline(false), strikeout(false), waveUnderline(false) - {} - - inline QFormat(const QColor& c) - : weight(QFont::Normal), italic(false), overline(false), underline(false), strikeout(false), waveUnderline(false), foreground(c) - {} - - inline QFormat(int w, const QColor& c) - : weight(w), italic(false), overline(false), underline(false), strikeout(false), waveUnderline(false), foreground(c) - {} - - inline QFormat(int w, bool i, bool u, bool s, const QColor& c) - : weight(w), italic(i), overline(false), underline(u), strikeout(s), waveUnderline(false), foreground(c) - {} - - inline QFormat(int w, bool i, bool o, bool u, bool s, bool wu, const QColor& c) - : weight(w), italic(i), overline(o), underline(u), strikeout(s), waveUnderline(wu), foreground(c) - {} - - inline QFormat(const QFormat& f) - : weight(f.weight), italic(f.italic), - overline(f.overline), underline(f.underline), strikeout(f.strikeout), waveUnderline(f.waveUnderline), - foreground(f.foreground), background(f.background), linescolor(f.linescolor) - {} - - inline QFormat& operator = (const QFormat& f) - { - weight = f.weight; - italic = f.italic; - overline = f.overline; - underline = f.underline; - strikeout = f.strikeout; - foreground = f.foreground; - background = f.background; - linescolor = f.linescolor; - waveUnderline = f.waveUnderline; - - return *this; - } - - inline bool operator == (const QFormat& f) const - { - return (weight == f.weight) - && - (italic == f.italic) - && - (overline == f.overline) - && - (underline == f.underline) - && - (strikeout == f.strikeout) - && - (foreground == f.foreground) - && - (background == f.background) - && - (linescolor == f.linescolor) - && - (waveUnderline == f.waveUnderline) - ; - } - - inline bool operator != (const QFormat& f) const - { - return (weight != f.weight) - || - (italic != f.italic) - || - (overline != f.overline) - || - (underline != f.underline) - || - (strikeout != f.strikeout) - || - (foreground != f.foreground) - || - (background != f.background) - || - (linescolor != f.linescolor) - || - (waveUnderline != f.waveUnderline) - ; - } - - QTextCharFormat toTextCharFormat() const - { - QTextCharFormat f; - f.setFontWeight(weight); - f.setFontItalic(italic); - f.setFontOverline(overline); - f.setFontUnderline(underline); - f.setFontStrikeOut(strikeout); - f.setUnderlineColor(linescolor); - - if ( waveUnderline ) - { - f.setUnderlineStyle(QTextCharFormat::WaveUnderline); - } - - if ( foreground.isValid() ) - f.setForeground(foreground); - - if ( background.isValid() ) - f.setBackground(background); - - return f; - } - - int weight; - bool italic; - bool overline; - bool underline; - bool strikeout; - bool waveUnderline; - QColor foreground; - QColor background; - QColor linescolor; -}; - -Q_DECLARE_TYPEINFO(QFormat, Q_MOVABLE_TYPE); - -struct QFormatRange -{ - inline QFormatRange() - : offset(0), length(0), format(0) - {} - - inline QFormatRange(int o, int l, int f) - : offset(o), length(l), format(f) - {} - - inline bool operator == (const QFormatRange& o) - { return (offset == o.offset) && (length == o.length) && (format == o.format); } - - inline bool operator != (const QFormatRange& o) - { return (offset != o.offset) || (length != o.length) || (format != o.format); } - - int offset; - int length; - int format; -}; - -Q_DECLARE_TYPEINFO(QFormatRange, Q_PRIMITIVE_TYPE); - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qformatfactory.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - Transition header file. -*/ - -#ifndef _QFORMAT_FACTORY_H_ - -#include "qformatscheme.h" - -class QFormatFactory : public QFormatScheme -{ - public: - inline QFormatFactory(QObject *p = 0) : QFormatScheme(p) {} - inline QFormatFactory(const QString& f, QObject *p = 0) : QFormatScheme(f, p) {} -}; - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qformatscheme.cpp +++ /dev/null @@ -1,493 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qformatscheme.h" - -/*! - \file qformatscheme.cpp - \brief Implementation of QFormatScheme - - \see QFormatScheme -*/ - -/*! - \ingroup language - @{ - - \class QFormatScheme - \brief A storage/configuration class for shared highlighting formats - - It stores text formats used by highlighters interfaces and provides - a default serializing format in QXF format (XML-based). - - \see QLanguageFactory - \see QHighlighter -*/ - -#include "qformat.h" - -#include <QFile> -#include <QDomText> -#include <QSettings> -#include <QStringList> -#include <QDomElement> -#include <QDomDocument> - -#define QFORMAT_VERSION "1.0" - -static bool bool_cast(const QString& s) -{ - return !QString::compare(s, QLatin1String("true")) || s.toUInt() == 1; -} - -/*! - \brief Constructor -*/ -QFormatScheme::QFormatScheme(QObject *p) - : QObject(p) -{ - setFormat("normal", QFormat()); -} - -/*! - \brief Constructor - \param f Filename of a format settings file to load -*/ -QFormatScheme::QFormatScheme(const QString& f, QObject *p) - : QObject(p) -{ - load(f); -} - -/*! - \brief Destructor -*/ -QFormatScheme::~QFormatScheme() -{ -} - -/*! - \brief Re-initialize the format scheme - - Calling this method leaves the format scheme with only one - format : the "normal" one, set to a default-constructed QFormat -*/ -void QFormatScheme::clear() -{ - m_formatKeys.clear(); - m_formatValues.clear(); - - setFormat("normal", QFormat()); -} - -/*! - \brief Load format settings from a file - \param f file to load data from - - The default implementation loads data in QXF format (XML-based) - - \note Previous content is discarded -*/ -void QFormatScheme::load(const QString& f) -{ - clear(); - m_settings = f; - - QFile settings(f); - - if ( settings.open(QFile::ReadOnly | QFile::Text) ) - { - QDomDocument doc; - doc.setContent(&settings); - - load(doc.documentElement()); - } -} - -/*! - \brief Save the format settings to a file - \param f target file (if none specified, last value passed to load is used) - - The default implementation saves data in QXF format (XML-based) -*/ -void QFormatScheme::save(const QString& f) const -{ - QFile settings(f.count() ? f : m_settings); - - if ( settings.open(QFile::WriteOnly | QFile::Text) ) - { - QDomDocument doc("QXF"); - QDomElement root = doc.createElement("QXF"); - save(root); - doc.appendChild(root); - settings.write(doc.toByteArray(4)); - } -} - -/*! - \overload - \param elem Source element to scan - \param ignoreNewIds whether unknown format identifiers should be ignored - - The given dom element must contain a proper version attribute and format - data as child elements (<format> tags) - - \note Previous content is not discarded -*/ -void QFormatScheme::load(const QDomElement& elem, bool ignoreNewIds) -{ - if ( elem.attribute("version") < QFORMAT_VERSION ) - { - qWarning("Format encoding version mismatch : [found]%s != [expected]%s", - qPrintable(elem.attribute("version")), - QFORMAT_VERSION); - - return; - } - - QDomElement e, c; - QDomNodeList l, f = elem.elementsByTagName("format"); - - for ( int i = 0; i < f.count(); i++ ) - { - e = f.at(i).toElement(); - - if ( ignoreNewIds && !m_formatKeys.contains(e.attribute("id")) ) - continue; - - l = e.childNodes(); - - QFormat fmt; - - for ( int i = 0; i < l.count(); i++ ) - { - c = l.at(i).toElement(); - - if ( c.isNull() ) - continue; - - QString field = c.tagName(), - value = c.firstChild().toText().data(); - - if ( field == "bold" ) - fmt.weight = bool_cast(value) ? QFont::Bold : QFont::Normal; - else if ( field == "italic" ) - fmt.italic = bool_cast(value); - else if ( field == "overline" ) - fmt.overline = bool_cast(value); - else if ( field == "underline" ) - fmt.underline = bool_cast(value); - else if ( field == "strikeout" ) - fmt.strikeout = bool_cast(value); - else if ( field == "waveUnderline" ) - fmt.waveUnderline = bool_cast(value); - else if ( field == "color" || field == "foreground" ) - fmt.foreground = QColor(value); - else if ( field == "background" ) - fmt.background = QColor(value); - else if ( field == "linescolor" ) - fmt.linescolor = QColor(value); - - } - - setFormat(e.attribute("id"), fmt); - } -} - -/*! - \overload -*/ -void QFormatScheme::save(QDomElement& elem) const -{ - QDomDocument doc = elem.ownerDocument(); - elem.setAttribute("version", QFORMAT_VERSION); - - for ( int i = 0; i < m_formatKeys.count(); ++i ) - { - QDomText t; - QDomElement f, c = doc.createElement("format"); - - c.setAttribute("id", m_formatKeys.at(i)); - - const QFormat& fmt = m_formatValues.at(i); - - f = doc.createElement("bold"); - t = doc.createTextNode((fmt.weight == QFont::Bold) ? "true" : "false"); - f.appendChild(t); - c.appendChild(f); - - f = doc.createElement("italic"); - t = doc.createTextNode(fmt.italic ? "true" : "false"); - f.appendChild(t); - c.appendChild(f); - - f = doc.createElement("overline"); - t = doc.createTextNode(fmt.overline ? "true" : "false"); - f.appendChild(t); - c.appendChild(f); - - f = doc.createElement("underline"); - t = doc.createTextNode(fmt.underline ? "true" : "false"); - f.appendChild(t); - c.appendChild(f); - - f = doc.createElement("strikeout"); - t = doc.createTextNode(fmt.strikeout ? "true" : "false"); - f.appendChild(t); - c.appendChild(f); - - f = doc.createElement("waveUnderline"); - t = doc.createTextNode(fmt.waveUnderline ? "true" : "false"); - f.appendChild(t); - c.appendChild(f); - - if ( fmt.foreground.isValid() ) - { - f = doc.createElement("foreground"); - t = doc.createTextNode(fmt.foreground.name()); - f.appendChild(t); - c.appendChild(f); - } - - if ( fmt.background.isValid() ) - { - f = doc.createElement("background"); - t = doc.createTextNode(fmt.background.name()); - f.appendChild(t); - c.appendChild(f); - } - - if ( fmt.linescolor.isValid() ) - { - f = doc.createElement("linescolor"); - t = doc.createTextNode(fmt.linescolor.name()); - f.appendChild(t); - c.appendChild(f); - } - - elem.appendChild(c); - } -} - -/*! - \overload - \brief Load format data from a QSettings object - \param s QSettings object from which data will be fetched - \param ignoreNewIds whether unknown format identifiers should be ignored - - The QSettings object is assumed to be initialized properly and to - point to a correct location. - - \note Previous content is not discarded -*/ -void QFormatScheme::load(QSettings& s, bool ignoreNewIds) -{ - QString version = s.value("version").toString(); - - if ( version < QFORMAT_VERSION ) - { - qWarning("Format encoding version mismatch : [found]%s != [expected]%s", - qPrintable(version), - QFORMAT_VERSION); - - return; - } - - s.beginGroup("data"); - - QStringList l = s.childGroups(); - - foreach ( QString id, l ) - { - if ( ignoreNewIds && !m_formatKeys.contains(id) ) - continue; - - s.beginGroup(id); - - QFormat fmt; - QStringList fields = s.childKeys(); - - foreach ( QString field, fields ) - { - QString value = s.value(field).toString(); - - if ( field == "bold" ) - fmt.weight = bool_cast(value) ? QFont::Bold : QFont::Normal; - else if ( field == "italic" ) - fmt.italic = bool_cast(value); - else if ( field == "overline" ) - fmt.overline = bool_cast(value); - else if ( field == "underline" ) - fmt.underline = bool_cast(value); - else if ( field == "strikeout" ) - fmt.strikeout = bool_cast(value); - else if ( field == "waveUnderline" ) - fmt.waveUnderline = bool_cast(value); - else if ( field == "color" || field == "foreground" ) - fmt.foreground = QColor(value); - else if ( field == "background" ) - fmt.background = QColor(value); - else if ( field == "linescolor" ) - fmt.linescolor = QColor(value); - - } - - setFormat(id, fmt); - s.endGroup(); - } - - s.endGroup(); -} - -/*! - \overload -*/ -void QFormatScheme::save(QSettings& s) const -{ - s.setValue("version", QFORMAT_VERSION); - - s.beginGroup("data"); - - for ( int i = 0; i < m_formatKeys.count(); ++i ) - { - s.beginGroup(m_formatKeys.at(i)); - - const QFormat& fmt = m_formatValues.at(i); - - s.setValue("bold", (fmt.weight == QFont::Bold) ? "true" : "false"); - s.setValue("italic", fmt.italic ? "true" : "false"); - s.setValue("overline", fmt.overline ? "true" : "false"); - s.setValue("underline", fmt.underline ? "true" : "false"); - s.setValue("strikeout", fmt.strikeout ? "true" : "false"); - s.setValue("waveUnderline", fmt.waveUnderline ? "true" : "false"); - - if ( fmt.foreground.isValid() ) - { - s.setValue("foreground", fmt.foreground.name()); - } - - if ( fmt.background.isValid() ) - { - s.setValue("background", fmt.background.name()); - } - - if ( fmt.linescolor.isValid() ) - { - s.setValue("linescolor", fmt.linescolor.name()); - } - - s.endGroup(); - } - - s.endGroup(); -} - -/*! - \return The number of available formats -*/ -int QFormatScheme::formatCount() const -{ - return m_formatValues.count(); -} - -/*! - \return A list of available format keys -*/ -QStringList QFormatScheme::formats() const -{ - return m_formatKeys.toList(); -} - -/*! - \return The format key associated to integer format id \a ifid -*/ -QString QFormatScheme::id(int ifid) const -{ - return m_formatKeys.at(ifid); -} - -/*! - \return The integer format id associated to format key \a fid -*/ -int QFormatScheme::id(const QString& sfid) const -{ - int idx = m_formatKeys.indexOf(sfid); - - return (idx == -1) ? 0 : idx; -} - -/*! - \return The text format associated with format key \a fid - - \warning Use at your own risks : if there are no format associated - with the requested id this function will crash -*/ -QFormat& QFormatScheme::formatRef(int ifid) -{ - return m_formatValues[ifid]; -} - -/*! - \return The a reference to the text format associated with format key \a fid - - \warning Use at your own risks : if there are no format associated - with the requested id this function will crash. -*/ -QFormat& QFormatScheme::formatRef(const QString& sfid) -{ - return m_formatValues[id(sfid)]; -} - -/*! - \return The text format associated with format key \a fid -*/ -QFormat QFormatScheme::format(int ifid) const -{ - //qDebug("Querying format id %i within ]-1, %i[", ifid, m_formatValues.count()); - - return (ifid < m_formatValues.count()) ? m_formatValues.at(ifid) : QFormat(); -} - -/*! - \return The text format associated with format key \a fid -*/ -QFormat QFormatScheme::format(const QString& sfid) const -{ - return format(id(sfid)); -} - -/*! - \brief Set text format for key - \param fid Format key - \param fmt Format value -*/ -void QFormatScheme::setFormat(const QString& fid, const QFormat& fmt) -{ - const int idx = m_formatKeys.indexOf(fid); - - if ( idx != -1 ) - { - m_formatValues[idx] = fmt; - } else { - - //qDebug("adding format %s [%i]", qPrintable(fid), m_formatKeys.count()); - - m_formatKeys << fid; - m_formatValues << fmt; - } -} - -/*! @} */ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qformatscheme.h +++ /dev/null @@ -1,83 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QFORMAT_SCHEME_H_ -#define _QFORMAT_SCHEME_H_ - -/*! - \file qformatscheme.h - \brief Definition of the QFormatScheme class. - - \see QFormatScheme -*/ - -/*! - \defgroup language Language framework -*/ - -#include "qce-config.h" - -#include <QVector> -#include <QObject> - -struct QFormat; -class QString; -class QSettings; -class QStringList; -class QDomElement; - -class QCE_EXPORT QFormatScheme : public QObject -{ - Q_OBJECT - - public: - QFormatScheme(QObject *p = 0); - QFormatScheme(const QString& f, QObject *p = 0); - virtual ~QFormatScheme(); - - void clear(); - - virtual void load(const QString& filename); - virtual void save(const QString& filename = QString()) const; - - virtual void load(const QDomElement& doc, bool ignoreNewIds = false); - virtual void save(QDomElement& elem) const; - - virtual void load(QSettings& s, bool ignoreNewIds = false); - virtual void save(QSettings& s) const; - - int formatCount() const; - QStringList formats() const; - - virtual QString id(int ifid) const; - virtual int id(const QString& sfid) const; - - virtual QFormat& formatRef(int ifid); - virtual QFormat& formatRef(const QString& sfid); - - virtual QFormat format(int ifid) const; - virtual QFormat format(const QString& sfid) const; - - public slots: - virtual void setFormat(const QString& fid, const QFormat& fmt); - - protected: - QString m_settings; - - QVector<QString> m_formatKeys; - QVector<QFormat> m_formatValues; -}; - -#endif // !_QFORMAT_SCHEME_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qlanguagedefinition.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qlanguagedefinition.h" - -/*! - \file qlanguagedefinition.cpp - \brief Implementation of QLanguageDefinition - - \see QLanguageDefinition -*/ - -/*! - \ingroup language - @{ - - \class QLanguageDefinition - \brief Interface for language definition. - - This class is meant to be subclassed, see \see QGenericDefinition for more - informations, and added to a QLanguageFactory. - - A language definition is a wrapper that creates interfaces for a given file - extension from internally handled data (XML files in the case of - QGenericDefinition) - - \see QLanguageFactory -*/ - -#include "qdocument.h" -#include "qdocumentline.h" -#include "qdocumentcursor.h" - -#include "qlanguagefactory.h" - -#include <QKeyEvent> - -/*! - \brief Empty constructor -*/ -QLanguageDefinition::QLanguageDefinition() -{ -} - -/*! - \brief Empty destructor -*/ -QLanguageDefinition::~QLanguageDefinition() -{ -} - -/*! - \fn QLanguageDefinition::language() - - \return The language supported by this definition -*/ - -/*! - \fn QLanguageDefinition::extensions() - - \return the file extensions corrseponding to the supported language - - \see language() - \see QFileInfo::completeSuffix() -*/ - -/*! - \brief Entry point for syntax highlighting -*/ -int QLanguageDefinition::tokenize(QDocument *d, int line, int count) -{ - Q_UNUSED(d) - Q_UNUSED(line) - - return count; -} - -/*! - \brief Return the string starting a single line comment, if any offered by the language -*/ -QString QLanguageDefinition::singleLineComment() const -{ - return QString(); -} - -/*! - \brief Let language specify which line mark should be toggled by left clicking a line mark panel -*/ -QString QLanguageDefinition::defaultLineMark() const -{ - return QString(); -} - -/*! - \brief Brace matching entry point -*/ -void QLanguageDefinition::clearMatches(QDocument *d) -{ - Q_UNUSED(d) -} - -/*! - \brief Brace matching entry point -*/ -void QLanguageDefinition::match(QDocumentCursor& c) -{ - Q_UNUSED(c) -} - -/*! - \brief Return the indent to use when inserting a line at a given cursor position -*/ -QString QLanguageDefinition::indent(const QDocumentCursor& c) -{ - Q_UNUSED(c) - - return QString(); -} - -/*! - \brief Determines whether the given key event at the given position should cause unindent to happen -*/ -bool QLanguageDefinition::unindent (const QDocumentCursor& c, const QString& ktxt) -{ - Q_UNUSED(c) - Q_UNUSED(ktxt) - - return false; -} - -/*! - \brief Expand a collapsed block at a given line -*/ -void QLanguageDefinition::expand(QDocument *d, int line) -{ - Q_UNUSED(d) - Q_UNUSED(line) -} - -/*! - \brief Collapse a text block at a given line -*/ -void QLanguageDefinition::collapse(QDocument *d, int line) -{ - Q_UNUSED(d) - Q_UNUSED(line) -} - -/*! - \brief Compute the collapse state of a line -*/ -int QLanguageDefinition::blockFlags(QDocument *d, int line, int depth) const -{ - Q_UNUSED(d) - Q_UNUSED(line) - Q_UNUSED(depth) - - return 0; -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qlanguagedefinition.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QLANGUAGE_DEFINITION_H_ -#define _QLANGUAGE_DEFINITION_H_ - -#include "qce-config.h" - -/*! - \file qlanguagedefinition.h - \brief Definition of the QLanguageDefinition class. - - \see QLanguageDefinition -*/ - -#include "qformat.h" - -#include <QStringList> - -class QKeyEvent; -class QDocument; -class QDocumentCursor; - -#define QCE_FOLD_FLAGS(flags, open, close) ((flags) | (open & QLanguageDefinition::OpenMask) | ((close << 12) & QLanguageDefinition::CloseMask)) -#define QCE_FOLD_OPEN_COUNT(flags) ((flags) & QLanguageDefinition::OpenMask) -#define QCE_FOLD_CLOSE_COUNT(flags) (((flags) & QLanguageDefinition::CloseMask) >> 12) - -class QCE_EXPORT QLanguageDefinition -{ - public: - /// Collapse state of a line - enum CollapseFlag - { - None = 0x00000000, ///< The line cannot be collapsed nor expanded - Collapsible = 0x10000000, ///< The line is expanded and can thus be collapsed - Collapsed = 0x20000000, ///< The line is collapsed and can thus be expanded - Closure = 0x40000000, ///< The line is expanded and mark the end of a block - - CloseMask = 0x00fff000, ///< Number of actual closing fold mark - OpenMask = 0x00000fff ///< Number of actual open fold mark - }; - - Q_DECLARE_FLAGS(CollapseState, CollapseFlag); - - QLanguageDefinition(); - virtual ~QLanguageDefinition(); - - virtual QString language() const = 0; - virtual QStringList extensions() const = 0; - - virtual int tokenize(QDocument *d, int line, int count); - - virtual QString singleLineComment() const; - - virtual QString defaultLineMark() const; - - virtual void match(QDocumentCursor& c); - virtual void clearMatches(QDocument *d); - - virtual QString indent(const QDocumentCursor& c); - virtual bool unindent (const QDocumentCursor& c, const QString& ktxt); - - virtual void expand(QDocument *d, int line); - virtual void collapse(QDocument *d, int line); - virtual int blockFlags(QDocument *d, int line, int depth = 0) const; -}; - -#endif // _QLANGUAGE_DEFINITION_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qlanguagefactory.cpp +++ /dev/null @@ -1,322 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qlanguagefactory.h" - -/*! - \file qlanguagefactory.cpp - \brief Implementation of QLanguageFactory - - \see QLanguageFactory -*/ - -/*! - \ingroup language - @{ - - \class QLanguageFactory - \brief A class managing language definitions. - - It stores language definitions, added programmatically or found in XML files, - in specified locations and only if generic components are built-in. From - these definitions, QLanguageFactory generates matchers, indenters and - highlighters for a text editor, according to a file name. - - \see QLanguageDefinition -*/ - -#include <QDir> -#include <QFileInfo> -#include <QStringList> - -#ifdef _QCODE_EDIT_DEBUG_ -#include <QtDebug> -#endif - -#include "qeditor.h" -#include "qformatscheme.h" - -#include "qlanguagedefinition.h" -#include "qcodecompletionengine.h" - -#ifdef QNFA_BUILD -#include "qnfadefinition.h" -#endif - -/*! - \brief Empty constructor -*/ -QLanguageFactory::QLanguageFactory(QFormatScheme *fmt, QObject *p) - : QObject(p), m_defaultFormatScheme(fmt) -{ - -} - -/*! - \brief Empty destructor -*/ -QLanguageFactory::~QLanguageFactory() -{ - foreach ( QString l, m_languages ) - { - const LangData& d = m_data[l]; - - if ( d.s != m_defaultFormatScheme ) - delete d.s; - - delete d.d; - //delete d.e; - } -} - -/*! - \return a list of languages supported by this factory -*/ -QStringList QLanguageFactory::languages() const -{ - return m_languages; -} - -/*! - \return a list of file filters supported by this factory - - \note This list is NEVER empty and the last item is always "All files (*)" -*/ -QStringList QLanguageFactory::fileFilters() const -{ - QStringList l; - - foreach ( QString lng, m_languages ) - l << tr("%1 files (*.%2)").arg(lng).arg(m_data[lng].extensions.join(" *.")); - - l << tr("All files (*)"); - - return l; -} - -/*! - \param e target editor - \param file filename displayed by the editor - - The \a file parameter may actuall be either a filename, an extension or the name of the language, - checked in that order. - - If it is a filename, complete extension as higher priority than simple extension - (see QFileInfo suffix() and completeSuffix()). - - Matches are first done case-sensitively. - - If no matching language definition is found for all three possible interpretations of the \a file - parameter, the same search is done case-insensitively. - - If no matching language is found the previous language definition/completion engine of the editor - are removed, leaving it blank, and the format scheme of the document is set to the defaultFormatScheme() -*/ -void QLanguageFactory::setLanguage(QEditor *e, const QString& file) -{ - QString lang; - QFileInfo inf(file); - const QString ext = inf.suffix(), - cext = inf.completeSuffix(); - - //qDebug("suff:%s; compSuff:%s", qPrintable(ext), qPrintable(cext)); - - QLanguageDefinition *oldLang = e->languageDefinition(); - - if ( file.count() ) - { - QList<Qt::CaseSensitivity> lcs; - lcs << Qt::CaseSensitive << Qt::CaseInsensitive; - - foreach ( Qt::CaseSensitivity cs, lcs ) - { - int n = 0, idx = -1; - QStringList ext_langs, cext_langs, fcext_langs; - - foreach ( QString lang, m_languages ) - { - const QStringList& exts = m_data[lang].extensions; - - //qDebug("%s in (%s) ?", qPrintable(ext), qPrintable(exts.join(" "))); - - foreach ( QString x, exts ) - { - if ( !x.compare(ext, cs) ) - ext_langs << lang; - - if ( !x.compare(cext, cs) ) - cext_langs << lang; - - if ( !x.compare(file, cs) ) - fcext_langs << lang; - } - - if ( !lang.compare(file, cs) ) - idx = n; - - ++n; - } - - if ( cext_langs.count() ) - { - // TODO : use MIME types to resolve ambiguity - lang = cext_langs.first(); - } else if ( ext_langs.count() ) { - // TODO : use MIME types to resolve ambiguity - lang = ext_langs.first(); - } else if ( fcext_langs.count() ) { - // TODO : use MIME types to resolve ambiguity - lang = fcext_langs.first(); - } else if ( idx != -1 ) { - lang = m_languages.at(idx); - } - - if ( lang.count() ) - break; - } - } - - if ( lang.isEmpty() ) - { - //qDebug("no lang match for %s", qPrintable(file)); - e->setLanguageDefinition(0); - e->setCompletionEngine(0); - e->document()->setFormatScheme(m_defaultFormatScheme); - - if ( oldLang ) - e->highlight(); - - } else { - //qDebug("lang match for %s : %s", qPrintable(file), qPrintable(lang)); - const LangData& data = m_data[lang]; - - e->setLanguageDefinition(data.d); - e->setCompletionEngine(data.e ? data.e->clone() : 0); - e->document()->setFormatScheme(data.s ? data.s : m_defaultFormatScheme); - - if ( oldLang != data.d ) - e->highlight(); - } -} - -/*! - \brief Adds a language to the factory - - \param d language data - - \note The language data will overwrite any existing one for the same language -*/ -void QLanguageFactory::addLanguage(const QLanguageFactory::LangData& d) -{ - m_data[d.lang] = d; - - if ( !d.e ) - { - foreach ( QCodeCompletionEngine *e, m_unusedEngines ) - { - if ( e->language() == d.lang ) - { - m_data[d.lang].e = e; - break; - } - } - } - - if ( !m_languages.contains(d.lang) ) - m_languages << d.lang; -} - -/*! - \brief Lookup language data for a matching language - - The primary purpose of this function is to make it easy to create configuration dialogs (mainly for - format schemes). Beware though : some language may use the default format scheme. It is recommended - to check for that before modifying a format scheme or users might be surprised... - - \warning This function will lead to crashes if you pass it a language name not contained in languages(). -*/ -const QLanguageFactory::LangData& QLanguageFactory::languageData(const QString& lang) -{ - return m_data[lang]; -} - -/*! - \brief Registers a new completion engine - - \note This engine will NOT be used if there are no language definition for the - language it supports... -*/ -void QLanguageFactory::addLanguageDefinition(QLanguageDefinition *l) -{ - Q_UNUSED(l) - - qWarning("New design does not allow this sorry..."); -} - -/*! - \brief Registers a new completion engine - - \note This engine will NOT be used if there are no language definition for the - language it supports... -*/ -void QLanguageFactory::addCompletionEngine(QCodeCompletionEngine *e) -{ - foreach ( QString l, m_languages ) - { - if ( l == e->language() ) - { - m_data[l].e = e; - return; - } - } - - m_unusedEngines << e; -} - -/*! - \brief Fetches syntax definitions from files in \a path -*/ -void QLanguageFactory::addDefinitionPath(const QString& path) -{ - QDir d(path); - - foreach ( QString f, d.entryList(QDir::Files | QDir::Readable) ) - { - #ifdef QNFA_BUILD - if ( f.endsWith(".qnfa") ) - { - //qDebug("loading file %s", qPrintable(f)); - QFileInfo info(d.filePath(f)); - QString specificFormatScheme = QDir(info.path()).filePath(info.baseName() + ".qxf"); - - QFormatScheme *scheme = m_defaultFormatScheme; - - if ( QFile::exists(specificFormatScheme) ) - { - scheme = new QFormatScheme(specificFormatScheme); - } - - LangData data; - QNFADefinition::load(d.filePath(f), &data, scheme); - - //qDebug("%s : (%s | %s)", qPrintable(data.lang), qPrintable(data.mime), qPrintable(data.extensions.join(", "))); - addLanguage(data); - //addLanguageDefinition(new QNFADefinition(d.filePath(f), this)); - } - #endif - } -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qlanguagefactory.h +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QLANGUAGE_FACTORY_H_ -#define _QLANGUAGE_FACTORY_H_ - -/*! - \file qlanguagefactory.h - \brief Definition of the QLanguageFactory class. - - \see QLanguageFactory -*/ - -/*! - \defgroup language Language framework -*/ - -#include "qce-config.h" - -#include <QHash> -#include <QObject> -#include <QStringList> - -class QEditor; -class QFormatScheme; -class QLanguageDefinition; -class QCodeCompletionEngine; - -class QCE_EXPORT QLanguageFactory : public QObject -{ - Q_OBJECT - - public: - struct LangData - { - QString lang, mime; - QStringList extensions; - - QFormatScheme *s; - - QLanguageDefinition *d; - QCodeCompletionEngine *e; - }; - - QLanguageFactory(QFormatScheme *fmt, QObject *p = 0); - virtual ~QLanguageFactory(); - - QStringList languages() const; - QStringList fileFilters() const; - - const LangData& languageData(const QString& lang); - - void addDefinitionPath(const QString& path); - - inline QFormatScheme* defaultFormatScheme() const { return m_defaultFormatScheme; } - - public slots: - void addLanguage(const LangData& d); - void addLanguageDefinition(QLanguageDefinition *l); - void addCompletionEngine(QCodeCompletionEngine *e); - - virtual void setLanguage(QEditor *e, const QString& f); - - private: - QStringList m_languages; - QHash<QString, LangData> m_data; - QList<QCodeCompletionEngine*> m_unusedEngines; - - QFormatScheme *m_defaultFormatScheme; -}; - -#endif // _QLANGUAGE_FACTORY_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qlinemarksinfocenter.cpp +++ /dev/null @@ -1,643 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qlinemarksinfocenter.h" - -/*! - \file qlinemarksinfocenter.cpp - \brief Implementation of QLineMarksInfoCenter - - \see QLineMarksInfoCenter -*/ - -/*! - \ingroup language - @{ - - \class QLineMarksInfoCenter - \brief A class managing line marks accross all managed editors - - QLineMarksInfoCenter provides mean to read/write line marks on managed editors - but also to serialize and deserialize that data. -*/ - -#include "qeditor.h" -#include "qcodeedit.h" - -#include "qdocument.h" -#include "qdocument_p.h" -#include "qdocumentline.h" - -#include <QFile> -#include <QDataStream> -#include <QDomDocument> - -#define QLINE_MARKS_DUMP_VERSION 1 -#define QLINE_MARKS_DUMP_VERSION_MIN 1 - -QLineMarksInfoCenter* QLineMarksInfoCenter::m_instance = 0; - -QLineMarksInfoCenter* QLineMarksInfoCenter::instance() -{ - if ( !m_instance ) - m_instance = new QLineMarksInfoCenter; - - return m_instance; -} - -void QLineMarksInfoCenter::destroy() -{ - if ( m_instance ) - delete m_instance; - - m_instance = 0; -} - -QLineMarksInfoCenter::QLineMarksInfoCenter() - : QObject(0) -{ - qRegisterMetaType<QLineMark>("QLineMark"); -} - -QLineMarksInfoCenter::~QLineMarksInfoCenter() -{ - -} - -/*! - \return the list of line marks set on a given file -*/ -QLineMarkList QLineMarksInfoCenter::marks(const QString& file) -{ - QLineMarkList l; - bool check = file.count(); - - foreach ( QLineMarkHandle m, m_lineMarks ) - { - if ( !check || (m.file == file) ) - l << QLineMark(file, m.line->line() + 1, m.mark); - } - - return l; -} - -/*! - \brief Remove all line marks on all files -*/ -void QLineMarksInfoCenter::clear() -{ - foreach ( QLineMarkHandle m, m_lineMarks ) - { - removeLineMark(m); - } -} - -/*! - \brief Remove all line marks on a given file -*/ -void QLineMarksInfoCenter::removeMarks(const QString& file) -{ - foreach ( QLineMarkHandle m, m_lineMarks ) - if ( m.file == file ) - removeLineMark(m); - -} - -/*! - \brief Add a line mark - - If the target file is not found the toggling will be delayed. -*/ -void QLineMarksInfoCenter::addLineMark(const QLineMark& mark) -{ - QEditor *e = QCodeEdit::managed(mark.file); - - if ( !e ) - { - m_delayed << mark; - return; - } - - QDocumentLine l = e->document()->line(mark.line - 1); - - if ( !l.isValid() ) - return; - - e->setCursor(QDocumentCursor(e->document(), mark.line - 1)); - l.addMark(mark.mark); -} - -/*! - \brief Remove a line mark - - If the target file is not found the addition will be delayed. -*/ -void QLineMarksInfoCenter::toggleLineMark(const QLineMark& mark) -{ - QEditor *e = QCodeEdit::managed(mark.file); - - if ( !e ) - { - m_delayed << mark; - return; - } - - QDocumentLine l = e->document()->line(mark.line - 1); - - if ( !l.isValid() ) - return; - - e->setCursor(QDocumentCursor(e->document(), mark.line - 1)); - l.toggleMark(mark.mark); -} - -/*! - \brief Toggle a line mark - - If the target file is not found the removal will be delayed. -*/ -void QLineMarksInfoCenter::removeLineMark(const QLineMark& mark) -{ - QEditor *e = QCodeEdit::managed(mark.file); - - if ( !e ) - return; - - QDocumentLine l = e->document()->line(mark.line - 1); - - if ( !l.isValid() ) - return; - - l.removeMark(mark.mark); - - //e->setCursor(QDocumentCursor(l)); -} - -/*! - \brief Add a line mark -*/ -void QLineMarksInfoCenter::addLineMark(const QLineMarkHandle& mark) -{ - QDocumentLine l(mark.line); - - if ( l.isValid() ) - l.addMark(mark.mark); - -} - -/*! - \brief Toggle a line mark -*/ -void QLineMarksInfoCenter::toggleLineMark(const QLineMarkHandle& mark) -{ - QDocumentLine l(mark.line); - - if ( l.isValid() ) - l.toggleMark(mark.mark); - -} - -/*! - \brief Remove a line mark -*/ -void QLineMarksInfoCenter::removeLineMark(const QLineMarkHandle& mark) -{ - QDocumentLine l(mark.line); - - if ( l.isValid() ) - l.removeMark(mark.mark); - -} - -/*! - \brief Flush all delayed line marks addition/removal/toggling for a given file -*/ -void QLineMarksInfoCenter::flush(const QString& file) -{ - QLineMarkList::iterator i = m_delayed.begin(); - - while ( i != m_delayed.end() ) - { - if ( i->file == file ) - { - addLineMark(*i); - i = m_delayed.erase(i); - } else { - ++i; - } - } -} - -/*! - \brief Load serialized line marks data from a file -*/ -void QLineMarksInfoCenter::loadMarks(const QString& f) -{ - QFile file(f); - - if ( !file.open(QFile::ReadOnly) ) - return; - - QDataStream stream(&file); - - int version; - - stream >> version; - - if ( version < QLINE_MARKS_DUMP_VERSION_MIN ) - { - qWarning("QLineMarksInfoCenter : dump file version mismatch"); - return; - } else if ( version > QLINE_MARKS_DUMP_VERSION ) { - qWarning("QLineMarksInfoCenter : dump file version mismatch"); - return; - } - - QLineMark mark; - - while ( !stream.atEnd() ) - { - stream >> mark; - - addLineMark(mark); - } -} - -/*! - \brief Write serialized line marks data to a file -*/ -void QLineMarksInfoCenter::saveMarks(const QString& f) -{ - QFile file(f); - - if ( !file.open(QFile::WriteOnly) ) - return; - - QDataStream stream(&file); - - stream << QLINE_MARKS_DUMP_VERSION; - - foreach ( QLineMarkHandle mark, m_lineMarks ) - { - stream << mark.line->line() + 1; - stream << mark.file; - stream << QLineMarksInfoCenter::instance()->markTypeId(mark.mark); - //stream << mark; - } -} - -QDataStream& operator >> (QDataStream& d, QLineMark& m) -{ - int line; - QString file, mark; - - d >> line; - d >> file; - d >> mark; - - m.line = line; - m.file = file; - m.mark = QLineMarksInfoCenter::instance()->markTypeId(mark); - - return d; -} - -QDataStream& operator << (QDataStream& d, const QLineMark& m) -{ - int line = m.line; - QString file = m.file, - mark = QLineMarksInfoCenter::instance()->markTypeId(m.mark); - - d << line; - d << file; - d << mark; - - return d; -} - -/*! - \brief Load line marks definition from a file -*/ -void QLineMarksInfoCenter::loadMarkTypes(const QString& f) -{ - QFile file(f); - - if ( !file.open(QFile::ReadOnly | QFile::Text) ) - return; - - // TODO : prefer QXmlStreamReader when building against Qt 4.3.0 - - QDomDocument doc; - doc.setContent(&file); - - QDomNodeList l = doc.documentElement().childNodes(); - - for ( int i = 0; i < l.count(); i++ ) - { - QDomElement e = l.at(i).toElement(); - - if ( e.isNull() || (e.tagName() != "mark") ) - continue; - - QLineMarkType t; - QDomNodeList c = e.childNodes(); - - //qDebug("mark {"); - - for ( int j = 0; j < c.count(); j++ ) - { - QDomElement attr = c.at(j).toElement(); - - if ( attr.isNull() ) - continue; - - const QString field = attr.tagName(); - const QString value = attr.firstChild().toText().data(); - - //qDebug("\t%s = %s;", qPrintable(field), qPrintable(value)); - - const bool flag = (value == "true") || value.toUInt(); - - if ( field == "id" ) - { - t.id = value; - } else if ( field == "user" ) { - t.user = flag; - } else if ( field == "focus" ) { - t.focus = flag; - } else if ( field == "icon" ) { - t.icon = QPixmap(value); - } else if ( field == "color" ) { - //t.color = QColor(value); - - /* - color value MUST be a valid value for QColor::setNamedColor() - with one exception though : an alpha channel indication (unsupported - by QColor::setNamedColor()) can be prepended using '@' followed by a - sequence of hex digits (preferabily two of them...) - - examples : - #ff0c80 - #ff0c80@80 - blue - blue@10 - */ - - if ( value.contains('@') ) - { - t.color = QColor(value.section('@', 0, 0, QString::SectionSkipEmpty)); - t.color.setAlpha(value.section('@', 1, 1, QString::SectionSkipEmpty).toUInt(0, 16)); - } else { - t.color = QColor(value); - } - } else if ( field == "priority" ) { - t.priority = value.toUInt(); - } else if ( field == "persistency" ) { - t.persistency = value.toUInt(); - } else if ( field == "rule" ) { - t.rules << value; - } - - } - - m_lineMarkTypes << t; - - //qDebug("};"); - } -} - -/*! - \brief int -> string mark type identifier conversion -*/ -QString QLineMarksInfoCenter::markTypeId(int id) -{ - return ((id >= 0) && (id < m_lineMarkTypes.count())) ? m_lineMarkTypes.at(id).id : QString(); -} - -/*! - \brief string -> int mark type identifier conversion -*/ -int QLineMarksInfoCenter::markTypeId(const QString& id) -{ - for ( int idx = 0; idx < m_lineMarkTypes.count(); ++idx ) - if ( m_lineMarkTypes.at(idx).id == id ) - return idx; - - return -1; -} - -/*! - \return The mark type definition associated with a given id -*/ -QLineMarkType QLineMarksInfoCenter::markType(int id) -{ - return ((id >= 0) && (id < m_lineMarkTypes.count())) ? m_lineMarkTypes.at(id) : QLineMarkType(); -} - -/*! - \return the mark type definition associated with a given id -*/ -QLineMarkType QLineMarksInfoCenter::markType(const QString& id) -{ - foreach ( QLineMarkType t, m_lineMarkTypes ) - if ( t.id == id ) - return t; - - return QLineMarkType(); -} - -/*! - \return A list of available mark types - \param context context filter (no filtering is performed if empty) -*/ -QStringList QLineMarksInfoCenter::availableMarkTypes(const QString& context) -{ - QStringList l; - - foreach ( QLineMarkType t, m_lineMarkTypes ) - { - if ( - context.count() - && - ( - !t.user - || - ( - t.rules.contains("#out") - && - !t.rules.contains(context) - ) - || - ( - t.rules.contains("#in") - && - t.rules.contains("!" + context) - ) - ) - ) - { - //qDebug("mark[%s] mismatched", qPrintable(t.id)); - } else { - l << t.id; - } - } - - return l; -} - -/*! - \return the mark that has the highest priority among a list of marks -*/ -int QLineMarksInfoCenter::priority(const QList<int>& marks) -{ - int higher = -1; - int mark = marks.isEmpty() ? -1 : marks.at(0); - - for ( int i = 0; i < m_lineMarkTypes.count(); ++i ) - { - if ( marks.contains(i) && (m_lineMarkTypes.at(i).priority > higher) ) - { - mark = i; - higher = m_lineMarkTypes.at(i).priority; - } - } - - return mark; -} - -/*! - \return the mark that has the highest priority among a list of marks -*/ -QString QLineMarksInfoCenter::priority(const QStringList& marks) -{ - QString mark; - int higher = -1; - - foreach ( QLineMarkType t, m_lineMarkTypes ) - { - if ( marks.contains(t.id) && (t.priority > higher) ) - { - mark = t.id; - higher = t.priority; - } - } - - return (mark.count() || !marks.count()) ? mark : marks.at(0); -} - -/*! - \brief Useless for now -*/ -QList<QStringList> QLineMarksInfoCenter::marksLayout(const QString& context) -{ - QList<QStringList> l; - - - foreach ( QString id, availableMarkTypes(context) ) - { - l << QStringList(id); - } - - /* - foreach ( QLineMarkType t, availableMarks(context) ) - { - - } - */ - - return l; -} - -/*! - \internal -*/ -void QLineMarksInfoCenter::cursorMoved(QEditor *e) -{ - foreach ( const QLineMarkHandle& lmh, m_lineMarks ) - { - QLineMarkType t = markType(lmh.mark); - - if ( - (e->fileName() != lmh.file) - || - (e->document() != lmh.line->document()) - || - (t.persistency == 2) - ) - continue; - - if ( !t.persistency || (lmh.line != e->cursor().line().handle()) ) - { - removeLineMark(lmh); - cursorMoved(e); - break; - } - } -} - -/*! - \internal -*/ -void QLineMarksInfoCenter::lineDeleted(QDocumentLineHandle *h) -{ - QLineMarkHandleList::iterator i = m_lineMarks.begin(); - - while ( i != m_lineMarks.end() ) - { - if ( i->line == h ) - { - QLineMark mrk(i->file, i->line->line() + 1, i->mark); - - i = m_lineMarks.erase(i); - - emit lineMarkRemoved(mrk); - } else { - ++i; - } - } -} - -/*! - \brief Entry point for changes in documents - - Every document notify through this function a change in its line marks... -*/ -void QLineMarksInfoCenter::markChanged(const QString& f, QDocumentLineHandle *line, int mark, bool on) -{ - QLineMarkHandle m(f, line, mark); - bool in = m_lineMarks.contains(m); - QLineMark mrk(f, line->line() + 1, mark); - - if ( !on && in ) - { - m_lineMarks.removeAll(m); - - emit lineMarkRemoved(mrk); - } else if ( on && !in ) { - m_lineMarks << m; - - emit lineMarkAdded(mrk); - } - - /* - foreach ( const QLineMarkHandle& h, m_lineMarks ) - { - qDebug("\t%s:%i [%i]", qPrintable(h.file), h.line->line() + 1, h.mark); - } - */ -} - -/*! @} */ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qlinemarksinfocenter.h +++ /dev/null @@ -1,183 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QLINE_MARKS_INFO_CENTER_H_ -#define _QLINE_MARKS_INFO_CENTER_H_ - -/*! - \file qlinemarksinfocenter.h - \brief Definition of the QLineMarksInfoCenter class. - - \see QLineMarksInfoCenter -*/ - -/*! - \defgroup language Language framework -*/ - -#include "qce-config.h" - -#include <QColor> -#include <QPixmap> -#include <QObject> -#include <QMetaType> -#include <QStringList> - -class QEditor; -class QDataStream; -class QDocumentLineHandle; - -struct QLineMark -{ - inline QLineMark() : line(-1) {} - - inline QLineMark(const QString& f, int l, int m) - : mark(m), line(l), file(f) - {} - - inline bool operator == (const QLineMark& m) - { return (line == m.line) && (file == m.file) && (mark == m.mark); } - - inline bool operator != (const QLineMark& m) - { return (line != m.line) || (file != m.file) || (mark != m.mark); } - - int mark; - int line; - QString file; -}; - -Q_DECLARE_METATYPE(QLineMark) - -typedef QList<QLineMark> QLineMarkList; - -Q_DECLARE_TYPEINFO(QLineMark, Q_MOVABLE_TYPE); - -struct QLineMarkHandle -{ - inline QLineMarkHandle() : line(0) {} - - inline QLineMarkHandle(const QString& f, QDocumentLineHandle *l, int m) - : mark(m), line(l), file(f) - {} - - inline bool operator == (const QLineMarkHandle& m) - { return (line == m.line) && (file == m.file) && (mark == m.mark); } - - inline bool operator != (const QLineMarkHandle& m) - { return (line != m.line) || (file != m.file) || (mark != m.mark); } - - int mark; - QDocumentLineHandle *line; - QString file; -}; - -Q_DECLARE_METATYPE(QLineMarkHandle) - -typedef QList<QLineMarkHandle> QLineMarkHandleList; - -Q_DECLARE_TYPEINFO(QLineMarkHandle, Q_MOVABLE_TYPE); - -QCE_EXPORT QDataStream& operator >> (QDataStream& d, QLineMark& m); -QCE_EXPORT QDataStream& operator << (QDataStream& d, const QLineMark& m); - -struct QLineMarkType -{ - inline QLineMarkType() - : user(false), focus(false), priority(-1), persistency(0) - {} - - bool user; - bool focus; - QString id; - QPixmap icon; - QColor color; - int priority; - int persistency; - QStringList rules; -}; - -Q_DECLARE_METATYPE(QLineMarkType) - -typedef QList<QLineMarkType> QLineMarkTypeList; - -Q_DECLARE_TYPEINFO(QLineMarkType, Q_MOVABLE_TYPE); - -class QCE_EXPORT QLineMarksInfoCenter : public QObject -{ - friend class QEditor; - friend class QCodeEdit; - - Q_OBJECT - - public: - static QLineMarksInfoCenter* instance(); - static void destroy(); - - QLineMarkList marks(const QString& file = QString()); - - QString markTypeId(int id); - int markTypeId(const QString& id); - - QLineMarkType markType(int id); - QLineMarkType markType(const QString& id); - - int priority(const QList<int>& marks); - QString priority(const QStringList& marks); - - QStringList availableMarkTypes(const QString& context = QString()); - QList<QStringList> marksLayout(const QString& context = QString()); - - public slots: - void loadMarks(const QString& f); - void saveMarks(const QString& f); - - void loadMarkTypes(const QString& f); - - void clear(); - - void removeMarks(const QString& file); - - void addLineMark(const QLineMark& mark); - void toggleLineMark(const QLineMark& mark); - void removeLineMark(const QLineMark& mark); - - void addLineMark(const QLineMarkHandle& mark); - void toggleLineMark(const QLineMarkHandle& mark); - void removeLineMark(const QLineMarkHandle& mark); - - void flush(const QString& file); - - signals: - void lineMarkAdded(const QLineMark& mark); - void lineMarkRemoved(const QLineMark& mark); - - protected: - QLineMarksInfoCenter(); - virtual ~QLineMarksInfoCenter(); - - protected slots: - void cursorMoved(QEditor *e); - void lineDeleted(QDocumentLineHandle *h); - void markChanged(const QString& f, QDocumentLineHandle *h, int mark, bool on); - - private: - QLineMarkList m_delayed; - QLineMarkHandleList m_lineMarks; - QLineMarkTypeList m_lineMarkTypes; - - static QLineMarksInfoCenter *m_instance; -}; - -#endif // !_QLINE_MARKS_INFO_CENTER_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qnfa/light_vector.h +++ /dev/null @@ -1,114 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _LIGHT_VECTOR_H_ -#define _LIGHT_VECTOR_H_ - -#include <qglobal.h> - -/*! - \file light_vector.h - \brief Definition of the light_vector class -*/ - -template <typename T> -class light_vector -{ - public: - light_vector() : m_data(0), size(0) {} - ~light_vector() { free(m_data); } - - light_vector& operator = (const light_vector& o) - { - size = o.size; - m_data = o.m_data; - - return *this; - } - - light_vector& operator << (const T& v) - { - append(v); - - return *this; - } - - inline quint16 length() const - { return size; } - - inline quint16 count() const - { return size; } - - inline T* data() - { return m_data; } - - void alloc(int pos, size_t n) - { - size += n; - m_data = !m_data ? (T*)malloc(size * sizeof(T)) : (T*)realloc(m_data, size * sizeof(T)); - - for ( int i = size - 1; (i > pos) && (i >= (int)n); --i ) - m_data[i] = m_data[i - n]; - - //for ( int i = pos; (i < (pos + n)) && ((i + n) < size); ++i ) - // m_data[i + n] = m_data[i]; - - } - - inline void prepend(const T& v) - { - insert(0, v); - } - - void insert(int i, const T& v) - { - i = qBound(0, i, (int)size); - - alloc(i, 1); - m_data[i] = v; - } - - void append(const T& v) - { - ++size; - m_data = !m_data ? (T*)malloc(size * sizeof(T)) : (T*)realloc(m_data, size * sizeof(T)); - m_data[size - 1] = v; - } - - inline const T& at(quint16 i) - { - return *(m_data + i); - } - - inline T& operator [] (quint16 i) - { - return *(m_data + i); - } - - bool contains(const T& v) const - { - for ( int i = 0; i < size; i++ ) - if ( m_data[i] == v ) - return true; - - return false; - } - - private: - T* m_data; - quint16 size; -}; - -#endif // _LIGHT_VECTOR_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qnfa/qnfa.cpp +++ /dev/null @@ -1,1039 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qnfa.h" - -/*! - \file qnfa.cpp - \brief Implementation of the core QNFA syntax engine -*/ - -#include <QHash> -#include <QList> - -quint32 QNFA::_count = 0; -static QList<QNFA*> _deleted; - -QNFA::QNFA() - : type(Char), assertion(0), actionid(0) -{ - out.next = 0; - - ++_count; - - //qDebug("alloc(0x%x) => QNFA syntax[%i];", this, _count); -} - -QNFA::~QNFA() -{ - --_count; - - // some nfa nodes are shared... gotta make sure they are free'd once only - _deleted << this; - - //qDebug("free(0x%x) => QNFA syntax[%i];", this, _count); - - tree.clear(); - - if ( (type & CxtBeg) && out.branch ) - { - delete out.branch; - out.branch = 0; - } - - if ( out.next && !_deleted.contains(out.next) ) - { - delete out.next; - out.next = 0; - } -} - - -QNFABranch::~QNFABranch() -{ - //qDebug("branch to %i nodes", count()); - for ( int i = 0; i < count(); ++i ) - { - if ( at(i) && !_deleted.contains(at(i)) ) - { - delete (*this)[i]; - (*this)[i] = 0; - } - } -} - -inline bool isWord(QChar c) -{ return c.isLetterOrNumber() || (c.unicode() == '_'); } - -static bool match(QChar cc, QNFA *chain) -{ - bool found = true; - quint16 cu = cc.unicode(); - bool notEmpty = chain->c.count(); - - if ( notEmpty && (chain->c.at(0) == '\0') ) - found = false; - - if ( notEmpty ) - if ( chain->c.contains(cu) ) - return found; - - int ass = chain->assertion; - - if ( ass ) - { - if ( cc.isDigit() ) - { - if ( ass & Digit ) - return found; - } else { - if ( ass & NonDigit ) - return found; - - if ( cc.isSpace() ) - { - if ( ass & Space ) - return found; - } else { - if ( ass & NonSpace ) - return found; - - if ( cc.isLetterOrNumber() || (cu == '_') ) - { - if ( ass & Word ) - return found; - } else { - if ( ass & NonWord ) - return found; - } - } - } - } - - return !found; -} - -void match(QNFAMatchContext *lexer, const QChar *d, int length, QNFAMatchNotifier notify) -{ - if ( !lexer || !lexer->context ) - { - //qWarning("get off you scum!"); - return; - } - - // restore message buffering - - notify.clear(); - - int olvls = lexer->parents.count(), - nlvls = 0, - lvls = olvls; - - if ( lvls ) - notify.startBuffering(); - - // - - quint16 c = 0; - const QChar *di = d; - QNFA *chain = 0, *start = 0; - int index = 0, lastCxt = 0, len, idx; - bool bFound, bEscape = false, bEscaped = false; - bool wPrev = false, wCur = false; - - while ( index < length ) - { - bFound = false; - bEscaped = false; - //bEscape &= !lexer->meaningless.contains(d[index].unicode()); - - //while ( lexer->meaningless.contains(d[index].unicode()) && ((index + 1) < length) ) - // ++index; - - if ( index >= length ) - break; - - c = di->unicode(); - - wCur = isWord(*di); - - int plainIndex = -1, plainMatch, plainLength; - - // try fast plain matching - if ( !(wPrev && wCur) ) - { - //qDebug("trying plain..."); - - //len = 0; - idx = index; - QCharTree::const_iterator it, match, end; - - it = lexer->context->tree.constFind(c); - - if ( it != lexer->context->tree.constEnd() ) - { - //qDebug("plain on %c", c); - do - { - ++di; - ++idx; - - end = it->next.constEnd(); - match = it->next.constFind(0); - - if ( idx < length ) - { - c = di->unicode(); - it = it->next.constFind(c); - } else { - it = end; - } - - if ( it == end ) - { - if ( (match != end) && !isWord(*di) ) - { - //word boundary found - // corresponding token end found - wPrev = isWord(*(di - 1)); - bFound = true; - if ( match->value.action & 0x40000000 ) - { - // try regexps before notifying - plainIndex = index; - plainLength = idx - index; - plainMatch = match->value.action; - //qDebug("ambiguity."); - } else { - notify(index, idx - index, match->value.action); - index = idx; - } - //qDebug("next step : %c", d[index].toLatin1()); - //bMonitor = true; - } - - break; - } - } while ( idx < length ) ; - - if ( bFound ) - { - bEscape = false; - - if ( plainIndex == -1 ) - continue; - - bFound = false; - } - - di -= idx - index; - } - } - - // fallback on regexp-like NFA-based matching - QNFABranch* children = lexer->context->out.branch; - - if ( children ) - { - //qDebug("trying %i sub nfas on %c", children->count(), d[index].toLatin1()); - int max = children->count(); - - for ( quint16 i = 0; i < max; ++i ) - { - len = 0; - idx = index; - start = chain = children->at(i); - - //qDebug("%ith attempt on %c", i, d[index + len].toLatin1()); - - while ( (idx < length) || (chain->type & Match) ) - { - bEscaped = false; - - if ( chain->type & Match ) - { - if ( - (chain->assertion & WordEnd) - && - (idx < length) - && - isWord(*di) - && - isWord(*(di - 1)) - ) - { - //qDebug("end assertion failed..."); - break; - } - - //qDebug("matched to end"); - - if ( chain->type & CxtBeg ) - { - //qDebug("entering context : 0x%x", chain); - - ++nlvls; - - bool notifySub = notify.bufferLevel(); - - if ( notifySub ) - { - // pop one message buffer - notify.stopBuffering(); - } - - // notify content of previous context until nest - notify(lastCxt, index - lastCxt, lexer->context->actionid | 0x80000000); - - if ( notifySub ) - { - // notify sub matches so far to avoid tricky handling later on - notify.flush(); - - //notify.startBuffering(); - } - - // notify begin marker - notify(index, len, start->actionid ? start->actionid : chain->actionid); - - // update context stack - lexer->parents.push(lexer->context); - lexer->context = chain; - - // update nest index - lastCxt = idx; - - // push a message buffer - notify.startBuffering(); - - } else if ( chain->type & CxtEnd ) { - //qDebug("leaving context :"); - - if ( lexer->parents.isEmpty() ) - qFatal("context nesting problem"); - - if ( bEscape ) - { - // not really end : escape found... - - bEscape = false; - bEscaped = true; - } else { - - if ( nlvls ) - --nlvls; - else - --lvls; - - // pop one message buffer - notify.stopBuffering(); - - // notify context content from last nest - notify(lastCxt, index - lastCxt, lexer->context->actionid | 0x80000000); - - // flush sub matches - notify.flush(); - - // update context stack - lexer->context = lexer->parents.pop(); - - if ( lexer->parents.count() ) - notify.startBuffering(); - - // update nest index - lastCxt = idx; - - // notify end marker - notify(index, len, chain->actionid); - - //qDebug("cxt notif..."); - - if ( chain->type & Exclusive ) - index = idx; - - --index; - --di; - - bFound = true; - break; - } - } else if ( chain->type & CxtEsc ) { - //qDebug("matched %s", qPrintable(QString(index, len))); - - //notify(index, len, chain->actionid); - bEscape = !bEscape; - } else { - //qDebug("matched %s", qPrintable(QString(d + index, len))); - - if ( plainIndex != -1 && plainLength >= len ) - { - break; - } - - notify(index, len, chain->actionid); - bEscape = false; - } - - bFound = true; - index = idx; - --index; - --di; - - //qDebug("next step : %c", d[index + 1].toLatin1()); - //bMonitor = true; - - break; - } else { - // "regular" nfa match (no match yet...) - - if ( - (chain->assertion & WordStart) - && - (idx >= 1) - && - ( - isWord(*(di - 1)) - && - isWord(*di) - ) - ) - { - //qDebug("beg assertion failed..."); - - break; - } - - QChar cc = *di; - bool found = match(cc, chain); - - if ( - !(chain->assertion & ZeroOrOne) - && - !(chain->assertion & ZeroOrMore) - && - !found - ) - { - //if ( cc.toLatin1() == ')' ) - // qDebug("mismatch : %c != %c", cc.toLatin1(), chain->c.at(0)); - - break; - } - - if ( found ) - { - //qDebug("%c", d[index + len].toLatin1()); - - if ( - (chain->assertion & OneOrMore) - || - (chain->assertion & ZeroOrMore) - ) - { - do - { - ++di; - ++len; - ++idx; - } while ( - (idx < length) - && - match(*di, chain) - ); - - } else { - ++len; - ++idx; - ++di; - } - - } else { - //qDebug("! %c", d[index + len].toLatin1()); - } - - chain = chain->out.next; - } - } - - if ( bFound ) - break; - - di -= len; - } - } - - if ( !bFound ) - { - if ( plainIndex != -1 ) - { - notify(plainIndex, plainLength, plainMatch); - index = plainIndex + plainLength; - di += plainLength; - continue; - } - - bEscape = false; - //++index; - wPrev = wCur; - } else { - wPrev = isWord(*di); - } - - ++index; - ++di; - } - - // flush messages - - if ( !notify.bufferLevel() ) - return; - - //qDebug("%i context nests", notify.bufferLevel()); - //qDebug("[%i;+00[ : 0x%x", lastCxt, lexer->context->actionid | 0x80000000); - - // pop down one buffer - notify.stopBuffering(); - - // notify overlapping context so far - notify(lastCxt, length - lastCxt, lexer->context->actionid | 0x80000000); - - // notify sub matches - notify.flush(); - - // make sure we leave a blank notifier... - notify.clear(); - - // preserve escape power... - if ( bEscaped ) - return; - - // some existing left AND new one(s) - if ( (olvls == lvls) && nlvls ) - ++lvls; - - // close stay-on-line contexts, if any - QStack<QNFA*>::iterator it = lexer->parents.begin() + lvls; - - while ( it != lexer->parents.end() ) - { - if ( (*it)->type & StayOnLine ) - { - //qDebug("staid..."); - it = lexer->parents.erase(it); - } else { - ++it; - } - } - - if ( (lexer->context->type & StayOnLine) && nlvls && lexer->parents.count() ) - lexer->context = lexer->parents.pop(); - -} - -QNFA* lexer() -{ - QNFA *lex = new QNFA; - - lex->type = ContextBegin; - lex->out.branch = new QNFABranch; - - return lex; -} - -QNFA* sharedContext(const QString& start, QNFA *other, bool cs) -{ - QNFA *nfa, *end, *beg = sequence(start.constData(), start.length(), &end, cs); - - nfa = new QNFA; - nfa->type = ContextBegin; - nfa->out.branch = other->out.branch; - - end->out.next = nfa; - - return beg; -} - -QNFA* context(const QString& start, const QString& stop, const QString&, int action, QNFA **handler, bool cs) -{ - QNFA *nfa, *end, *beg = sequence(start.constData(), start.length(), &end, cs); - - nfa = new QNFA; - nfa->type = ContextBegin; - nfa->actionid = action; - nfa->out.branch = new QNFABranch; - - if ( handler ) - *handler = nfa; - //else - // qDebug("no handler set [0x%x]", nfa); - - end->out.next = nfa; - end = nfa; - - QNFA *endmark, *begendmark = sequence(stop.constData(), stop.length(), &endmark, cs); - - nfa = new QNFA; - nfa->type = ContextEnd; - nfa->actionid = action; - - endmark->out.next = nfa; - - //end->out->branch->append(endmark); - addNFA(end, begendmark); - - return beg; -} - -void addWord(QNFA *lexer, const QString& w, int action, bool cs) -{ - if ( !lexer || !(lexer->type & CxtBeg) || !lexer->out.branch ) - return; - - // try using the fastest way if possible - - QString pt; - - if ( plain(w, &pt) && cs ) - { - addWord(lexer->tree, pt, action, cs); - return; - } - - // fallback on (fast) regexp-like NFA-based semi-compiled parsing - QNFA *nfa, *word, *end; - - word = sequence(w.constData(), w.length(), &end, cs); - word->assertion |= WordStart; - - nfa = new QNFA; - nfa->type = Match; - nfa->assertion = WordEnd; - nfa->actionid = action; - - end->out.next = nfa; - - //lexer->out.branch->append(word); - addNFA(lexer, word); -} - -void addSequence(QNFA *lexer, const QString& w, int action, bool cs) -{ - if ( !lexer || !(lexer->type & CxtBeg) || !lexer->out.branch ) - { - return; - } - - QNFA *seq, *end, *nfa; - - seq = sequence(w.constData(), w.length(), &end, cs); - - nfa = new QNFA; - nfa->type = Match; - nfa->actionid = action; - - end->out.next = nfa; - - //lexer->out.branch->append(seq); - addNFA(lexer, seq); -} - -QNFA* sequence(const QChar *d, int length, QNFA **end, bool cs) -{ - QNFA *nfa, *set = 0, *prev = 0, *first = 0; - - for ( int i = 0; i < length; ++i ) - { - QChar c = d[i]; - - if ( c == QLatin1Char('\\') ) - { - c = d[++i]; - - if ( c == QLatin1Char('n') ) - { - c = '\n'; - } else if ( c == QLatin1Char('t') ) { - c = '\t'; - } else if ( c == QLatin1Char('r') ) { - c = '\r'; - } - - if ( set ) - { - set->c << c.unicode(); - } else { - nfa = new QNFA; - nfa->c << c.unicode(); - - if ( prev ) - prev->out.next = nfa; - - prev = nfa; - } - } else if ( c == QLatin1Char('$') ) { - // char classes - c = d[++i]; - - if ( set ) - { - if ( c == QLatin1Char('s') ) - set->assertion |= Space; - else if ( c == QLatin1Char('S') ) - set->assertion |= NonSpace; - else if ( c == QLatin1Char('d') ) - set->assertion |= Digit; - else if ( c == QLatin1Char('D') ) - set->assertion |= NonDigit; - else if ( c == QLatin1Char('w') ) - set->assertion |= Word; - else if ( c == QLatin1Char('W') ) - set->assertion |= NonWord; - else - set->c << QLatin1Char('$').unicode() << c.unicode(); - - } else { - nfa = new QNFA; - - if ( c == QLatin1Char('s') ) - nfa->assertion |= Space; - else if ( c == QLatin1Char('S') ) - nfa->assertion |= NonSpace; - else if ( c == QLatin1Char('d') ) - nfa->assertion |= Digit; - else if ( c == QLatin1Char('D') ) - nfa->assertion |= NonDigit; - else if ( c == QLatin1Char('w') ) - nfa->assertion |= Word; - else if ( c == QLatin1Char('W') ) - nfa->assertion |= NonWord; - else { - nfa->c << QLatin1Char('$').unicode(); - --i; - } - - if ( prev ) - prev->out.next = nfa; - - prev = nfa; - } - } else if ( c == QLatin1Char('[') ) { - - if ( set ) - { - set->c << c.unicode(); - // qWarning("Nested sets are not supported (and useless BTW)..."); - continue; - } - - // enter set... - - set = new QNFA; - - //qDebug("set start"); - - } else if ( c == QLatin1Char(']') ) { - - if ( !set ) - { - qWarning("Unmatched set closing marker"); - continue; - } - - // leave set... - - if ( prev ) - prev->out.next = set; - - prev = set; - set = 0; - - //qDebug("set end"); - /* - } else if ( c == QLatin1Char('(') ) { - // allow trivial groups - - QList<int> cuts; - int idx = i, nest = 1; - - while ( nest && (++idx < length) ) - { - if ( d[idx] == '\\' ) - { - ++idx; - continue; - } else if ( d[idx] == '(' ) { - ++nest; - } else if ( d[idx] == ')' ) { - --nest; - } else if ( (nest == 1) && (d[idx] == '|') ) { - cuts << idx; - } else if ( d[idx] == '[' ) { - while ( ++idx < length ) - { - if ( d[idx] == '\\' ) - { - ++idx; - continue; - } else if ( d[idx] == ']' ) { - break; - } - } - } - } - - */ - } else if ( set ) { - - if ( (c == QLatin1Char('^')) && !set->c.count() ) - { - set->c << '\0'; - continue; - } - - quint16 prev = set->c.count() ? set->c.at(set->c.length() - 1) : '\0'; - - if ( (c == '-') && (prev != '\0') && ((i + 1) < length) ) - { - quint16 cse = d[++i].unicode(); - - for ( quint16 csi = prev + 1; csi <= cse; ++csi ) - { - QChar csc(csi); - - if ( c.isLetter() && !cs ) - set->c << c.toLower().unicode() << c.toUpper().unicode(); - else - set->c << csi; - } - } else { - if ( c.isLetter() && !cs ) - set->c << c.toLower().unicode() << c.toUpper().unicode(); - else - set->c << c.unicode(); - } - //qDebug("set << %c", c.toLatin1()); - - } else if ( c == QLatin1Char('+') ) { - if ( prev ) prev->assertion |= OneOrMore; - } else if ( c == QLatin1Char('*') ) { - if ( prev ) prev->assertion |= ZeroOrMore; - } else if ( c == QLatin1Char('?') ) { - if ( prev ) prev->assertion |= ZeroOrOne; - } else { - nfa = new QNFA; - - if ( c.isLetter() && !cs ) - { - nfa->c << c.toLower().unicode() << c.toUpper().unicode(); - } else { - nfa->c << c.unicode(); - } - - if ( prev ) - prev->out.next = nfa; - - prev = nfa; - } - - if ( !first ) - first = prev; - } - - if ( end ) - { - *end = prev; - } - - return first; -} - -bool plain(const QString& word, QString *dest) -{ - if ( dest ) - dest->clear(); - - for ( int i = 0; i < word.length(); i++ ) - { - QChar c = word.at(i); - - if ( c == QLatin1Char('\\') ) - { - if ( dest && ((i + 1) < word.length()) ) - { - c = word.at(++i); - - if ( c == QLatin1Char('n') ) - dest->append('\n'); - else if ( c == QLatin1Char('t') ) - dest->append('\t'); - else if ( c == QLatin1Char('r') ) - dest->append('\r'); - else - dest->append(c); - } - } else if ( - c == QLatin1Char('[') - || - c == QLatin1Char(']') - || - c == QLatin1Char('+') - || - c == QLatin1Char('*') - || - c == QLatin1Char('?') - || - c == QLatin1Char('$') - ) - { - if ( dest ) - dest->clear(); - - return false; - } else { - - if ( dest ) - dest->append(c); - - } - } - - return true; -} - -void addWord(QCharTree& tree, const QString& w, int action, bool cs) -{ - //qDebug("Adding word to char tree : %s", qPrintable(w)); - - if ( cs ) - { - quint16 u = w.at(0).unicode(); - QCharTree::iterator it = tree.find(u), tmp; - - if ( it == tree.end() ) - it = tree.insert(u, QCharTreeNode(u)); - - for ( int i = 1; i < w.count(); i++ ) - { - u = w.at(i).unicode(); - - //qDebug("char %c", w.at(i).toLatin1()); - - tmp = it->next.find(u); - - if ( tmp == it->next.end() ) - tmp = it->next.insert(u, QCharTreeNode(u)); - - it = tmp; - } - - // add action handler - QCharTreeNode node; - node.value.action = action; - - it->next[0] = node; - } else if ( 0 ) { - QChar c = w.at(0); - quint16 u = c.unicode(); - - QCharTree::iterator it, tmp; - QList<QCharTree::iterator> l, ltmp; - - if ( c.isLetter() ) - { - u = c.toLower().unicode(); - tmp = tree.find(u); - - if ( tmp == tree.end() ) - tmp = tree.insert(u, QCharTreeNode(u)); - - l << tmp; - - u = c.toUpper().unicode(); - tmp = tree.find(u); - - if ( tmp == tree.end() ) - tmp = tree.insert(u, QCharTreeNode(u)); - - l << tmp; - } else { - tmp = tree.find(u); - - if ( tmp == tree.end() ) - tmp = tree.insert(u, QCharTreeNode(u)); - - l << tmp; - } - - for ( int i = 1; i < w.count(); ++i ) - { - c = w.at(i); - QList<QChar> lc; - - if ( c.isLetter() ) - lc << c.toLower() << c.toUpper(); - else - lc << c; - - foreach ( c, lc ) - { - u = c.unicode(); - - foreach ( it, l ) - { - tmp = it->next.find(u); - - if ( tmp == it->next.end() ) - tmp = it->next.insert(u, QCharTreeNode(u)); - - ltmp << tmp; - } - } - - l = ltmp; - } - - // add action handler - QCharTreeNode node; - node.value.action = action; - - foreach ( it, l ) - it->next[0] = node; - } -} - -void squeeze(QNFA *nfa) -{ - squeeze(nfa->tree); - - if ( nfa->type & Match ) - { - if ( nfa->out.branch ) - for ( int i = 0; i < nfa->out.branch->count(); ++i ) - squeeze(nfa->out.branch->at(i)); - - } else if ( nfa->out.next ) { - squeeze(nfa->out.next); - } -} - -void squeeze(QCharTreeLevel& lvl) -{ - lvl.squeeze(); - - QCharTreeLevel::iterator it = lvl.begin(); - - while ( it != lvl.end() ) - squeeze((it++)->next); -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qnfa/qnfa.h +++ /dev/null @@ -1,306 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _Q_NFA_H_ -#define _Q_NFA_H_ - -/*! - \file qnfa.h - \brief Definition of the core QNFA syntax engine -*/ - -#include <QChar> -#include <QList> -#include <QHash> -#include <QStack> -#include <QString> - -#include "light_vector.h" - -struct QNFA; - -typedef light_vector<quint16> QNFASet; - -class QNFABranch : public light_vector<QNFA*> -{ - public: - ~QNFABranch(); -}; - -enum NFAType -{ - Char = 0, - - Match = 1, - - CxtBeg = 2, - CxtEnd = 4, - CxtEsc = 8, - - ContextBegin = Match | CxtBeg, - ContextEnd = Match | CxtEnd, - EscapeSeq = Match | CxtEsc, - - Escaped = 16, - Exclusive = 32, - StayOnLine = 64, - - Reserved = 128 -}; - -enum NFAAssertion -{ - NoAssertion = 0, - - One = 0, // default standard - ZeroOrOne = 1, // ? - ZeroOrMore = 2, // * - OneOrMore = 4, // + - - WordStart = 8, - WordEnd = 16, - - Word = 32, - NonWord = 64, - - Digit = 128, - NonDigit = 256, - - Space = 512, - NonSpace = 1024, - - CaseSensitive = 2048 -}; - -struct QCharTreeNode; - -typedef QHash<quint16, QCharTreeNode> QCharTreeLevel; - -struct QCharTreeNode -{ - inline QCharTreeNode(quint16 v = 0) { value.unicode = v; } - inline QCharTreeNode(const QCharTreeNode& o) { value = o.value; next = o.next; } - - union - { - int action; - quint16 unicode; - } value; - - QCharTreeLevel next; -}; - -Q_DECLARE_TYPEINFO(QCharTreeNode, Q_MOVABLE_TYPE); - -typedef QCharTreeLevel QCharTree; - -struct QNFA -{ - QNFA(); - ~QNFA(); - - QNFASet c; - QCharTree tree; - - union - { - QNFA *next; - QNFABranch *branch; - } out; - - quint8 type; - quint16 assertion; - - int actionid; - - static quint32 _count; -}; - -struct QNFAMatchContext -{ - inline QNFAMatchContext(QNFA *root = 0) : context(root) {} - - inline QNFAMatchContext& operator = (QNFAMatchContext *c) - { - if ( c ) - { - context = c->context; - parents = c->parents; - meaningless = c->meaningless; - } else { - reset(); - } - - return *this; - } - - inline QNFAMatchContext& operator = (const QNFAMatchContext& c) - { - context = c.context; - parents = c.parents; - meaningless = c.meaningless; - - return *this; - } - - inline void reset() - { - context = 0; - - while ( parents.count() ) - context = parents.pop(); - } - - QNFA *context; - QNFASet meaningless; - QStack<QNFA*> parents; -}; - -class QNFAMatchHandler -{ - public: - virtual ~QNFAMatchHandler() {} - - virtual void matched(int pos, int len, int action) = 0; -}; - -class QNFAMatchNotifier -{ - private: - struct Command - { - inline Command(int p, int len, int act) - : pos(p), length(len), action(act) {} - - int pos; - int length; - int action; - }; - - typedef QList<Command> CommandList; - - public: - inline QNFAMatchNotifier(QNFAMatchHandler *h) - : handler(h) {} - - inline QNFAMatchNotifier& operator = (const QNFAMatchNotifier& n) - { - handler = n.handler; - - return *this; - } - - inline void operator () (int pos, int len, int action) - { - if ( handler && (m_buffers.isEmpty() || m_pending.count()) ) - handler->matched(pos, len, action); - else - m_buffers.top() << Command(pos, len, action); - } - - inline int bufferLevel() const - { - return m_buffers.count(); - } - - inline void startBuffering() - { - m_buffers.push(CommandList()); - } - - inline void stopBuffering() - { - m_pending = m_buffers.pop(); - } - - inline void flush() - { - foreach ( Command c, m_pending ) - handler->matched(c.pos, c.length, c.action); - - m_pending.clear(); - } - - inline void clear() - { - m_pending.clear(); - m_buffers.clear(); - } - - private: - QNFAMatchHandler *handler; - - CommandList m_pending; - QStack<CommandList> m_buffers; -}; - -void match( QNFAMatchContext *lexer, - const QChar *d, - int length, - QNFAMatchNotifier notify); - -inline void match( QNFAMatchContext *lexer, - const QString& s, - QNFAMatchNotifier notify) -{ match(lexer, s.constData(), s.length(), notify); } - -QNFA* lexer(); - -void squeeze(QNFA *nfa); -void squeeze(QCharTreeLevel& lvl); - -QNFA* sharedContext(const QString& start, - QNFA *other, - bool cs); - -QNFA* context( const QString& start, - const QString& stop, - const QString& escape, - int action, - QNFA **handler = 0, - bool cs = true); - -inline void addNFA(QNFA *context, QNFA *nfa) -{ context->out.branch->append(nfa); } - -bool plain(const QString& word, QString *dest); - -void addWord( QCharTree& tree, - const QString& w, - int action, - bool cs); - -void addWord( QNFA *lexer, - const QString& w, - int action, - bool cs); - -void addSequence( QNFA *lexer, - const QString& w, - int action, - bool cs); - -QNFA* sequence( const QChar *d, - int length, - QNFA **end, - bool cs); - -inline QNFA* sequence( - const QString& s, - QNFA **end, - bool cs) -{ return sequence(s.constData(), s.length(), end, cs); } - -#endif //!_Q_NFA_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qnfa/qnfadefinition.cpp +++ /dev/null @@ -1,1804 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qnfadefinition.h" - -/*! - \file qnfadefinition.cpp - \brief Implementation of the QNFADefinition class. -*/ - -#include "qnfa.h" - -#include "qformatscheme.h" - -#include "qlinemarksinfocenter.h" - -#include "qdocument.h" -#include "qdocument_p.h" -#include "qdocumentline.h" -#include "qdocumentcursor.h" - -#include <QFile> -#include <QKeyEvent> - -#include <QDomText> -#include <QDomElement> -#include <QDomDocument> - -uint qHash(const QPointer<QDocument>& p) { return qHash((QDocument*)(p)); } - -class QNFANotifier : public QNFAMatchHandler -{ - public: - QNFANotifier(const QString& line) - { - m_formats.fill(0, line.length()); - } - - QNFANotifier(const QDocumentLine& line) - : m_line(line) - { - m_formats.fill(0, line.length()); - } - - ~QNFANotifier() - { - if ( m_line.isValid() ) - { - m_line.setFormats(m_formats); - m_line.setParentheses(m_parens); - } - } - - const QVector<int>& formats() const - { - return m_formats; - } - - const QVector<QParenthesis>& parentheses() const - { - return m_parens; - } - - virtual void matched(int pos, int len, int action) - { - //qDebug("action 0x%x on [%s]", action, qPrintable(m_line.text().mid(pos, len))); - - if ( !len ) - return; - - //qDebug("matched \"%s\"", qPrintable(m_line.text().mid(pos, len))); - - if ( - !(action & QNFAAction::Content) - && - ( - action - & - ( - QNFAAction::ParenOpen - | - QNFAAction::ParenClose - | - QNFAAction::Indent - | - QNFAAction::Fold - ) - ) - ) - { - //qDebug("matched paren : %s", qPrintable(m_line.text().mid(pos, len))); - - QParenthesis par( - (action & QNFAAction::ParenMask) >> 8, - 0, - pos, - len - ); - - if ( action & QNFAAction::ParenOpen ) - par.role |= QParenthesis::Open; - - if ( action & QNFAAction::ParenClose ) - par.role |= QParenthesis::Close; - - if ( action & QNFAAction::MatchParen ) - par.role |= QParenthesis::Match; - - if ( action & QNFAAction::Indent ) - par.role |= QParenthesis::Indent; - - if ( action & QNFAAction::Fold ) - par.role |= QParenthesis::Fold; - - m_parens << par; - } - - if ( action & QNFAAction::Highlight ) - { - int i = qMax(pos, 0); - int max = qMin(i + len, m_formats.count()); - - while ( i < max ) - m_formats[i++] = action & QNFAAction::FormatMask; - } - } - - private: - QDocumentLine m_line; - QVector<int> m_formats; - QVector<QParenthesis> m_parens; -}; - -extern QString *_singleLineCommentTarget; -void embed(QNFA *src, QNFA *dest, int index); -void fillContext(QNFA *cxt, QDomElement e, QFormatScheme *f, QHash<QString, int>& pids, bool cs); - -static inline bool match(const QParenthesis& open, const QParenthesis& close) -{ - return open.id == close.id; -} - -#if 0 -class QNFAMatcher : public QMatcherInterface -{ - public: - QNFAMatcher(QNFADefinition *d, bool indent = false) - : m_definition(d), m_indentFold(indent) - { - - } - - virtual void match(const QDocumentCursor& c, QMatcher *m) - { - //qDebug("trying to match..."); - - QDocument *d = c.document(); - QDocumentLine b = c.line(); - - if ( !d || !b.isValid() ) - return; - - int pos = c.columnNumber(); - const QVector<QParenthesis>& m_parens = b.parentheses(); - - if ( m_parens.isEmpty() ) - return; - - QParenthesis p; - - m->clearMatches(); - - foreach ( p, m_parens ) - { - if ( (pos != p.offset) && (pos != (p.offset + p.length)) ) - continue; - - int line = c.lineNumber(), - beg = -1, - end = -1, - beglen = 0, - endlen = 0; - - if ( - (p.role & QParenthesis::Open) - && - (p.role & QParenthesis::Match) - ) - { - beg = p.offset; - beglen = p.length; - endlen = matchOpen(d, line, p, end); - - if ( endlen ) - m->addMatch(c.lineNumber(), beg, beglen, line, end, endlen); - - } else if ( - (p.role & QParenthesis::Close) - && - (p.role & QParenthesis::Match) - ) - { - end = p.offset; - endlen = p.length; - beglen = matchClose(d, line, p, beg); - - if ( beglen ) - m->addMatch(line, beg, beglen, c.lineNumber(), end, endlen); - - } - } - } - - virtual QChar autoClose(QChar) - { - return QChar(); - } - - virtual int blockFlags(int b, int depth, QMatcher *m) - { - if ( m_indentFold ) - { - QDocument *d = m->document(); - - QDocumentLine - prev = d->line(b - 1), - curr = d->line(b), - next = d->line(b + 1); - - if ( curr.hasFlag(QDocumentLine::CollapsedBlockStart) ) - return QMatcher::Collapsed; - - int id = m_indentGuess.value(d, 0), - cc = curr.firstChar(), - pc = prev.firstChar(), - nc = next.firstChar(); - - int k = b; - - do { - prev = d->line(--k); - pc = prev.firstChar(); - } while ( prev.isValid() && (pc == -1) ); - - k = b; - - do { - next = d->line(++k); - nc = next.firstChar(); - } while ( next.isValid() && (nc == -1) ); - - if ( !id && (depth > 0) && (pc > 0) ) - { - id = pc / depth; - m_indentGuess[d] = id; - } - - if ( cc != -1 ) - { - if ( nc > cc ) - return QMatcher::Collapsible; - - if ( nc < cc ) - { - if ( !id && depth ) - { - id = cc / depth; - m_indentGuess[d] = id; - } - - //qDebug("cc=%i; nc=%i; id=%i => do=%i", cc, nc, id, (cc - nc) / id); - return QMatcher::Closure | ((cc - nc) / id); - } - } - /* - if ( (nc != cc) && (nc <= 0) && depth ) - { - return QMatcher::Closure | depth; - }*/ - } - - return collapseState(b, m, 0); - } - - int collapseState(int ln, QMatcher *m, QParenthesis *l) - { - Q_UNUSED(m) - - QDocumentLine b = m->document()->line(ln); - - if ( !b.isValid() ) - return QMatcher::None; - - int open = 0; - - if ( b.hasFlag(QDocumentLine::CollapsedBlockStart) ) - return QMatcher::Collapsed; - - foreach ( QParenthesis p, b.parentheses() ) - { - if ( !(p.role & QParenthesis::Fold) ) - continue; - - if ( p.role & QParenthesis::Open ) - ++open; - else - --open; - - if ( l ) - *l = p; - } - - if ( open > 0 ) - return QMatcher::Collapsible; - else if ( open < 0 ) - return QMatcher::Closure | qAbs(open); - - return QMatcher::None; - } - - virtual void expand(int ln, QMatcher *m) - { - Q_UNUSED(m) - - QDocument *d = m->document(); - QDocumentLine b = d->line(ln); - - if ( !b.isValid() || !b.hasFlag(QDocumentLine::CollapsedBlockStart) ) - return; - - int depth = 1, - count = 1, - indent = b.firstChar() / m_indentGuess.value(d, 1); - - QDocumentLine l = d->line(ln + count); - - while ( l.isValid() ) - { - if ( depth == 1 ) - l.setFlag(QDocumentLine::Hidden, false); - - if ( l.hasFlag(QDocumentLine::CollapsedBlockStart) ) - { - ++depth; - } else if ( l.hasFlag(QDocumentLine::CollapsedBlockEnd) ) { - int flags = blockFlags(ln + count, depth + indent, m); - int doff = qMax(1, flags & QMatcher::DataMask); - - if ( (depth == 1) && (doff > 0) ) - l.setFlag(QDocumentLine::CollapsedBlockEnd, false); - - depth -= doff; - - //qDebug("depth offset = %i > depth = %i", doff, depth); - } - - if ( depth <= 0 ) - break; - - ++count; - l = d->line(ln + count); - } - - if ( !l.isValid() ) - { - --count; - l = d->line(ln + count); - l.setFlag(QDocumentLine::CollapsedBlockEnd, false); - } - - b.setFlag(QDocumentLine::CollapsedBlockStart, false); - d->impl()->showEvent(ln, count); - - d->impl()->setHeight(); - d->impl()->emitFormatsChanged(); - } - - virtual void collapse(int ln, QMatcher *m) - { - QDocument *d = m->document(); - QDocumentLine b = d->line(ln); - - if ( !b.isValid() || b.hasFlag(QDocumentLine::CollapsedBlockStart) ) - return; - - int count = 1, - indent = 0; - - QVector<QParenthesis> lp = b.parentheses(); - - while ( lp.count() ) - { - QParenthesis p = lp.first(); - - if ( (p.role & QParenthesis::Open) && (p.role & QParenthesis::Fold) ) - { - QParenthesis par; - int depth = 1, cd = 0; - QDocumentLine block = d->line(ln + count); - - if ( !b.isValid() ) - return; - - while ( block.isValid() ) - { - const int state = collapseState(ln + count, m, &par); - - if ( state & QMatcher::Closure ) - { -// qDebug("at line %i depth fall by %i", ln + count, state & QMatcher::DataMask); - depth -= state & QMatcher::DataMask; - - if ( depth <= 0 ) - break; - - } else if ( state & (QMatcher::Collapsible | QMatcher::Collapsed) ) { - ++depth; - } - - ++count; - block = d->line(ln + count); - } - - if ( !block.isValid() ) - { - // fold to END for malformed blocks or syntax that allow it - - --count; - block = d->line(ln + count); - } - - b.setFlag(QDocumentLine::CollapsedBlockStart); - - for ( int i = ln + 1; i <= ln + count; ++i ) - { - d->line(i).setFlag(QDocumentLine::Hidden); - } - - block.setFlag(QDocumentLine::Hidden); - block.setFlag(QDocumentLine::CollapsedBlockEnd); - - d->impl()->hideEvent(ln, count); - d->impl()->setHeight(); - - d->impl()->emitFormatsChanged(); - return; - } - - lp.pop_front(); - } - - - if ( !m_indentFold ) - return; - - int i = ln + 1, k; - QDocumentLine block = d->line(i); - - if ( !block.isValid() ) - return; - - indent = block.firstChar(); - - do - { - block = d->line(++i); - k = block.firstChar(); - } while ( block.isValid() && ((k >= indent) || (k == -1)) ); - - if ( k < indent ) - { - block = d->line(--i); - k = block.firstChar(); - } - - while ( block.isValid() && (i > ln) && (k == -1) ) - { - block = d->line(--i); - k = block.firstChar(); - } - - b.setFlag(QDocumentLine::CollapsedBlockStart); - - //qDebug("hidding from %i to %i", ln + 1, i); - - for ( int j = ln + 1; j <= i; ++j ) - { - d->line(j).setFlag(QDocumentLine::Hidden); - } - - d->line(i).setFlag(QDocumentLine::CollapsedBlockEnd); - - d->impl()->hideEvent(ln, i - ln); - d->impl()->setHeight(); - - d->impl()->emitFormatsChanged(); - } - - protected: - int matchOpen(QDocument *d, int& line, QParenthesis p, int& end) - { - int pos = p.offset; - QVector<QParenthesis> m_parens = d->line(line).parentheses(); - - bool bMatch = false; - QParenthesis par; - QStack<QParenthesis> parens; - - forever - { - foreach ( par, m_parens ) - { - if ( par.offset < pos ) - continue; - - if ( par.role & QParenthesis::Open ) - { - parens.push(par); - } else if ( par.role & QParenthesis::Close ) { - if ( (bMatch = ::match(parens.top(), par)) ) - { - bMatch &= parens.count() == 1; - - if ( bMatch ) - break; - else if ( parens.count() ) - parens.pop(); - else - qWarning("bad paren nesting..."); - } else { - return 0; - } - } - } - - if ( bMatch ) - break; - - pos = 0; - ++line; - - QDocumentLine b = d->line(line); - - if ( !b.isValid() ) - return 0; - - m_parens = b.parentheses(); - } - - end = par.offset; - - return par.length; - } - - int matchClose(QDocument *d, int& line, QParenthesis p, int& beg) - { - int pos = p.offset; - QVector<QParenthesis> m_parens = d->line(line).parentheses(); - - QParenthesis par; - bool bMatch = false; - QStack<QParenthesis> parens; - - forever - { - for ( int i = m_parens.count() - 1; i >= 0; --i ) - { - par = m_parens.at(i); - - if ( par.offset > pos ) - continue; - - if ( par.role & QParenthesis::Close ) - { - parens.push(par); - } else if ( par.role & QParenthesis::Open ) { - if ( (bMatch = ::match(par, parens.top())) ) - { - bMatch &= parens.count() == 1; - - if ( bMatch ) - break; - else if ( parens.count() ) - parens.pop(); - else - qWarning("bad paren nesting..."); - } else { - return 0; - } - } - } - - if ( bMatch ) - break; - - --line; - - QDocumentLine b = d->line(line); - pos = b.length(); - - if ( !b.isValid() ) - return 0; - - m_parens = b.parentheses(); - } - - beg = par.offset; - - return par.length; - } - - private: - QNFADefinition *m_definition; - bool m_indentFold; - QHash<QDocument*, int> m_indentGuess; -}; - -class QNFAIndenter : public QIndenterInterface -{ - public: - QNFAIndenter(QNFADefinition *d) - : m_definition(d) - { - - } - - virtual QString indent(const QDocumentCursor& c, QIndenter *i) - { - Q_UNUSED(i) - - if ( c.isNull() || c.line().isNull() ) - return QString(); - - QDocumentLine b = c.line(); - int pos, max = qMin(c.columnNumber(), b.text().size()); - - QString s = b.text().left(max); - - //qDebug("line %i, column %i : %s", b.lineNumber(), c.columnNumber(), qPrintable(s)); - - for ( pos = 0; pos < max; pos++ ) - if ( !s.at(pos).isSpace() ) - break; - - int indent = 0; - bool open = false; - QString spaces = s.left(pos); - - //qDebug("spaces : \"%s\"", qPrintable(spaces)); - - foreach ( QParenthesis p, b.parentheses() ) - { - if ( p.offset >= max ) - { - break; - } else if ( !(p.role & QParenthesis::Indent) ) { - open = true; - } else if ( p.role & QParenthesis::Close ) { - - if ( open ) - --indent; - - } else { //if ( p.role & QParenthesis::Open ) { - open = true; - ++indent; - } - } - - //qDebug("indent : %i", indent); - - if ( indent > 0 ) - spaces += QString(indent, '\t'); - - return spaces; - } - - virtual bool unindent (const QDocumentCursor& c, QKeyEvent *k) - { - if ( c.isNull() || c.line().isNull() ) - return false; - - QDocumentLine b = c.line(); - int pos, max = qMin(c.columnNumber(), b.text().size()); - - QString ktxt = k->text(), - s = b.text().left(max); - - if ( ktxt.isEmpty() ) - return false; - - for ( pos = 0; pos < max; pos++ ) - if ( !s.at(pos).isSpace() ) - break; - - QString spaces = s.left(pos), - text = s.mid(pos) + ktxt; - - if ( spaces.isEmpty() || text.isEmpty() ) - return false; - - QNFAMatchContext cxt; - QNFANotifier notify(text); - - QDocumentLine prev = b.previous(); - - if ( prev.isValid() ) - { - cxt = prev.matchContext(); - } else { - // first line - cxt = b.matchContext(); - cxt.reset(); - } - - match(&cxt, text, ¬ify); - - const QVector<QParenthesis>& parens = notify.parentheses(); - - if ( parens.isEmpty() ) - return false; - - QParenthesis p = parens.last(); - - return ( - (p.role & QParenthesis::Close) - && - (p.role & QParenthesis::Indent) - && - (p.offset == 0) - && - (p.length == text.count()) - ); - } - - private: - QNFADefinition *m_definition; -}; - -class QNFAHighlighter : public QHighlighterInterface -{ - public: - QNFAHighlighter(QNFADefinition *d) - : m_definition(d) - { - - } - - virtual QString singleLineComment() const - { - return m_definition->m_singleLineComment; - } - - virtual void highlight(QDocumentLine& block, QFormatScheme *) - { - if ( !block.matchContext()->context ) - block.matchContext()->context = m_definition->m_root; - - QNFANotifier notifier(block); - QString txt = block.text() + "\n"; - match(block.matchContext(), txt, ¬ifier); - } - - private: - QNFADefinition *m_definition; -}; -#endif - -extern bool stringToBool(const QString& s, bool previous); - -QHash<QString, int> QNFADefinition::m_paren; -QHash<QString, QNFA*> QNFADefinition::m_contexts; -//QHash<QString, QNFADefinition*> QNFADefinition::m_definitions; -QHash<QString, QNFADefinition::EmbedRequestList> QNFADefinition::m_pendingEmbeds; - -void QNFADefinition::load(const QString& file, QLanguageFactory::LangData *d, QFormatScheme *s) -{ - QFile f(file); - - if ( !f.open(QFile::ReadOnly | QFile::Text) ) - { - qWarning("QNFADefinition : failed to open file %s", qPrintable(file)); - return; - } - - load(&f, d, s); -} - -void QNFADefinition::load(QFile *f, QLanguageFactory::LangData *d, QFormatScheme *s) -{ - QDomDocument doc; - doc.setContent(f); - - load(doc, d, s); -} - -void QNFADefinition::load(const QDomDocument& doc, QLanguageFactory::LangData *d, QFormatScheme *s) -{ - QDomElement root = doc.documentElement(); - - QNFADefinition *nd = new QNFADefinition; - - nd->m_language = d->lang = root.attribute("language"); - nd->m_indentFold = stringToBool(root.attribute("indentationFold"), false); - nd->m_extensions = d->extensions = root.attribute("extensions").split(";"); - nd->m_defaultMark = root.attribute("defaultLineMark", "bookmark"); - - /* - qDebug("Generating definition for %s language from XML file : %s", - qPrintable(m_language), - qPrintable(fn)); - */ - - // create root entity - nd->m_root = lexer(); - - _singleLineCommentTarget = &(nd->m_singleLineComment); - fillContext(nd->m_root, root, s, m_paren, true); - _singleLineCommentTarget = 0; - - squeeze(nd->m_root); - - //m_definitions[m_language] = this; - m_contexts[nd->m_language] = nd->m_root; - - flushEmbedRequests(nd->m_language); - - d->d = nd; - d->e = 0; - d->s = s; -} - -QNFADefinition::QNFADefinition() - : m_indentFold(false), m_root(0) -{ - -} - -QNFADefinition::~QNFADefinition() -{ - delete m_root; -} - -QString QNFADefinition::language() const -{ - return m_language; -} - -QStringList QNFADefinition::extensions() const -{ - return m_extensions; -} - -/*! - \brief Entry point for syntax highlighting -*/ -int QNFADefinition::tokenize(QDocument *d, int line, int count) -{ - int n = 0; - bool diffCxt = false; - - QNFA *prevcxt; - QDocumentLine l, prev = d->line(line - 1); - - //qDebug("reformating %i lines from %i...", count, line); - - while ( (n < count) || diffCxt ) - { - l = d->line(line); - - if ( !l.isValid() ) - break; - - // get last context nest to check for noteworthy modifications needing further work - prevcxt = l.matchContext()->context; - //qDebug("\tline %i, cxt : %i", line, prevcxt); - - if ( prev.isValid() ) - { - // go on using previous match context (NFA naming...) - - l.matchContext()->context = prev.matchContext()->context; - l.matchContext()->parents = prev.matchContext()->parents; - l.matchContext()->meaningless = prev.matchContext()->meaningless; - } else { - // first line : reset context.... - - l.matchContext()->reset(); - - /* - qDebug("reset : popping down by %i contexts", line.matchContext()->parents.count()); - - while ( line.matchContext()->parents.count() ) - line.matchContext()->context = line.matchContext()->parents.pop(); - */ - } - - // call the implementation - if ( !l.matchContext()->context ) - l.matchContext()->context = m_root; - - QNFANotifier notifier(l); - QString txt = l.text() + "\n"; - ::match(l.matchContext(), txt, ¬ifier); - - // update cont state, i.e. whether or not highlighting info of next block shall be updated - diffCxt = (prevcxt != l.matchContext()->context); - //qDebug("\t->%i (%i)", l.matchContext()->context, diffCxt); - prev = l; - ++line; - ++n; - } - - return n; -} - -/*! - \brief Return the string starting a single line comment, if any offered by the language -*/ -QString QNFADefinition::singleLineComment() const -{ - return m_singleLineComment; -} - -QString QNFADefinition::defaultLineMark() const -{ - return m_defaultMark; -} - -/*! - \brief Brace matching entry point -*/ -void QNFADefinition::clearMatches(QDocument *d) -{ - QHash<QPointer<QDocument>, int>::iterator it = m_matchGroups.find(d); - - if ( it != m_matchGroups.end() ) - { - d->clearMatches(*it); - d->flushMatches(*it); - - // erase? - //m_matchGroups.erase(it); - } -} - -/*! - \brief Brace matching entry point -*/ -void QNFADefinition::match(QDocumentCursor& c) -{ - QDocumentLine b = c.line(); - QDocument *d = c.document(); - - if ( !d || !b.isValid() ) - { - qDebug("invalid cursor"); - return; - } - - int gid = 0; - QHash<QPointer<QDocument>, int>::iterator it = m_matchGroups.find(d); - - if ( it != m_matchGroups.end() ) - { - d->clearMatches(*it); - d->flushMatches(*it); - *it = gid = d->getNextGroupId(); - } else { - gid = d->getNextGroupId(); - m_matchGroups[d] = gid; - } - - QFormatScheme *s = d->formatScheme(); - - if ( !s ) - { - qDebug("no fmt"); - d->releaseGroupId(gid); - m_matchGroups.remove(d); - return; - } - - int matchFID = s->id("braceMatch"), mismatchFID = s->id("braceMismatch"); - - int pos = c.columnNumber(); - const QVector<QParenthesis>& m_parens = b.parentheses(); - - if ( m_parens.isEmpty() ) - { - // required to properly update display - d->releaseGroupId(gid); - m_matchGroups.remove(d); - return; - } - - QParenthesis p; - - //qDebug("matching on line %i (fid is %i)", c.lineNumber(), fid); - - int matchCount = 0; - foreach ( p, m_parens ) - { - if ( (pos != p.offset) && (pos != (p.offset + p.length)) ) - continue; - - if ( !(p.role & QParenthesis::Match) ) - continue; - - PMatch m; - m.line[0] = c.lineNumber(); - m.column[0] = p.offset; - m.length[0] = p.length; - - if ( (p.role & QParenthesis::Open) && (p.role & QParenthesis::Close) ) - { - matchOpen(d, m); - - if ( m.type == PMatch::Match ) - { - ++matchCount; - - d->addMatch(gid, m.line[0], m.column[0], m.length[0], matchFID); - d->addMatch(gid, m.line[1], m.column[1], m.length[1], matchFID); - } - - m.line[0] = c.lineNumber(); - m.column[0] = p.offset; - m.length[0] = p.length; - - matchClose(d, m); - - if ( m.type == PMatch::Match ) - { - ++matchCount; - - d->addMatch(gid, m.line[0], m.column[0], m.length[0], matchFID); - d->addMatch(gid, m.line[1], m.column[1], m.length[1], matchFID); - } - - continue; - } else if ( p.role & QParenthesis::Open ) { - matchOpen(d, m); - } else if ( p.role & QParenthesis::Close ) { - matchClose(d, m); - } - - if ( m.type != PMatch::Invalid ) - { - ++matchCount; - - int mfid = m.type == PMatch::Match ? matchFID : mismatchFID; - d->addMatch(gid, m.line[0], m.column[0], m.length[0], mfid); - d->addMatch(gid, m.line[1], m.column[1], m.length[1], mfid); - } - } - - if ( matchCount ) - { - d->flushMatches(gid); - } else { - d->releaseGroupId(gid); - m_matchGroups.remove(d); - } -} - -void QNFADefinition::matchOpen(QDocument *d, PMatch& m) -{ - int line = m.line[0]; - int pos = m.column[0]; - QVector<QParenthesis> m_parens = d->line(line).parentheses(); - - bool bMatch = false; - QParenthesis par; - QStack<int> lines; - QStack<QParenthesis> parens; - - forever - { - foreach ( par, m_parens ) - { - if ( par.offset < pos ) - continue; - - if ( (par.role & QParenthesis::Open) && (par.role & QParenthesis::Close) ) - { - bool bInsert = true; - - if ( parens.count() ) - { - if ( ::match(par, parens.top()) ) - { - //qDebug("submatch at %i", line); - parens.pop(); - lines.pop(); - - if ( parens.isEmpty() ) - { - bMatch = true; - //qDebug("match at %i", line); - m.type = PMatch::Match; - - break; - } - } else { - bInsert = false; - - do - { - QParenthesis tp = parens.top(); - - if ( (tp.role & QParenthesis::Open) && (tp.role & QParenthesis::Close) ) - { - if ( par.id < tp.id ) - { - parens.pop(); - } else { - break; - } - } else { - break; - } - - } while ( parens.count() ); - - if ( parens.isEmpty() ) - { - bMatch = true; - m.type = PMatch::Mismatch; - break; - } - } - } - - if ( bInsert ) - { - parens.push(par); - lines.push(line); - } - } else if ( par.role & QParenthesis::Open ) { - lines.push(line); - parens.push(par); - } else if ( par.role & QParenthesis::Close ) { - if ( (bMatch = ::match(parens.top(), par)) ) - { - bMatch &= parens.count() == 1; - - if ( bMatch ) - { - m.type = PMatch::Match; - - break; - } else if ( parens.count() ) { - parens.pop(); - lines.pop(); - } else - qWarning("bad paren nesting..."); - } else { - bMatch = true; - - QParenthesis p = parens.pop(); - - m.line[0] = lines.pop(); - m.column[0] = p.offset; - m.length[0] = p.length; - - m.type = PMatch::Mismatch; - - break; - } - } - } - - if ( bMatch ) - break; - - pos = 0; - ++line; - - QDocumentLine b = d->line(line); - - if ( !b.isValid() ) - { - m.type = PMatch::Invalid; - return; - } - - m_parens = b.parentheses(); - } - - m.line[1] = line; - m.column[1] = par.offset; - m.length[1] = par.length; -} - -void QNFADefinition::matchClose(QDocument *d, PMatch& m) -{ - int line = m.line[0]; - int pos = m.column[0]; - QVector<QParenthesis> m_parens = d->line(line).parentheses(); - - bool bMatch = false; - QParenthesis par; - QStack<int> lines; - QStack<QParenthesis> parens; - - forever - { - for ( int i = m_parens.count() - 1; i >= 0; --i ) - { - par = m_parens.at(i); - - if ( par.offset > pos ) - continue; - - if ( (par.role & QParenthesis::Open) && (par.role & QParenthesis::Close) ) - { - bool bInsert = true; - - if ( parens.count() ) - { - if ( ::match(par, parens.top()) ) - { - //qDebug("submatch at %i", line); - parens.pop(); - lines.pop(); - - if ( parens.isEmpty() ) - { - //qDebug("match at %i", line); - bMatch = true; - m.type = PMatch::Match; - - break; - } - } else { - bInsert = false; - do - { - QParenthesis tp = parens.top(); - - if ( (tp.role & QParenthesis::Open) && (tp.role & QParenthesis::Close) ) - { - if ( par.id < tp.id ) - { - parens.pop(); - } else { - break; - } - } else { - break; - } - - } while ( parens.count() ); - - if ( parens.isEmpty() ) - { - bMatch = true; - m.type = PMatch::Mismatch; - break; - } - } - } - - if ( bInsert ) - { - parens.push(par); - lines.push(line); - } - } else if ( par.role & QParenthesis::Close ) { - parens.push(par); - lines.push(line); - } else if ( par.role & QParenthesis::Open ) { - if ( ::match(par, parens.top()) ) - { - bMatch = parens.count() == 1; - - if ( bMatch ) - { - m.type = PMatch::Match; - - break; - } else if ( parens.count() ) { - parens.pop(); - lines.pop(); - } else - qWarning("bad paren nesting..."); - } else { - bMatch = true; - - QParenthesis p = parens.pop(); - - m.line[0] = lines.pop(); - m.column[0] = p.offset; - m.length[0] = p.length; - - m.type = PMatch::Mismatch; - - break; - } - } - } - - if ( bMatch ) - break; - - --line; - - QDocumentLine b = d->line(line); - pos = b.length(); - - if ( !b.isValid() ) - { - m.type = PMatch::Invalid; - return; - } - - m_parens = b.parentheses(); - } - - m.line[1] = line; - m.column[1] = par.offset; - m.length[1] = par.length; -} - -/*! - \brief Return the indent to use when inserting a line at a given cursor position -*/ -QString QNFADefinition::indent(const QDocumentCursor& c) -{ - if ( c.isNull() || c.line().isNull() ) - return QString(); - - QDocumentLine b = c.line(); - int pos, max = qMin(c.columnNumber(), b.text().size()); - - QString s = b.text().left(max); - - //qDebug("line %i, column %i : %s", b.lineNumber(), c.columnNumber(), qPrintable(s)); - - for ( pos = 0; pos < max; pos++ ) - if ( !s.at(pos).isSpace() ) - break; - - int indent = 0; - QString spaces = s.left(pos); - - foreach ( QParenthesis p, b.parentheses() ) - { - if ( p.offset >= max ) - break; - - if ( !(p.role & QParenthesis::Indent) ) - continue; - - if ( p.role & QParenthesis::Open ) - { - ++indent; - } else if ( p.role & QParenthesis::Close ) { - --indent; - } - } - - //qDebug("indent : %i", indent); - - if ( indent > 0 ) - spaces += QString(indent, '\t'); - - return spaces; -} - -/*! - \brief Determines whether the given key event at the given position should cause unindent to happen -*/ -bool QNFADefinition::unindent (const QDocumentCursor& c, const QString& ktxt) -{ - if ( c.isNull() || c.line().isNull() || ktxt.isEmpty() ) - return false; - - QDocumentLine b = c.line(); - QDocumentLine prev = c.document()->line(c.lineNumber() - 1); - - if ( !prev.isValid() ) - return false; - - int prevIndent = prev.indent(), curIndent = b.indent(); - int pos, max = qMin(c.columnNumber(), b.text().size()); - - if ( (prevIndent - curIndent) >= c.document()->tabStop() ) - return false; - - QString s = b.text(); - s.insert(max, ktxt); - - //qDebug("outdenting %s", qPrintable(s)); - for ( pos = 0; pos < max; ++pos ) - if ( !s.at(pos).isSpace() ) - break; - - if ( !pos || pos >= c.columnNumber() + ktxt.length() ) - return false; - - QString text = s.mid(pos); - - QNFAMatchContext cxt; - QNFANotifier notify(text); - - if ( prev.isValid() ) - { - cxt = prev.matchContext(); - } else { - // first line - cxt = b.matchContext(); - cxt.reset(); - } - - ::match(&cxt, text, ¬ify); - - const QVector<QParenthesis>& parens = notify.parentheses(); - - if ( parens.isEmpty() ) - return false; - - //qDebug("%i parentheses", parens.count()); - QParenthesis p = parens.first(); - - //qDebug("%i, %i, %i", p.offset, p.length, c.columnNumber()); - - return ( - (p.role & QParenthesis::Close) - && - (p.role & QParenthesis::Indent) - && - (p.offset <= c.columnNumber() - pos) - && - (p.offset + p.length > c.columnNumber() - pos) - ); - -} - -int QNFADefinition::findBlockEnd(QDocument *d, int line, bool *open) -{ - QDocumentLine b = d->line(line); - - if ( !b.isValid() ) - return -1; - - QVector<QParenthesis> vp, lp = b.parentheses(); - - while ( lp.count() ) - { - QParenthesis p = lp.first(); - lp.pop_front(); - - if ( !(p.role & QParenthesis::Fold) ) - continue; - - if ( p.role & QParenthesis::Close && vp.count() ) - vp.pop_back(); - - if ( p.role & QParenthesis::Open ) - vp << p; - - } - - if ( vp.count() ) - { - QParenthesis p = vp.first(); - - PMatch m; - m.line[0] = line; - m.column[0] = p.offset; - m.length[0] = p.length; - - matchOpen(d, m); - - if ( - (m.type == PMatch::Match) - || - ( - (m.type == PMatch::Mismatch) - && - (m.line[0] == line) - && - (m.column[0] == p.offset) - ) - ) - { - if ( open ) - { - int flags = blockFlags(d, m.line[1], 0); - - *open = QCE_FOLD_OPEN_COUNT(flags) | (m.type == PMatch::Mismatch); - } - - return m.line[1]; - } else if ( m.type == PMatch::Invalid ) { - return d->lines() - 1; - } - } - - return -1; -} - - -/*! - \brief Expand a collapsed block at a given line -*/ -void QNFADefinition::expand(QDocument *d, int line) -{ - QDocumentLine b = d->line(line); - - if ( !b.isValid() || !b.hasFlag(QDocumentLine::CollapsedBlockStart) ) - return; - - bool open = false; - int end = findBlockEnd(d, line, &open); - - int count = end - line; - - if ( open ) - --count; - - if ( count <= 0 ) - return; - - b.setFlag(QDocumentLine::CollapsedBlockStart, false); - - bool shared = false; - int i = line + 1; - - while ( i < end ) - { - QDocumentLine l = d->line(i); - l.setFlag(QDocumentLine::Hidden, false); - //qDebug("+%i", i); - if ( l.hasFlag(QDocumentLine::CollapsedBlockStart) ) - { - bool bopen = false; - int bend = findBlockEnd(d, i, &bopen); - - i = bend; - - if ( !bopen ) - ++i; - - if ( bend == end ) - { - shared = true; - } - } else { - ++i; - } - } - - if ( !shared ) - { - d->line(end).setFlag(QDocumentLine::CollapsedBlockEnd, false); - } - - if ( !open && !shared ) - { - //qDebug("+%i", end); - d->line(end).setFlag(QDocumentLine::Hidden, false); - } - - //qDebug("expanding %i lines from %i", count, line); - d->impl()->showEvent(line, count); -} - -/*! - \brief Collapse a text block at a given line -*/ -void QNFADefinition::collapse(QDocument *d, int line) -{ - QDocumentLine b = d->line(line); - - if ( !b.isValid() || b.hasFlag(QDocumentLine::CollapsedBlockStart) ) - return; - - //qDebug("collapse line %i", line); - - bool open = false; - int end = findBlockEnd(d, line, &open); - - int count = end - line; - - if ( open ) - --count; - - if ( count <= 0 ) - return; - - b.setFlag(QDocumentLine::CollapsedBlockStart); - - for ( int i = line + 1; i < end; ++i ) - { - if ( !d->line(i).hasFlag(QDocumentLine::Hidden) ) - { - //qDebug("-%i", i); - d->line(i).setFlag(QDocumentLine::Hidden); - } - } - - d->line(end).setFlag(QDocumentLine::CollapsedBlockEnd); - - if ( !open ) - { - if ( !d->line(end).hasFlag(QDocumentLine::Hidden) ) - { - //qDebug("-%i", end); - d->line(end).setFlag(QDocumentLine::Hidden); - } - } - - //qDebug("collapsing %i lines from %i", count, line); - d->impl()->hideEvent(line, count); - - #if 0 - if ( !m_indentFold ) - return; - - int i = ln + 1, k; - QDocumentLine block = d->line(i); - - if ( !block.isValid() ) - return; - - indent = block.firstChar(); - - do - { - block = d->line(++i); - k = block.firstChar(); - } while ( block.isValid() && ((k >= indent) || (k == -1)) ); - - if ( k < indent ) - { - block = d->line(--i); - k = block.firstChar(); - } - - while ( block.isValid() && (i > ln) && (k == -1) ) - { - block = d->line(--i); - k = block.firstChar(); - } - - b.setFlag(QDocumentLine::CollapsedBlockStart); - - //qDebug("hidding from %i to %i", ln + 1, i); - - for ( int j = ln + 1; j <= i; ++j ) - { - d->line(j).setFlag(QDocumentLine::Hidden); - } - - d->line(i).setFlag(QDocumentLine::CollapsedBlockEnd); - - d->impl()->hideEvent(ln, i - ln); - #endif -} - -/*! - \brief Compute the collapse state of a line -*/ -int QNFADefinition::blockFlags(QDocument *d, int line, int depth) const -{ - Q_UNUSED(depth) - - QDocumentLine b = d->line(line); - - if ( !b.isValid() ) - return None; - - int ret = None; - short open = 0, close = 0; - - foreach ( QParenthesis p, b.parentheses() ) - { - if ( !(p.role & QParenthesis::Fold) ) - continue; - - if ( p.role & QParenthesis::Close ) - { - if ( open ) - --open; - else - ++close; - - } - - if ( p.role & QParenthesis::Open ) - { - ++open; - } - } - - if ( b.hasFlag(QDocumentLine::CollapsedBlockStart) ) - ret = Collapsed; - - if ( open ) - ret |= Collapsible; - - if ( close ) - ret |= Closure; - - //qDebug("%i : ret : %i (%i, %i)", line, ret, ret & 0xffff0000, short(((short)0) | (ret & 0xffff))); - - return QCE_FOLD_FLAGS(ret, open, close); -} - -void QNFADefinition::addContext(const QString& id, QNFA *nfa) -{ - //qDebug("registering context : %s", qPrintable(id)); - m_contexts[id] = nfa; -} - -void QNFADefinition::flushEmbedRequests(const QString& lang) -{ - //qDebug("flushing requests for : %s", qPrintable(lang)); - QHash<QString, EmbedRequestList>::iterator it; - - it = m_pendingEmbeds.begin(); - - while ( it != m_pendingEmbeds.end() ) - { - QString r = it.key(); - - if ( - r.startsWith(lang) - && - ( - (r.count() == lang.count()) - || - (r.at(lang.count()) == ':') - ) - ) - { - QNFA *src = m_contexts.value(r); - - if ( !src ) - { - ++it; - continue; - } - - foreach( const EmbedRequest& request, *it ) - { - //qDebug("embedding %s in 0x%x at index %i", - // qPrintable(r), request.target, request.index); - - embed(src, request.target, request.index); - } - - it = m_pendingEmbeds.erase(it); - } else { - ++it; - } - } -} - -void QNFADefinition::addEmbedRequest(const QString& cxt, QNFA *dest) -{ - //qDebug("Adding request : %s", qPrintable(cxt)); - - if ( m_contexts.contains(cxt) ) - { - //qDebug("dealing with request : %s", qPrintable(cxt)); - embed(m_contexts[cxt], dest, dest->out.branch->count()); - } else { - m_pendingEmbeds[cxt] << EmbedRequest(dest, dest->out.branch->count()); - } -} - -void QNFADefinition::shareEmbedRequests(QNFA *src, QNFA *dest, int offset) -{ - QHash<QString, EmbedRequestList>::iterator it = m_pendingEmbeds.begin(); - - while ( it != m_pendingEmbeds.end() ) - { - foreach ( const EmbedRequest& request, *it ) - { - if ( request.target == src ) - { - //qDebug("sharing one embed request between 0x%x and 0x%x at %i + %i", src, dest, offset, request.index); - it->append(EmbedRequest(dest, request.index + offset)); - } - } - - ++it; - } -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qnfa/qnfadefinition.h +++ /dev/null @@ -1,163 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QNFA_DEFINITION_H_ -#define _QNFA_DEFINITION_H_ - -/*! - \file qnfadefinition.h - \brief Definition of the QNFADefinition class. -*/ - -#include "qlanguagefactory.h" -#include "qlanguagedefinition.h" - -#include <QHash> -#include <QPointer> -#include <QStringList> - -struct QNFA; - -class QParenthesis; - -class QFile; -class QDomDocument; - -class QNFAAction -{ - public: - enum - { - NoAction = 0, - - FormatMask = 0x00000fff, - ParenMask = 0x00fff000, - - Highlight = 0x01000000, - Indent = 0x02000000, - ParenOpen = 0x04000000, - ParenClose = 0x08000000, - MatchParen = 0x10000000, - Fold = 0x20000000, - - Ambiguous = 0x40000000, - - Content = 0x80000000 - }; - - inline static int format(int id) - { return id & FormatMask; } - - inline static int parenthesis(int id) - { return id & ParenMask; } -}; - -class QCE_EXPORT QNFADefinition : public QLanguageDefinition -{ - public: - QNFADefinition(); - virtual ~QNFADefinition(); - - virtual QString language() const; - virtual QStringList extensions() const; - - virtual int tokenize(QDocument *d, int line, int count); - - virtual QString singleLineComment() const; - - virtual QString defaultLineMark() const; - - virtual void clearMatches(QDocument *d); - virtual void match(QDocumentCursor& c); - - virtual QString indent(const QDocumentCursor& c); - virtual bool unindent (const QDocumentCursor& c, const QString& ktxt); - - virtual void expand(QDocument *d, int line); - virtual void collapse(QDocument *d, int line); - virtual int blockFlags(QDocument *d, int line, int depth) const; - - static void load(QFile *f, QLanguageFactory::LangData *d, QFormatScheme *s); - static void load(const QString& file, QLanguageFactory::LangData *d, QFormatScheme *s); - static void load(const QDomDocument& doc, QLanguageFactory::LangData *d, QFormatScheme *s); - - static void addContext(const QString& id, QNFA *nfa); - static void addEmbedRequest(const QString& lang, QNFA *dest); - static void shareEmbedRequests(QNFA *src, QNFA *dest, int offset); - - private: - bool m_indentFold; - QString m_language, - m_defaultMark, - m_singleLineComment; - - QStringList m_extensions; - - QNFA *m_root; - - QHash<QPointer<QDocument>, int> m_matchGroups; - - static QHash<QString, int> m_paren; - static QHash<QString, QNFA*> m_contexts; - - struct PMatch - { - PMatch() : type(Invalid) - { - line[0] = -1; - line[1] = -1; - - column[0] = -1; - column[1] = -1; - - length[0] = 0; - length[1] = 0; - } - - enum Type - { - Invalid, - Match, - Mismatch - }; - - char type; - - int line[2]; - int column[2]; - int length[2]; - }; - - void matchOpen(QDocument *d, PMatch& m); - void matchClose(QDocument *d, PMatch& m); - - int findBlockEnd(QDocument *d, int line, bool *open = 0); - - static void flushEmbedRequests(const QString& lang); - - struct EmbedRequest - { - inline EmbedRequest(QNFA *nfa, int idx) : index(idx), target(nfa) {} - - int index; - QNFA *target; - }; - - typedef QList<EmbedRequest> EmbedRequestList; - - static QHash<QString, EmbedRequestList> m_pendingEmbeds; -}; - -#endif // !_QNFA_DEFINITION_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qnfa/xml2qnfa.cpp +++ /dev/null @@ -1,466 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -/*! - \file xml2qnfa.cpp - \brief Implementation of the QNFA builder (fetch syntax engine data from XML files) -*/ - -#include "qnfa.h" -#include "qnfadefinition.h" - -#include "qformatscheme.h" - -#include <QVariant> -#include <QDomText> -#include <QDomElement> -#include <QDomDocument> - -/* - <QNFA> - <word></word> - <sequence></sequence> - - <context> - <start></start> - <stop></stop> - <escape></escape> - - ... - - </context> - </QNFA> -*/ - -QString *_singleLineCommentTarget = 0; - -bool stringToBool(const QString& s, bool previous) -{ - if ( s.isEmpty() ) - return previous; - - return - ( - (s == "true") - || - (s == "enabled") - ) - || - ( - (s != "false") - && - (s != "disabled") - && - QVariant(s).toBool() - ); -} - -int pid(const QString& s, QHash<QString, int>& pids) -{ - if ( pids.contains(s) ) - return pids.value(s); - - int id = (pids.count() + 1) << 12; - - pids[s] = id; - - return id; -} - -int action(QDomElement c, QFormatScheme *f, QHash<QString, int>& pids, int fid = 0) -{ - QString paren, spid, spt, sfid; - - sfid = c.attribute("format"); - - if ( sfid.count() ) - { - fid |= QNFAAction::Highlight | QNFAAction::format(f->id(sfid)); - } - - paren = c.attribute("parenthesis"); - - if ( paren.count() ) - { - spid = paren.section(':', 0, -2); - spt = paren.section(':', -1, -1); - - if ( spt.endsWith("@nomatch") ) - { - spt.chop(8); - } else { - fid |= QNFAAction::MatchParen; - } - - if ( spid.count() ) - { - /*qDebug("paren : [%s|%s] => 0x%x", - qPrintable(spid), qPrintable(spt), - (spt == "open" ? QNFAAction::ParenOpen : QNFAAction::ParenClose) | pid(spid, pids)); - */ - - if ( spt == "open" ) - fid |= QNFAAction::ParenOpen; - else if ( spt == "close" ) - fid |= QNFAAction::ParenClose; - else if ( spt == "boundary" ) - fid |= QNFAAction::ParenOpen | QNFAAction::ParenClose; - - fid |= QNFAAction::parenthesis(pid(spid, pids)); - - /* - qDebug("paren : [%s|%s] => 0x%x", - qPrintable(spid), qPrintable(spt), - fid & QNFAAction::ParenMask); - */ - } - } - - if ( stringToBool(c.attribute("indent"), false) ) - fid |= QNFAAction::Indent; - - if ( stringToBool(c.attribute("fold"), false) ) - fid |= QNFAAction::Fold; - - // TODO : determine ambiguity automatically - if ( stringToBool(c.attribute("ambiguous"), false) ) - fid |= QNFAAction::Ambiguous; - - return fid; -} - -void copy(const QCharTreeLevel& src, QCharTreeLevel& dest) -{ - QCharTreeLevel::const_iterator it = src.constBegin(); - - while ( it != src.constEnd() ) - { - //qDebug("copying char tree level %c", QChar(it.key()).toLatin1()); - - if ( !dest.contains(it.key()) ) - dest[it.key()] = *it; - else - copy(it->next, dest[it.key()].next); - - ++it; - } -} - -void embed(QNFA *src, QNFA *dest, int idx = 0) -{ - QNFA *nfa; - const int n = src->out.branch->count(); - - //dest->out.branch->alloc(idx, n); - - //qDebug("\tembedding %i children", n); - - for ( int i = 0; i < n; ++i ) - { - nfa = src->out.branch->at(i); - - if ( nfa->type & Reserved ) - continue; - - //qDebug("\t\teffectively embedding 0x%x at %i", nfa, idx); - dest->out.branch->insert(idx++, nfa); - } - - copy(src->tree, dest->tree); -} - -void fillContext(QNFA *cxt, QDomElement e, QFormatScheme *f, QHash<QString, int>& pids, bool cs); -void fillContext(QNFA *cxt, QDomNodeList l, QFormatScheme *f, QHash<QString, int>& pids, bool cs); - -void addToContext( QNFA *cxt, QDomElement c, int fid, - QFormatScheme *f, QHash<QString, int>& pids, - const QStringList& pref, - const QStringList& suff, - bool cs) -{ - QString tag = c.tagName(); - - if ( !c.hasChildNodes() && tag != "embed" ) - return; - - cs = stringToBool(c.attribute("caseSensitive"), cs); - - if ( (tag == "start") || (tag == "stop") || (tag == "escape") ) - { - return; - } else if ( tag == "word" ) { - //qDebug("adding word : %s", qPrintable(c.firstChild().toText().data())); - const QString value = c.firstChild().toText().data(); - - if ( pref.isEmpty() && suff.isEmpty() ) - { - addWord(cxt, value, fid, cs); - } else if ( pref.count() ) { - foreach ( const QString& p, pref ) - { - if ( suff.isEmpty() ) - { - addWord(cxt, p + value, fid, cs); - } else { - foreach ( const QString& s, suff ) - { - addWord(cxt, p + value + s, fid, cs); - } - } - } - } else { - foreach ( const QString& s, suff ) - { - addWord(cxt, value + s, fid, cs); - } - } - } else if ( tag == "sequence" ) { - const QString value = c.firstChild().toText().data(); - - //qDebug("adding sequence : %s [0x%x]", qPrintable(value), cxt); - if ( pref.isEmpty() && suff.isEmpty() ) - { - addSequence(cxt, value, fid, cs); - } else if ( pref.count() ) { - foreach ( const QString& p, pref ) - { - if ( suff.isEmpty() ) - { - addSequence(cxt, p + value, fid, cs); - } else { - foreach ( const QString& s, suff ) - { - addSequence(cxt, p + value + s, fid, cs); - } - } - } - } else { - foreach ( const QString& s, suff ) - { - addSequence(cxt, value + s, fid, cs); - } - } - } else if ( tag == "list" ) { - QDomNodeList children = c.childNodes(); - QStringList prefixes, suffixes; - - //qDebug("starting list"); - for ( int j = 0; j < children.count(); ++j ) - { - QDomElement cc = children.at(j).toElement(); - - if ( cc.isNull() ) - continue; - - const QString role = cc.tagName(); - const QString value = cc.firstChild().toText().data(); - - if ( role == "prefix" ) - prefixes << value; - else if ( role == "suffix" ) - suffixes << value; - else - addToContext(cxt, cc, action(cc, f, pids, fid), f, pids, prefixes, suffixes, cs); - } - //qDebug("ending list"); - - } else if ( tag == "embed" ) { - QNFADefinition::addEmbedRequest(c.attribute("target"), cxt); - } else if ( tag == "context" ) { - QNFA *nfa, - *start = 0, - *hstart = 0, - *cstart = 0, - *stop = 0, - *hstop = 0, - *escape = 0, - *hescape = 0; - - QList<QNFA*> lStart, lStop, lEscape; - - QString attr; - int defact = action(c, f, pids); - QDomNodeList children = c.childNodes(); - - QString _id = c.attribute("id"); - bool trans = stringToBool(c.attribute("transparency"), false); - bool stay = stringToBool(c.attribute("stayOnLine"), false); - - for ( int j = 0; j < children.count(); ++j ) - { - QDomElement child = children.at(j).toElement(); - - if ( child.isNull() || !child.hasChildNodes() ) - continue; - - bool tcs = stringToBool(child.attribute("caseSensitive"), cs); - - int act = action(child, f, pids); - - if ( !(act & QNFAAction::Highlight) ) - act |= QNFAAction::Highlight | QNFAAction::format(defact); - - const QString role = child.tagName(); - const QString value = child.firstChild().toText().data(); - - if ( role == "start" ) - { - start = sequence(value, &hstart, tcs); - start->actionid = act; - //start->type |= Reserved; - lStart << start; - - if ( !cstart ) - { - cstart = new QNFA; - cstart->type = ContextBegin | (stay ? StayOnLine : 0); - cstart->actionid = defact; - cstart->out.branch = new QNFABranch; - - // only the first sequence comes - if ( _singleLineCommentTarget && (_id == "comment/single") ) - *_singleLineCommentTarget = value; - - } - - hstart->out.next = cstart; - hstart->actionid = act; - //hstart = nfa; - - //qDebug("cxt start seq : %s [0x%x, 0x%x]", qPrintable(value), start, nfa); - - } else if ( role == "stop" ) { - stop = sequence(value, &hstop, tcs); - stop->actionid = act; - stop->type |= Reserved; - lStop << stop; - - nfa = new QNFA; - nfa->type = ContextEnd; - nfa->actionid = act; - //nfa->out.branch = new QNFABranch; - - hstop->out.next = nfa; - hstop->actionid = act; - hstop = nfa; - - attr = child.attribute("exclusive"); - - if ( attr.isEmpty() || (attr == "true") || attr.toUInt() ) - hstop->type |= Exclusive; - - //qDebug("cxt stop seq : %s [0x%x]", qPrintable(value), act); - - } else if ( role == "escape" ) { - - escape = sequence(value, &hescape, tcs); - escape->type |= Reserved; - lEscape << escape; - - nfa = new QNFA; - nfa->type = EscapeSeq; - nfa->actionid = action(child, f, pids); - //nfa->out.branch = new QNFABranch; - - hescape->out.next = nfa; - //hescape = nfa; - } - } - - if ( hstart ) - { - //qDebug("starting cxt %s:0x%x [0x%x]", qPrintable(c.attribute("id")), cstart, cxt); - - foreach ( escape, lEscape ) - { - //cstart->type |= Escaped; - addNFA(cstart, escape); - } - - //qDebug("after esc : %i", cstart->out.branch->count()); - - foreach ( stop, lStop ) - addNFA(cstart, stop); - - //qDebug("after stop : %i", cstart->out.branch->count()); - } else { - cstart = new QNFA; - cstart->type = ContextBegin | (stay ? StayOnLine : 0); - cstart->actionid = defact; - cstart->out.branch = new QNFABranch; - } - - fillContext(cstart, c, f, pids, cs); - - if ( c.hasAttribute("id") ) - { - QNFADefinition::addContext( - c.ownerDocument().documentElement().attribute("language") - + ":" - + _id, - cstart - ); - - } else { - //qDebug("unregistered context"); - } - - //qDebug("after sub : %i", cstart->out.branch->count()); - - if ( trans ) - { - QNFADefinition::shareEmbedRequests(cxt, cstart, cstart->out.branch->count()); - embed(cxt, cstart, cstart->out.branch->count()); - } - - if ( hstart ) - { - foreach ( start, lStart ) - addNFA(cxt, start); - - //qDebug("ending cxt"); - } else { - - } - - //fillContext(subcxt, c, f, pids); - } else { - //qDebug("unhandled tag : %s", qPrintable(tag)); - } -} - -void fillContext(QNFA *cxt, QDomElement e, QFormatScheme *f, QHash<QString, int>& pids, bool cs) -{ - cs = stringToBool(e.attribute("caseSensitive"), cs); - - fillContext(cxt, e.childNodes(), f, pids, cs); -} - -void fillContext(QNFA *cxt, QDomNodeList l, QFormatScheme *f, QHash<QString, int>& pids, bool cs) -{ - //qDebug("filling context from %i nodes", l.count()); - - for ( int i = 0; i < l.count(); i++ ) - { - QDomElement c = l.at(i).toElement(); - - if ( c.isNull() ) - continue; - - addToContext(cxt, c, action(c, f, pids), f, pids, QStringList(), QStringList(), cs); - } - - //qDebug("context filled"); -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qpanellayout.cpp +++ /dev/null @@ -1,435 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qpanellayout.h" - -/*! - \file qpanellayout.cpp - \brief Implementation of the QPanelLayout class. -*/ - -#include "qpanel.h" -#include "qeditor.h" - -#include <QWidget> -#include <QScrollBar> - -#ifdef Q_WS_WIN -// panel position fix required on some systems to work around a bug in QAbstractScrollArea -#define _PANEL_POSITION_FIX_ -#endif - -/*! - \class QPanelLayout - \brief A specialized layout taking care of panel display - - The panel layout is specialized in several ways : - <ul> - <li>It only operates on specific widgets (which inherit QPanel)</li> - <li>It can only layout widgets in the viewport margins of a QEditor (could work with - any QAbstractScrollArea if a single method was made public instead of protected...) - so it does not qualify as a "real" layout (contrary to grid/box layouts)</li> - <li>It positions widgets on the border of the editor in the same way the Border Layout - example does (most of the layout code actually comes from there).</li> - <li>It provides serialization/deserialization of its layout structure</li> - </ul> -*/ - -/* - The layouting code is inspired from a Qt4 example : Border Layout -*/ - -/*! - \brief ctor -*/ -QPanelLayout::QPanelLayout(QEditor *p) - : QLayout(p), m_parent(p) -{ - setSpacing(0); -} - -/*! - \brief ctor - \param layout structure to deserailize -*/ -QPanelLayout::QPanelLayout(const QString& layout, QEditor *p) - : QLayout(p), m_parent(p) -{ - setSpacing(0); - addSerialized(layout); -} - -/*! - \brief dtor -*/ -QPanelLayout::~QPanelLayout() -{ - QLayoutItem *l; - - while ( (l = takeAt(0)) ) - delete l; -} - -/*! - \return A serialized layout strucure -*/ -QString QPanelLayout::serialized() const -{ - /* - Scheme : - - QPanelLayout::Position '{' comma-separated list of identifiers '}' - */ - - QHash<int, QString> posMap; - - for ( int i = 0; i < m_list.size(); ++i ) - { - PanelWrapper *wrapper = m_list.at(i); - Position position = wrapper->position; - - QPanel *panel = qobject_cast<QPanel*>(wrapper->item->widget()); - - if ( !panel ) - continue; - - if ( !posMap.contains(position) ) - { - posMap[position] = QString::number(position) + "{" + panel->id() + "}"; - } else { - QString& ref = posMap[position]; - - ref.insert(ref.count() - 2, QString(",") + panel->id()); - } - } - - return QStringList(posMap.values()).join(""); -} - -/*! - \brief Add the content of a serialized layout structure -*/ -void QPanelLayout::addSerialized(const QString& layout) -{ - //qDebug("layout : %s", qPrintable(layout)); - - int last = 0, i = 0; - bool inList = false; - Position position = West; - - while ( i < layout.length() ) - { - if ( inList ) - { - if ( layout.at(i) == '}' ) - inList = false; - - if ( !inList || (layout.at(i) == ',') ) - { - QPanel *panel = QPanel::panel(layout.mid(last, i - last), m_parent); - - if ( panel ) - { - panel->attach(m_parent); - addWidget(panel, position); - - //qDebug("\tpanel : %s", qPrintable(layout.mid(last, i - last))); - } - - last = i + 1; - } - } else if ( layout.at(i) == '{' ) { - inList = true; - position = Position(layout.mid(last, i - last).toInt()); - - //qDebug("position : %i [%s]", position, qPrintable(layout.mid(last, i - last))); - - last = i + 1; - } - - ++i; - } - - update(); -} - -/*! - \return the list of panels managed by the layout -*/ -QList<QPanel*> QPanelLayout::panels() const -{ - QList<QPanel*> l; - - foreach ( PanelWrapper *w, m_list ) - { - QPanel *p = qobject_cast<QPanel*>(w->item->widget()); - - if ( p ) - l << p; - } - - return l; -} - -/*! - \return the count of managed panels -*/ -int QPanelLayout::count() const -{ - return m_list.count(); -} - -/*! - \internal -*/ -bool QPanelLayout::hasHeightForWidth() const -{ - return false; -} - -/*! - \internal -*/ -Qt::Orientations QPanelLayout::expandingDirections() const -{ - return Qt::Horizontal | Qt::Vertical; -} - -/*! - \internal -*/ -QSize QPanelLayout::sizeHint() const -{ - return calculateSize(SizeHint); -} - -/*! - \internal -*/ -QSize QPanelLayout::minimumSize() const -{ - return calculateSize(MinimumSize); -} - -/*! - \internal -*/ -void QPanelLayout::addItem(QLayoutItem *item) -{ - add(item, West); -} - -/*! - \brief Add a panel at a given position -*/ -void QPanelLayout::addWidget(QWidget *widget, Position position) -{ - add(new QWidgetItem(widget), position); -} - -/*! - \internal -*/ -QLayoutItem* QPanelLayout::itemAt(int idx) const -{ - PanelWrapper *wrapper = m_list.value(idx); - - if ( wrapper ) - return wrapper->item; - else - return 0; - -} - -/*! - \internal -*/ -QLayoutItem* QPanelLayout::takeAt(int idx) -{ - if ( (idx >= 0) && (idx < m_list.size()) ) - { - PanelWrapper *layoutStruct = m_list.takeAt(idx); - return layoutStruct->item; - } - - return 0; -} - -/*! - \internal -*/ -void QPanelLayout::setGeometry(const QRect &r) -{ - //qDebug("laying out %i panels", count()); - #ifdef _PANEL_POSITION_FIX_ - QScrollBar *vb = m_parent->verticalScrollBar(), - *hb = m_parent->horizontalScrollBar(); - - QRect rect( r.x(), r.y(), - r.width() - (vb->isVisibleTo(m_parent) ? vb->width() : 0), - r.height() - (hb->isVisibleTo(m_parent) ? hb->height() : 0) - ); - #else - QRect rect( r.x(), r.y(), - r.width(), - r.height() - ); - #endif - - int i, - eastWidth = 0, - westWidth = 0, - northHeight = 0, - southHeight = 0, - centerHeight = 0; - - QLayout::setGeometry(rect); - - for ( i = 0; i < m_list.size(); ++i ) - { - PanelWrapper *wrapper = m_list.at(i); - QLayoutItem *item = wrapper->item; - Position position = wrapper->position; - - if ( item->isEmpty() ) - continue; - - if ( position == North ) - { - item->setGeometry(QRect( - rect.x(), - northHeight, - rect.width(), - item->sizeHint().height() - ) - ); - - northHeight += item->geometry().height() + spacing(); - } else if (position == South) { - item->setGeometry(QRect(item->geometry().x(), - item->geometry().y(), - rect.width(), - item->sizeHint().height() - ) - ); - - southHeight += item->geometry().height() + spacing(); - - item->setGeometry(QRect(rect.x(), - rect.y() + rect.height() - southHeight + spacing(), - item->geometry().width(), - item->geometry().height() - ) - ); - - } - } - - centerHeight = rect.height() - northHeight - southHeight; - - for ( i = 0; i < m_list.size(); ++i ) - { - PanelWrapper *wrapper = m_list.at(i); - QLayoutItem *item = wrapper->item; - Position position = wrapper->position; - - if ( item->isEmpty() ) - continue; - - if ( position == West ) - { - item->setGeometry(QRect(rect.x() + westWidth, - northHeight, - item->sizeHint().width(), - centerHeight - ) - ); - - westWidth += item->geometry().width() + spacing(); - } else if (position == East) { - item->setGeometry(QRect(item->geometry().x(), - item->geometry().y(), - item->sizeHint().width(), - centerHeight - ) - ); - - eastWidth += item->geometry().width() + spacing(); - - item->setGeometry(QRect(rect.x() + rect.width() - eastWidth + spacing(), - northHeight, - item->geometry().width(), - item->geometry().height() - ) - ); - - } - } - - /* - if ( center ) - center->item->setGeometry(QRect(westWidth, northHeight, - rect.width() - eastWidth - westWidth, - centerHeight)); - */ - //qDebug("{%i, %i, %i, %i}", westWidth, northHeight, eastWidth, southHeight); - m_parent->setPanelMargins(westWidth, northHeight, eastWidth, southHeight); -} - -/*! - \internal -*/ -void QPanelLayout::add(QLayoutItem *item, Position position) -{ - QPanel *p; - - if ( (p = qobject_cast<QPanel*>(item->widget())) ) - { - //p->setParent(m_parent); - p->setVisible(p->defaultVisibility()); - } - - m_list.append(new PanelWrapper(item, position)); -} - -/*! - \internal -*/ -QSize QPanelLayout::calculateSize(SizeType sizeType) const -{ - QSize totalSize; - - for ( int i = 0; i < m_list.size(); ++i ) - { - QSize itemSize; - PanelWrapper *wrapper = m_list.at(i); - Position position = wrapper->position; - - if ( sizeType == MinimumSize ) - itemSize = wrapper->item->minimumSize(); - else // ( sizeType == SizeHint ) - itemSize = wrapper->item->sizeHint(); - - if ( (position == North) || (position == South) ) // || (position == Center) ) - totalSize.rheight() += itemSize.height(); - - if ( (position == West) || (position == East) ) // || (position == Center) ) - totalSize.rwidth() += itemSize.width(); - - } - - return totalSize; -} -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qpanellayout.h +++ /dev/null @@ -1,94 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QPANEL_LAYOUT_H_ -#define _QPANEL_LAYOUT_H_ - -#include "qce-config.h" - -/*! - \file qpanellayout.h - \brief Definition of the QPanelLayout class -*/ - -#include <QList> -#include <QLayout> -#include <QPointer> - -class QPanel; -class QEditor; - -class QCE_EXPORT QPanelLayout : public QLayout -{ - Q_OBJECT - - public: - enum Position - { - West, - North, - South, - East - }; - - QPanelLayout(QEditor *p); - QPanelLayout(const QString& layout, QEditor *p); - virtual ~QPanelLayout(); - - virtual int count() const; - virtual bool hasHeightForWidth() const; - virtual Qt::Orientations expandingDirections() const; - - virtual QSize sizeHint() const; - virtual QSize minimumSize() const; - - virtual QLayoutItem *itemAt(int idx) const; - virtual QLayoutItem *takeAt(int idx); - - QString serialized() const; - void addSerialized(const QString& layout); - - QList<QPanel*> panels() const; - - public slots: - virtual void addItem(QLayoutItem *item); - virtual void setGeometry(const QRect &rect); - - void add(QLayoutItem *item, Position position); - void addWidget(QWidget *widget, Position position); - - private: - QPointer<QEditor> m_parent; - - struct PanelWrapper - { - PanelWrapper(QLayoutItem *i, Position p) - { - item = i; - position = p; - } - - QLayoutItem *item; - Position position; - }; - - enum SizeType { MinimumSize, SizeHint }; - QSize calculateSize(SizeType sizeType) const; - - QList<PanelWrapper*> m_list; -}; - -#endif // _QPANEL_LAYOUT_H_ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qreliablefilewatch.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qreliablefilewatch.h" - -/*! - \file qreliablefilewatch.cpp - \brief Implementation of the QReliableFileWatch class. -*/ - -#include <QFile> -#include <QTimerEvent> - -/*! - \class QReliableFileWatch - \brief A specialized file monitor that works around some issues in QFileSystemWatcher -*/ - -QReliableFileWatch::QReliableFileWatch(QObject *p) - : QFileSystemWatcher(p) -{ - connect(this, SIGNAL( fileChanged(QString) ), - this, SLOT ( sourceChanged(QString) ) ); - -} - -QReliableFileWatch::~QReliableFileWatch() -{ - -} - -void QReliableFileWatch::addWatch(const QString& file, QObject *recipient) -{ - QHash<QString, Watch>::iterator it = m_targets.find(file); - - if ( it != m_targets.end() ) - { - it->recipients << recipient; - } else { - QFile f(file); - - Watch w; - w.state = Clean; - w.size = f.size(); - w.recipients << recipient; - m_targets[file] = w; - - addPath(file); - } -} - -void QReliableFileWatch::removeWatch(QObject *recipient) -{ - removeWatch(QString(), recipient); -} - -void QReliableFileWatch::removeWatch(const QString& file, QObject *recipient) -{ - QHash<QString, Watch>::iterator it = m_targets.find(file); - - if ( it == m_targets.end() ) - { - if ( !recipient ) - return; - - // given recipient stop watching any file - - it = m_targets.begin(); - - while ( it != m_targets.end() ) - { - int n = it->recipients.removeAll(recipient); - - if ( n && it->recipients.isEmpty() ) - { - // no more recipients watching this file - removePath(it.key()); - it = m_targets.erase(it); - } else { - ++it; - } - } - } else { - if ( recipient ) - { - // given recipient stops watching given file - it->recipients.removeAll(recipient); - - if ( it->recipients.isEmpty() ) - { - // no more recipients watching this file - removePath(it.key()); - m_targets.erase(it); - } - } else { - // stop watching given file at all - m_targets.erase(it); - } - } -} - -void QReliableFileWatch::timerEvent(QTimerEvent *e) -{ - if ( e->timerId() != m_timer.timerId() ) - return QFileSystemWatcher::timerEvent(e); - - int postponedEmissions = 0; - QHash<QString, Watch>::iterator it = m_targets.begin(); - - while ( it != m_targets.end() ) - { - if ( it->state & Duplicate ) - { - // postpone signal emission... - ++postponedEmissions; - it->state = Recent; - } else if ( it->state & Recent ) { - // send signal - it->state = Clean; - - QFile f(it.key()); - - if ( f.size() == it->size ) - { - // TODO : avoid signal emission if checksum match - // DO this in editor or here? - } - - //qDebug("%s emission.", qPrintable(it.key())); - - it->recipients.removeAll(0); - - foreach ( QObject *r, it->recipients ) - QMetaObject::invokeMethod(r, "fileChanged", Q_ARG(QString, it.key())); - - //it = m_state.erase(it); - } - - ++it; - } - - if ( postponedEmissions ) - { - //qDebug("%i postponed emissions", postponedEmissions); - m_timer.start(20, this); - } -} - -void QReliableFileWatch::sourceChanged(const QString& filepath) -{ - m_timer.stop(); - - QHash<QString, Watch>::iterator it = m_targets.find(filepath); - - if ( it == m_targets.end() ) - return; - - //qDebug("%s modified.", qPrintable(filepath)); - - if ( it->state ) - { - it->state = Recent | Duplicate; - } else { - it->state = Recent; - } - - m_timer.start(20, this); -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/qreliablefilewatch.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QRELIABLE_FILE_WATCH_H_ -#define _QRELIABLE_FILE_WATCH_H_ - -#include "qce-config.h" - -/*! - \file qreliablefilewatch.h - \brief Definition of the QReliableFileWatch class -*/ - -#include <QHash> -#include <QTimer> -#include <QPointer> -#include <QFileSystemWatcher> - -class QCE_EXPORT QReliableFileWatch : protected QFileSystemWatcher -{ - friend class QPointer<QReliableFileWatch>; - - Q_OBJECT - - public: - QReliableFileWatch(QObject *p = 0); - virtual ~QReliableFileWatch(); - - public slots: - void addWatch(const QString& file, QObject *recipient); - - void removeWatch(QObject *recipient); - void removeWatch(const QString& file, QObject *recipient); - - protected: - virtual void timerEvent(QTimerEvent *e); - - private slots: - void sourceChanged(const QString& filepath); - - private: - enum State - { - Clean = 0, - Recent = 1, - Duplicate = 2 - }; - - struct Watch - { - char state; - qint64 size; - QList< QPointer<QObject> > recipients; - }; - - QBasicTimer m_timer; - - QHash<QString, Watch> m_targets; -}; - -#endif // !_QRELIABLE_FILE_WATCH_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/qsnippet.cpp +++ /dev/null @@ -1,376 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -/*! - \file qsnippet.cpp - \brief Implementation of the builtin snippet types and loaders -*/ - -#include "qsnippet_p.h" - -#include <QMap> - -/*! - \class QSnippet - \brief The base class for snippets -*/ - -/*! - \class QSnippetPatternLoader - \brief The base class for snippet loaders -*/ - -QSnippetInsertionCommand::QSnippetInsertionCommand(QEditor *e) - : QDocumentCommandBlock(e->document()), m_editor(e), m_cursor(e->cursor()) -{ -} - -QSnippetInsertionCommand::~QSnippetInsertionCommand() -{ - foreach ( const QEditor::PlaceHolder& ph, m_placeHolders ) - delete ph.affector; -} - -void QSnippetInsertionCommand::addPlaceHolder(const QEditor::PlaceHolder& ph) -{ - m_placeHolders << ph; -} - -void QSnippetInsertionCommand::addCommand(QDocumentCommand *c) -{ - c->setTargetCursor(m_cursor.handle()); - QDocumentCommandBlock::addCommand(c); -} - -void QSnippetInsertionCommand::removeCommand(QDocumentCommand *c) -{ - c->setTargetCursor(0); - QDocumentCommandBlock::removeCommand(c); -} - -void QSnippetInsertionCommand::redo() -{ - m_editor->clearPlaceHolders(); - QDocumentCommandBlock::redo(); - - foreach ( const QEditor::PlaceHolder& ph, m_placeHolders ) - m_editor->addPlaceHolder(ph); - - m_editor->nextPlaceHolder(); -} - -void QSnippetInsertionCommand::undo() -{ - // TODO : backup and restore previous placeholders? - m_editor->clearPlaceHolders(); - QDocumentCommandBlock::undo(); - m_editor->setCursor(m_cursor); -} - -// - -bool QCE::Snippets::PlainText::loadSnippet(QSnippet *snip, const QString& pattern) -{ - PlainText *target = dynamic_cast<PlainText*>(snip); - - if ( !target ) - { - qWarning("snippet/loader type mismatch."); - return false; - } - - target->m_data = pattern; - - return true; -} - -void QCE::Snippets::PlainText::insert(QEditor *e) const -{ - /* - QDocumentCursor c = e->cursor(); - c.insertText(m_data); - e->setCursor(c); - */ - - e->write(m_data); -} - -// - -QString parsePlaceHolder(const QString& s, int& index, int max, QMap<int, QCE::Snippets::Simple::PlaceHolder>& p, int& line, int& column, int baseSize) -{ - QChar c; - QStringList segments; - int i = index, depth = 1, last = index + 1; - - while ( i + 1 < max ) - { - c = s.at(++i); - - if ( c == QLatin1Char('{') ) - { - ++depth; - } else if ( c == QLatin1Char('}') ) { - --depth; - - if ( !depth ) - { - segments << s.mid(last, i - last); - break; - } - } else if ( c == QLatin1Char(':') ) { - if ( depth == 1 ) - { - segments << s.mid(last, i - last); - last = i + 1; - } - } - } - - if ( segments.isEmpty() ) - { - qWarning("invalid placeholder"); - return QString(); - } - - int id = segments.at(0).toInt(); - - QCE::Snippets::Simple::PlaceHolder& ph = p[id]; - - if ( ph.length == -1 && segments.count() > 1 ) - { - // new placeholder - ph.length = segments.last().count(); - ph.lineOffset = line; - ph.columnOffset = column; - ph.defaultValue = segments.last(); - // TODO : support recursive snippetting of default value... - } else { - // mirror of an existing placeholder - QCE::Snippets::Simple::Anchor a; - a.lineOffset = line; - a.columnOffset = column; - if ( ph.defaultValue.isEmpty() ) - ph.unresolvedMirrors << baseSize << ph.mirrors.count(); - ph.mirrors << a; - } - - index = i + 1; - return ph.defaultValue; -} - -void performRelocation(QCE::Snippets::Simple::Anchor& a, const QHash<int, QList<int> >& relocationTable, int length) -{ - QHash<int, QList<int> >::const_iterator reloc = relocationTable.constFind(a.lineOffset); - - if ( reloc == relocationTable.constEnd() ) - return; - - int idx = 0; - int relocOffset = 0; - const QList<int>& offsets = *reloc; - - while ( ((idx + 1) < offsets.count()) && (offsets.at(idx) <= a.columnOffset) ) - { - int off = offsets.at(++idx); - - if ( offsets.at(idx - 1) < a.columnOffset || off != length ) - relocOffset += off; - - ++idx; - } - - a.columnOffset += relocOffset; -} - -bool QCE::Snippets::Simple::loadSnippet(QSnippet *snip, const QString& pattern) -{ - Simple *target = dynamic_cast<Simple*>(snip); - - if ( !target ) - { - qWarning("snippet/loader type mismatch"); - return false; - } - - target->m_base.clear(); - target->m_placeHolders.clear(); - - int index = 0, line = 0, column = 0, max = pattern.length(); - - QString tmp; - QStringList base; - QMap<int, PlaceHolder> p; - - while ( index < max ) - { - QChar c = pattern.at(index); - - if ( c == QLatin1Char('$') ) - { - base << tmp; - tmp.clear(); - - c = pattern.at(++index); - - if ( c == QLatin1Char('{') ) - { - QString val = parsePlaceHolder(pattern, index, max, p, line, column, base.count()); - base << val; - - if ( val.count() ) - { - int nl = val.count(QLatin1Char('\n')); - - line += nl; - - if ( nl ) - column = val.count() - val.lastIndexOf(QLatin1Char('\n')) - 1; - else - column += val.count(); - } - continue; - } else { - if ( c != QLatin1Char('$') ) - { - c = pattern.at(--index); - } - - ++column; - } - } else if ( c == QLatin1Char('\n') ) { - column = 0; - ++line; - } else { - ++column; - } - - tmp += c; - ++index; - } - - if ( tmp.count() ) - base << tmp; - - QHash<int, QList<int> > relocationTable; - QMap<int, PlaceHolder>::iterator it = p.begin(); - - // first : build relocation table (in case several placeholders are on same line - while ( it != p.end() ) - { - if ( it->unresolvedMirrors.count() && it->length ) - { - for ( int i = 0; i + 1 < it->unresolvedMirrors.count(); ++i ) - { - int idx = it->unresolvedMirrors.at(i); - int anchor = it->unresolvedMirrors.at(++i); - - base[idx] = it->defaultValue; - - const Anchor& a = it->mirrors.at(anchor); - relocationTable[a.lineOffset] << a.columnOffset << it->length; - } - - it->unresolvedMirrors.clear(); - } - - ++it; - } - - it = p.begin(); - - // then : apply relocation and store the corrected placeholder data - while ( it != p.end() ) - { - performRelocation(*it, relocationTable, it->length); - - for ( int i = 0; i < it->mirrors.count(); ++i ) - performRelocation(it->mirrors[i], relocationTable, it->length); - - target->m_placeHolders << *it; - ++it; - } - - target->m_base = base.join(QString::null); - - return true; -} - -void QCE::Snippets::Simple::insert(QEditor *e) const -{ - // TODO : move into command and backup for proper undo/redo - e->clearPlaceHolders(); - - QDocument *d = e->document(); - QDocumentCursor c = e->cursor(); - - if ( c.isNull() ) - c = QDocumentCursor(d); - - int line = qMax(c.lineNumber(), 0), column = qMax(c.columnNumber(), 0); - - if ( line != c.lineNumber() || column != c.columnNumber() ) - c = QDocumentCursor(d, line, column); - - QSnippetInsertionCommand *cmd = new QSnippetInsertionCommand(e); - - QDocumentCommand *scmd = 0; - - if ( c.hasSelection() ) - { - QDocumentSelection sel = c.selection(); - - //qDebug("((%i, %i), (%i, %i))", sel.startLine, sel.start, sel.endLine, sel.end); - scmd = new QDocumentEraseCommand(sel.startLine, sel.start, sel.endLine, sel.end, d); - - cmd->addCommand(scmd); - - line = sel.startLine; - column = sel.start; - } - - //qDebug("%s", qPrintable(m_base)); - - if ( scmd ) - { - // trick to get insert command to init properly - scmd->redo(); - } - - cmd->addCommand(new QDocumentInsertCommand(line, column, m_base, d)); - - if ( scmd ) - { - // trick to get insert command to init properly - scmd->undo(); - } - - if ( m_placeHolders.count() ) - { - foreach ( const PlaceHolder& ph, m_placeHolders ) - { - QEditor::PlaceHolder eph; - eph.length = ph.length; - eph.cursor = QDocumentCursor(d, line + ph.lineOffset, ph.columnOffset + (ph.lineOffset ? 0 : column)); - //eph.affector = new StubAffector; - foreach ( const Anchor& a, ph.mirrors ) - eph.mirrors << QDocumentCursor(d, line + a.lineOffset, a.columnOffset + (a.lineOffset ? 0 : column)); - - cmd->addPlaceHolder(eph); - } - } - - d->execute(cmd); -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/qsnippet.h +++ /dev/null @@ -1,62 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QSNIPPET_H_ -#define _QSNIPPET_H_ - -#include "qce-config.h" - -/*! - \file qsnippet.h - \brief Definition of the QSnippet class -*/ - -#include <QStringList> - -class QEditor; -class QSnippetManager; - -#include "qsnippetpatternloader.h" - -class QCE_EXPORT QSnippet -{ - friend class QSnippetManager; - - public: - inline QSnippet(const QSnippetPatternLoader *pl) : m_patternLoader(pl) {} - virtual ~QSnippet() {} - - inline QString name() const { return m_name; } - inline void setName(const QString& n) { m_name = n; } - - inline QStringList contexts() const { return m_contexts; } - inline void setContexts(const QStringList& l) { m_contexts = l; } - - inline QString pattern() const - { return m_pattern; } - - inline void setPattern(const QString& p) - { m_pattern = p; m_patternLoader->reloadSnippet(this, p); } - - virtual void insert(QEditor *e) const = 0; - - protected: - QString m_name; - QString m_pattern; - QStringList m_contexts; - const QSnippetPatternLoader *m_patternLoader; -}; - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/qsnippet_p.h +++ /dev/null @@ -1,123 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QSNIPPET_P_H_ -#define _QSNIPPET_P_H_ - -/*! - \file qsnippet_p.h - \brief Definition of the QSnippetInsertionCommand class -*/ - -#include "qsnippet.h" -#include "qsnippetpatternloader.h" - -#include "qeditor.h" -#include "qdocument.h" -#include "qdocumentcursor.h" -#include "qdocumentcommand.h" - -class QSnippetInsertionCommand : public QDocumentCommandBlock -{ - public: - QSnippetInsertionCommand(QEditor *e); - virtual ~QSnippetInsertionCommand(); - - void addPlaceHolder(const QEditor::PlaceHolder& ph); - - virtual void addCommand(QDocumentCommand *c); - virtual void removeCommand(QDocumentCommand *c); - - virtual void redo(); - virtual void undo(); - - private: - QEditor *m_editor; - QDocumentCursor m_cursor; - QList<QEditor::PlaceHolder> m_placeHolders; -}; - -#define Q_SNIPPET(T) \ - friend class Loader; \ - public: \ - class Loader : public QSnippetPatternLoader \ - { \ - public: \ - virtual QString type() const { return ""#T; } \ - virtual QSnippet* loadSnippet(const QString& pattern) const \ - { \ - T *snip = new T(this); \ - snip->m_pattern = pattern; \ - bool ok = reloadSnippet(snip, pattern); \ - if ( !ok ) { delete snip; snip = 0; } \ - return snip; \ - } \ - virtual bool reloadSnippet(QSnippet* snip, const QString& pattern) const \ - { return T::loadSnippet(snip, pattern); } \ - }; \ - inline T(const QSnippetPatternLoader *pl) : QSnippet(pl) {} \ - private: \ - - -namespace QCE -{ - namespace Snippets - { - class PlainText : public QSnippet - { - Q_SNIPPET(PlainText) - - public: - virtual void insert(QEditor *e) const; - - static bool loadSnippet(QSnippet *snip, const QString& pattern); - - QString m_data; - }; - - class Simple : public QSnippet - { - Q_SNIPPET(Simple) - - public: - struct Anchor - { - Anchor() : lineOffset(0), columnOffset(0) {} - - int lineOffset; - int columnOffset; - }; - - struct PlaceHolder : public Anchor - { - PlaceHolder() : length(-1) {} - - int length; - QString defaultValue; - QList<Anchor> mirrors; - QList<int> unresolvedMirrors; - }; - - virtual void insert(QEditor *e) const; - - static bool loadSnippet(QSnippet *snip, const QString& pattern); - - QString m_base; - QList<PlaceHolder> m_placeHolders; - }; - } -} - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/qsnippetbinding.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qsnippetbinding.h" - -/*! - \file qsnippetbinding.cpp - \brief Implementation of the QSnippetBinding class -*/ - -#include "qsnippet.h" -#include "qsnippetmanager.h" - -#include "qeditor.h" -#include "qdocumentcursor.h" - -#include <QKeyEvent> - -/* -class QSnippetCommand : public QEditorInputBinding::Command -{ - public: - QSnippetCommand(QSnippetManager *m, int idx) - : index(idx), manager(m) - { - - } - - virtual void exec(QEditor *e) - { - if ( index < manager->snippetCount() ) - manager->snippet(index)->insert(e); - } - - private: - int index; - QSnippetManager *manager; -}; -*/ - -class QSnippetCommand : public QEditorInputBinding::Command -{ - public: - QSnippetCommand(QSnippet *s) - : snip(s) - { - - } - - virtual void exec(QEditor *e) - { - snip->insert(e); - } - - private: - QSnippet *snip; -}; - -QSnippetBinding::QSnippetBinding(QSnippetManager *manager) - : m_manager(manager) -{ - //for ( int i = 0; i < 10; ++i ) - // setMapping(QKeySequence(Qt::Key_F1 + i), new SnippetCommand(manager, i)); -} - -QString QSnippetBinding::id() const -{ - return "snippet binding"; -} - -QString QSnippetBinding::name() const -{ - return "snippet binding"; -} - -bool QSnippetBinding::keyPressEvent(QKeyEvent *event, QEditor *editor) -{ - /* - if ( event->modifiers() & Qt::ControlModifier ) - { - for ( int i = 0; i < qMin(10, m->snippetCount()); ++i ) - { - if ( event->key() == (Qt::Key_F1 + i) ) - { - m->snippet(i)->insert(editor); - return true; - } - } - } - */ - - if ( (event->modifiers() & Qt::AltModifier) && (event->key() == Qt::Key_Space || event->text() == " ") ) - { - QDocumentCursor c = editor->cursor(); - - //c.select(QDocumentCursor::SelectWord); - - if ( !c.hasSelection() ) - { - c.movePosition(1, QDocumentCursor::PreviousWord, QDocumentCursor::KeepAnchor); - editor->setCursor(c); - } - - QString s = c.selectedText(); - - for ( int i = 0; i < m_manager->snippetCount(); ++i ) - { - QSnippet *snip = m_manager->snippet(i); - - if ( snip->name() == s ) - { - snip->insert(editor); - return true; - } - } - } - - return QEditorInputBinding::keyPressEvent(event, editor); -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/qsnippetbinding.h +++ /dev/null @@ -1,44 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QSNIPPET_BINDING_H_ -#define _QSNIPPET_BINDING_H_ - -#include "qce-config.h" - -/*! - \file qsnippetbinding.h - \brief Definition of the QSnippetBinding class -*/ - -#include "qeditorinputbinding.h" - -class QSnippetManager; - -class QCE_EXPORT QSnippetBinding : public QEditorInputBinding -{ - public: - QSnippetBinding(QSnippetManager *manager); - - virtual QString id() const; - virtual QString name() const; - - virtual bool keyPressEvent(QKeyEvent *event, QEditor *editor); - - private: - QSnippetManager *m_manager; -}; - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/qsnippetedit.cpp +++ /dev/null @@ -1,268 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qsnippetedit.h" - -/*! - \file qsnippetedit.cpp - \brief Implementation of the QSnippetEdit widget -*/ - -#include "qsnippet.h" -#include "qsnippetmanager.h" - -#include <QMessageBox> - -/*! - \class QSnippetEdit - \brief A widget for snippets management - - -*/ - -QSnippetEdit::QSnippetEdit(QWidget *p) - : QWidget(p), m_editedSnippet(-1), m_manager(0) -{ - setupUi(this); - setEnabled(false); -} - -QSnippetEdit::QSnippetEdit(QSnippetManager *mgr, QWidget *p) - : QWidget(p), m_editedSnippet(-1), m_manager(0) -{ - setupUi(this); - setSnippetManager(mgr); -} - -QSnippetManager* QSnippetEdit::snippetManager() const -{ - return m_manager; -} - -void QSnippetEdit::setSnippetManager(QSnippetManager *mgr) -{ - if ( m_manager ) - { - disconnect( m_manager , SIGNAL( snippetAdded(QSnippet*) ), - this , SLOT ( snippetAdded(QSnippet*) ) ); - - disconnect( m_manager , SIGNAL( snippetRemoved(int) ), - this , SLOT ( snippetRemoved(int) ) ); - - QListWidgetItem *empty = lwSnippets->takeItem(0); - lwSnippets->clear(); - lwSnippets->addItem(empty); - } - - m_manager = mgr; - setEnabled(mgr); - - if ( m_manager ) - { - connect(m_manager , SIGNAL( snippetAdded(QSnippet*) ), - this , SLOT ( snippetAdded(QSnippet*) ) ); - - connect(m_manager , SIGNAL( snippetRemoved(int) ), - this , SLOT ( snippetRemoved(int) ) ); - - for ( int i = 0; i < m_manager->snippetCount(); ++i ) - { - lwSnippets->addItem(m_manager->snippet(i)->name()); - } - } - - lwSnippets->setCurrentItem(0); -} - -void QSnippetEdit::snippetRemoved(int i) -{ - delete lwSnippets->takeItem(i + 1); -} - -void QSnippetEdit::snippetAdded(QSnippet *s) -{ - lwSnippets->addItem(s->name()); -} - -void QSnippetEdit::retranslate() -{ - QSnippetManager *mgr = snippetManager(); - setSnippetManager(0); - - lwSnippets->clear(); - retranslateUi(this); - - setSnippetManager(mgr); -} - -static const QRegExp _cxt_splitter("\\s*,\\s*"); - -bool QSnippetEdit::maybeSave() -{ - static const QRegExp nonTrivial("\\S"); - - QString pattern = eSnippet->text(); - - if ( pattern.endsWith('\n') ) - pattern.chop(1); - - QString name = leSnippetName->text(); - QStringList contexts = leSnippetScope->text().split(_cxt_splitter); - bool nonTrivialPattern = pattern.contains(nonTrivial); - - if ( m_editedSnippet >= 0 ) - { - QSnippet *snip = m_manager->snippet(m_editedSnippet); - - if ( snip->pattern() != pattern ) - { - int ret = QMessageBox::warning(this, - tr("Unsaved changes"), - tr("Do you want to save pattern changes to snippet %1 ?") - .arg(snip->name()), - QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, - QMessageBox::Yes - ); - - if ( ret == QMessageBox::Cancel ) - { - return true; - } else if ( ret == QMessageBox::Yes ) { - snip->setPattern(pattern); - } - } - } else if ( nonTrivialPattern ) { - int ret = QMessageBox::warning(this, - tr("Unsaved changes"), - tr("The current snippet data will be discarded. Do you want to continue?"), - QMessageBox::Yes | QMessageBox::No, - QMessageBox::Yes - ); - - if ( ret == QMessageBox::No ) - { - return true; - } - } - - return false; -} - -void QSnippetEdit::on_lwSnippets_currentRowChanged(int idx) -{ - if ( (idx - 1) == m_editedSnippet ) - return; - - if ( maybeSave() ) - { - lwSnippets->setCurrentRow(m_editedSnippet); - return; - } - - m_editedSnippet = idx - 1; - - if ( idx <= 0 ) - { - eSnippet->setText(QString()); - leSnippetName->setText(QString()); - leSnippetScope->setText(QString()); - } else { - QSnippet *snip = m_manager->snippet(m_editedSnippet); - - eSnippet->setText(snip->pattern()); - leSnippetName->setText(snip->name()); - leSnippetScope->setText(snip->contexts().join(",")); - //eSnippet->highlight(); - } - - eSnippet->setFocus(); -} - -void QSnippetEdit::on_leSnippetName_editingFinished() -{ - if ( m_editedSnippet < 0 ) - return; - - QSnippet *snip = m_manager->snippet(m_editedSnippet); - - snip->setName(leSnippetName->text()); - - lwSnippets->item(m_editedSnippet + 1)->setText(snip->name()); -} - -void QSnippetEdit::on_leSnippetScope_editingFinished() -{ - if ( m_editedSnippet < 0 ) - return; - - QSnippet *snip = m_manager->snippet(m_editedSnippet); - - snip->setContexts(leSnippetScope->text().split(_cxt_splitter)); -} - -void QSnippetEdit::on_tbCreateSnippet_clicked() -{ - QString name = leSnippetName->text(); - QString pattern = eSnippet->text(); - QStringList contexts = leSnippetScope->text().split(_cxt_splitter); - - if ( pattern.endsWith('\n') ) - pattern.chop(1); - - if ( name.isEmpty() || pattern.isEmpty() ) - { - QMessageBox::information(0, tr("Missing data"), tr("Please provide a name and a content to create a new snippet")); - return; - } - - // TODO : allow pattern loader choice... - bool ok = m_manager->loadSnippetFromString(name, pattern, "Simple"); - - if ( !ok ) - { - QMessageBox::warning(0, tr("Error"), tr("Invalid snippet pattern.")); - return; - } - - eSnippet->setText(QString()); - leSnippetScope->clear(); - leSnippetName->clear(); - - - QSnippet *snip = m_manager->snippet(m_manager->snippetCount() - 1); - //snip->setName(name); - snip->setContexts(contexts); - - - lwSnippets->setCurrentRow(0); -} - -void QSnippetEdit::on_tbDeleteSnippet_clicked() -{ - int row = lwSnippets->currentRow() - 1; - - if ( row < 0 ) - { - QMessageBox::warning(0, tr("Error"), tr("Please select a valid snippet to erase")); - return; - } - - m_manager->removeSnippet(row); -} - -void QSnippetEdit::on_bMoreSnippets_clicked() -{ - -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/qsnippetedit.h +++ /dev/null @@ -1,67 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QSNIPPET_EDIT_H_ -#define _QSNIPPET_EDIT_H_ - -#include "qce-config.h" - -/*! - \file qsnippetedit.h - \brief Definition of the QSnippetEdit widget -*/ - -#include <QWidget> -#include "ui_snippetedit.h" - -class QSnippet; -class QSnippetManager; - -class QCE_EXPORT QSnippetEdit : public QWidget, private Ui::SnippetEdit -{ - Q_OBJECT - - public: - QSnippetEdit(QWidget *p = 0); - QSnippetEdit(QSnippetManager *mgr, QWidget *p = 0); - - QSnippetManager* snippetManager() const; - - public slots: - void setSnippetManager(QSnippetManager *mgr); - - bool maybeSave(); - - void retranslate(); - - private slots: - void on_lwSnippets_currentRowChanged(int idx); - - void on_leSnippetName_editingFinished(); - void on_leSnippetScope_editingFinished(); - - void on_tbCreateSnippet_clicked(); - void on_tbDeleteSnippet_clicked(); - void on_bMoreSnippets_clicked(); - - void snippetRemoved(int i); - void snippetAdded(QSnippet *s); - - private: - int m_editedSnippet; - QSnippetManager *m_manager; -}; - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/qsnippetmanager.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -/*! - \file qsnippetmanager.cpp - \brief Implementation of the QSnippetManager class -*/ - -#include "qsnippetmanager.h" - -#include "qsnippet_p.h" - -#include <QDir> -#include <QFile> -#include <QFileInfo> -#include <QTextStream> - -/* -class StubAffector : public QEditor::PlaceHolder::Affector -{ - public: - virtual void affect(const QStringList& base, int ph, const QKeyEvent *e, int mirror, QString& after) const - { - after = after.toUpper(); - } -}; -*/ - -/*! - \class QSnippetManager - \brief A class managing code snippets - - -*/ - -QSnippetManager::QSnippetManager(QObject *p) - : QObject(p) -{ - addPatternLoader(new QCE::Snippets::PlainText::Loader); - addPatternLoader(new QCE::Snippets::Simple::Loader); -} - -QSnippetManager::~QSnippetManager() -{ - qDeleteAll(m_snippets); - qDeleteAll(m_patternLoaders); -} - -int QSnippetManager::snippetCount() const -{ - return m_snippets.count(); -} - -QSnippet* QSnippetManager::snippet(int i) const -{ - return i >= 0 && i < m_snippets.count() ? m_snippets.at(i) : 0; -} - -void QSnippetManager::removeSnippet(int i, bool cleanup) -{ - if ( i < 0 || i >= m_snippets.count() ) - return; - - QSnippet *snip = m_snippets.takeAt(i); - - emit snippetRemoved(i); - emit snippetRemoved(snip); - - if ( cleanup ) - delete snip; -} - -void QSnippetManager::removeSnippet(QSnippet *snip) -{ - int idx = m_snippets.indexOf(snip); - - if ( idx == -1 ) - return; - - m_snippets.removeAt(idx); - - emit snippetRemoved(idx); - emit snippetRemoved(snip); -} - -void QSnippetManager::addSnippet(QSnippet *snip) -{ - if ( !snip ) - return; - - m_snippets << snip; - emit snippetAdded(snip); -} - -bool QSnippetManager::loadSnippetFromString(const QString& name, const QString& s, const QString& type) -{ - QSnippetPatternLoader *pl = patternLoader(type); - - QSnippet *snip = pl->loadSnippet(s); - - if ( snip ) - snip->setName(name); - - addSnippet(snip); - - return snip; -} - -bool QSnippetManager::loadSnippetFromFile(const QString& file, const QString& type) -{ - QFile f(file); - - if ( !f.open(QFile::ReadOnly | QFile::Text) ) - { - qWarning("Unable to load snippet from %s", qPrintable(file)); - return false; - } - - //qDebug("loading from : %s", qPrintable(file)); - - QString s = QString::fromLocal8Bit(f.readAll()); - - static const QRegExp meta("# name:(\\S+) context:(\\S*)[^\n]*\n"); - - int idx = meta.indexIn(s); - bool metaMatch = idx != -1; - - if ( metaMatch ) - { - //qDebug("meta! : %i => %s", idx, qPrintable(meta.cap(0))); - s.remove(idx, meta.matchedLength()); - } - - if ( s.endsWith('\n') ) - s.chop(1); - - bool ok = loadSnippetFromString(metaMatch ? meta.cap(1) : QFileInfo(file).baseName(), s, type); - - if ( ok ) - { - QSnippet *snip = m_snippets.last(); - snip->setContexts(metaMatch ? meta.cap(2).split(",") : QStringList("all")); - } - - return ok; -} - -QSnippetPatternLoader* QSnippetManager::patternLoader(const QString& type) const -{ - foreach ( QSnippetPatternLoader *pl, m_patternLoaders ) - { - if ( pl->type() == type ) - return pl; - } - - return 0; -} - -void QSnippetManager::saveSnippetsToDirectory(const QString& path) -{ - QDir d(path); - - foreach ( QSnippet *snip, m_snippets ) - { - QFile f(d.filePath(snip->name() + ".qcs")); - - if ( !f.open(QFile::WriteOnly | QFile::Text) ) - continue; - - QTextStream s(&f); - s << "# name:" << snip->name() << " context:" << snip->contexts().join(",") << endl; - s << snip->pattern(); - } -} - -void QSnippetManager::loadSnippetsFromDirectory(const QString& path) -{ - QDir d(path); - - QFileInfoList l = d.entryInfoList(QDir::Files | QDir::Readable); - - foreach ( const QFileInfo& info, l ) - { - if ( info.suffix() != "qcs" ) - continue; - - // TODO : pattern selection? - loadSnippetFromFile(info.absoluteFilePath(), "Simple"); - } -} - -void QSnippetManager::addPatternLoader(QSnippetPatternLoader *pl) -{ - m_patternLoaders << pl; -} - -void QSnippetManager::removePatternLoader(QSnippetPatternLoader *pl) -{ - m_patternLoaders.removeAll(pl); -} - -QString QSnippetManager::typeGuess(const QString& pattern) const -{ - Q_UNUSED(pattern) - - return "Simple"; -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/qsnippetmanager.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QSNIPPET_MANAGER_H_ -#define _QSNIPPET_MANAGER_H_ - -#include "qce-config.h" - -/*! - \file qsnippetmanager.h - \brief Definition of the QSnippetManager class -*/ - -#include <QStringList> - -class QSnippet; -class QSnippetPatternLoader; - -class QCE_EXPORT QSnippetManager : public QObject -{ - Q_OBJECT - - public: - QSnippetManager(QObject *p = 0); - virtual ~QSnippetManager(); - - int snippetCount() const; - QSnippet* snippet(int i) const; - void removeSnippet(int i, bool cleanup = true); - - bool loadSnippetFromFile(const QString& file, const QString& type = QString()); - bool loadSnippetFromString(const QString& name, const QString& pattern, const QString& type = QString()); - - void saveSnippetsToDirectory(const QString& path); - void loadSnippetsFromDirectory(const QString& path); - - public slots: - void addSnippet(QSnippet *s); - void removeSnippet(QSnippet *s); - - void addPatternLoader(QSnippetPatternLoader *pl); - void removePatternLoader(QSnippetPatternLoader *pl); - - signals: - void snippetAdded(QSnippet *s); - - void snippetRemoved(int i); - void snippetRemoved(QSnippet *s); - - private: - QString typeGuess(const QString& pattern) const; - QSnippetPatternLoader* patternLoader(const QString& type) const; - - QList<QSnippet*> m_snippets; - QList<QSnippetPatternLoader*> m_patternLoaders; -}; - -#endif // !_SNIPPETS_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/qsnippetpatternloader.h +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QSNIPPET_PATTERN_LOADER_H_ -#define _QSNIPPET_PATTERN_LOADER_H_ - -/*! - \file qsnippetpatternloader.h - \brief Definition of the QSnippetPatternLoader class -*/ - -class QString; - -class QSnippet; - -class QSnippetPatternLoader -{ - public: - virtual ~QSnippetPatternLoader() {} - - virtual QString type() const = 0; - - virtual QSnippet* loadSnippet(const QString& pattern) const = 0; - virtual bool reloadSnippet(QSnippet* snip, const QString& pattern) const = 0; -}; - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/snippets/snippetedit.ui +++ /dev/null @@ -1,190 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>SnippetEdit</class> - <widget class="QWidget" name="SnippetEdit"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>548</width> - <height>486</height> - </rect> - </property> - <property name="windowTitle"> - <string/> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0" rowspan="4" colspan="5"> - <widget class="QListWidget" name="lwSnippets"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximumSize"> - <size> - <width>200</width> - <height>16777215</height> - </size> - </property> - <item> - <property name="text"> - <string>empty</string> - </property> - <property name="icon"> - <iconset> - <normaloff>new.png</normaloff>new.png</iconset> - </property> - </item> - </widget> - </item> - <item row="0" column="5"> - <widget class="QLabel" name="label"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Edit snippet</string> - </property> - </widget> - </item> - <item row="1" column="5" colspan="2"> - <widget class="QEditor" name="eSnippet"> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - </widget> - </item> - <item row="2" column="5"> - <widget class="QLabel" name="label_5"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Name/trigger</string> - </property> - <property name="buddy"> - <cstring>leSnippetName</cstring> - </property> - </widget> - </item> - <item row="2" column="6"> - <widget class="QLineEdit" name="leSnippetName"> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="toolTip"> - <string>Enter the name of the code snippet, which will also be its full-text trigger, if enabled.</string> - </property> - </widget> - </item> - <item row="3" column="5"> - <widget class="QLabel" name="label_6"> - <property name="text"> - <string>Scope(s)</string> - </property> - <property name="buddy"> - <cstring>leSnippetScope</cstring> - </property> - </widget> - </item> - <item row="3" column="6"> - <widget class="QLineEdit" name="leSnippetScope"> - <property name="toolTip"> - <string>Enter a coma-separated list of languages in which the snippet can be used.</string> - </property> - </widget> - </item> - <item row="4" column="5" colspan="2"> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Preferred</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item row="4" column="3"> - <widget class="QPushButton" name="bMoreSnippets"> - <property name="text"> - <string>More</string> - </property> - </widget> - </item> - <item row="4" column="2"> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Preferred</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item row="4" column="1"> - <widget class="QToolButton" name="tbDeleteSnippet"> - <property name="text"> - <string>-</string> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QToolButton" name="tbCreateSnippet"> - <property name="text"> - <string>+</string> - </property> - </widget> - </item> - </layout> - </widget> - <customwidgets> - <customwidget> - <class>QEditor</class> - <extends>QFrame</extends> - <header>qeditor.h</header> - <container>1</container> - </customwidget> - </customwidgets> - <tabstops> - <tabstop>lwSnippets</tabstop> - <tabstop>leSnippetName</tabstop> - <tabstop>leSnippetScope</tabstop> - <tabstop>tbCreateSnippet</tabstop> - <tabstop>tbDeleteSnippet</tabstop> - <tabstop>bMoreSnippets</tabstop> - </tabstops> - <resources/> - <connections/> -</ui>
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/editconfig.ui +++ /dev/null @@ -1,325 +0,0 @@ -<ui version="4.0" > - <class>EditorConfig</class> - <widget class="QWidget" name="EditorConfig" > - <property name="geometry" > - <rect> - <x>0</x> - <y>0</y> - <width>575</width> - <height>586</height> - </rect> - </property> - <layout class="QVBoxLayout" > - <item> - <widget class="QGroupBox" name="gbFont" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Preferred" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title" > - <string>Font</string> - </property> - <layout class="QGridLayout" > - <property name="margin" > - <number>4</number> - </property> - <item row="0" column="0" > - <widget class="QFontComboBox" name="cbFont" > - <property name="font" > - <font> - <family>Monospace</family> - </font> - </property> - <property name="currentFont" > - <font> - <family>DejaVu Sans Mono</family> - </font> - </property> - </widget> - </item> - <item row="0" column="1" > - <widget class="QSpinBox" name="spnFontSize" > - <property name="buttonSymbols" > - <enum>QAbstractSpinBox::UpDownArrows</enum> - </property> - <property name="minimum" > - <number>6</number> - </property> - <property name="maximum" > - <number>50</number> - </property> - <property name="value" > - <number>10</number> - </property> - </widget> - </item> - <item row="1" column="0" colspan="3" > - <widget class="QLabel" name="lblSampleText" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Preferred" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font" > - <font> - <family>Monospace</family> - </font> - </property> - <property name="frameShape" > - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow" > - <enum>QFrame::Sunken</enum> - </property> - <property name="text" > - <string>text which <i>should</i> be a <b>fair</b> test of the font</string> - </property> - <property name="alignment" > - <set>Qt::AlignCenter</set> - </property> - <property name="margin" > - <number>0</number> - </property> - </widget> - </item> - <item row="0" column="2" > - <spacer> - <property name="orientation" > - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0" > - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="gbTabs" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Preferred" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title" > - <string>Tabulators && Whitespaces</string> - </property> - <layout class="QVBoxLayout" > - <property name="margin" > - <number>5</number> - </property> - <item> - <layout class="QHBoxLayout" > - <item> - <widget class="QLabel" name="lblTabWitdh" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Tab width</string> - </property> - <property name="buddy" > - <cstring>spnTabWidth</cstring> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="spnTabWidth" > - <property name="value" > - <number>4</number> - </property> - </widget> - </item> - <item> - <spacer> - <property name="orientation" > - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0" > - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <widget class="QCheckBox" name="chkShowLeadingWhitespace" > - <property name="text" > - <string>Show leading whitespaces</string> - </property> - <property name="checked" > - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="chkShowTabsInText" > - <property name="text" > - <string>Show tabs which are neither leading nor trailing</string> - </property> - <property name="checked" > - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="chkShowTrailingWhitespace" > - <property name="text" > - <string>Show trailing whitespaces</string> - </property> - <property name="checked" > - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="chkReplaceTabs" > - <property name="text" > - <string>Replace tabs by blanks</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QGroupBox" name="gbEncodings" > - <property name="title" > - <string>Load && Save</string> - </property> - <layout class="QGridLayout" name="gridLayout" > - <item row="0" column="0" > - <widget class="QLabel" name="label" > - <property name="text" > - <string>Default encoding</string> - </property> - </widget> - </item> - <item row="0" column="1" > - <widget class="QComboBox" name="cbEncoding" /> - </item> - <item row="1" column="0" > - <widget class="QCheckBox" name="chkDetectLE" > - <property name="text" > - <string>Preserve line endings</string> - </property> - <property name="checked" > - <bool>true</bool> - </property> - </widget> - </item> - <item row="1" column="1" > - <widget class="QComboBox" name="cbLineEndings" > - <property name="enabled" > - <bool>false</bool> - </property> - <item> - <property name="text" > - <string>Local</string> - </property> - </item> - <item> - <property name="text" > - <string>Unix/Linux</string> - </property> - </item> - <item> - <property name="text" > - <string>DOS/Windows</string> - </property> - </item> - <item> - <property name="text" > - <string>Old Mac</string> - </property> - </item> - </widget> - </item> - <item row="2" column="0" > - <widget class="QCheckBox" name="chkAutoRemoveTrailingWhitespace" > - <property name="text" > - <string>Remove trailing spaces</string> - </property> - </widget> - </item> - <item row="2" column="1" > - <widget class="QCheckBox" name="chkPreserveTrailingIndent" > - <property name="enabled" > - <bool>false</bool> - </property> - <property name="text" > - <string>Preserve trailing indent</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <spacer> - <property name="orientation" > - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType" > - <enum>QSizePolicy::MinimumExpanding</enum> - </property> - <property name="sizeHint" stdset="0" > - <size> - <width>492</width> - <height>10</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - <resources/> - <connections> - <connection> - <sender>chkDetectLE</sender> - <signal>toggled(bool)</signal> - <receiver>cbLineEndings</receiver> - <slot>setDisabled(bool)</slot> - <hints> - <hint type="sourcelabel" > - <x>190</x> - <y>445</y> - </hint> - <hint type="destinationlabel" > - <x>279</x> - <y>444</y> - </hint> - </hints> - </connection> - <connection> - <sender>chkAutoRemoveTrailingWhitespace</sender> - <signal>toggled(bool)</signal> - <receiver>chkPreserveTrailingIndent</receiver> - <slot>setEnabled(bool)</slot> - <hints> - <hint type="sourcelabel" > - <x>176</x> - <y>475</y> - </hint> - <hint type="destinationlabel" > - <x>287</x> - <y>479</y> - </hint> - </hints> - </connection> - </connections> -</ui>
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/formatconfig.ui +++ /dev/null @@ -1,114 +0,0 @@ -<ui version="4.0" > - <class>FormatConfig</class> - <widget class="QWidget" name="FormatConfig" > - <property name="geometry" > - <rect> - <x>0</x> - <y>0</y> - <width>539</width> - <height>383</height> - </rect> - </property> - <property name="sizePolicy" > - <sizepolicy vsizetype="MinimumExpanding" hsizetype="MinimumExpanding" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="windowTitle" > - <string>Form</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout" > - <item> - <widget class="QFrame" name="m_frame" > - <property name="frameShape" > - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow" > - <enum>QFrame::Plain</enum> - </property> - <layout class="QGridLayout" name="gridLayout" > - <item row="0" column="0" > - <widget class="QLabel" name="label" > - <property name="text" > - <string>Scheme :</string> - </property> - </widget> - </item> - <item row="0" column="1" > - <widget class="QComboBox" name="m_selector" /> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QTableWidget" name="m_table" > - <property name="sizePolicy" > - <sizepolicy vsizetype="MinimumExpanding" hsizetype="MinimumExpanding" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="selectionMode" > - <enum>QAbstractItemView::NoSelection</enum> - </property> - <property name="selectionBehavior" > - <enum>QAbstractItemView::SelectRows</enum> - </property> - <column> - <property name="text" > - <string>Identifier</string> - </property> - </column> - <column> - <property name="text" > - <string/> - </property> - </column> - <column> - <property name="text" > - <string/> - </property> - </column> - <column> - <property name="text" > - <string/> - </property> - </column> - <column> - <property name="text" > - <string>O</string> - </property> - </column> - <column> - <property name="text" > - <string/> - </property> - </column> - <column> - <property name="text" > - <string>W</string> - </property> - </column> - <column> - <property name="text" > - <string/> - </property> - </column> - <column> - <property name="text" > - <string/> - </property> - </column> - <column> - <property name="text" > - <string/> - </property> - </column> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui>
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/gotoline.ui +++ /dev/null @@ -1,77 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>GotoLine</class> - <widget class="QWidget" name="GotoLine"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>513</width> - <height>45</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QToolButton" name="bClose"> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label"> - <property name="text"> - <string>&Go to line :</string> - </property> - <property name="buddy"> - <cstring>spLine</cstring> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="spLine"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="prefix"> - <string> </string> - </property> - <property name="minimum"> - <number>1</number> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="bGo"> - <property name="text"> - <string>G&o</string> - </property> - </widget> - </item> - <item> - <widget class="QSlider" name="slLine"> - <property name="minimum"> - <number>1</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - </layout> - </widget> - <tabstops> - <tabstop>spLine</tabstop> - <tabstop>bGo</tabstop> - <tabstop>bClose</tabstop> - <tabstop>slLine</tabstop> - </tabstops> - <resources/> - <connections/> -</ui>
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/gotolinedialog.ui +++ /dev/null @@ -1,147 +0,0 @@ -<ui version="4.0" > - <class>GotoDialog</class> - <widget class="QDialog" name="GotoDialog" > - <property name="geometry" > - <rect> - <x>0</x> - <y>0</y> - <width>210</width> - <height>103</height> - </rect> - </property> - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="windowTitle" > - <string>Goto line ...</string> - </property> - <layout class="QGridLayout" > - <item row="0" column="0" colspan="2" > - <widget class="QLabel" name="label" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Fixed" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Select the line you want to go to :</string> - </property> - <property name="buddy" > - <cstring>spinLine</cstring> - </property> - </widget> - </item> - <item row="1" column="0" > - <widget class="QSlider" name="slideLine" > - <property name="minimum" > - <number>1</number> - </property> - <property name="orientation" > - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="1" column="1" > - <widget class="QSpinBox" name="spinLine" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="prefix" > - <string>line </string> - </property> - <property name="minimum" > - <number>1</number> - </property> - </widget> - </item> - <item row="2" column="0" colspan="2" > - <widget class="QDialogButtonBox" name="buttonBox" > - <property name="standardButtons" > - <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - </layout> - </widget> - <tabstops> - <tabstop>spinLine</tabstop> - <tabstop>slideLine</tabstop> - <tabstop>buttonBox</tabstop> - </tabstops> - <resources> - <include location="../../../../src/lib/images/Edyuk.qrc" /> - </resources> - <connections> - <connection> - <sender>buttonBox</sender> - <signal>accepted()</signal> - <receiver>GotoDialog</receiver> - <slot>accept()</slot> - <hints> - <hint type="sourcelabel" > - <x>67</x> - <y>165</y> - </hint> - <hint type="destinationlabel" > - <x>205</x> - <y>64</y> - </hint> - </hints> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>rejected()</signal> - <receiver>GotoDialog</receiver> - <slot>reject()</slot> - <hints> - <hint type="sourcelabel" > - <x>44</x> - <y>164</y> - </hint> - <hint type="destinationlabel" > - <x>30</x> - <y>67</y> - </hint> - </hints> - </connection> - <connection> - <sender>slideLine</sender> - <signal>sliderMoved(int)</signal> - <receiver>spinLine</receiver> - <slot>setValue(int)</slot> - <hints> - <hint type="sourcelabel" > - <x>35</x> - <y>99</y> - </hint> - <hint type="destinationlabel" > - <x>299</x> - <y>100</y> - </hint> - </hints> - </connection> - <connection> - <sender>spinLine</sender> - <signal>valueChanged(int)</signal> - <receiver>slideLine</receiver> - <slot>setValue(int)</slot> - <hints> - <hint type="sourcelabel" > - <x>299</x> - <y>112</y> - </hint> - <hint type="destinationlabel" > - <x>82</x> - <y>99</y> - </hint> - </hints> - </connection> - </connections> -</ui>
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qcalltip.cpp +++ /dev/null @@ -1,274 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qcalltip.h" - -/*! - \file qcalltip.cpp - \brief Implementation of the QCallTip class -*/ - -#include <QPainter> -#include <QMouseEvent> - -/*! - \class QCallTip - \brief A widget dedicated to calltips display -*/ - -QCallTip::QCallTip(QWidget *p) - : QWidget(p), m_index(0) -{ - setCursor(Qt::ArrowCursor); - setFocusPolicy(Qt::StrongFocus); - setAttribute(Qt::WA_DeleteOnClose); -} - -QCallTip::~QCallTip() -{ - -} - -QStringList QCallTip::tips() const -{ - return m_tips; -} - -void QCallTip::setTips(const QStringList& l) -{ - m_tips = l; - m_index = 0; -} - -static int arrowWidth = 14; - -void QCallTip::paintEvent(QPaintEvent *e) -{ - Q_UNUSED(e) - - QPainter p(this); - QFontMetrics fm = fontMetrics(); - - m_up = m_down = QRect(); - - bool bPrev = m_index, bNext = (m_index + 1) < m_tips.count(); - int offset = 3, whalf = arrowWidth / 2 - 3; //, hhalf = height() / 2; - - QRect bg(0, 0, fm.width(m_tips.at(m_index)) + 6, fm.height()); - - if ( bPrev ) - { - bg.setWidth(bg.width() + arrowWidth); - } - - if ( bNext ) - { - bg.setWidth(bg.width() + arrowWidth); - } - - p.fillRect(bg, QColor(0xca, 0xff, 0x70)); - //p.drawRect(bg); - - p.save(); - - p.setPen(QColor(0x00, 0x00, 0x00)); - p.drawLine(0, height() - 1, bg.width() - 1, height() - 1); - p.drawLine(bg.width() - 1, height() - 1, bg.width() - 1, 0); - - p.setPen(QColor(0xc0, 0xc0, 0xc0)); - p.drawLine(0, height() - 1, 0, 0); - p.drawLine(0, 0, bg.width() - 1, 0); - - p.restore(); - - int top = height() / 3, bottom = height() - height() / 3; - - if ( bPrev ) - { - int x = offset + arrowWidth / 2 - 1; - - QPoint pts[] = { - QPoint(x - whalf, bottom), - QPoint(x + whalf, bottom), - QPoint(x, top) - }; - - p.drawPolygon(pts, sizeof(pts) / sizeof(QPoint), Qt::WindingFill); - - m_up = QRect(offset, 0, offset + arrowWidth, height()); - offset += arrowWidth; - } - - if ( bNext ) - { - int x = offset + arrowWidth / 2 - 1; - - QPoint pts[] = { - QPoint(x - whalf, top), - QPoint(x + whalf, top), - QPoint(x, bottom) - }; - - p.drawPolygon(pts, sizeof(pts) / sizeof(QPoint), Qt::WindingFill); - - m_down = QRect(offset, 0, offset + arrowWidth, height()); - offset += arrowWidth; - } - - p.drawText(offset, fm.ascent() + 2, m_tips.at(m_index)); - - setFixedSize(bg.size() + QSize(1, 1)); -} - -void QCallTip::keyPressEvent(QKeyEvent *e) -{ - if ( e->modifiers() & (Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier) ) - { - close(); - - if ( parentWidget() ) - parentWidget()->setFocus(); - - e->ignore(); - return; - } - - QString prefix, text = e->text(); - - switch ( e->key() ) - { - case Qt::Key_Escape : - close(); - - if ( parentWidget() ) - parentWidget()->setFocus(); - - e->accept(); - break; - - case Qt::Key_Enter : - case Qt::Key_Return : - case Qt::Key_Tab : - //hide(); - - close(); - - if ( parentWidget() ) - parentWidget()->setFocus(); - - e->ignore(); - - break; - - case Qt::Key_Up : - - if ( m_index ) - --m_index; - - e->accept(); - update(); - break; - - case Qt::Key_Down : - - if ( (m_index + 1) < m_tips.count() ) - ++m_index; - - e->accept(); - update(); - break; - - case Qt::Key_Backspace : - - close(); - - if ( parentWidget() ) - parentWidget()->setFocus(); - - e->ignore(); - break; - - case Qt::Key_Shift : - case Qt::Key_Alt : - case Qt::Key_Control : - e->ignore(); - break; - - default: - - if ( text.count() && text.at(0).isPrint() ) - { - - } else { - close(); - - if ( parentWidget() ) - parentWidget()->setFocus(); - - } - - e->ignore(); - - break; - } -} - -void QCallTip::focusInEvent(QFocusEvent *e) -{ - QWidget::focusInEvent(e); -} - -void QCallTip::focusOutEvent(QFocusEvent *e) -{ - QWidget::focusOutEvent(e); - - close(); - - if ( parentWidget() ) - parentWidget()->setFocus(); - -} - -void QCallTip::mousePressEvent(QMouseEvent *e) -{ - if ( m_index && m_up.isValid() && m_up.contains(e->pos()) ) - { - --m_index; - } else if ( - ((m_index + 1) < m_tips.count()) - && - m_down.isValid() - && - m_down.contains(e->pos()) - ) - { - ++m_index; - } else { - close(); - - if ( parentWidget() ) - parentWidget()->setFocus(); - - } - - e->accept(); - - update(); -} - -void QCallTip::mouseReleaseEvent(QMouseEvent *e) -{ - e->accept(); -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qcalltip.h +++ /dev/null @@ -1,51 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QCALL_TIP_H_ -#define _QCALL_TIP_H_ - -#include "qce-config.h" - -/*! - \file qcalltip.h - \brief Definition of the QCallTip class -*/ - -#include <QWidget> - -class QCE_EXPORT QCallTip : public QWidget -{ - public: - QCallTip(QWidget *p = 0); - virtual ~QCallTip(); - - QStringList tips() const; - void setTips(const QStringList& l); - - protected: - virtual void paintEvent(QPaintEvent *e); - virtual void keyPressEvent(QKeyEvent *e); - virtual void focusInEvent(QFocusEvent *e); - virtual void focusOutEvent(QFocusEvent *e); - virtual void mousePressEvent(QMouseEvent *e); - virtual void mouseReleaseEvent(QMouseEvent *e); - - private: - int m_index; - QStringList m_tips; - QRect m_up, m_down; -}; - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qeditconfig.cpp +++ /dev/null @@ -1,614 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qeditconfig.h" - -/*! - \file qeditconfig.cpp - \brief Implementation of the QEditConfig class. - - \see QEditConfig -*/ - -#include "qeditor.h" -#include "qdocument.h" -#include "qdocument_p.h" - -#include <QDebug> -#include <QTextCodec> - -/*! - \ingroup dialogs - @{ - - \class QEditConfig - \brief A minimalistic, easy to embed, settings widget. - -*/ - -QEditConfig::QEditConfig(QWidget *w) - : QWidget(w), m_direct(false) -{ - setupUi(this); - - QStringList l; - QList<QByteArray> ens = QTextCodec::availableCodecs(); - - foreach ( QByteArray b, ens ) - l << QString::fromLatin1(b); - - cbEncoding->clear(); - cbEncoding->addItems(l); - - restore(); -} - -/*! - \brief run-time translation entry point -*/ -void QEditConfig::retranslate() -{ - retranslateUi(this); -} - -/*! - \brief -*/ -bool QEditConfig::hasUnsavedChanges() const -{ - if ( m_direct ) - return false; - - QFont font = cbFont->currentFont(); - //font.setPointSize(spnFontSize->value()); - - const QFont& docFont = QDocument::font(); - - if ( font.family() != docFont.family() || spnFontSize->value() != docFont.pointSize() ) - { - //qDebug("font!"); - return true; - } - - if ( spnTabWidth->value() != QDocument::tabStop() ) - { - //qDebug("tab stop!"); - return true; - } - - QDocument::LineEnding le = QDocument::defaultLineEnding(); - - if ( chkDetectLE->isChecked() ) - { - if ( le != QDocument::Conservative ) - { - //qDebug("conservative line endings! : %i", le); - return true; - } - } else { - if ( le != QDocument::LineEnding(cbLineEndings->currentIndex() + 1) ) - { - //qDebug("line endings!"); - return true; - } - } - - QDocument::WhiteSpaceMode ws = QDocument::ShowNone; - - if ( chkShowLeadingWhitespace->isChecked() ) - ws |= QDocument::ShowLeading; - - if ( chkShowTrailingWhitespace->isChecked() ) - ws |= QDocument::ShowTrailing; - - if ( chkShowTabsInText->isChecked() ) - ws |= QDocument::ShowTabs; - - if ( ws != QDocument::showSpaces() ) - { - //qDebug("spaces!"); - return true; - } - - QTextCodec *c = QEditor::defaultCodec(); - - if ( cbEncoding->currentText() == "System" ) - { - if ( c && c->name() != "System" ) - { - //qDebug("system codec!"); - return true; - } - } else { - if ( !c || c->name() != cbEncoding->currentText().toLatin1() ) - { - //qDebug("codec!"); - return true; - } - } - - int flags = QEditor::defaultFlags(); - - if ( chkReplaceTabs->isChecked() ) - flags |= QEditor::ReplaceTabs; - else - flags &= ~QEditor::ReplaceTabs; - - if ( chkAutoRemoveTrailingWhitespace->isChecked() ) - flags |= QEditor::RemoveTrailing; - else - flags &= ~QEditor::RemoveTrailing; - - if ( chkPreserveTrailingIndent->isChecked() ) - flags |= QEditor::PreserveTrailingIndent; - else - flags &= ~QEditor::PreserveTrailingIndent; - - if ( flags != QEditor::defaultFlags() ) - { - //qDebug("flags!"); - return true; - } - - return false; -} - -/*! - \return whether user changes are immediately applied -*/ -bool QEditConfig::applyImmediately() const -{ - return m_direct; -} - -/*! - \brief Set whether user changes are immediately applied -*/ -void QEditConfig::setApplyImmediately(bool y) -{ - m_direct = y; -} - -/*! - \brief Apply changes -*/ -void QEditConfig::apply() -{ - QFont font = cbFont->currentFont(); - font.setPointSize(spnFontSize->value()); - - QDocument::setFont(font); - QDocument::setTabStop(spnTabWidth->value()); - - if ( chkDetectLE->isChecked() ) - QDocument::setDefaultLineEnding(QDocument::Conservative); - else - QDocument::setDefaultLineEnding(QDocument::LineEnding(cbLineEndings->currentIndex() + 1)); - - QDocument::WhiteSpaceMode ws = QDocument::ShowNone; - - if ( chkShowLeadingWhitespace->isChecked() ) - ws |= QDocument::ShowLeading; - - if ( chkShowTrailingWhitespace->isChecked() ) - ws |= QDocument::ShowTrailing; - - if ( chkShowTabsInText->isChecked() ) - ws |= QDocument::ShowTabs; - - QDocument::setShowSpaces(ws); - - if ( cbEncoding->currentText() == "System" ) - QEditor::setDefaultCodec(0, QEditor::UpdateAll); - else - QEditor::setDefaultCodec(cbEncoding->currentText().toLatin1(), QEditor::UpdateAll); - - int flags = QEditor::defaultFlags(); - - if ( chkReplaceTabs->isChecked() ) - flags |= QEditor::ReplaceTabs; - else - flags &= ~QEditor::ReplaceTabs; - - if ( chkAutoRemoveTrailingWhitespace->isChecked() ) - flags |= QEditor::RemoveTrailing; - else - flags &= ~QEditor::RemoveTrailing; - - if ( chkPreserveTrailingIndent->isChecked() ) - flags |= QEditor::PreserveTrailingIndent; - else - flags &= ~QEditor::PreserveTrailingIndent; - - QEditor::setDefaultFlags(flags); -} - -/*! - \brief Reset the subcontrols to reflect the current settings - - The name can be a bit misleading at first, it has been chosen - because it directly maps to the effect a "cancel" button would - have on the widget -*/ -void QEditConfig::cancel() -{ - // reload the current config - - bool oldDir = m_direct; - - m_direct = false; - - cbFont->setFont(QDocument::font()); - spnFontSize->setValue(QDocument::font().pointSize()); - - spnTabWidth->setValue(QDocument::tabStop()); - - QDocument::WhiteSpaceMode ws = QDocument::showSpaces(); - chkShowTabsInText->setChecked(ws & QDocument::ShowTabs); - chkShowLeadingWhitespace->setChecked(ws & QDocument::ShowLeading); - chkShowTrailingWhitespace->setChecked(ws & QDocument::ShowTrailing); - - QDocument::LineEnding le = QDocument::defaultLineEnding(); - chkDetectLE->setChecked(le == QDocument::Conservative); - cbLineEndings->setCurrentIndex(le ? le - 1 : 0); - - int flags = QEditor::defaultFlags(); - chkReplaceTabs->setChecked(flags & QEditor::ReplaceTabs); - chkAutoRemoveTrailingWhitespace->setChecked(flags & QEditor::RemoveTrailing); - chkPreserveTrailingIndent->setChecked(flags & QEditor::PreserveTrailingIndent); - - QTextCodec *c = QEditor::defaultCodec(); - cbEncoding->setCurrentIndex(cbEncoding->findText(c ? c->name() : QTextCodec::codecForLocale()->name())); - - m_direct = oldDir; -} - -/*! - \brief Restore default values for all subcontrols - - \note The widgets are changed but these changes are NOT applied. -*/ -void QEditConfig::restore() -{ - // restore default configuration - - bool oldDir = m_direct; - - m_direct = false; - - QFont font("Monospace", 10); - font.setStyleHint(QFont::Courier); - - cbFont->setFont(font); - spnFontSize->setValue(10); - - spnTabWidth->setValue(4); - - chkShowTabsInText->setChecked(true); - chkShowLeadingWhitespace->setChecked(true); - chkShowTrailingWhitespace->setChecked(true); - - chkDetectLE->setChecked(true); - cbLineEndings->setCurrentIndex(0); - - chkReplaceTabs->setChecked(false); - chkAutoRemoveTrailingWhitespace->setChecked(false); - chkPreserveTrailingIndent->setChecked(true); - - cbEncoding->setCurrentIndex(cbEncoding->findText(QTextCodec::codecForLocale()->name())); - - m_direct = oldDir; -} - -/*! - \brief Fills a settings map from the state of the subcontrols -*/ -QMap<QString, QVariant> QEditConfig::dumpKeys() const -{ - QMap<QString, QVariant> m; - - QFont font = cbFont->currentFont(); - font.setPointSize(spnFontSize->value()); - - m.insert("font", font); - m.insert("tab_width", spnTabWidth->value()); - - m.insert("show_leading_whitespace", chkShowLeadingWhitespace->isChecked()); - m.insert("show_trailing_whitespace", chkShowTrailingWhitespace->isChecked()); - m.insert("show_tabs_in_text", chkShowTabsInText->isChecked()); - - m.insert("replace_tabs", chkReplaceTabs->isChecked()); - m.insert("remove_trailing", chkAutoRemoveTrailingWhitespace->isChecked()); - m.insert("preserve_trailing_indent", chkPreserveTrailingIndent->isChecked()); - - m.insert("encoding", cbEncoding->currentText()); - - if ( chkDetectLE->isChecked() ) - m.insert("line_endings", (int)QDocument::Conservative); - else - m.insert("line_endings", cbLineEndings->currentIndex() + 1); - - return m; -} - -/*! - \brief Fills the widget subcontrols from a settings map - - \param keys a key/value map that can be obtained from QSettings -*/ -void QEditConfig::loadKeys(const QMap<QString, QVariant>& keys) -{ - //qDebug("loading %i keys", keys.count()); - - // load - QMap<QString, QVariant>::const_iterator it = keys.constBegin(); - - while ( it != keys.constEnd() ) - { - if ( it.key() == "font" ) - { - QFont f = qvariant_cast<QFont>(*it); - - cbFont->setCurrentFont(f); - spnFontSize->setValue(f.pointSize()); - - if ( m_direct ) - QDocument::setFont(f); - - lblSampleText->setFont(f); - - } else if ( it.key() == "tab_width" ) { - spnTabWidth->setValue(it->toInt()); - - if ( m_direct ) - on_spnTabWidth_valueChanged(it->toInt()); - } else if ( it.key() == "replace_tabs" ) { - chkReplaceTabs->setChecked(it->toBool()); - if ( m_direct ) - on_chkReplaceTabs_toggled(it->toBool()); - } else if ( it.key() == "remove_trailing" ) { - chkAutoRemoveTrailingWhitespace->setChecked(it->toBool()); - if ( m_direct ) - on_chkAutoRemoveTrailingWhitespace_toggled(it->toBool()); - } else if ( it.key() == "preserve_trailing_indent" ) { - chkPreserveTrailingIndent->setChecked(it->toBool()); - if ( m_direct ) - on_chkPreserveTrailingIndent_toggled(it->toBool()); - } else if ( it.key() == "show_tabs_in_text" ) { - chkShowTabsInText->setChecked(it->toBool()); - if ( m_direct ) - on_chkShowTabsInText_toggled(it->toBool()); - } else if ( it.key() == "show_leading_whitespace" ) { - chkShowLeadingWhitespace->setChecked(it->toBool()); - if ( m_direct ) - on_chkShowLeadingWhitespace_toggled(it->toBool()); - } else if ( it.key() == "show_trailing_whitespace" ) { - chkShowTrailingWhitespace->setChecked(it->toBool()); - if ( m_direct ) - on_chkShowTrailingWhitespace_toggled(it->toBool()); - } else if ( it.key() == "encoding" ) { - cbEncoding->setCurrentIndex(cbEncoding->findText(it->toString())); - if ( m_direct ) - on_cbEncoding_currentIndexChanged(it->toString()); - } else if ( it.key() == "line_endings" ) { - int le = it->toInt(); - - if ( le ) - { - chkDetectLE->setChecked(false); - cbLineEndings->setCurrentIndex(le - 1); - } else { - cbLineEndings->setCurrentIndex(0); - chkDetectLE->setChecked(true); - } - } else { - /* - qWarning("QEditConfig::loadKeys() fed with unsupported settings key : \"%s\" ", - qPrintable(it.key()) - ); - */ - } - - ++it; - } -} - -/*! - \brief Slot used to apply font size settings -*/ -void QEditConfig::on_spnFontSize_valueChanged(int size) -{ - QFont font = cbFont->currentFont(); - font.setPointSize(size); - - lblSampleText->setFont(font); - - if ( m_direct ) - { - QDocument::setFont(font); - emit keyChanged("font", font); - } -} - -/*! - \brief Slot used to apply font family settings -*/ -void QEditConfig::on_cbFont_currentFontChanged(QFont font) -{ - font.setPointSize(spnFontSize->value()); - lblSampleText->setFont(font); - - if ( m_direct ) - { - QDocument::setFont(font); - emit keyChanged("font", font); - } -} - -/*! - \brief Slot used to apply tab width settings -*/ -void QEditConfig::on_spnTabWidth_valueChanged(int n) -{ - if ( m_direct ) - { - QDocument::setTabStop(n); - emit keyChanged("tab_width", n); - } -} - -/*! - \brief Slot used to apply tabs replacement settings -*/ -void QEditConfig::on_chkReplaceTabs_toggled(bool y) -{ - if ( m_direct ) - { - // FIXME - foreach ( QEditor *e, QEditor::m_editors ) - { - e->setFlag(QEditor::ReplaceTabs, y); - } - emit keyChanged("replace_tabs", y); - } -} - -/*! - \brief Slot used to apply tabs display settings -*/ -void QEditConfig::on_chkShowTabsInText_toggled(bool y) -{ - if ( m_direct ) - { - if ( y ) - QDocument::setShowSpaces(QDocument::showSpaces() | QDocument::ShowTabs); - else - QDocument::setShowSpaces(QDocument::showSpaces() & ~QDocument::ShowTabs); - - emit keyChanged("show_tabs_in_text", y); - } -} - -/*! - \brief Slot used to apply trailing whitespace display settings -*/ -void QEditConfig::on_chkShowLeadingWhitespace_toggled(bool y) -{ - if ( m_direct ) - { - if ( y ) - QDocument::setShowSpaces(QDocument::showSpaces() | QDocument::ShowLeading); - else - QDocument::setShowSpaces(QDocument::showSpaces() & ~QDocument::ShowLeading); - - emit keyChanged("show_leading_whitespace", y); - } -} - -/*! - \brief Slot used to apply leading whitespace display settings -*/ -void QEditConfig::on_chkShowTrailingWhitespace_toggled(bool y) -{ - if ( m_direct ) - { - if ( y ) - QDocument::setShowSpaces(QDocument::showSpaces() | QDocument::ShowTrailing); - else - QDocument::setShowSpaces(QDocument::showSpaces() & ~QDocument::ShowTrailing); - - emit keyChanged("show_trailing_whitespace", y); - } -} - -/*! - \brief Slot used to apply encodings settings -*/ -void QEditConfig::on_cbEncoding_currentIndexChanged(const QString& name) -{ - if ( m_direct ) - { - QEditor::setDefaultCodec(name.toLatin1(), QEditor::UpdateAll); - emit keyChanged("encoding", name); - } -} - -/*! - \brief Slot used to apply line endings settings -*/ -void QEditConfig::on_cbLineEndings_currentIndexChanged(int idx) -{ - QDocument::LineEnding le = QDocument::LineEnding(idx + 1); - - if ( m_direct ) - { - QDocument::setDefaultLineEnding(le); - emit keyChanged("line_endings", (int)le); - } -} - -/*! - \brief Slot used to apply line endings auto detectionl settings -*/ -void QEditConfig::on_chkDetectLE_toggled(bool y) -{ - QDocument::LineEnding le = QDocument::Conservative; - - if ( !y ) - { - le = QDocument::LineEnding(cbLineEndings->currentIndex() + 1); - } - - if ( m_direct ) - { - QDocument::setDefaultLineEnding(le); - emit keyChanged("line_endings", (int)le); - } -} - -/*! - \brief Slot used to apply trailing space removal settings -*/ -void QEditConfig::on_chkAutoRemoveTrailingWhitespace_toggled(bool y) -{ - if ( m_direct ) - { - // FIXME - foreach ( QEditor *e, QEditor::m_editors ) - { - e->setFlag(QEditor::RemoveTrailing, y); - } - emit keyChanged("remove_trailing", y); - } -} - -/*! - \brief Slot used to indent preservation settings -*/ -void QEditConfig::on_chkPreserveTrailingIndent_toggled(bool y) -{ - if ( m_direct ) - { - // FIXME - foreach ( QEditor *e, QEditor::m_editors ) - { - e->setFlag(QEditor::PreserveTrailingIndent, y); - } - emit keyChanged("preserve_trailing_indent", y); - } -} - -/*! @} */ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qeditconfig.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QEDIT_CONFIG_H_ -#define _QEDIT_CONFIG_H_ - -#include "qce-config.h" - -/*! - \file qeditconfig.h - \brief Definition of the QEditConfig widget - - \see QEditConfig -*/ - -#include "ui_editconfig.h" - -#include <QWidget> - -class QCE_EXPORT QEditConfig : public QWidget, private Ui::EditorConfig -{ - Q_OBJECT - - public: - QEditConfig(QWidget *w = 0); - - bool hasUnsavedChanges() const; - - bool applyImmediately() const; - - QMap<QString, QVariant> dumpKeys() const; - - public slots: - void retranslate(); - - void apply(); - void cancel(); - void restore(); - - void loadKeys(const QMap<QString, QVariant>& keys); - - void setApplyImmediately(bool y); - - signals: - void keyChanged(const QString& key, const QVariant& value); - - private slots: - void on_spnFontSize_valueChanged(int size); - void on_cbFont_currentFontChanged(QFont font); - - void on_spnTabWidth_valueChanged(int n); - - void on_chkReplaceTabs_toggled(bool y); - - void on_chkShowTabsInText_toggled(bool y); - void on_chkShowLeadingWhitespace_toggled(bool y); - void on_chkShowTrailingWhitespace_toggled(bool y); - - void on_cbEncoding_currentIndexChanged(const QString& name); - void on_cbLineEndings_currentIndexChanged(int idx); - void on_chkDetectLE_toggled(bool y); - void on_chkAutoRemoveTrailingWhitespace_toggled(bool y); - void on_chkPreserveTrailingIndent_toggled(bool y); - - private: - bool m_direct; -}; - -#endif // _QEDIT_CONFIG_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qfoldpanel.cpp +++ /dev/null @@ -1,306 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qfoldpanel.h" - -/*! - \file qfoldpanel.cpp - \brief Implementation of the QFoldPanel class. - - \see QFoldPanel -*/ - -#include "qeditor.h" - -#include "qdocument.h" -#include "qdocumentline.h" - -#include "qlanguagedefinition.h" - -#include <QStack> -#include <QBitmap> -#include <QPainter> -#include <QScrollBar> -#include <QMouseEvent> - -/*! - \ingroup widgets - @{ -*/ - -/*! - \class QFoldPanel - \brief A panel that draw fold indicators and provide fold/unfold actions to the user -*/ - -QCE_AUTO_REGISTER(QFoldPanel) - -/*! - \brief Constructor -*/ -QFoldPanel::QFoldPanel(QWidget *p) - : QPanel(p) -{ - setFixedWidth(12); -} - -/*! - \brief Empty destructor -*/ -QFoldPanel::~QFoldPanel() -{ - -} - -/*! - -*/ -QString QFoldPanel::type() const -{ - return "Fold indicators"; -} - -/*! - -*/ -void QFoldPanel::mousePressEvent(QMouseEvent *e) -{ - if ( !editor() || !editor()->languageDefinition() || (e->button() != Qt::LeftButton) ) - { - QPanel::mousePressEvent(e); - return; - } - - bool act = false; - QDocument *doc = editor()->document(); - QLanguageDefinition *def = editor()->languageDefinition(); - - for ( int i = 0; i < m_rects.count(); ++i ) - { - if ( !m_rects.at(i).contains(e->pos()) ) - continue; - - int ln = m_lines.at(i); - - QDocumentLine b = doc->line(ln); - - if ( b.hasFlag(QDocumentLine::CollapsedBlockStart) ) - def->expand(doc, ln); - else if ( def->blockFlags(doc, ln, 0) & QLanguageDefinition::Collapsible ) - def->collapse(doc, ln); - - act = true; - } - - if ( act ) - editor()->setFocus(); - else - QPanel::mousePressEvent(e); - -} - -/*! - -*/ -bool QFoldPanel::paint(QPainter *p, QEditor *e) -{ - QDocument *doc = editor()->document(); - QLanguageDefinition *def = e->languageDefinition(); - - if ( !def || !doc ) - { - return true; - } - - m_rects.clear(); - m_lines.clear(); - - bool bVisible = false; //, - // inCursorBlock = false; - - QDocumentLine block; - const QFontMetrics fm(doc->font()); - - int n, - pos, - depth = 0, - max = doc->lines(), - ls = fm.lineSpacing(), - pageBottom = e->viewport()->height(), - contentsY = e->verticalOffset(); - - pos = - contentsY; - - //qDebug("beg pos : %i", pos); - - for ( n = 0; n < max; ++n ) - { - if ( pos > pageBottom ) - break; - - block = doc->line(n); - - if ( block.isHidden() ) - { - continue; - } - - int len = ls * block.lineSpan(); - int flags = def->blockFlags(doc, n, depth); - short open = QCE_FOLD_OPEN_COUNT(flags); - short close = QCE_FOLD_CLOSE_COUNT(flags); - - bVisible = ((pos + len) >= 0); - - int oldDepth = depth; - - depth -= close; - - if ( depth < 0 ) - depth = 0; - - depth += open; - - if ( open ) - { - if ( flags & QLanguageDefinition::Collapsed ) - { - int bound = (ls - 8) / 2; - int mid = pos + len - ls / 6; - - // outermost block folded : none of the opening is actually opened - depth -= open; - - if ( bVisible ) - { - // draw icon - - if ( bound > 0 && oldDepth > 0 ) - { - p->drawLine(7, pos, 7, pos + bound); - } - - if ( close ) - { - p->drawLine(7, pos + 8 + bound, 7, mid); - p->drawLine(7, mid, 12, mid); - } - - m_lines << n; - m_rects << drawIcon(p, e, 3, pos + bound, true); - } - - int sub = open; - - //qDebug("%i : +%i", n, open); - - while ( sub > 0 && ((n + 1) < max) ) - { - ++n; - block = doc->line(n); - - if ( !block.isHidden() ) - { - if ( bVisible ) - p->drawLine(7, pos + 8 + bound, 7, pos + len); - - --n; - break; - } - - int sflags = def->blockFlags(doc, n, depth + 1); - short sopen = QCE_FOLD_OPEN_COUNT(sflags); - short sclose = QCE_FOLD_CLOSE_COUNT(sflags); - - sub -= sclose; - - if ( sub <= 0 ) - break; - - sub += sopen; - } - - depth += sub; - - if ( bVisible && depth > 0 ) - { - if ( close ) - p->drawLine(7, mid, 7, pos + len); - else - p->drawLine(7, pos + 8 + bound, 7, pos + len); - } - } else { - if ( bVisible ) - { - int bound = (ls - 8) / 2; - - if ( oldDepth > 0 && bound > 0 ) - p->drawLine(7, pos, 7, pos + bound); - - m_lines << n; - m_rects << drawIcon(p, e, 3, pos + bound, false); - - int mid = pos + len - ls / 6; - - if ( close ) - p->drawLine(7, mid, 12, mid); - - if ( bound > 0 ) - p->drawLine(7, pos + 8 + bound, 7, pos + len); - } - } - } else if ( (oldDepth > 0) && bVisible ) { - if ( close ) - { - int mid = pos + len - ls / 6; - - p->drawLine(7, pos, 7, mid); - p->drawLine(7, mid, 12, mid); - - if ( depth > 0 ) - p->drawLine(7, pos, 7, pos + len); - } else { - p->drawLine(7, pos, 7, pos + len); - } - } - - pos += len; - } - - return true; -} - -QRect QFoldPanel::drawIcon( QPainter *p, QEditor *, - int x, int y, bool toExpand) -{ - QRect symbolRect(x, y, 8, 8); - - //p->save(); - //p->setRenderHint(QPainter::Antialiasing); - p->drawRect(symbolRect); - //p->restore(); - - if ( toExpand ) - { - p->drawLine(x + 2, y + 4, x + 6, y + 4); - p->drawLine(x + 4, y + 2, x + 4, y + 6); - } else { - p->drawLine(x + 2, y + 4, x + 6, y + 4); - } - - return symbolRect; -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qfoldpanel.h +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QFOLD_PANEL_H_ -#define _QFOLD_PANEL_H_ - -#include "qpanel.h" - -/*! - \file qfoldpanel.h - \brief Definition of the QFoldPanel class. - - \see QFoldPanel -*/ - -class QDocumentLine; - -class QCE_EXPORT QFoldPanel : public QPanel -{ - Q_OBJECT - - public: - Q_PANEL(QFoldPanel, "Fold Panel") - - QFoldPanel(QWidget *p = 0); - virtual ~QFoldPanel(); - - virtual QString type() const; - - protected: - virtual void mousePressEvent(QMouseEvent *e); - virtual bool paint(QPainter *p, QEditor *e); - - QRect drawIcon( QPainter *p, QEditor *e, - int x, int y, bool expand); - - private: - QList<QRect> m_rects; - QList<int> m_lines; -}; - -#endif // _QFOLD_PANEL_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qformatconfig.cpp +++ /dev/null @@ -1,491 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qformatconfig.h" - -/*! - \file qformatconfig.cpp - \brief Implementation of the QFormatConfig class. - - \see QFormatConfig -*/ - -#include "qformat.h" -#include "qformatscheme.h" - -#include "qeditor.h" -#include "qdocument.h" - -#include "qsimplecolorpicker.h" - -#include <QHeaderView> -#include <QVBoxLayout> -#include <QMessageBox> -#include <QTableWidget> - -/*! - \ingroup dialogs - @{ - - \class QFormatConfig - \brief A minimalistic, easy to embed, format settings widget. - -*/ - -QFormatConfig::QFormatConfig(QWidget *w) - : QWidget(w), m_autonomous(false), m_currentScheme(0) -{ - setupUi(this); - - m_frame->hide(); - - m_table->verticalHeader()->hide(); - - m_table->horizontalHeaderItem(1)->setIcon(QIcon(":/bold.png")); - m_table->horizontalHeaderItem(2)->setIcon(QIcon(":/italic.png")); - m_table->horizontalHeaderItem(3)->setIcon(QIcon(":/underline.png")); - //m_table->horizontalHeaderItem(4)->setIcon(QIcon(":/overline.png")); - m_table->horizontalHeaderItem(5)->setIcon(QIcon(":/strikeout.png")); - //m_table->horizontalHeaderItem(6)->setIcon(QIcon(":/waveUnderline.png")); - m_table->horizontalHeaderItem(7)->setIcon(QIcon(":/textcolor.png")); - m_table->horizontalHeaderItem(8)->setIcon(QIcon(":/fillcolor.png")); - m_table->horizontalHeaderItem(9)->setIcon(QIcon(":/strokecolor.png")); - - connect(m_table, SIGNAL( itemSelectionChanged() ), - m_table, SLOT ( clearSelection() ) ); - -} - -/*! - \brief run-time translation entry point -*/ -void QFormatConfig::retranslate() -{ - retranslateUi(this); -} - -/*! - \return Whether the format config widget is in "autonomous" mode -*/ -bool QFormatConfig::isAutonomous() const -{ - return m_autonomous; -} - -/*! - \brief Turn on "autonomous" mode - - When the format config widget is autonomous it will automatically - check for changes upon hide event and ask the user whether he wishes - to commit them. -*/ -void QFormatConfig::setAutonomous(bool y) -{ - m_autonomous = y; -} - -/*! - \brief Check whether there are unsaved in the widget -*/ -bool QFormatConfig::hasUnsavedChanges() const -{ - return modifiedFormats().count(); -} - -/*! - \return the list of format schemes this config widget "manages" -*/ -QList<QFormatScheme*> QFormatConfig::schemes() const -{ - return m_schemes; -} - -/*! - \brief Add a format scheme to the config widget - - Users will be able to edit that scheme (switching among schemes using - a combobox if several schemes are added to the widget) -*/ -void QFormatConfig::addScheme(const QString& name, QFormatScheme *scheme) -{ - m_schemes << scheme; - - m_selector->addItem(name); - - if ( m_schemes.count() > 1 && m_schemes.contains(m_currentScheme) ) - { - // show the scheme selector - m_frame->show(); - } - - if ( !m_currentScheme ) - setCurrentScheme(scheme); -} - -/*! - \brief Remove a scheme from the config widget - - \note No attempt is made to commit unsaved changes -*/ -void QFormatConfig::removeScheme(QFormatScheme *s) -{ - if ( m_currentScheme == s ) - { - m_currentScheme = 0; - } - - for ( int i = 0; i < m_schemes.count(); ++i ) - { - if ( m_schemes.at(i) == s ) - { - m_selector->removeItem(i); - m_schemes.removeAt(i); - } - } - - if ( m_schemes.count() <= 1 ) - { - // hide the scheme selector - m_frame->hide(); - } -} - -/*! - \brief Enforce the currently edited scheme - - \note It is possible to pass a scheme not previously added to the widget, - but it really isn't recommended. -*/ -void QFormatConfig::setCurrentScheme(QFormatScheme *s) -{ - int idx = m_schemes.indexOf(s); - - if ( idx != -1 ) - { - m_currentScheme = s; - - // update table widget - cancel(); - } else { - m_selector->setCurrentIndex(idx); - } -} - -/*! - \brief Apply changes made to the currently edited scheme, if any -*/ -void QFormatConfig::apply() -{ - if ( m_currentScheme ) - { - const int n = m_currentScheme->formatCount(); - - m_table->setRowCount(n); - - for ( int i = 0 ; i < n; ++i ) - { - QString fid = m_currentScheme->id(i); - QFormat& fmt = m_currentScheme->formatRef(i); - - QTableWidgetItem *item; - - item = m_table->item(i, 1); - fmt.weight = item->checkState() == Qt::Checked ? QFont::Bold : QFont::Normal; - - item = m_table->item(i, 2); - fmt.italic = item->checkState() == Qt::Checked; - - item = m_table->item(i, 3); - fmt.underline = item->checkState() == Qt::Checked; - - item = m_table->item(i, 4); - fmt.overline = item->checkState() == Qt::Checked; - - item = m_table->item(i, 5); - fmt.strikeout = item->checkState() == Qt::Checked; - - item = m_table->item(i, 6); - fmt.waveUnderline = item->checkState() == Qt::Checked; - - QSimpleColorPicker *cp; - - cp = qobject_cast<QSimpleColorPicker*>(m_table->cellWidget(i, 7)); - if ( cp ) - fmt.foreground = cp->color(); - - cp = qobject_cast<QSimpleColorPicker*>(m_table->cellWidget(i, 8)); - if ( cp ) - fmt.background = cp->color(); - - cp = qobject_cast<QSimpleColorPicker*>(m_table->cellWidget(i, 9)); - if ( cp ) - fmt.linescolor = cp->color(); - - } - - // TODO : save scheme and update editors - - // this will only save schemes loaded from an existing file - m_currentScheme->save(); - - if ( m_autonomous ) - { - QList<QEditor*> editors = QEditor::editors(); - - foreach ( QEditor *e, editors ) - { - if ( e->document()->formatScheme() == m_currentScheme ) - e->viewport()->update(); - } - } - } -} - -/*! - \brief Reset the subcontrols to reflect the data of the format scheme being edited - - The name can be a bit misleading at first, it has been chosen - because it directly maps to the effect a "cancel" button would - have on the widget -*/ -void QFormatConfig::cancel() -{ - m_table->clearContents(); - - if ( m_currentScheme ) - { - const int n = m_currentScheme->formatCount(); - - m_table->setRowCount(n); - - for ( int i = 0 ; i < n; ++i ) - { - QString fid = m_currentScheme->id(i); - const QFormat& fmt = m_currentScheme->formatRef(i); - - QTableWidgetItem *item; - - item = new QTableWidgetItem(fid); - item->setFlags(Qt::ItemIsEnabled); - m_table->setItem(i, 0, item); - - item = new QTableWidgetItem; - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - item->setCheckState(fmt.weight == QFont::Bold ? Qt::Checked : Qt::Unchecked); - item->setToolTip(tr("Bold")); - m_table->setItem(i, 1, item); - - item = new QTableWidgetItem; - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - item->setCheckState(fmt.italic ? Qt::Checked : Qt::Unchecked); - item->setToolTip(tr("Italic")); - m_table->setItem(i, 2, item); - - item = new QTableWidgetItem; - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - item->setCheckState(fmt.underline ? Qt::Checked : Qt::Unchecked); - item->setToolTip(tr("Underline")); - m_table->setItem(i, 3, item); - - item = new QTableWidgetItem; - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - item->setCheckState(fmt.overline ? Qt::Checked : Qt::Unchecked); - item->setToolTip(tr("Overline")); - m_table->setItem(i, 4, item); - - item = new QTableWidgetItem; - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - item->setCheckState(fmt.strikeout ? Qt::Checked : Qt::Unchecked); - item->setToolTip(tr("Strikeout")); - m_table->setItem(i, 5, item); - - item = new QTableWidgetItem; - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - item->setCheckState(fmt.waveUnderline ? Qt::Checked : Qt::Unchecked); - item->setToolTip(tr("Wave underline")); - m_table->setItem(i, 6, item); - - m_table->setCellWidget(i, 7, new QSimpleColorPicker(fmt.foreground)); - m_table->cellWidget(i, 7)->setToolTip(tr("Text color (aka foreground)")); - //m_table->cellWidget(i, 7)->setMaximumSize(22, 22); - - m_table->setCellWidget(i, 8, new QSimpleColorPicker(fmt.background)); - m_table->cellWidget(i, 8)->setToolTip(tr("Background color")); - //m_table->cellWidget(i, 8)->setMaximumSize(22, 22); - - m_table->setCellWidget(i, 9, new QSimpleColorPicker(fmt.linescolor)); - m_table->cellWidget(i, 9)->setToolTip(tr("Lines color (used by all lines formatting : underline, overline, ...)")); - //m_table->cellWidget(i, 9)->setMaximumSize(22, 22); - } - } - - m_table->resizeColumnsToContents(); -} - -/*! - \brief Restore default values for all subcontrols - - \note The widgets are changed but these changes are NOT applied. -*/ -void QFormatConfig::restore() -{ - // restoring what? this is only provided for API consistency and in case - // (very unlikely to ever happen) design changes make restore() a sensible - // thing to do on format schemes -} - -QList<int> QFormatConfig::modifiedFormats() const -{ - QList<int> hasModif; - - if ( m_currentScheme ) - { - const int n = m_currentScheme->formatCount(); - - m_table->setRowCount(n); - - for ( int i = 0 ; i < n; ++i ) - { - QString fid = m_currentScheme->id(i); - QFormat& fmt = m_currentScheme->formatRef(i); - - QTableWidgetItem *item; - - item = m_table->item(i, 1); - if ( fmt.weight != (item->checkState() == Qt::Checked ? QFont::Bold : QFont::Normal) ) - { - hasModif << i; - continue; - } - - item = m_table->item(i, 2); - if ( fmt.italic != (item->checkState() == Qt::Checked) ) - { - hasModif << i; - continue; - } - - item = m_table->item(i, 3); - if ( fmt.underline != (item->checkState() == Qt::Checked) ) - { - hasModif << i; - continue; - } - - item = m_table->item(i, 4); - if ( fmt.overline != (item->checkState() == Qt::Checked) ) - { - hasModif << i; - continue; - } - - item = m_table->item(i, 5); - if ( fmt.strikeout != (item->checkState() == Qt::Checked) ) - { - hasModif << i; - continue; - } - - item = m_table->item(i, 6); - if ( fmt.waveUnderline != (item->checkState() == Qt::Checked) ) - { - hasModif << i; - continue; - } - - QSimpleColorPicker *cp; - - cp = qobject_cast<QSimpleColorPicker*>(m_table->cellWidget(i, 7)); - if ( cp && fmt.foreground != cp->color() ) - { - hasModif << i; - continue; - } - - cp = qobject_cast<QSimpleColorPicker*>(m_table->cellWidget(i, 8)); - if ( cp && fmt.background != cp->color() ) - { - hasModif << i; - continue; - } - - cp = qobject_cast<QSimpleColorPicker*>(m_table->cellWidget(i, 9)); - if ( cp && fmt.linescolor != cp->color() ) - { - hasModif << i; - continue; - } - } - } - - return hasModif; -} - -void QFormatConfig::hideEvent(QHideEvent *e) -{ - Q_UNUSED(e) - - if ( !m_autonomous ) - return; - - QList<int> hasModif = modifiedFormats(); - - if ( hasModif.count() ) - { - // TODO : provide custom widget to allow user to select which items should be saved? - int ret = QMessageBox::warning( - 0, - tr("Unsaved changes"), - tr("There are unsaved changes in this format scheme.\nDo you want them to be saved?"), - QMessageBox::Save | QMessageBox::Discard - ); - - if ( ret == QMessageBox::Save ) - { - apply(); - } else { - cancel(); - } - } -} - -void QFormatConfig::on_m_selector_currentIndexChanged(int idx) -{ - QList<int> hasModif = modifiedFormats(); - - if ( hasModif.count() ) - { - // TODO : provide custom widget to allow user to select which items should be saved? - int ret = QMessageBox::warning( - 0, - tr("Unsaved changes"), - tr("There are unsaved changes in this format scheme.\nDo you want them to be saved?"), - QMessageBox::Save | QMessageBox::Discard - ); - - if ( ret == QMessageBox::Save ) - { - apply(); - } else { - cancel(); - } - } - - m_currentScheme = idx >= 0 && idx < m_schemes.count() ? m_schemes.at(idx) : 0; - - cancel(); -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qformatconfig.h +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QFORMAT_CONFIG_H_ -#define _QFORMAT_CONFIG_H_ - -#include "qce-config.h" - -/*! - \file qformatconfig.h - \brief Definition of the QFormatConfig widget - - \see QFormatConfig -*/ - -#include <QWidget> - -#include "ui_formatconfig.h" - -class QFormatScheme; - -class QCE_EXPORT QFormatConfig : public QWidget, private Ui::FormatConfig -{ - Q_OBJECT - - public: - QFormatConfig(QWidget *w = 0); - - bool isAutonomous() const; - - bool hasUnsavedChanges() const; - - QList<QFormatScheme*> schemes() const; - - public slots: - void retranslate(); - - void apply(); - void cancel(); - void restore(); - - void setAutonomous(bool y); - - void addScheme(const QString& name, QFormatScheme *scheme); - void removeScheme(QFormatScheme *scheme); - - void setCurrentScheme(QFormatScheme *scheme); - - protected: - virtual void hideEvent(QHideEvent *e); - - private slots: - void on_m_selector_currentIndexChanged(int idx); - - private: - QList<int> modifiedFormats() const; - - bool m_autonomous; - QFormatScheme *m_currentScheme; - QList<QFormatScheme*> m_schemes; -}; - -#endif // _QFORMAT_CONFIG_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qgotolinedialog.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qgotolinedialog.h" - -/*! - \file qgotolinedialog.cpp - \brief Implementation of the QGotoDialog class. - - \see QGotoDialog -*/ - -#include "qeditor.h" - -#include "qdocument.h" -#include "qdocumentline.h" -#include "qdocumentcursor.h" - -/*! - \ingroup dialogs - @{ - - \class QGotoLineDialog - \brief A Kate-like generic goto line dialog. - -*/ - -QGotoLineDialog::QGotoLineDialog(QWidget *w) - : QDialog(w) -{ - setupUi(this); -} - -void QGotoLineDialog::exec(QEditor *e) -{ - if ( !e ) - return; - - int ln = e->cursor().lineNumber() + 1, - max = e->document()->lines(); - - spinLine->setValue(ln); - spinLine->setMaximum(max); - - slideLine->setValue(ln); - slideLine->setMaximum(max); - - spinLine->selectAll(); - - if ( QDialog::exec() != QDialog::Accepted ) - return; - - QDocumentCursor c(e->document(), spinLine->value() - 1); - - if ( c.isNull() ) - return; - - //qDebug("going to line : %i [%i]", c.lineNumber(), spinLine->value()); - - e->setCursor(c); -} - -/*! @} */ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qgotolinedialog.h +++ /dev/null @@ -1,45 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QGOTO_LINE__DIALOG_H_ -#define _QGOTO_LINE__DIALOG_H_ - -#include "qce-config.h" - -/*! - \file qgotodialog.h - \brief Definition of the QGotoLineDialog class - - \see QGotoLineDialog -*/ - -#include "ui_gotolinedialog.h" - -#include <QDialog> - -class QEditor; - -class QCE_EXPORT QGotoLineDialog : public QDialog, private Ui::GotoDialog -{ - Q_OBJECT - - public: - QGotoLineDialog(QWidget *w = 0); - - public slots: - void exec(QEditor *e); -}; - -#endif // _QGOTO_LINE__DIALOG_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qgotolinepanel.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qgotolinepanel.h" - -/*! - \file qgotolinepanel.cpp - \brief Implementation of the QGotoLinePanel class. - - \see QGotoLinePanel -*/ - -#include "qeditor.h" - -#include "qdocument.h" -#include "qdocumentline.h" -#include "qdocumentcursor.h" - -#include <QKeyEvent> - -/*! - \ingroup widgets - @{ -*/ - -/*! - \class QGotoLinePanel - \brief A panel that provide inline goto line functionalities -*/ - -QCE_AUTO_REGISTER(QGotoLinePanel) - -/*! - \brief Constructor -*/ -QGotoLinePanel::QGotoLinePanel(QWidget *p) - : QPanel(p) -{ - setupUi(this); - setDefaultVisibility(false); - - bClose->setIcon(QPixmap(":/closeall.png")); -} - -/*! - \brief Empty destructor -*/ -QGotoLinePanel::~QGotoLinePanel() -{ - -} - -/*! - -*/ -QString QGotoLinePanel::type() const -{ - return "Goto"; -} - -/*! - \brief -*/ -void QGotoLinePanel::editorChange(QEditor *e) -{ - if ( editor() ) - { - disconnect( editor(), SIGNAL( cursorPositionChanged() ), - this , SLOT ( cursorPositionChanged() ) ); - - disconnect( editor()->document(), SIGNAL( lineCountChanged(int) ), - this , SLOT ( lineCountChanged(int) ) ); - } - - if ( e ) - { - connect(e , SIGNAL( cursorPositionChanged() ), - this, SLOT ( cursorPositionChanged() ) ); - - connect(e->document() , SIGNAL( lineCountChanged(int) ), - this , SLOT ( lineCountChanged(int) ) ); - - lineCountChanged(e->document()->lineCount()); - spLine->setValue(e->cursor().lineNumber() + 1); - slLine->setValue(e->cursor().lineNumber() + 1); - } -} - -bool QGotoLinePanel::forward(QMouseEvent *e) -{ - Q_UNUSED(e) - - /* - This panel does not need mouse events to be forwarded to the editor. - Even more, it requires them not to be forwarded... - */ - return false; -} - -void QGotoLinePanel::showEvent(QShowEvent *e) -{ - Q_UNUSED(e) - - spLine->setFocus(); - spLine->selectAll(); -} - -void QGotoLinePanel::keyPressEvent(QKeyEvent *e) -{ - if ( e->key() == Qt::Key_Escape ) - { - on_bClose_clicked(); - } else if ( e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter ) { - on_bGo_clicked(); - } else { - QPanel::keyPressEvent(e); - } -} - -void QGotoLinePanel::on_bClose_clicked() -{ - hide(); - editor()->setFocus(); -} - -void QGotoLinePanel::on_bGo_clicked() -{ - editor()->setCursor(QDocumentCursor(editor()->document(), spLine->value() - 1)); -} - -void QGotoLinePanel::on_spLine_valueChanged(int v) -{ - if ( slLine->value() != v ) - slLine->setValue(v); -} - -void QGotoLinePanel::on_slLine_valueChanged(int v) -{ - if ( spLine->value() != v ) - spLine->setValue(v); -} - -void QGotoLinePanel::lineCountChanged(int n) -{ - spLine->setMaximum(n); - slLine->setMaximum(n); -} - -void QGotoLinePanel::cursorPositionChanged() -{ - spLine->setValue(editor()->cursor().lineNumber() + 1); - slLine->setValue(editor()->cursor().lineNumber() + 1); -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qgotolinepanel.h +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QGOTO_LINE_PANEL_H_ -#define _QGOTO_LINE_PANEL_H_ - -#include "qpanel.h" - -/*! - \file qgotolinepanel.h - \brief Definition of the QGotoLinePanel class. - - \see QGotoLinePanel -*/ - -#include "ui_gotoline.h" - -class QCE_EXPORT QGotoLinePanel : public QPanel, private Ui::GotoLine -{ - Q_OBJECT - - public: - Q_PANEL(QGotoLinePanel, "Goto Line Panel") - - QGotoLinePanel(QWidget *p = 0); - virtual ~QGotoLinePanel(); - - virtual QString type() const; - - public slots: - - - protected: - virtual bool forward(QMouseEvent *e); - virtual void editorChange(QEditor *e); - virtual void showEvent(QShowEvent *e); - virtual void keyPressEvent(QKeyEvent *e); - - private slots: - void on_bClose_clicked(); - - void on_bGo_clicked(); - - void on_spLine_valueChanged(int v); - void on_slLine_valueChanged(int v); - - void lineCountChanged(int n); - void cursorPositionChanged(); -}; - -#endif // _QGOTO_LINE_PANEL_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qlinechangepanel.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qlinechangepanel.h" - -/*! - \file qlinechangepanel.cpp - \brief Implementation of the QLineChangePanel class. -*/ - -#include "qeditor.h" - -#include "qdocument.h" -#include "qdocumentline.h" - -#include <QIcon> -#include <QMenu> -#include <QPainter> -#include <QScrollBar> -#include <QContextMenuEvent> - -/*! - \ingroup widgets - @{ -*/ - -/*! - \class QLineMarkPanel - \brief A specific panel in charge of drawing line numbers of an editor - - \see QEditorInterface -*/ - -QCE_AUTO_REGISTER(QLineChangePanel) - -/*! - \brief Constructor -*/ -QLineChangePanel::QLineChangePanel(QWidget *p) - : QPanel(p) -{ - setFixedWidth(4); -} - -/*! - \brief Empty destructor -*/ -QLineChangePanel::~QLineChangePanel() -{ - -} - -/*! - -*/ -QString QLineChangePanel::type() const -{ - return "Line changes"; -} - -/*! - \internal -*/ -bool QLineChangePanel::paint(QPainter *p, QEditor *e) -{ - if ( !e || !e->document() ) - return true; - - const QFontMetrics fm( e->document()->font() ); - - int n, posY, - as = fm.ascent(), - ls = fm.lineSpacing(), - pageBottom = e->viewport()->height(), - contentsY = e->verticalOffset(); - - QString txt; - - QDocument *d = e->document(); - n = d->lineNumber(contentsY); - posY = 2 + d->y(n) - contentsY; - - for ( ; ; ++n ) - { - //qDebug("n = %i; pos = %i", n, posY); - QDocumentLine line = d->line(n); - - if ( line.isNull() || ((posY - as) > pageBottom) ) - break; - - if ( line.isHidden() ) - continue; - - int span = line.lineSpan(); - - if ( d->isLineModified(line) ) - { - p->fillRect(1, posY, 2, ls * span, Qt::red); - } else if ( d->hasLineEverBeenModified(line) ) { - p->fillRect(1, posY, 2, ls * span, Qt::green); - } - - posY += ls * span; - } - - return true; -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qlinechangepanel.h +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QLINE_CHANGE_PANEL_H_ -#define _QLINE_CHANGE_PANEL_H_ - -/*! - \file qlinechangepanel.h - \brief Definition of the QLineChangePanel class. - - \see QLineChangePanel -*/ - -#include "qpanel.h" - -#include <QHash> -#include <QIcon> - -class QDocumentLine; - -class QCE_EXPORT QLineChangePanel : public QPanel -{ - Q_OBJECT - - public: - Q_PANEL(QLineChangePanel, "Line Change Panel") - - QLineChangePanel(QWidget *p = 0); - virtual ~QLineChangePanel(); - - virtual QString type() const; - - protected: - virtual bool paint(QPainter *p, QEditor *e); - - private: - -}; - -#endif // _QLINE_CHANGE_PANEL_H_ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qlinemarkpanel.cpp +++ /dev/null @@ -1,235 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qlinemarkpanel.h" - -/*! - \file qlinemarkpanel.cpp - \brief Implementation of the QLineMarkPanel class. -*/ - -#include "qeditor.h" - -#include "qdocument.h" -#include "qdocumentline.h" - -#include "qlanguagedefinition.h" -#include "qlinemarksinfocenter.h" - -#include <QIcon> -#include <QMenu> -#include <QPainter> -#include <QScrollBar> -#include <QMessageBox> -#include <QContextMenuEvent> - -/*! - \ingroup widgets - @{ -*/ - -/*! - \class QLineMarkPanel - \brief A specific panel in charge of drawing line marks of an editor -*/ - -QCE_AUTO_REGISTER(QLineMarkPanel) - -/*! - \brief Constructor -*/ -QLineMarkPanel::QLineMarkPanel(QWidget *p) - : QPanel(p) -{ - setFixedWidth(18); -} - -/*! - \brief Empty destructor -*/ -QLineMarkPanel::~QLineMarkPanel() -{ - -} - -/*! - -*/ -QString QLineMarkPanel::type() const -{ - return "Line marks"; -} - -/*! - \internal -*/ -bool QLineMarkPanel::paint(QPainter *p, QEditor *e) -{ - if ( !e || !e->document() ) - return true; - - m_rects.clear(); - m_lines.clear(); - QDocument *d = e->document(); - - int maxMarksPerLine = d->maxMarksPerLine(); - - setFixedWidth(maxMarksPerLine ? maxMarksPerLine * 16 + 2 : 18); - - const QFontMetrics fm( d->font() ); - - int n, posY, - as = fm.ascent(), - ls = fm.lineSpacing(), - pageBottom = e->viewport()->height(), - contentsY = e->verticalOffset(); - - QString txt; - const QFontMetrics sfm(fontMetrics()); - QLineMarksInfoCenter *mic = QLineMarksInfoCenter::instance(); - - n = d->lineNumber(contentsY); - posY = 2 + d->y(n) - contentsY; - - //qDebug("first = %i; last = %i", first, last); - //qDebug("beg pos : %i", posY); - //qDebug("<session>"); - for ( ; ; ++n ) - { - //qDebug("n = %i; pos = %i", n, posY); - QDocumentLine line = d->line(n); - - if ( line.isNull() || ((posY - as) > pageBottom) ) - break; - - if ( line.isHidden() ) - continue; - - m_lines << n; - m_rects << QRect(0, posY, width(), ls); - - if ( maxMarksPerLine ) - { - int count = 1; - QList<int> lm = line.marks(); - - foreach ( int id, lm ) - { - QPixmap pix = mic->markType(id).icon; - - if ( pix.isNull() ) - continue; - - int h = qMin(pix.height(), ls), - w = qMin(pix.width(), 16), - x = count, - y = posY + ( (ls - h) >> 1 ); - - p->drawPixmap(x, y, w, h, pix); - - count += 16; - } - } - - posY += ls * line.lineSpan(); - } - //qDebug("</session>"); - - //setFixedWidth(sfm.width(txt) + 5); - return true; -} - -/*! - \internal -*/ -void QLineMarkPanel::mousePressEvent(QMouseEvent *e) -{ -// if ( !editor() || !editor()->document() || !editor()->marker() ) -// { -// return QPanel::mousePressEvent(e); -// } -// - QPanel::mousePressEvent(e); - e->accept(); -} - -/*! - \internal -*/ -void QLineMarkPanel::mouseReleaseEvent(QMouseEvent *e) -{ - if ( !editor() || !editor()->document() || !editor()->languageDefinition() ) - { - QPanel::mouseReleaseEvent(e); - return; - } - - //QMessageBox::warning(0, 0, "clik."); - - QDocumentLine l; - QLanguageDefinition *d = editor()->languageDefinition(); - const int id = QLineMarksInfoCenter::instance()->markTypeId(d->defaultLineMark()); - - if ( id < 0 ) - return; - - e->accept(); - - for ( int i = 0; i < m_rects.count(); ++i ) - { - if ( m_rects.at(i).contains(e->pos()) ) - { - l = editor()->document()->line(m_lines.at(i)); - l.toggleMark(id); - //m->toggleDefaultMark(l, -1); - - break; - } - } - - QPanel::mouseReleaseEvent(e); -} - -/*! - \internal -*/ -void QLineMarkPanel::contextMenuEvent(QContextMenuEvent *e) -{ - if ( !editor() || !editor()->document() ) - { - e->ignore(); - return; - } - - /* - QTextBlock b; - QMarker *m = editor()->marker(); - QTextDocument *d = editor()->document(); - - e->accept(); - - QHash<int, QRect>::iterator i; - - for ( i = rects.begin(); i != rects.end(); i++ ) - { - b = d->findBlock(i.key()); - - if ( i->contains( e->pos() ) ) - return m->menu(b, e->globalPos()); - } - */ -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qlinemarkpanel.h +++ /dev/null @@ -1,57 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QLINE_MARK_PANEL_H_ -#define _QLINE_MARK_PANEL_H_ - -/*! - \file qlinemarkpanel.h - \brief Definition of the QLineMarkPanel class. - - \see QLineMarkPanel -*/ - -#include "qpanel.h" - -#include <QHash> -#include <QIcon> - -class QDocumentLine; - -class QCE_EXPORT QLineMarkPanel : public QPanel -{ - Q_OBJECT - - public: - Q_PANEL(QLineMarkPanel, "Line Mark Panel") - - QLineMarkPanel(QWidget *p = 0); - virtual ~QLineMarkPanel(); - - virtual QString type() const; - - protected: - virtual bool paint(QPainter *p, QEditor *e); - virtual void mousePressEvent(QMouseEvent *e); - virtual void mouseReleaseEvent(QMouseEvent *e); - virtual void contextMenuEvent(QContextMenuEvent *e); - - private: - QList<QRect> m_rects; - QList<int> m_lines; -}; - -#endif // _QLINE_MARK_PANEL_H_ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qlinenumberpanel.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qlinenumberpanel.h" - -/*! - \file qlinenumberpanel.cpp - \brief Implementation of the QLineNumberPanel class - - \see QLineNumberPanel -*/ - -#include <QPainter> -#include <QScrollBar> - -#include "qeditor.h" -#include "qdocument.h" -#include "qdocument_p.h" -#include "qdocumentline.h" - - -/*! - \ingroup widgets - @{ -*/ - -/*! - \class QLineNumberPanel - \brief A specific panel in charge of drawing line numbers of an editor -*/ - -QCE_AUTO_REGISTER(QLineNumberPanel) - -/*! - \brief Constructor -*/ -QLineNumberPanel::QLineNumberPanel(QWidget *p) - : QPanel(p), m_verbose(false) -{ - setFixedWidth(20); -} - -/*! - \brief Empty destructor -*/ -QLineNumberPanel::~QLineNumberPanel() -{ - -} - -/*! - -*/ -QString QLineNumberPanel::type() const -{ - return "Line numbers"; -} - -/*! - -*/ -bool QLineNumberPanel::isVerboseMode() const -{ - return m_verbose; -} - -/*! - -*/ -void QLineNumberPanel::setVerboseMode(bool y) -{ - m_verbose = y; - update(); -} - -/*! - -*/ -void QLineNumberPanel::editorChange(QEditor *e) -{ - if ( editor() ) - { - disconnect( editor(), SIGNAL( cursorPositionChanged() ), - this , SLOT ( update() ) ); - - } - - if ( e ) - { - setFixedWidth(fontMetrics().width(QString::number(e->document()->lines())) + 5); - - connect(e , SIGNAL( cursorPositionChanged() ), - this, SLOT ( update() ) ); - - } -} - -/*! - -*/ -bool QLineNumberPanel::paint(QPainter *p, QEditor *e) -{ - /* - possible Unicode caracter for wrapping arrow : - 0x21B3 - 0x2937 - */ - - QFont f(font()); - f.setWeight(QFont::Bold); - const QFontMetrics sfm(f); - - #ifndef WIN32 - static const QChar wrappingArrow(0x2937); - const QFontMetrics specialSfm(sfm); - #else - // 0xC4 gives a decent wrapping arrow in Wingdings fonts, availables on all windows systems - // this is a hackish fallback to workaround Windows issues with Unicode... - static const QChar wrappingArrow(0xC4); - QFont specialFont(font()); - specialFont.setRawName("Wingdings"); - const QFontMetrics specialSfm(specialFont); - #endif - - const int max = e->document()->lines(); - const int panelWidth = sfm.width(QString::number(max)) + 5; - setFixedWidth(panelWidth); - - const QFontMetrics fm( e->document()->font() ); - - int n, posY, - as = fm.ascent(), - ls = fm.lineSpacing(), - pageBottom = e->viewport()->height(), - contentsY = e->verticalOffset(); - - QString txt; - QDocument *d = e->document(); - const int cursorLine = e->cursor().lineNumber(); - - n = d->lineNumber(contentsY); - posY = as + 2 + d->y(n) - contentsY; - - //qDebug("first = %i; last = %i", first, last); - //qDebug("beg pos : %i", posY); - - for ( ; ; ++n ) - { - //qDebug("n = %i; pos = %i", n, posY); - QDocumentLine line = d->line(n); - - if ( line.isNull() || ((posY - as) > pageBottom) ) - break; - - if ( line.isHidden() ) - continue; - - bool draw = true; - - if ( !m_verbose ) - { - draw = !((n + 1) % 10) || !n || line.marks().count(); - } - - txt = QString::number(n + 1); - - if ( n == cursorLine ) - { - draw = true; - - p->save(); - QFont f = p->font(); - f.setWeight(QFont::Bold); - - p->setFont(f); - } - - if ( draw ) - { - p->drawText(width() - 2 - sfm.width(txt), - posY, - txt); - - } else { - int yOff = posY - (as + 1) + ls / 2; - - if ( (n + 1) % 5 ) - p->drawPoint(width() - 5, yOff); - else - p->drawLine(width() - 7, yOff, width() - 2, yOff); - } - - if ( line.lineSpan() > 1 ) - { - #ifdef Q_OS_WIN32 - p->save(); - specialFont.setBold(n == cursorLine); //todo: only get bold on the current wrapped line - p->setFont(specialFont); - #endif - - for ( int i = 1; i < line.lineSpan(); ++i ) - { - // draw line wrapping indicators - //p->drawText(width() - 2 - sfm.width(wrappingArrow), posY + i * ls, wrappingArrow); - p->drawText(width() - 1 - specialSfm.width(wrappingArrow), posY + i * ls, wrappingArrow); - } - - #ifdef Q_OS_WIN32 - p->restore(); - #endif - } - - if ( n == cursorLine ) - { - p->restore(); - } - - posY += ls * line.lineSpan(); - } - - //p->setPen(Qt::DotLine); - //p->drawLine(width()-1, 0, width()-1, pageBottom); - - //setFixedWidth(sfm.width(txt) + 5); - return true; -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qlinenumberpanel.h +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QLINE_NUMBER_PANEL_H_ -#define _QLINE_NUMBER_PANEL_H_ - -/*! - \file qlinenumberpanel.h - \brief Definition of the QLineNumberPanel class - - \see QLineNumberPanel -*/ - -#include "qpanel.h" - -class QCE_EXPORT QLineNumberPanel : public QPanel -{ - Q_OBJECT - - public: - Q_PANEL(QLineNumberPanel, "Line Number Panel") - - QLineNumberPanel(QWidget *p = 0); - virtual ~QLineNumberPanel(); - - bool isVerboseMode() const; - - virtual QString type() const; - - public slots: - void setVerboseMode(bool y); - - protected: - virtual void editorChange(QEditor *e); - virtual bool paint(QPainter *p, QEditor *e); - - bool m_verbose; -}; - -#endif // _QLINE_NUMBER_PANEL_H_ -
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qpanel.cpp +++ /dev/null @@ -1,317 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qpanel.h" - -/*! - \file qpanel.cpp - \brief Implementation of the QPanel class - - \see QPanel -*/ - -#include "qeditor.h" -#include "qcodeedit.h" -#include "qpanellayout.h" - -#include <QFont> -#include <QFontMetrics> - -#include <QPainter> -#include <QPaintEvent> - -#include <QScrollBar> - -#include <QMouseEvent> -#include <QApplication> - -/*! - \ingroup widgets - @{ - - \class QPanel - \brief Helper class for panels displayed by QCodeEdit - -*/ - -QHash<QString, QPanelCreator*>& QPanel::creators() -{ - static QHash<QString, QPanelCreator*> _c; - return _c; -} - -QPanel* QPanel::panel(const QString& id, QWidget *p) -{ - if ( !creators().contains(id) ) - return 0; - - return creators().value(id)->panel(p); -} - -void QPanel::registerCreator(QPanelCreator *c) -{ - creators()[c->id()] = c; -} - -static int _panels = 0; - -/*! - \brief Constructor - - If the parent is a text editor, it is automatically connected to the panel -*/ -QPanel::QPanel(QWidget *p) - : QWidget(p), m_defaultVisibility(true), m_shownOnce(false) -{ - QEditor *e = qobject_cast<QEditor*>(p); - - if ( e ) - attach(e); - - ++_panels; -} - -/*! - \brief Destructor -*/ -QPanel::~QPanel() -{ - --_panels; - - //if ( !_panels ) - // qDebug("Panels cleared."); - -} - -/*! -*/ -QEditor* QPanel::editor() -{ - return m_editor; -} - -/*! - \brief Connect the panel to a text editor -*/ -void QPanel::attach(QEditor *e) -{ - if ( m_editor ) - { - disconnect( m_editor->document(), - SIGNAL( formatsChanged() ), - this, - SLOT ( update() ) ); - - disconnect( m_editor->document(), - SIGNAL( contentsChanged() ), - this, - SLOT ( update() ) ); - - disconnect( m_editor->verticalScrollBar(), - SIGNAL( valueChanged(int) ), - this, - SLOT ( update() ) ); - - } - - editorChange(e); - - m_editor = e; - setParent(e); - - if ( m_editor ) - { - connect(m_editor->document(), - SIGNAL( formatsChanged() ), - this, - SLOT ( update() ) ); - - connect(m_editor->document(), - SIGNAL( contentsChanged() ), - this, - SLOT ( update() ) ); - - connect(m_editor->verticalScrollBar(), - SIGNAL( valueChanged(int) ), - this, - SLOT ( update() ) ); - - } -} - -/*! - \brief -*/ -bool QPanel::shallShow() const -{ - return m_shownOnce ? isHidden() : m_defaultVisibility; -} - -/*! - \brief -*/ -bool QPanel::defaultVisibility() const -{ - return m_defaultVisibility; -} - -/*! - \brief -*/ -void QPanel::setDefaultVisibility(bool on) -{ - m_defaultVisibility = on; -} - -/*! - \brief Callback - - Each time attach() is called, this function is called as well so that - the panel can fine tune its behaviour according to the editor monitored. - - \note the Default implementation does nothing... -*/ -void QPanel::editorChange(QEditor *) -{ - -} - -bool QPanel::forward(QMouseEvent *e) -{ - QPoint pos, globalPos = e->globalPos(), ref = editor()->viewport()->pos(); - - if ( editor()->viewport()->parentWidget() ) - ref = editor()->viewport()->parentWidget()->mapToGlobal(ref); - - globalPos.setX(qBound(ref.x(), globalPos.x(), ref.x() + editor()->width())); - globalPos.setY(qBound(ref.y(), globalPos.y(), ref.y() + editor()->height())); - - pos = editor()->viewport()->mapFromGlobal(globalPos); - - QMouseEvent fw( - e->type(), - pos, - globalPos, - e->button(), - e->buttons(), - e->modifiers() - ); - - bool ok = qApp->sendEvent(editor()->viewport(), &fw) && fw.isAccepted(); - - //qDebug("forwarding mouse event : (%i, %i) => %i", pos.x(), pos.y(), ok); - - return ok; -} - -/*! - \internal -*/ -void QPanel::mouseMoveEvent(QMouseEvent *e) -{ - if ( !editor() ) - return; - - if ( forward(e) ) - e->accept(); - else - QWidget::mouseMoveEvent(e); -} - -/*! - \internal -*/ -void QPanel::mousePressEvent(QMouseEvent *e) -{ - if ( !editor() ) - return; - - if ( forward(e) ) - e->accept(); - else - QWidget::mousePressEvent(e); -} - -/*! - \internal -*/ -void QPanel::mouseReleaseEvent(QMouseEvent *e) -{ - if ( !editor() ) - return; - - if ( forward(e) ) - e->accept(); - else - QWidget::mouseReleaseEvent(e); -} - -/*! - \internal -*/ -void QPanel::showEvent(QShowEvent *e) -{ - m_shownOnce = true; - - QWidget::showEvent(e); -} - -/*! - \internal -*/ -void QPanel::hideEvent(QHideEvent *e) -{ - QCodeEdit *ce = QCodeEdit::manager(editor()); - - if ( ce ) - ce->panelLayout()->update(); - - QWidget::hideEvent(e); -} - -/*! - \internal -*/ -void QPanel::paintEvent(QPaintEvent *e) -{ - if ( !m_editor || !m_editor->document() ) - { - e->ignore(); - return; - } - - e->accept(); - - QPainter p(this); - - if ( !paint(&p, m_editor) ) - QWidget::paintEvent(e); -} - -/*! - \internal -*/ -bool QPanel::paint(QPainter *, QEditor *) -{ - /* - qWarning("Bad panel implementation : " - "QPanel::paint(QPainter*, QEditor*)" - " is a stub that should not get called." - "\nCheck out the code of %s", qPrintable(type())); - */ - return false; -} - -/* @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qpanel.h +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QPANEL_H_ -#define _QPANEL_H_ - -/*! - \file qpanel.h - \brief Definition of the QPanel class - - \see QPanel - - \defgroup widgets -*/ - -#include "qce-config.h" - -#include <QHash> -#include <QWidget> -#include <QPointer> - -class QPainter; -class QPaintEvent; - -class QEditor; -class QPanelCreator; - -class QCE_EXPORT QPanel : public QWidget -{ - Q_OBJECT - - public: - QPanel(QWidget *p = 0); - virtual ~QPanel(); - - virtual QString id() const = 0; - virtual QString type() const = 0; - - QEditor* editor(); - void attach(QEditor *e); - - virtual bool shallShow() const; - - bool defaultVisibility() const; - void setDefaultVisibility(bool on); - - static QPanel* panel(const QString& id, QWidget *p = 0); - static void registerCreator(QPanelCreator *c); - - protected: - virtual bool forward(QMouseEvent *e); - - virtual void editorChange(QEditor *e); - - virtual void mouseMoveEvent(QMouseEvent *e); - virtual void mousePressEvent(QMouseEvent *e); - virtual void mouseReleaseEvent(QMouseEvent *e); - - virtual void showEvent(QShowEvent *e); - virtual void hideEvent(QHideEvent *e); - virtual void paintEvent(QPaintEvent *e); - virtual bool paint(QPainter *p, QEditor *e); - - private: - QPointer<QEditor> m_editor; - bool m_defaultVisibility, m_shownOnce; - static QHash<QString, QPanelCreator*>& creators(); -}; - -class QPanelCreator -{ - public: - virtual ~QPanelCreator() {} - virtual QString id() const = 0; - virtual QPanel* panel(QWidget *p) = 0; -}; - -#define Q_PANEL(T, SID) \ - public: \ - class Creator : public QPanelCreator \ - { \ - public: \ - virtual QString id() const \ - { \ - return SID; \ - } \ - \ - virtual QPanel* panel(QWidget *p) \ - { \ - return new T(p); \ - } \ - \ - static QPanelCreator* instance() \ - { \ - static Creator global; \ - return &global; \ - } \ - \ - Creator() {} \ - virtual ~Creator() {} \ - }; \ - \ - QString id() const { return SID; } \ - \ - static void _register() \ - { \ - QPanel::registerCreator(Creator::instance()); \ - } \ - - -#define Q_PANEL_ID(T) \ - T::Creator::instance()->id() \ - - -#define Q_CREATE_PANEL(T) \ - QPanel::panel(Q_PANEL_ID(T)) \ - - -#endif // _QPANEL_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qsearchreplacepanel.cpp +++ /dev/null @@ -1,535 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qsearchreplacepanel.h" - -/*! - \file qsearchreplacepanel.cpp - \brief Implementation of the QSearchReplacePanel class. - - \see QSearchReplacePanel -*/ - -#include "qeditor.h" - -#include "qdocument.h" -#include "qdocumentline.h" -#include "qdocumentcursor.h" -#include "qdocumentsearch.h" - -#include <QScrollBar> -#include <QPaintEvent> - -static QString escapeCpp(const QString& s, bool rep) -{ - if ( !rep ) - return s; - - QString es; - - for ( int i = 0; i < s.count(); ++i ) - { - if ( (s.at(i) == '\\') && ((i + 1) < s.count()) ) - { - QChar c = s.at(++i); - - if ( c == '\\' ) - es += '\\'; - else if ( c == 't' ) - es += '\t'; - else if ( c == 'n' ) - es += '\n'; - else if ( c == 'r' ) - es += '\r'; - else if ( c == '0' ) - es += '\0'; - - } else { - es += s.at(i); - } - } - - //qDebug("\"%s\" => \"%s\"", qPrintable(s), qPrintable(es)); - - return es; -} - -/*! - \ingroup widgets - @{ -*/ - -/*! - \class QSearchReplacePanel - \brief A panel that provide inline search/replace functionalities -*/ - -QCE_AUTO_REGISTER(QSearchReplacePanel) - -/*! - \brief Constructor -*/ -QSearchReplacePanel::QSearchReplacePanel(QWidget *p) - : QPanel(p), lastDirection(0), m_search(0) -{ - setupUi(this); - setDefaultVisibility(false); - - leFind->installEventFilter(this); - leReplace->installEventFilter(this); -} - -/*! - \brief Empty destructor -*/ -QSearchReplacePanel::~QSearchReplacePanel() -{ - if ( m_search ) - delete m_search; -} - -/*! - -*/ -QString QSearchReplacePanel::type() const -{ - return "Search"; -} - -/*! - \brief -*/ -void QSearchReplacePanel::editorChange(QEditor *e) -{ - if ( editor() ) - { - disconnect( editor(), SIGNAL( cursorPositionChanged() ), - this , SLOT ( cursorPositionChanged() ) ); - } - - if ( e ) - { - connect(e , SIGNAL( cursorPositionChanged() ), - this, SLOT ( cursorPositionChanged() ) ); - } -} - -bool QSearchReplacePanel::forward(QMouseEvent *e) -{ - Q_UNUSED(e) - - /* - This panel does not need mouse events to be forwarded to the editor. - Even more, it requires them not to be forwarded... - */ - return false; -} - -/*! - -*/ -void QSearchReplacePanel::display(int mode, bool replace) -{ - //qDebug("display(%i)", replace); - bool visible = true; - - if ( mode < 0 ) - visible = (replace != cbReplace->isChecked()) || isHidden(); - else - visible = mode; - - if ( visible ) - { - cbReplace->setChecked(replace); - //frameReplace->setVisible(replace); - leFind->setFocus(); - leFind->selectAll(); - //show(); - } - - setVisible(visible); - - if ( !visible ) - editor()->setFocus(); -} - -/*! - -*/ -void QSearchReplacePanel::find(int backward) -{ - if ( !m_search ) - { - if ( !isVisible() ) - { - display(1, false); - return; - } else { - init(); - } - - if ( backward != -1 ) - lastDirection = backward; - } - - bool replaceAll = cbReplace->isChecked() && cbReplaceAll->isChecked(); - - if ( backward == -1 ) - { - backward = lastDirection; - } else { - if ( lastDirection != backward && editor()->cursor().hasSelection() && !replaceAll ) - m_search->next(backward, false); //the first hit is already selected - - lastDirection = backward; - } - - m_search->next(backward, replaceAll); - - if ( !leFind->hasFocus() && !leReplace->hasFocus() ) - leFind->setFocus(); -} - -/*! - -*/ -void QSearchReplacePanel::hideEvent(QHideEvent *) -{ - /* - if ( m_search ) - delete m_search; - - m_search = 0; - */ -} - -bool QSearchReplacePanel::eventFilter(QObject *o, QEvent *e) -{ - int kc; - - if ( o == leFind || o == leReplace ) - { - switch ( e->type() ) - { - /* - case QEvent::FocusIn : - leFind->grabKeyboard(); - break; - - case QEvent::FocusOut : - leFind->releaseKeyboard(); - break; - */ - - case QEvent::KeyPress : - - kc = static_cast<QKeyEvent*>(e)->key(); - - if ( (kc == Qt::Key_Enter) || (kc == Qt::Key_Return) ) - { - //on_leFind_returnPressed(); - on_leFind_returnPressed(Qt::ShiftModifier & static_cast<QKeyEvent*>(e)->modifiers()); - return true; - } else if ( kc == Qt::Key_Escape) { - if ( cbReplace->isChecked() ) - display(1,false); - else - display(0,false); - return true; - } else if ( kc == Qt::Key_Tab || kc == Qt::Key_Backtab ) { - if ( cbReplace->isChecked() ) - { - if ( leFind->hasFocus() ) - leReplace->setFocus(); - else - leFind->setFocus(); - } - return true; - } - break; - - default: - break; - } - } - - return QWidget::eventFilter(o, e); -} - -void QSearchReplacePanel::on_leFind_textEdited(const QString& text) -{ - if ( cbReplace->isChecked() ) - { - // do not perfrom incremental search when replacing - - if ( m_search ) - m_search->setSearchText(text); - - leFind->setStyleSheet(QString()); - return; - } - - bool hadSearch = m_search; - QDocumentCursor cur = editor()->cursor(); - - if ( m_search ) - { - cur = m_search->cursor(); - - m_search->setSearchText(text); - - if ( cbCursor->isChecked() ) - { - QDocumentCursor c = cur; - c.setColumnNumber(qMin(c.anchorColumnNumber(), c.columnNumber())); - - m_search->setCursor(c); - } - } else { - // TODO : make incremental search optional - init(); - } - - if ( text.isEmpty() ) - { - leFind->setStyleSheet(QString()); - return; - } - - m_search->setOption(QDocumentSearch::Silent, true); - - find(0); - - m_search->setOption(QDocumentSearch::Silent, false); - - if ( m_search->cursor().isNull() ) - { - leFind->setStyleSheet("QLineEdit { background: red; color : white; }"); - - if ( hadSearch ) - { - m_search->setCursor(cur); - - // figure out whether other matches are availables - QDocumentSearch::Options opts = m_search->options(); - opts &= ~QDocumentSearch::HighlightAll; - opts |= QDocumentSearch::Silent; - - QDocumentSearch temp(editor(), text, opts); - temp.setOrigin(QDocumentCursor()); - temp.setScope(m_search->scope()); - temp.next(true); - - if ( temp.cursor().isValid() ) - { - // other match found from doc start - leFind->setStyleSheet("QLineEdit { background: yellow; color : black; }"); - m_search->setCursor(cur.document()->cursor(0,0)); - find(0); - } - } - } else { - leFind->setStyleSheet(QString()); - editor()->setCursor(m_search->cursor()); - } -} - -void QSearchReplacePanel::on_leFind_returnPressed(bool backward) -{ - leFind->setStyleSheet(QString()); - - if ( backward ) - find(1); - else - find(0); - -} - -void QSearchReplacePanel::on_leReplace_textEdited(const QString& text) -{ - if ( m_search ) - m_search->setReplaceText(text); - -} - -void QSearchReplacePanel::on_cbReplace_toggled(bool on) -{ - if ( m_search ) - m_search->setOption(QDocumentSearch::Replace, on); - - if ( leFind->isVisible() ) - leFind->setFocus(); -} - -void QSearchReplacePanel::on_cbWords_toggled(bool on) -{ - if ( m_search ) - m_search->setOption(QDocumentSearch::WholeWords, on); - - leFind->setFocus(); -} - -void QSearchReplacePanel::on_cbRegExp_toggled(bool on) -{ - if ( m_search ) - m_search->setOption(QDocumentSearch::RegExp, on); - - leFind->setFocus(); -} - -void QSearchReplacePanel::on_cbCase_toggled(bool on) -{ - if ( m_search ) - m_search->setOption(QDocumentSearch::CaseSensitive, on); - - leFind->setFocus(); -} - -void QSearchReplacePanel::on_cbCursor_toggled(bool on) -{ - if ( m_search ) - { - m_search->setOrigin(on ? editor()->cursor() : QDocumentCursor()); - - if ( cbHighlight->isChecked() ) - m_search->next(false); - } - - leFind->setFocus(); -} - -void QSearchReplacePanel::on_cbHighlight_toggled(bool on) -{ - if ( !m_search ) - init(); - - if ( m_search ) - { - m_search->setOption(QDocumentSearch::HighlightAll, on); - - if ( on && !m_search->indexedMatchCount() ) - m_search->next(false); - } - - leFind->setFocus(); -} - -void QSearchReplacePanel::on_cbSelection_toggled(bool on) -{ - if ( m_search ) - m_search->setScope(on ? editor()->cursor() : QDocumentCursor()); - - leFind->setFocus(); -} - -void QSearchReplacePanel::on_cbPrompt_toggled(bool on) -{ - if ( m_search ) - m_search->setOption(QDocumentSearch::Prompt, on); - - leFind->setFocus(); -} - -void QSearchReplacePanel::on_cbEscapeSeq_toggled(bool on) -{ - if ( m_search ) - m_search->setReplaceText(escapeCpp(leReplace->text(), on)); -} - -void QSearchReplacePanel::on_bNext_clicked() -{ - if ( !m_search ) - init(); - - leFind->setStyleSheet(QString()); - find(0); -} - -void QSearchReplacePanel::on_bPrevious_clicked() -{ - if ( !m_search ) - init(); - - leFind->setStyleSheet(QString()); - find(1); -} - -void QSearchReplacePanel::on_bRefresh_clicked() -{ - init(); -} - -void QSearchReplacePanel::init() -{ - if ( m_search ) - { - delete m_search; - m_search = 0; - } - - QDocumentSearch::Options opt; - - if ( cbRegExp->isChecked() ) - opt |= QDocumentSearch::RegExp; - - if ( cbCase->isChecked() ) - opt |= QDocumentSearch::CaseSensitive; - - if ( cbWords->isChecked() ) - opt |= QDocumentSearch::WholeWords; - - if ( cbHighlight->isChecked() && !cbReplace->isVisible() ) - opt |= QDocumentSearch::HighlightAll; - - if ( cbReplace->isChecked() && cbReplace->isVisible() ) - opt |= QDocumentSearch::Replace; - - if ( cbPrompt->isChecked() ) - opt |= QDocumentSearch::Prompt; - - m_search = new QDocumentSearch( editor(), - leFind->text(), - opt, - cbReplace->isChecked() - ? - escapeCpp(leReplace->text(), cbEscapeSeq->isChecked()) - : - QString() - ); - - - if ( cbCursor->isChecked() ) - m_search->setCursor(editor()->cursor()); - - if ( cbSelection->isChecked() ) - m_search->setScope(editor()->cursor()); - -} - -void QSearchReplacePanel::cursorPositionChanged() -{ - if ( m_search ) - { - if ( editor()->cursor() == m_search->cursor() || cbHighlight->isChecked() ) - return; - - if ( cbCursor->isChecked() ) - m_search->setOrigin(editor()->cursor()); - - m_search->setCursor(editor()->cursor()); - } -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qsearchreplacepanel.h +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QSEARCH_REPLACE_PANEL_H_ -#define _QSEARCH_REPLACE_PANEL_H_ - -#include "qpanel.h" - -/*! - \file qsearchreplacepanel.h - \brief Definition of the QSearchReplacePanel class. - - \see QSearchReplacePanel -*/ - -#include "ui_searchreplace.h" - -class QDocumentLine; -class QDocumentSearch; - -class QCE_EXPORT QSearchReplacePanel : public QPanel, private Ui::SearchReplace -{ - Q_OBJECT - - public: - Q_PANEL(QSearchReplacePanel, "Search Replace Panel") - - QSearchReplacePanel(QWidget *p = 0); - virtual ~QSearchReplacePanel(); - - virtual QString type() const; - - public slots: - void display(int mode, bool replace); - - void find(int backward = -1); - - protected: - virtual bool forward(QMouseEvent *e); - virtual void editorChange(QEditor *e); - - virtual bool eventFilter(QObject *o, QEvent *e); - - virtual void hideEvent(QHideEvent *e); - - private slots: - void on_leFind_textEdited(const QString& text); - void on_leReplace_textEdited(const QString& text); - - void on_cbReplace_toggled(bool on); - - void on_cbCase_toggled(bool on); - void on_cbWords_toggled(bool on); - void on_cbRegExp_toggled(bool on); - void on_cbCursor_toggled(bool on); - void on_cbHighlight_toggled(bool on); - void on_cbSelection_toggled(bool on); - void on_cbPrompt_toggled(bool on); - void on_cbEscapeSeq_toggled(bool on); - - void on_bRefresh_clicked(); - - void on_bNext_clicked(); - void on_bPrevious_clicked(); - - void cursorPositionChanged(); - - private: - void init(); - void on_leFind_returnPressed(bool backward); - - int lastDirection; - QDocumentSearch *m_search; -}; - -#endif // _QSEARCH_REPLACE_PANEL_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qsimplecolorpicker.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qsimplecolorpicker.h" - -/*! - \file qsimplecolorpicker.cpp - \brief Implementation of the QSimpleColorPicker class -*/ - -#include <QIcon> -#include <QPixmap> -#include <QPainter> -#include <QResizeEvent> -#include <QColorDialog> - -QSimpleColorPicker::QSimpleColorPicker(QWidget *w) - : QToolButton(w) -{ - setColor(QColor()); - - connect(this, SIGNAL( clicked() ), this, SLOT( clicked() ) ); -} - -QSimpleColorPicker::QSimpleColorPicker(const QColor& c, QWidget *w) - : QToolButton(w) -{ - setColor(c); - - connect(this, SIGNAL( clicked() ), this, SLOT( clicked() ) ); -} - -const QColor& QSimpleColorPicker::color() const -{ - return m_color; -} - -void QSimpleColorPicker::setColor(const QColor& c) -{ - m_color = c; - - updateIcon(size()); -} - -void QSimpleColorPicker::resizeEvent(QResizeEvent *e) -{ - updateIcon(e->size()); - - QToolButton::resizeEvent(e); -} - -void QSimpleColorPicker::contextMenuEvent(QContextMenuEvent *e) -{ - setColor(QColor()); - - e->accept(); - - QToolButton::contextMenuEvent(e); -} - -void QSimpleColorPicker::updateIcon(const QSize& sz) -{ - QPixmap px(sz.width() - 3, sz.height() - 3); - QPainter p(&px); - - if ( m_color.isValid() ) - { - p.fillRect(0, 0, px.width(), px.height(), m_color); - setIcon(QIcon(px)); - } else { - //p.fillRect(0, 0, px.width(), px.height(), palette().window()); - setIcon(QIcon()); - } -} - -void QSimpleColorPicker::clicked() -{ - QColor c = QColorDialog::getColor(m_color); - - if ( c.isValid() ) - { - setColor(c); - } -}
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qsimplecolorpicker.h +++ /dev/null @@ -1,56 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QSIMPLE_COLOR_PICKER_H_ -#define _QSIMPLE_COLOR_PICKER_H_ - -#include "qce-config.h" - -/*! - \file qsimplecolorpicker.h - \brief Definition of the QSimpleColorPicker class -*/ - -#include <QToolButton> - -class QCE_EXPORT QSimpleColorPicker : public QToolButton -{ - Q_OBJECT - - Q_PROPERTY(QColor color READ color WRITE setColor) - - public: - QSimpleColorPicker(QWidget *w = 0); - QSimpleColorPicker(const QColor& c, QWidget *w = 0); - - const QColor& color() const; - - protected: - void resizeEvent(QResizeEvent *e); - void contextMenuEvent(QContextMenuEvent *e); - - public slots: - void setColor(const QColor& c); - - void updateIcon(const QSize& sz); - - private slots: - void clicked(); - - private: - QColor m_color; -}; - -#endif
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qstatuspanel.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#include "qstatuspanel.h" - -/*! - \file qstatuspanel.cpp - \brief Implementation of the QStatusPanel class. - - \see QStatusPanel -*/ - -#include "qeditor.h" - -#include "qdocument.h" -#include "qdocumentline.h" -#include "qdocumentcursor.h" - -#include <QTimer> -#include <QPainter> -#include <QDateTime> -#include <QPaintEvent> -#include <QFontMetrics> -#include <QApplication> - -/*! - \ingroup widgets - @{ -*/ - -/*! - \class QStatusPanel - \brief A panel that display some status informations -*/ - -QCE_AUTO_REGISTER(QStatusPanel) - -/*! - \brief Constructor -*/ -QStatusPanel::QStatusPanel(QWidget *p) - : QPanel(p) -{ - setFixedHeight(fontMetrics().lineSpacing() + 4); -} - -/*! - \brief Empty destructor -*/ -QStatusPanel::~QStatusPanel() -{ - -} - -/*! - -*/ -QString QStatusPanel::type() const -{ - return "Status"; -} - -/*! - -*/ -void QStatusPanel::editorChange(QEditor *e) -{ - if ( editor() ) - { - disconnect( editor(), SIGNAL( cursorPositionChanged() ), - this , SLOT ( update() ) ); - - } - - if ( e ) - { - connect(e , SIGNAL( cursorPositionChanged() ), - this, SLOT ( update() ) ); - - } -} - -/*! - -*/ -bool QStatusPanel::paint(QPainter *p, QEditor *e) -{ - //qDebug("drawing status panel... [%i, %i, %i, %i]", - // geometry().x(), - // geometry().y(), - // geometry().width(), - // geometry().height()); - static QPixmap _warn(":/warning.png"), _mod(":/save.png"); - - QString s; - int xpos = 10; - QDocumentCursor c = e->cursor(); - const QFontMetrics fm(fontMetrics()); - - const int ls = fm.lineSpacing(); - const int ascent = fm.ascent() + 3; - - s = tr("Line : %1 Visual column : %2 Text column : %3") - .arg(c.lineNumber() + 1) - .arg(c.visualColumnNumber()) - .arg(c.columnNumber()); - - p->drawText(xpos, ascent, s); - xpos += fm.width(s) + 10; - - int sz = qMin(height(), _mod.height()); - //int lastMod = d->lastModified().secsTo(QDateTime::currentDateTime()); - //QString timeDiff = tr("(%1 min %2 s ago)").arg(lastMod / 60).arg(lastMod % 60); - - //xpos += 10; - if ( e->isContentModified() ) - { - p->drawPixmap(xpos, (height() - sz) / 2, sz, sz, _mod); - //xpos += sz; - //xpos += 10; - //p->drawText(xpos, ascent, timeDiff); - } - xpos += sz + 10; - //xpos += fm.width(timeDiff); - //xpos += 20; - - s = editor()->flag(QEditor::Overwrite) ? tr("OVERWRITE") : tr("INSERT"); - p->drawText(xpos, ascent, s); - xpos += fm.width(s) + 10; - - m_conflictSpot = 0; - - if ( editor()->isInConflict() ) - { - s = tr("Conflict"); - int w = fm.width(s) + 30; - - if ( xpos + w + _warn.width() < width() ) - { - m_conflictSpot = width() - (w + _warn.width()); - p->drawText(width() - w + 15, ascent, s); - p->drawPixmap(m_conflictSpot, (ls - _warn.height()) / 2 + 2, _warn); - } else if ( xpos + _warn.width() < width() ) { - m_conflictSpot = width() - _warn.width(); - p->drawPixmap(m_conflictSpot, (ls - _warn.height()) / 2 + 2, _warn); - } - } - - setFixedHeight(ls + 4); - - QTimer::singleShot(1000, this, SLOT( update() ) ); - - return true; -} - -/*! - -*/ -void QStatusPanel::mousePressEvent(QMouseEvent *e) -{ - if ( !editor() || (e->button() != Qt::LeftButton) || !m_conflictSpot || e->x() < m_conflictSpot ) - { - editor()->setFocus(); - return; - } - - editor()->save(); -} - -/*! - -*/ -void QStatusPanel::mouseReleaseEvent(QMouseEvent *e) -{ - Q_UNUSED(e) - - editor()->setFocus(); -} - -/*! @} */
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/qstatuspanel.h +++ /dev/null @@ -1,55 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr> -** -** This file is part of the Edyuk project <http://edyuk.org> -** -** This file may be used under the terms of the GNU General Public License -** version 3 as published by the Free Software Foundation and appearing in the -** file GPL.txt included in the packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - -#ifndef _QSTATUS_PANEL_H_ -#define _QSTATUS_PANEL_H_ - -#include "qpanel.h" - -/*! - \file qstatuspanel.h - \brief Definition of the QStatusPanel class. - - \see QStatusPanel -*/ - -class QLabel; - -class QDocumentLine; - -class QCE_EXPORT QStatusPanel : public QPanel -{ - Q_OBJECT - - public: - Q_PANEL(QStatusPanel, "Status Panel") - - QStatusPanel(QWidget *p = 0); - virtual ~QStatusPanel(); - - virtual QString type() const; - - protected: - virtual void editorChange(QEditor *e); - virtual bool paint(QPainter *p, QEditor *e); - - virtual void mousePressEvent(QMouseEvent *e); - virtual void mouseReleaseEvent(QMouseEvent *e); - - private: - int m_conflictSpot; -}; - -#endif // _QSTATUS_PANEL_H_
deleted file mode 100644 --- a/gui//qcodeedit-2.2.3/widgets/searchreplace.ui +++ /dev/null @@ -1,514 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>SearchReplace</class> - <widget class="QWidget" name="SearchReplace"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>801</width> - <height>82</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <layout class="QVBoxLayout"> - <property name="spacing"> - <number>0</number> - </property> - <property name="leftMargin"> - <number>2</number> - </property> - <property name="topMargin"> - <number>2</number> - </property> - <property name="rightMargin"> - <number>2</number> - </property> - <property name="bottomMargin"> - <number>1</number> - </property> - <item> - <widget class="QFrame" name="frameSearch"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>16</width> - <height>24</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>16777215</height> - </size> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Plain</enum> - </property> - <layout class="QHBoxLayout"> - <property name="spacing"> - <number>2</number> - </property> - <property name="margin"> - <number>0</number> - </property> - <item> - <widget class="QToolButton" name="bClose"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="toolTip"> - <string>Close search/replace panel</string> - </property> - <property name="text"> - <string/> - </property> - <property name="icon"> - <iconset resource="../../../../src/lib/images/Edyuk.qrc"> - <normaloff>:/closeall.png</normaloff>:/closeall.png</iconset> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="bRefresh"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="toolTip"> - <string>Refresh search underlying context (as an attempt to correct search behavior)</string> - </property> - <property name="text"> - <string/> - </property> - <property name="icon"> - <iconset resource="../../../../src/lib/images/Edyuk.qrc"> - <normaloff>:/reload.png</normaloff>:/reload.png</iconset> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string> Find :</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="leFind"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>120</width> - <height>22</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>120</width> - <height>16777215</height> - </size> - </property> - <property name="toolTip"> - <string>Text or pattern to search for</string> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="bNext"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="toolTip"> - <string>Find next occurence</string> - </property> - <property name="text"> - <string/> - </property> - <property name="icon"> - <iconset resource="../../../../src/lib/images/Edyuk.qrc"> - <normaloff>:/down.png</normaloff>:/down.png</iconset> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="bPrevious"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - <property name="toolTip"> - <string>Find previous occurence</string> - </property> - <property name="text"> - <string/> - </property> - <property name="icon"> - <iconset resource="../../../../src/lib/images/Edyuk.qrc"> - <normaloff>:/up.png</normaloff>:/up.png</iconset> - </property> - </widget> - </item> - <item> - <spacer> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Expanding</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QCheckBox" name="cbWords"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Words</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="cbCursor"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Cursor</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="cbSelection"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Selection</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="cbHighlight"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Highlight all</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="cbRegExp"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Regexp</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="cbCase"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Case</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QFrame" name="frameReplace"> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>16</width> - <height>24</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>16777215</height> - </size> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Plain</enum> - </property> - <layout class="QHBoxLayout"> - <property name="spacing"> - <number>2</number> - </property> - <property name="margin"> - <number>0</number> - </property> - <item> - <widget class="QCheckBox" name="cbReplace"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Replace :</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="leReplace"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>168</width> - <height>22</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>1200</width> - <height>16777215</height> - </size> - </property> - <property name="toolTip"> - <string>Replacement text</string> - </property> - </widget> - </item> - <item> - <spacer> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Preferred</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>139</width> - <height>24</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QCheckBox" name="cbPrompt"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Prompt on replace</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="cbReplaceAll"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Replace all</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="cbEscapeSeq"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Escape sequences</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - <resources> - <include location="../../../../src/lib/images/Edyuk.qrc"/> - </resources> - <connections> - <connection> - <sender>cbReplace</sender> - <signal>toggled(bool)</signal> - <receiver>frameReplace</receiver> - <slot>setVisible(bool)</slot> - <hints> - <hint type="sourcelabel"> - <x>46</x> - <y>47</y> - </hint> - <hint type="destinationlabel"> - <x>249</x> - <y>49</y> - </hint> - </hints> - </connection> - <connection> - <sender>bClose</sender> - <signal>clicked()</signal> - <receiver>SearchReplace</receiver> - <slot>hide()</slot> - <hints> - <hint type="sourcelabel"> - <x>11</x> - <y>15</y> - </hint> - <hint type="destinationlabel"> - <x>202</x> - <y>-27</y> - </hint> - </hints> - </connection> - </connections> -</ui>
--- a/gui//src/MainWindow.cpp +++ b/gui//src/MainWindow.cpp @@ -42,12 +42,14 @@ m_variablesDockWidget = new VariablesDockWidget(this); m_historyDockWidget = new HistoryDockWidget(this); m_filesDockWidget = new FilesDockWidget(this); + m_codeEdit = new QCodeEdit(this); m_centralTabWidget = new QTabWidget(this); setWindowTitle("Octave"); setCentralWidget(m_centralTabWidget); m_centralTabWidget->addTab(m_octaveTerminal, "Terminal"); + m_centralTabWidget->addTab(m_codeEdit->editor(), "Editor"); addDockWidget(Qt::LeftDockWidgetArea, m_variablesDockWidget); addDockWidget(Qt::LeftDockWidgetArea, m_historyDockWidget);
--- a/gui//src/MainWindow.h +++ b/gui//src/MainWindow.h @@ -27,6 +27,7 @@ #include "VariablesDockWidget.h" #include "HistoryDockWidget.h" #include "FilesDockWidget.h" +#include "qcodeedit.h" // Octave includes #undef PACKAGE_BUGREPORT @@ -91,6 +92,7 @@ VariablesDockWidget *variablesDockWidget() { return m_variablesDockWidget; } HistoryDockWidget *historyDockWidget() { return m_historyDockWidget; } FilesDockWidget *filesDockWidget() { return m_filesDockWidget; } + QCodeEdit *codeEdit() { return m_codeEdit; } public slots: private: @@ -100,6 +102,7 @@ VariablesDockWidget *m_variablesDockWidget; HistoryDockWidget *m_historyDockWidget; FilesDockWidget *m_filesDockWidget; + QCodeEdit *m_codeEdit; QTabWidget *m_centralTabWidget; // Threads for running octave and managing the data interaction.