فهرست منبع

提交1.21.0的全部代码

爬山虎 2 سال پیش
والد
کامیت
17f55b4c4e
100فایلهای تغییر یافته به همراه8048 افزوده شده و 2500 حذف شده
  1. 674 0
      src/LICENSE
  2. 3 12
      src/RcTreeWidget.cpp
  3. 2 2
      src/RealCompare.pro
  4. 1 49
      src/RealCompare.qrc
  5. BIN
      src/RealCompare.rc
  6. 111 82
      src/RealCompare.vcxproj
  7. 55 167
      src/RealCompare.vcxproj.filters
  8. 2 2
      src/RealCompare.vcxproj.user
  9. 370 0
      src/batchfindreplace.cpp
  10. 43 0
      src/batchfindreplace.h
  11. 319 0
      src/batchfindreplace.ui
  12. 39 0
      src/bigfilemessage.cpp
  13. 23 0
      src/bigfilemessage.h
  14. 163 0
      src/bigfilemessage.ui
  15. 486 152
      src/cceditor/ccnotepad.cpp
  16. 64 17
      src/cceditor/ccnotepad.h
  17. 56 164
      src/cceditor/ccnotepad.ui
  18. 20 3
      src/cceditor/filemanager.cpp
  19. 2 2
      src/cceditor/filemanager.h
  20. 66 4
      src/columnedit.cpp
  21. 1 0
      src/columnedit.h
  22. 31 1
      src/columnedit.ui
  23. 1 9
      src/encodeconvert.cpp
  24. 116 0
      src/filelistview.cpp
  25. 48 0
      src/filelistview.h
  26. 43 0
      src/filelistview.ui
  27. 92 7
      src/findresultwin.cpp
  28. 156 33
      src/findwin.cpp
  29. 11 3
      src/findwin.h
  30. 307 100
      src/findwin.ui
  31. 27 0
      src/include/pluginGl.h
  32. 13 10
      src/main.cpp
  33. 35 2
      src/nddsetting.cpp
  34. 5 0
      src/nddsetting.h
  35. 70 0
      src/plugin.cpp
  36. 10 0
      src/plugin.h
  37. 34 0
      src/plugin/helloworld/helloworld.pro
  38. 69 0
      src/plugin/helloworld/helloworld.vcxproj.filters
  39. 10 0
      src/plugin/helloworld/helloworld.vcxproj.user
  40. 56 0
      src/plugin/helloworld/helloworldexport.cpp
  41. 30 0
      src/plugin/helloworld/qttestclass.cpp
  42. 21 0
      src/plugin/helloworld/qttestclass.h
  43. 108 0
      src/plugin/helloworld/qttestclass.ui
  44. 57 0
      src/plugin/test/test.cpp
  45. 34 0
      src/plugin/test/test.pro
  46. 18 0
      src/pluginGl.h
  47. 41 0
      src/pluginmgr.cpp
  48. 23 0
      src/pluginmgr.h
  49. 161 0
      src/pluginmgr.ui
  50. 2 10
      src/qscidisplaywindow.cpp
  51. 2 2
      src/qscint/scintilla/include/Scintilla.h
  52. 1 1
      src/qscint/scintilla/src/Editor.cpp
  53. 1 0
      src/qscint/src/Qsci/qsciglobal.h
  54. 20 0
      src/qscint/src/Qsci/qscilexer.h
  55. 48 1
      src/qscint/src/Qsci/qscilexerglobal.h
  56. 12 5
      src/qscint/src/Qsci/qsciscintilla.h
  57. 876 780
      src/qscint/src/qscilexer.cpp
  58. 1 0
      src/qscint/src/qscilexerbash.cpp
  59. 1 0
      src/qscint/src/qscilexerbatch.cpp
  60. 1 0
      src/qscint/src/qscilexercmake.cpp
  61. 3 0
      src/qscint/src/qscilexercpp.cpp
  62. 3 0
      src/qscint/src/qscilexercsharp.cpp
  63. 2 0
      src/qscint/src/qscilexercss.cpp
  64. 1 0
      src/qscint/src/qscilexerfortran.cpp
  65. 1 0
      src/qscint/src/qscilexerfortran77.cpp
  66. 469 7
      src/qscint/src/qscilexerglobal.cpp
  67. 3 0
      src/qscint/src/qscilexergo.cpp
  68. 4 1
      src/qscint/src/qscilexerhtml.cpp
  69. 3 0
      src/qscint/src/qscilexerjava.cpp
  70. 3 0
      src/qscint/src/qscilexerjavascript.cpp
  71. 1 0
      src/qscint/src/qscilexerlua.cpp
  72. 1 0
      src/qscint/src/qscilexermakefile.cpp
  73. 1 0
      src/qscint/src/qscilexermatlab.cpp
  74. 2 2
      src/qscint/src/qscilexernsis.cpp
  75. 2 0
      src/qscint/src/qscilexerpascal.cpp
  76. 1 0
      src/qscint/src/qscilexerperl.cpp
  77. 1 0
      src/qscint/src/qscilexerproperties.cpp
  78. 1 0
      src/qscint/src/qscilexerpython.cpp
  79. 1 0
      src/qscint/src/qscilexerruby.cpp
  80. 4 2
      src/qscint/src/qscilexerrust.cpp
  81. 3 0
      src/qscint/src/qscilexersql.cpp
  82. 1 0
      src/qscint/src/qscilexertext.cpp
  83. 2 1
      src/qscint/src/qscilexervb.cpp
  84. 3 0
      src/qscint/src/qscilexerverilog.cpp
  85. 3 0
      src/qscint/src/qscilexervhdl.cpp
  86. 3 0
      src/qscint/src/qscilexerxml.cpp
  87. 1 0
      src/qscint/src/qscilexeryaml.cpp
  88. 1 1
      src/qscint/src/qscintilla.pro
  89. 261 0
      src/qscint/src/qscintilla.pro.user
  90. 586 97
      src/qscint/src/qscintilla.vcxproj
  91. 3 3
      src/qscint/src/qscintilla.vcxproj.user
  92. 4 2
      src/qscint/src/qsciscintilla.cpp
  93. 36 19
      src/qss/black.qss
  94. 97 0
      src/qss/common.qss
  95. 8 7
      src/qss/lightbluestyle.qss
  96. 220 0
      src/qss/myblack.qss
  97. 15 122
      src/qss/mystyle.qss
  98. 638 240
      src/qtlangset.cpp
  99. 33 8
      src/qtlangset.h
  100. 531 368
      src/qtlangset.ui

+ 674 - 0
src/LICENSE

@@ -0,0 +1,674 @@
+                    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>.

+ 3 - 12
src/RcTreeWidget.cpp

@@ -45,18 +45,9 @@ void RcTreeWidget::slot_ShowPopMenu(const QPoint& pos)
 		}
 
 		QAction* action = menu->addAction(tr("Show File in Explorer"), this, [&]() {
-			QString path, cmd;
-
-			path = QString("%1/%2").arg(m_rootDir).arg(curItem->data(0, Qt::ToolTipRole).toString());
-			#ifdef _WIN32
-				path = path.replace("/", "\\");
-				cmd = QString("explorer.exe /select,%1").arg(path);
-			#else
-				path = path.replace("\\", "/");
-				cmd = QString("open -R %1").arg(path);
-			#endif
-				QProcess process;
-				process.startDetached(cmd);
+			QString path = QString("%1/%2").arg(m_rootDir).arg(curItem->data(0, Qt::ToolTipRole).toString());
+			showFileInExplorer(path);
+	
 			});
 
 		//没有名称表示是对齐的item,不存在对应的文件,只是占位

+ 2 - 2
src/RealCompare.pro

@@ -3,7 +3,7 @@ LANGUAGE = C++
 
 TARGET = Notepad--
 
-CONFIG	+= qt warn_on Release
+CONFIG	+= qt warn_on Debug
 
 QT += core gui widgets concurrent network xmlpatterns
 
@@ -46,7 +46,7 @@ TRANSLATIONS += realcompare_zh.ts
     }
    }
 unix{
-if(CONFIG(debug, debug|release)){
+if(CONFIG(debug, Debug|Release)){
           LIBS += -L/home/yzw/build/CCNotePad/x64/Debug -lqmyedit_qt5
 
 QMAKE_CXXFLAGS += -fopenmp

+ 1 - 49
src/RealCompare.qrc

@@ -135,55 +135,6 @@
         <file>Resources/edit/styledeepblue/zoomin.png</file>
         <file>Resources/edit/styledeepblue/zoomout.png</file>
         <file>Resources/edit/styledeepblue/needsaveall.png</file>
-        <file>qss/black.qss</file>
-        <file>qss/psblack/add_bottom.png</file>
-        <file>qss/psblack/add_left.png</file>
-        <file>qss/psblack/add_right.png</file>
-        <file>qss/psblack/add_top.png</file>
-        <file>qss/psblack/branch_close.png</file>
-        <file>qss/psblack/branch_open.png</file>
-        <file>qss/psblack/calendar_nextmonth.png</file>
-        <file>qss/psblack/calendar_prevmonth.png</file>
-        <file>qss/psblack/checkbox_checked.png</file>
-        <file>qss/psblack/checkbox_checked_disable.png</file>
-        <file>qss/psblack/checkbox_parcial.png</file>
-        <file>qss/psblack/checkbox_parcial_disable.png</file>
-        <file>qss/psblack/checkbox_unchecked.png</file>
-        <file>qss/psblack/checkbox_unchecked_disable.png</file>
-        <file>qss/psblack/radiobutton_checked.png</file>
-        <file>qss/psblack/radiobutton_checked_disable.png</file>
-        <file>qss/psblack/radiobutton_unchecked.png</file>
-        <file>qss/psblack/radiobutton_unchecked_disable.png</file>
-        <file>Resources/edit/styledark/needsaveall.png</file>
-        <file>Resources/edit/styledark/needsavebar.png</file>
-        <file>Resources/edit/styledark/autosave.png</file>
-        <file>Resources/edit/styledark/bincmp.png</file>
-        <file>Resources/edit/styledark/clearsign.png</file>
-        <file>Resources/edit/styledark/closefile.png</file>
-        <file>Resources/edit/styledark/copy.png</file>
-        <file>Resources/edit/styledark/crlf.png</file>
-        <file>Resources/edit/styledark/cut.png</file>
-        <file>Resources/edit/styledark/dircompare.png</file>
-        <file>Resources/edit/styledark/filecompare.png</file>
-        <file>Resources/edit/styledark/find.png</file>
-        <file>Resources/edit/styledark/goto.png</file>
-        <file>Resources/edit/styledark/indentGuide.png</file>
-        <file>Resources/edit/styledark/mark.png</file>
-        <file>Resources/edit/styledark/newfile.png</file>
-        <file>Resources/edit/styledark/next.png</file>
-        <file>Resources/edit/styledark/openfile.png</file>
-        <file>Resources/edit/styledark/paste.png</file>
-        <file>Resources/edit/styledark/pre.png</file>
-        <file>Resources/edit/styledark/redo.png</file>
-        <file>Resources/edit/styledark/rename.png</file>
-        <file>Resources/edit/styledark/replace.png</file>
-        <file>Resources/edit/styledark/sign.png</file>
-        <file>Resources/edit/styledark/transcode.png</file>
-        <file>Resources/edit/styledark/undo.png</file>
-        <file>Resources/edit/styledark/white.png</file>
-        <file>Resources/edit/styledark/zoomin.png</file>
-        <file>Resources/edit/styledark/zoomout.png</file>
-        <file>Resources/edit/styledark/closeall.png</file>
         <file>Resources/img/savedark.png</file>
         <file>Resources/img/opendark.png</file>
         <file>Resources/img/reloaddark.png</file>
@@ -193,5 +144,6 @@
         <file>Resources/img/diffall.png</file>
         <file>Resources/img/expand.png</file>
         <file>Resources/img/fold.png</file>
+        <file>qss/common.qss</file>
     </qresource>
 </RCC>

BIN
src/RealCompare.rc


+ 111 - 82
src/RealCompare.vcxproj

@@ -20,7 +20,7 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <PlatformToolset>v141</PlatformToolset>
-    <OutputDirectory>x64\Release\</OutputDirectory>
+    <OutputDirectory>x64\Debug\</OutputDirectory>
     <ATLMinimizesCRunTimeLibraryUsage>false</ATLMinimizesCRunTimeLibraryUsage>
     <CharacterSet>NotSet</CharacterSet>
     <ConfigurationType>Application</ConfigurationType>
@@ -44,11 +44,11 @@
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
   </ImportGroup>
-  <PropertyGroup Label="UserMacros" /><ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')"><Import Project="$(QtMsBuild)\qt_defaults.props" /></ImportGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><OutDir>x64\Debug\</OutDir><IntDir>debug\</IntDir><TargetName>Notepad--</TargetName><IgnoreImportLibrary>true</IgnoreImportLibrary></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><OutDir>x64\Release\</OutDir><IntDir>release\</IntDir><TargetName>Notepad--</TargetName><IgnoreImportLibrary>true</IgnoreImportLibrary><LinkIncremental>false</LinkIncremental></PropertyGroup><PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><QtInstall>5.15.2_msvc2019_64</QtInstall><QtModules>core;network;gui;xmlpatterns;widgets;concurrent</QtModules></PropertyGroup><PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><QtInstall>5.15.2_msvc2019_64</QtInstall><QtModules>core;network;gui;xmlpatterns;widgets;concurrent</QtModules></PropertyGroup><ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')"><Import Project="$(QtMsBuild)\qt.props" /></ImportGroup>
+  <PropertyGroup Label="UserMacros" /><ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')"><Import Project="$(QtMsBuild)\qt_defaults.props" /></ImportGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><OutDir>x64\Debug\</OutDir><IntDir>debug\</IntDir><TargetName>Notepad--</TargetName><IgnoreImportLibrary>true</IgnoreImportLibrary></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><OutDir>x64\Debug\</OutDir><IntDir>release\</IntDir><TargetName>Notepad--</TargetName><IgnoreImportLibrary>true</IgnoreImportLibrary><LinkIncremental>false</LinkIncremental></PropertyGroup><PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><QtInstall>5.12.10_msvc2017_64</QtInstall><QtModules>core;network;gui;xmlpatterns;widgets;concurrent</QtModules></PropertyGroup><PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><QtInstall>5.12.10_msvc2017_64</QtInstall><QtModules>core;network;gui;xmlpatterns;widgets;concurrent</QtModules></PropertyGroup><ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')"><Import Project="$(QtMsBuild)\qt.props" /></ImportGroup>
   
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <ClCompile>
-      <AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.;qscint\src;qscint\src\Qsci;qscint\scintilla\include;cceditor;x64\Release;release;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.;qscint\src;qscint\src\Qsci;qscint\scintilla\include;cceditor;./x64/Release;release;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions)</AdditionalOptions>
       <AssemblerListingLocation>release\</AssemblerListingLocation>
       <BrowseInformation>false</BrowseInformation>
@@ -57,7 +57,7 @@
       <ExceptionHandling>Sync</ExceptionHandling>
       <ObjectFileName>release\</ObjectFileName>
       <Optimization>MaxSpeed</Optimization>
-      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QSCINTILLA_DLL;NDEBUG;QT_NO_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QT_NO_DEBUG;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessToFile>false</PreprocessToFile>
       <ProgramDataBaseFileName></ProgramDataBaseFileName>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -66,14 +66,13 @@
       <WarningLevel>Level3</WarningLevel>
     <MultiProcessorCompilation>true</MultiProcessorCompilation></ClCompile>
     <Link>
-      <AdditionalDependencies>qmyedit_qt5.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>x64\Release;C:\openssl\lib;C:\Utils\my_sql\mysql-5.7.25-winx64\lib;C:\Utils\postgresql\pgsql\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>qmyedit_qt5d.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>x64\Debug;C:\openssl\lib;C:\Utils\my_sql\mysql-5.6.11-winx64\lib;C:\Utils\postgresql\pgsql\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalOptions>"/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
       <DataExecutionPrevention>true</DataExecutionPrevention>
       <GenerateDebugInformation>false</GenerateDebugInformation>
       <IgnoreImportLibrary>true</IgnoreImportLibrary>
       <LinkIncremental>false</LinkIncremental>
-      <OptimizeReferences>true</OptimizeReferences>
       <OutputFile>$(OutDir)\Notepad--.exe</OutputFile>
       <RandomizedBaseAddress>true</RandomizedBaseAddress>
       <SubSystem>Windows</SubSystem>
@@ -85,12 +84,12 @@
       <WarningLevel>0</WarningLevel>
     </Midl>
     <ResourceCompile>
-      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QSCINTILLA_DLL;NDEBUG;QT_NO_DEBUG;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CONCURRENT_LIB;QT_XMLPATTERNS_LIB;QT_NETWORK_LIB;QT_CORE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QT_NO_DEBUG;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CONCURRENT_LIB;QT_XMLPATTERNS_LIB;QT_NETWORK_LIB;QT_CORE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ResourceCompile>
   <QtMoc><CompilerFlavor>msvc</CompilerFlavor><Include>./$(Configuration)/moc_predefs.h</Include><ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription><DynamicSource>output</DynamicSource><QtMocDir>$(Configuration)</QtMocDir><QtMocFileName>moc_%(Filename).cpp</QtMocFileName></QtMoc><QtRcc><InitFuncName>RealCompare</InitFuncName><Compression>default</Compression><ExecutionDescription>Rcc'ing %(Identity)...</ExecutionDescription><QtRccDir>$(Configuration)</QtRccDir><QtRccFileName>qrc_%(Filename).cpp</QtRccFileName></QtRcc><QtUic><ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription><QtUicDir>$(ProjectDir)</QtUicDir><QtUicFileName>ui_%(Filename).h</QtUicFileName></QtUic></ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <ClCompile>
-      <AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.;qscint\src;qscint\src\Qsci;qscint\scintilla\include;cceditor;x64\Release;debug;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.;qscint\src;qscint\src\Qsci;qscint\scintilla\include;cceditor;./x64/Release;debug;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions)</AdditionalOptions>
       <AssemblerListingLocation>debug\</AssemblerListingLocation>
       <BrowseInformation>false</BrowseInformation>
@@ -99,7 +98,7 @@
       <ExceptionHandling>Sync</ExceptionHandling>
       <ObjectFileName>debug\</ObjectFileName>
       <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QSCINTILLA_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessToFile>false</PreprocessToFile>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <SuppressStartupBanner>true</SuppressStartupBanner>
@@ -107,8 +106,8 @@
       <WarningLevel>Level3</WarningLevel>
     <MultiProcessorCompilation>true</MultiProcessorCompilation></ClCompile>
     <Link>
-      <AdditionalDependencies>x64\Debug\qmyedit_qt5d.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>x64\Debug;C:\openssl\lib;C:\Utils\my_sql\mysql-5.7.25-winx64\lib;C:\Utils\postgresql\pgsql\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>qmyedit_qt5d.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>x64\Debug;C:\openssl\lib;C:\Utils\my_sql\mysql-5.6.11-winx64\lib;C:\Utils\postgresql\pgsql\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalOptions>"/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
       <DataExecutionPrevention>true</DataExecutionPrevention>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -124,7 +123,7 @@
       <WarningLevel>0</WarningLevel>
     </Midl>
     <ResourceCompile>
-      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QSCINTILLA_DLL;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CONCURRENT_LIB;QT_XMLPATTERNS_LIB;QT_NETWORK_LIB;QT_CORE_LIB;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CONCURRENT_LIB;QT_XMLPATTERNS_LIB;QT_NETWORK_LIB;QT_CORE_LIB;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ResourceCompile>
   <QtMoc><CompilerFlavor>msvc</CompilerFlavor><Include>./$(Configuration)/moc_predefs.h</Include><ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription><DynamicSource>output</DynamicSource><QtMocDir>$(Configuration)</QtMocDir><QtMocFileName>moc_%(Filename).cpp</QtMocFileName></QtMoc><QtRcc><InitFuncName>RealCompare</InitFuncName><Compression>default</Compression><ExecutionDescription>Rcc'ing %(Identity)...</ExecutionDescription><QtRccDir>$(Configuration)</QtRccDir><QtRccFileName>qrc_%(Filename).cpp</QtRccFileName></QtRcc><QtUic><ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription><QtUicDir>$(ProjectDir)</QtUicDir><QtUicFileName>ui_%(Filename).h</QtUicFileName></QtUic></ItemDefinitionGroup>
   <ItemGroup>
@@ -135,6 +134,8 @@
     <ClCompile Include="QTreeWidgetSortItem.cpp" />
     <ClCompile Include="RcTreeWidget.cpp" />
     <ClCompile Include="aboutndd.cpp" />
+    <ClCompile Include="batchfindreplace.cpp" />
+    <ClCompile Include="bigfilemessage.cpp" />
     <ClCompile Include="cceditor\ccnotepad.cpp" />
     <ClCompile Include="closeDlg.cpp" />
     <ClCompile Include="columnedit.cpp" />
@@ -148,6 +149,7 @@
     <ClCompile Include="encodeconvert.cpp" />
     <ClCompile Include="extLexermanager.cpp" />
     <ClCompile Include="filecmprulewin.cpp" />
+    <ClCompile Include="filelistview.cpp" />
     <ClCompile Include="cceditor\filemanager.cpp" />
     <ClCompile Include="findcmpwin.cpp" />
     <ClCompile Include="findresultwin.cpp" />
@@ -162,6 +164,8 @@
     <ClCompile Include="nddsetting.cpp" />
     <ClCompile Include="ndstyleditemdelegate.cpp" />
     <ClCompile Include="optionsview.cpp" />
+    <ClCompile Include="plugin.cpp" />
+    <ClCompile Include="pluginmgr.cpp" />
     <ClCompile Include="progresswin.cpp" />
     <ClCompile Include="qscidisplaywindow.cpp" />
     <ClCompile Include="qtlangset.cpp" />
@@ -220,6 +224,26 @@
       
       
       
+    </QtMoc>
+    <QtMoc Include="batchfindreplace.h">
+      
+      
+      
+      
+      
+      
+      
+      
+    </QtMoc>
+    <QtMoc Include="bigfilemessage.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="cceditor\ccnotepad.h">
       
@@ -324,6 +348,16 @@
       
       
       
+    </QtMoc>
+    <QtMoc Include="filelistview.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="cceditor\filemanager.h">
       
@@ -436,6 +470,18 @@
       
       
       
+    </QtMoc>
+    <ClInclude Include="plugin.h" />
+    <ClInclude Include="pluginGl.h" />
+    <QtMoc Include="pluginmgr.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="progresswin.h">
       
@@ -532,6 +578,9 @@
       
       
     </QtMoc>
+    <ClInclude Include="userlexdef.h" />
+  </ItemGroup>
+  <ItemGroup>
     
     
     
@@ -557,26 +606,6 @@
     
     
     
-    <ClInclude Include="userlexdef.h" />
-  </ItemGroup>
-  <ItemGroup>
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
     
     
     
@@ -666,6 +695,10 @@
     
     
     
+    
+    
+    
+    
     
     
     
@@ -686,6 +719,28 @@
       
       
       
+    </QtUic>
+    <QtUic Include="batchfindreplace.ui">
+      
+      
+      
+      
+      
+      
+      
+      
+      
+    </QtUic>
+    <QtUic Include="bigfilemessage.ui">
+      
+      
+      
+      
+      
+      
+      
+      
+      
     </QtUic>
     <QtUic Include="cceditor\ccnotepad.ui">
       
@@ -785,6 +840,17 @@
       
       
       
+    </QtUic>
+    <QtUic Include="filelistview.ui">
+      
+      
+      
+      
+      
+      
+      
+      
+      
     </QtUic>
     <QtUic Include="findcmpwin.ui">
       
@@ -884,6 +950,17 @@
       
       
       
+    </QtUic>
+    <QtUic Include="pluginmgr.ui">
+      
+      
+      
+      
+      
+      
+      
+      
+      
     </QtUic>
     <QtUic Include="progresswin.ui">
       
@@ -972,34 +1049,16 @@
       
     </QtRcc>
     <None Include="qss\lightblue\add_bottom.png" />
-    <None Include="qss\psblack\add_bottom.png" />
-    <None Include="qss\psblack\add_left.png" />
-    <None Include="qss\psblack\add_right.png" />
     <None Include="qss\lightblue\add_top.png" />
-    <None Include="qss\psblack\add_top.png" />
     <None Include="Resources\img\all.png" />
     <None Include="qss\lightblue\arrow_bottom.png" />
-    <None Include="Resources\edit\styledark\autosave.png" />
     <None Include="Resources\edit\styledeepblue\autosave.png" />
     <None Include="notepad\autosave.png" />
     <None Include="Resources\img\bin.png" />
-    <None Include="Resources\edit\styledark\bincmp.png" />
     <None Include="Resources\edit\styledeepblue\bincmp.png" />
-    <None Include="qss\black.qss" />
     <None Include="Resources\img\bookmark.png" />
-    <None Include="qss\psblack\branch_close.png" />
-    <None Include="qss\psblack\branch_open.png" />
     <None Include="Resources\img\break.png" />
-    <None Include="qss\psblack\calendar_nextmonth.png" />
-    <None Include="qss\psblack\calendar_prevmonth.png" />
-    <None Include="qss\psblack\checkbox_checked.png" />
-    <None Include="qss\psblack\checkbox_checked_disable.png" />
-    <None Include="qss\psblack\checkbox_parcial.png" />
-    <None Include="qss\psblack\checkbox_parcial_disable.png" />
-    <None Include="qss\psblack\checkbox_unchecked.png" />
-    <None Include="qss\psblack\checkbox_unchecked_disable.png" />
     <None Include="Resources\img\clear.png" />
-    <None Include="Resources\edit\styledark\clearsign.png" />
     <None Include="Resources\edit\styledeepblue\clearsign.png" />
     <None Include="notepad\clearsign.png" />
     <None Include="Resources\edit\global\close.png" />
@@ -1010,9 +1069,7 @@
     <None Include="notepad\closeTabButton_hover.png" />
     <None Include="notepad\closeTabButton_inact.png" />
     <None Include="notepad\closeTabButton_push.png" />
-    <None Include="Resources\edit\styledark\closeall.png" />
     <None Include="Resources\edit\styledeepblue\closeall.png" />
-    <None Include="Resources\edit\styledark\closefile.png" />
     <None Include="Resources\edit\styledeepblue\closefile.png" />
     <None Include="Resources\edit\global\closehover.png" />
     <None Include="notepad\closehover.png" />
@@ -1020,35 +1077,28 @@
     <None Include="notepad\cmpdir.png" />
     <None Include="notepad\cmpfile.png" />
     <None Include="notepad\cmpfile1.png" />
-    <None Include="Resources\edit\styledark\copy.png" />
+    <None Include="qss\common.qss" />
     <None Include="Resources\edit\styledeepblue\copy.png" />
     <None Include="notepad\copy.png" />
-    <None Include="Resources\edit\styledark\crlf.png" />
     <None Include="Resources\edit\styledeepblue\crlf.png" />
-    <None Include="Resources\edit\styledark\cut.png" />
     <None Include="Resources\edit\styledeepblue\cut.png" />
     <None Include="notepad\cut.png" />
     <None Include="Resources\img\diff.png" />
     <None Include="Resources\img\diff1.png" />
     <None Include="Resources\img\diffall.png" />
     <None Include="Resources\img\dir.png" />
-    <None Include="Resources\edit\styledark\dircompare.png" />
     <None Include="Resources\edit\styledeepblue\dircompare.png" />
     <None Include="notepad\ecg.png" />
     <None Include="Resources\img\expand.png" />
     <None Include="Resources\img\file.png" />
-    <None Include="Resources\edit\styledark\filecompare.png" />
     <None Include="Resources\edit\styledeepblue\filecompare.png" />
-    <None Include="Resources\edit\styledark\find.png" />
     <None Include="Resources\edit\styledeepblue\find.png" />
     <None Include="notepad\find.png" />
     <None Include="notepad\findReplace.png" />
     <None Include="Resources\img\fold.png" />
     <None Include="notepad\go.png" />
-    <None Include="Resources\edit\styledark\goto.png" />
     <None Include="Resources\edit\styledeepblue\goto.png" />
     <None Include="Resources\img\hidechar.png" />
-    <None Include="Resources\edit\styledark\indentGuide.png" />
     <None Include="Resources\edit\styledeepblue\indentGuide.png" />
     <None Include="notepad\indentGuide.png" />
     <None Include="Resources\img\info.png" />
@@ -1057,7 +1107,6 @@
     <None Include="qss\lightbluestyle.qss" />
     <None Include="mac.icns" />
     <None Include="Resources\img\main.png" />
-    <None Include="Resources\edit\styledark\mark.png" />
     <None Include="Resources\edit\styledeepblue\mark.png" />
     <None Include="notepad\mark.png" />
     <None Include="qss\mystyle.qss" />
@@ -1065,14 +1114,10 @@
     <None Include="Resources\edit\global\needsave.png" />
     <None Include="Resources\img\needsave.png" />
     <None Include="notepad\needsave.png" />
-    <None Include="Resources\edit\styledark\needsaveall.png" />
     <None Include="Resources\edit\styledeepblue\needsaveall.png" />
-    <None Include="Resources\edit\styledark\needsavebar.png" />
     <None Include="Resources\edit\styledeepblue\needsavebar.png" />
     <None Include="notepad\newFile.png" />
-    <None Include="Resources\edit\styledark\newfile.png" />
     <None Include="Resources\edit\styledeepblue\newfile.png" />
-    <None Include="Resources\edit\styledark\next.png" />
     <None Include="Resources\edit\styledeepblue\next.png" />
     <None Include="Resources\img\next.png" />
     <None Include="notepad\next.png" />
@@ -1086,24 +1131,16 @@
     <None Include="Resources\img\open1.png" />
     <None Include="notepad\openFile.png" />
     <None Include="Resources\img\opendark.png" />
-    <None Include="Resources\edit\styledark\openfile.png" />
     <None Include="Resources\edit\styledeepblue\openfile.png" />
-    <None Include="Resources\edit\styledark\paste.png" />
     <None Include="Resources\edit\styledeepblue\paste.png" />
     <None Include="notepad\paste.png" />
     <None Include="Resources\img\point.png" />
-    <None Include="Resources\edit\styledark\pre.png" />
     <None Include="Resources\edit\styledeepblue\pre.png" />
     <None Include="Resources\img\pre.png" />
     <None Include="notepad\pre.png" />
     <None Include="Resources\img\pre2.png" />
     <None Include="Resources\img\pullopen.png" />
-    <None Include="qss\psblack\radiobutton_checked.png" />
-    <None Include="qss\psblack\radiobutton_checked_disable.png" />
-    <None Include="qss\psblack\radiobutton_unchecked.png" />
-    <None Include="qss\psblack\radiobutton_unchecked_disable.png" />
     <None Include="realcompare_zh.qm" />
-    <None Include="Resources\edit\styledark\redo.png" />
     <None Include="Resources\edit\styledeepblue\redo.png" />
     <None Include="Resources\img\redo.png" />
     <None Include="notepad\redo.png" />
@@ -1113,10 +1150,8 @@
     <None Include="Resources\img\reload2.png" />
     <None Include="Resources\img\reloaddark.png" />
     <None Include="Resources\edit\styleblack\rename.png" />
-    <None Include="Resources\edit\styledark\rename.png" />
     <None Include="Resources\edit\styledeepblue\rename.png" />
     <None Include="notepad\rename.png" />
-    <None Include="Resources\edit\styledark\replace.png" />
     <None Include="Resources\edit\styledeepblue\replace.png" />
     <None Include="Resources\img\right3.png" />
     <None Include="notepad\rightClose.png" />
@@ -1129,16 +1164,13 @@
     <None Include="notepad\savetab.png" />
     <None Include="Resources\img\showall.png" />
     <None Include="Resources\img\showchar.png" />
-    <None Include="Resources\edit\styledark\sign.png" />
     <None Include="Resources\edit\styledeepblue\sign.png" />
     <None Include="notepad\sign.png" />
     <None Include="Resources\img\strict.png" />
     <None Include="Resources\img\swap.png" />
     <None Include="Resources\img\tolerant.png" />
     <None Include="Resources\img\tran.png" />
-    <None Include="Resources\edit\styledark\transcode.png" />
     <None Include="Resources\edit\styledeepblue\transcode.png" />
-    <None Include="Resources\edit\styledark\undo.png" />
     <None Include="Resources\edit\styledeepblue\undo.png" />
     <None Include="Resources\img\undo.png" />
     <None Include="notepad\undo.png" />
@@ -1146,15 +1178,12 @@
     <None Include="Resources\img\unequalfile.png" />
     <None Include="Resources\img\vip.png" />
     <None Include="Resources\img\vipdark.png" />
-    <None Include="Resources\edit\styledark\white.png" />
     <None Include="Resources\edit\styledeepblue\white.png" />
     <None Include="notepad\wrap.png" />
     <None Include="notepad\zoomIn.png" />
     <None Include="notepad\zoomOut.png" />
-    <None Include="Resources\edit\styledark\zoomin.png" />
     <None Include="Resources\edit\styledeepblue\zoomin.png" />
     <None Include="Resources\img\zoomin.png" />
-    <None Include="Resources\edit\styledark\zoomout.png" />
     <None Include="Resources\edit\styledeepblue\zoomout.png" />
     <None Include="Resources\img\zoomout.png" />
   </ItemGroup>

+ 55 - 167
src/RealCompare.vcxproj.filters

@@ -78,6 +78,12 @@
     <ClCompile Include="aboutndd.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="batchfindreplace.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="bigfilemessage.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
     <ClCompile Include="cceditor\ccnotepad.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
@@ -117,6 +123,9 @@
     <ClCompile Include="filecmprulewin.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="filelistview.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
     <ClCompile Include="cceditor\filemanager.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
@@ -159,6 +168,12 @@
     <ClCompile Include="optionsview.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="plugin.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="pluginmgr.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
     <ClCompile Include="progresswin.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
@@ -224,6 +239,12 @@
     <QtMoc Include="aboutndd.h">
       <Filter>Header Files</Filter>
     </QtMoc>
+    <QtMoc Include="batchfindreplace.h">
+      <Filter>Header Files</Filter>
+    </QtMoc>
+    <QtMoc Include="bigfilemessage.h">
+      <Filter>Header Files</Filter>
+    </QtMoc>
     <QtMoc Include="cceditor\ccnotepad.h">
       <Filter>Header Files</Filter>
     </QtMoc>
@@ -266,6 +287,9 @@
     <QtMoc Include="filecmprulewin.h">
       <Filter>Header Files</Filter>
     </QtMoc>
+    <QtMoc Include="filelistview.h">
+      <Filter>Header Files</Filter>
+    </QtMoc>
     <QtMoc Include="cceditor\filemanager.h">
       <Filter>Header Files</Filter>
     </QtMoc>
@@ -305,6 +329,15 @@
     <QtMoc Include="optionsview.h">
       <Filter>Header Files</Filter>
     </QtMoc>
+    <ClInclude Include="plugin.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="pluginGl.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <QtMoc Include="pluginmgr.h">
+      <Filter>Header Files</Filter>
+    </QtMoc>
     <QtMoc Include="progresswin.h">
       <Filter>Header Files</Filter>
     </QtMoc>
@@ -347,6 +380,11 @@
     <QtMoc Include="textfind.h">
       <Filter>Header Files</Filter>
     </QtMoc>
+    <ClInclude Include="userlexdef.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
     
     
     
@@ -372,28 +410,6 @@
     
     
     
-    <ClInclude Include="userlexdef.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
     
     
     
@@ -473,6 +489,10 @@
     
     
     
+    
+    
+    
+    
     
     
     
@@ -488,6 +508,12 @@
     <QtUic Include="aboutndd.ui">
       <Filter>Form Files</Filter>
     </QtUic>
+    <QtUic Include="batchfindreplace.ui">
+      <Filter>Form Files</Filter>
+    </QtUic>
+    <QtUic Include="bigfilemessage.ui">
+      <Filter>Form Files</Filter>
+    </QtUic>
     <QtUic Include="cceditor\ccnotepad.ui">
       <Filter>Form Files</Filter>
     </QtUic>
@@ -515,6 +541,9 @@
     <QtUic Include="filecmprulewin.ui">
       <Filter>Form Files</Filter>
     </QtUic>
+    <QtUic Include="filelistview.ui">
+      <Filter>Form Files</Filter>
+    </QtUic>
     <QtUic Include="findcmpwin.ui">
       <Filter>Form Files</Filter>
     </QtUic>
@@ -542,6 +571,9 @@
     <QtUic Include="optionsview.ui">
       <Filter>Form Files</Filter>
     </QtUic>
+    <QtUic Include="pluginmgr.ui">
+      <Filter>Form Files</Filter>
+    </QtUic>
     <QtUic Include="progresswin.ui">
       <Filter>Form Files</Filter>
     </QtUic>
@@ -589,30 +621,15 @@
     <None Include="qss\lightblue\add_bottom.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="qss\psblack\add_bottom.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\add_left.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\add_right.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="qss\lightblue\add_top.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="qss\psblack\add_top.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\img\all.png">
       <Filter>Resource Files</Filter>
     </None>
     <None Include="qss\lightblue\arrow_bottom.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\autosave.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\autosave.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -622,57 +639,18 @@
     <None Include="Resources\img\bin.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\bincmp.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\bincmp.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="qss\black.qss">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\img\bookmark.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="qss\psblack\branch_close.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\branch_open.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\img\break.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="qss\psblack\calendar_nextmonth.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\calendar_prevmonth.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\checkbox_checked.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\checkbox_checked_disable.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\checkbox_parcial.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\checkbox_parcial_disable.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\checkbox_unchecked.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\checkbox_unchecked_disable.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\img\clear.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\clearsign.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\clearsign.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -703,15 +681,9 @@
     <None Include="notepad\closeTabButton_push.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\closeall.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\closeall.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\closefile.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\closefile.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -733,7 +705,7 @@
     <None Include="notepad\cmpfile1.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\copy.png">
+    <None Include="qss\common.qss">
       <Filter>Resource Files</Filter>
     </None>
     <None Include="Resources\edit\styledeepblue\copy.png">
@@ -742,15 +714,9 @@
     <None Include="notepad\copy.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\crlf.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\crlf.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\cut.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\cut.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -769,9 +735,6 @@
     <None Include="Resources\img\dir.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\dircompare.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\dircompare.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -784,15 +747,9 @@
     <None Include="Resources\img\file.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\filecompare.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\filecompare.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\find.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\find.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -808,18 +765,12 @@
     <None Include="notepad\go.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\goto.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\goto.png">
       <Filter>Resource Files</Filter>
     </None>
     <None Include="Resources\img\hidechar.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\indentGuide.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\indentGuide.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -844,9 +795,6 @@
     <None Include="Resources\img\main.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\mark.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\mark.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -868,30 +816,18 @@
     <None Include="notepad\needsave.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\needsaveall.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\needsaveall.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\needsavebar.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\needsavebar.png">
       <Filter>Resource Files</Filter>
     </None>
     <None Include="notepad\newFile.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\newfile.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\newfile.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\next.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\next.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -931,15 +867,9 @@
     <None Include="Resources\img\opendark.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\openfile.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\openfile.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\paste.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\paste.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -949,9 +879,6 @@
     <None Include="Resources\img\point.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\pre.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\pre.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -967,24 +894,9 @@
     <None Include="Resources\img\pullopen.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="qss\psblack\radiobutton_checked.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\radiobutton_checked_disable.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\radiobutton_unchecked.png">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="qss\psblack\radiobutton_unchecked_disable.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="realcompare_zh.qm">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\redo.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\redo.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -1012,18 +924,12 @@
     <None Include="Resources\edit\styleblack\rename.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\rename.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\rename.png">
       <Filter>Resource Files</Filter>
     </None>
     <None Include="notepad\rename.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\replace.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\replace.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -1060,9 +966,6 @@
     <None Include="Resources\img\showchar.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\sign.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\sign.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -1081,15 +984,9 @@
     <None Include="Resources\img\tran.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\transcode.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\transcode.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\undo.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\undo.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -1111,9 +1008,6 @@
     <None Include="Resources\img\vipdark.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\white.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\white.png">
       <Filter>Resource Files</Filter>
     </None>
@@ -1126,18 +1020,12 @@
     <None Include="notepad\zoomOut.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\zoomin.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\zoomin.png">
       <Filter>Resource Files</Filter>
     </None>
     <None Include="Resources\img\zoomin.png">
       <Filter>Resource Files</Filter>
     </None>
-    <None Include="Resources\edit\styledark\zoomout.png">
-      <Filter>Resource Files</Filter>
-    </None>
     <None Include="Resources\edit\styledeepblue\zoomout.png">
       <Filter>Resource Files</Filter>
     </None>

+ 2 - 2
src/RealCompare.vcxproj.user

@@ -2,9 +2,9 @@
 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup />
   <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <QtLastBackgroundBuild>2022-12-11T10:37:19.8112403Z</QtLastBackgroundBuild>
+    <QtLastBackgroundBuild>2023-01-07T07:01:11.4235283Z</QtLastBackgroundBuild>
   </PropertyGroup>
   <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <QtLastBackgroundBuild>2022-12-11T10:37:20.2889680Z</QtLastBackgroundBuild>
+    <QtLastBackgroundBuild>2023-01-07T07:01:11.5050188Z</QtLastBackgroundBuild>
   </PropertyGroup>
 </Project>

+ 370 - 0
src/batchfindreplace.cpp

@@ -0,0 +1,370 @@
+#include "batchfindreplace.h"
+#include "scintillaeditview.h"
+#include "ccnotepad.h"
+#include "progresswin.h"
+
+#include <QTableWidgetItem>
+#include <QFileDialog>
+
+BatchFindReplace::BatchFindReplace(QWidget *parent)
+	: QMainWindow(parent), m_curEditWin(nullptr), m_editTabWidget(nullptr)
+{
+	ui.setupUi(this);
+
+	m_mainNotepad = dynamic_cast<CCNotePad*>(parent);
+}
+
+BatchFindReplace::~BatchFindReplace()
+{}
+
+void BatchFindReplace::setTabWidget(QTabWidget* editTabWidget)
+{
+	m_editTabWidget = editTabWidget;
+}
+
+//自动调整当前窗口的状态,如果发生了变化,则需要认定为是首次查找
+QWidget* BatchFindReplace::autoAdjustCurrentEditWin()
+{
+	QWidget* pw = m_editTabWidget->currentWidget();
+
+	if (m_curEditWin != pw)
+	{
+		m_curEditWin = pw;
+	}
+	return pw;
+}
+
+void BatchFindReplace::appendToFindTable(QString findKeyword)
+{
+	int rNum = ui.findReplaceTable->rowCount();
+	ui.findReplaceTable->insertRow(rNum);
+
+	QTableWidgetItem* itemFind = new QTableWidgetItem(findKeyword);
+	ui.findReplaceTable->setItem(rNum, 0, itemFind);
+	ui.findReplaceTable->setItem(rNum, 1, new QTableWidgetItem());
+}
+
+//这里不能追加,而是插入,即对应的Item必须已经存在。否则不插入
+void BatchFindReplace::insertToReplaceTable(int row, QString replaceKeyword)
+{
+	QTableWidgetItem* item = ui.findReplaceTable->item(row, 1);
+	if (item == nullptr)
+	{
+		ui.statusBar->showMessage(tr("$1 has no find match work item").arg(replaceKeyword));
+		return;
+	}
+
+	item->setText(replaceKeyword);
+}
+
+void BatchFindReplace::insertToFindReplaceTable(QStringList& replaceKeyword)
+{
+	for (int i = 0; i < replaceKeyword.size(); ++i)
+	{
+		insertToReplaceTable(i, replaceKeyword.at(i));
+	}
+}
+
+
+void BatchFindReplace::appendToFindReplaceTable(QStringList& findKeyword)
+{
+	if (findKeyword.isEmpty())
+	{
+		return;
+	}
+
+	int rNum = ui.findReplaceTable->rowCount();
+
+	for (int i = 0; i < findKeyword.size(); ++i)
+	{
+		int curRow = rNum + i;
+		ui.findReplaceTable->insertRow(curRow);
+
+		QTableWidgetItem* itemFind = new QTableWidgetItem(findKeyword.at(i));
+		ui.findReplaceTable->setItem(curRow, 0, itemFind);
+		ui.findReplaceTable->setItem(curRow, 1, new QTableWidgetItem());
+	}
+}
+
+bool BatchFindReplace::tranInputKeyword(QString& findKeyWord, QStringList& outputKeyWordList)
+{
+	//把空白字符,空格或者\t \r\n 等字符进行替换为空格
+	QRegExp re("\\s");
+	findKeyWord.replace(re, QString(" "));
+
+	//再进行空格分隔处理
+	outputKeyWordList = findKeyWord.split(" ");
+
+	if (outputKeyWordList.size() > 20000)
+	{
+		ui.statusBar->showMessage(tr("Max find key word 20000 !"), 10000);
+		return false;
+	}
+
+	//删除每一个空的元素
+	for (int i = outputKeyWordList.size() - 1; i >= 0; --i)
+	{
+		if (outputKeyWordList[i].trimmed().isEmpty())
+		{
+			outputKeyWordList.removeAt(i);
+		}
+	}
+
+	if (outputKeyWordList.isEmpty())
+	{
+		return false;
+	}
+
+	return true;
+}
+
+void BatchFindReplace::on_freshBtClick()
+{
+	QStringList findWordList;
+	QString findKeyWord = ui.findKeywordEdit->toPlainText();
+	if (findKeyWord.isEmpty())
+	{
+		ui.statusBar->showMessage(tr("Please input find keyword !"),10000);
+
+		if (ui.findReplaceTable->rowCount() > 0)
+		{
+			ui.findReplaceTable->clearContents();
+			ui.findReplaceTable->setRowCount(0);
+		}
+		return;
+	}
+
+	if (!tranInputKeyword(findKeyWord, findWordList))
+	{
+		return;
+	}
+	else
+	{
+		ui.findReplaceTable->clearContents();
+		ui.findReplaceTable->setRowCount(0);
+		appendToFindReplaceTable(findWordList);
+	}
+
+	QStringList replaceWordList;
+	QString replaceKeyWord = ui.replaceKeywordEdit->toPlainText();
+	if (!tranInputKeyword(replaceKeyWord, replaceWordList))
+	{
+		return;
+	}
+	else
+	{
+		insertToFindReplaceTable(replaceWordList);
+	}
+}
+
+//进行批量查找工作
+void BatchFindReplace::on_findBtClick()
+{
+	if (m_mainNotepad != nullptr && m_mainNotepad)
+	{
+		int rowNums = ui.findReplaceTable->rowCount();
+
+		if (rowNums == 0)
+		{
+			return;
+		}
+		ProgressWin* loadFileProcessWin = new ProgressWin(this);
+
+		loadFileProcessWin->setWindowModality(Qt::WindowModal);
+
+		loadFileProcessWin->info(tr("total %1 keyword, please wait ...").arg(rowNums));
+
+		loadFileProcessWin->setTotalSteps(rowNums);
+
+		loadFileProcessWin->show();
+
+		int foundTimes = 0;
+
+		for (int i = 0; i < rowNums; ++i)
+		{
+			QTableWidgetItem* item = ui.findReplaceTable->item(i, 0);
+			if (item != nullptr && !item->text().isEmpty())
+			{
+				if (loadFileProcessWin->isCancel())
+				{
+					break;
+				}
+
+				foundTimes += m_mainNotepad->findAtBack(item->text());
+
+				loadFileProcessWin->moveStep();
+
+				QCoreApplication::processEvents();
+			}
+		}
+
+		delete loadFileProcessWin;
+
+		ui.statusBar->showMessage(tr("Batch Find Finished! total %1 found.").arg(foundTimes),10000);
+	}
+}
+
+//进行批量替换工作
+void BatchFindReplace::on_replaceBtClick()
+{
+	if (m_mainNotepad != nullptr && m_mainNotepad)
+	{
+		int rowNums = ui.findReplaceTable->rowCount();
+
+		int replaceTimes = 0;
+
+		QStringList findKeyList;
+		QStringList replaceKeyList;
+
+		for (int i = 0; i < rowNums; ++i)
+		{
+			QTableWidgetItem* item = ui.findReplaceTable->item(i, 0);
+			if (item != nullptr && !item->text().isEmpty())
+			{
+				QTableWidgetItem* replaceItem = ui.findReplaceTable->item(i, 1);
+				if (replaceItem != nullptr)
+				{
+					if (item->text() != replaceItem->text())
+					{
+						findKeyList.append(item->text());
+						replaceKeyList.append(replaceItem->text());
+					}
+				}
+			}
+		}
+		replaceTimes = m_mainNotepad->replaceAtBack(findKeyList, replaceKeyList);
+
+		ui.statusBar->showMessage(tr("Batch Replace Finished, total Replace %1 times !").arg(replaceTimes), 10000);
+	}
+}
+
+void BatchFindReplace::on_swapFindReplace()
+{
+	QString findText = ui.findKeywordEdit->toPlainText();
+	QString replaceText = ui.replaceKeywordEdit->toPlainText();
+
+	ui.findKeywordEdit->setPlainText(replaceText);
+	ui.replaceKeywordEdit->setPlainText(findText);
+
+	on_freshBtClick();
+}
+
+void BatchFindReplace::on_export()
+{
+	QString filter("Text files (*.txt);;All types(*.*)");
+	QString fileName = QFileDialog::getSaveFileName(this, tr("Save File As ..."), QString(), filter);
+
+	if (!fileName.isEmpty())
+	{
+		QSettings setting(fileName, QSettings::IniFormat);
+		setting.setIniCodec("UTF-8");
+
+		int rowNums = ui.findReplaceTable->rowCount();
+
+		QStringList findList;
+		QStringList replaceList;
+
+		for (int i = 0; i < rowNums; ++i)
+		{
+			QTableWidgetItem* item = ui.findReplaceTable->item(i, 0);
+			if (item != nullptr && !item->text().isEmpty())
+			{
+				QTableWidgetItem* replaceItem = ui.findReplaceTable->item(i, 1);
+				if (replaceItem != nullptr)
+				{
+					findList.append(item->text());
+					replaceList.append(replaceItem->text());
+				}
+			}
+		}
+
+		if (!findList.isEmpty())
+		{
+			setting.setValue("find", findList);
+			setting.setValue("replace", replaceList);
+
+			ui.statusBar->showMessage(tr("Export File finished !"), 10000);
+		}
+		else
+		{
+			ui.statusBar->showMessage(tr("No Content to Export !"), 10000);
+		}
+	}
+}
+
+void BatchFindReplace::on_import()
+{
+	QFileDialog fd(this, QString(), CCNotePad::s_lastOpenDirPath);
+	fd.setFileMode(QFileDialog::ExistingFile);
+
+	if (fd.exec() == QDialog::Accepted)   //如果成功的执行
+	{
+		QStringList fileNameList = fd.selectedFiles();      //返回文件列表的名称
+		QFileInfo fi(fileNameList[0]);
+
+		QSettings setting(fi.filePath(), QSettings::IniFormat);
+		setting.setIniCodec("UTF-8");
+
+		ui.findKeywordEdit->setPlainText(setting.value("find").toStringList().join(" "));
+		ui.replaceKeywordEdit->setPlainText(setting.value("replace").toStringList().join(" "));
+
+		on_freshBtClick();
+	}
+	else
+	{
+		fd.close();
+	}
+}
+
+void  BatchFindReplace::on_mark()
+{
+	if (m_mainNotepad != nullptr)
+	{
+		int rowNums = ui.findReplaceTable->rowCount();
+		if (rowNums == 0)
+		{
+			return;
+		}
+
+		int markTimes = 0;
+
+		ProgressWin* loadFileProcessWin = new ProgressWin(this);
+
+		loadFileProcessWin->setWindowModality(Qt::WindowModal);
+
+		loadFileProcessWin->info(tr("total %1 keyword, please wait ...").arg(rowNums));
+
+		loadFileProcessWin->setTotalSteps(rowNums);
+
+		loadFileProcessWin->show();
+
+		for (int i = 0; i < rowNums; ++i)
+		{
+			QTableWidgetItem* item = ui.findReplaceTable->item(i, 0);
+			if (item != nullptr && !item->text().isEmpty())
+			{
+				if (loadFileProcessWin->isCancel())
+				{
+					break;
+				}
+
+				markTimes += m_mainNotepad->markAtBack(item->text());
+
+				loadFileProcessWin->moveStep();
+
+				QCoreApplication::processEvents();
+			}
+		}
+
+		delete loadFileProcessWin;
+		ui.statusBar->showMessage(tr("Batch Mark Finished, total Mark %1 times !").arg(markTimes), 10000);
+	}
+}
+
+void BatchFindReplace::on_clearMark()
+{
+	if (m_mainNotepad != nullptr)
+	{
+		m_mainNotepad->slot_clearMark();
+	}
+}

+ 43 - 0
src/batchfindreplace.h

@@ -0,0 +1,43 @@
+#pragma once
+
+#include <QMainWindow>
+#include <QTabWidget>
+#include "ui_batchfindreplace.h"
+
+class CCNotePad;
+
+class BatchFindReplace : public QMainWindow
+{
+	Q_OBJECT
+
+public:
+	BatchFindReplace(QWidget *parent = nullptr);
+	virtual ~BatchFindReplace();
+	void setTabWidget(QTabWidget* editTabWidget);
+
+private slots:
+	void on_freshBtClick();
+	void on_findBtClick();
+	void on_replaceBtClick();
+	void on_swapFindReplace();
+	void on_export();
+	void on_import();
+	void on_mark();
+	void on_clearMark();
+
+private:
+	bool tranInputKeyword(QString& keyWord, QStringList& outputKeyWordList);
+	void appendToFindReplaceTable(QStringList& findKeyword);
+	void appendToFindTable(QString findKeyword);
+	void insertToReplaceTable(int row, QString replaceKeyword);
+	void insertToFindReplaceTable(QStringList& replaceKeyword);
+
+	QWidget* autoAdjustCurrentEditWin();
+private:
+	Ui::BatchFindReplaceClass ui;
+
+	QTabWidget* m_editTabWidget;
+	QWidget* m_curEditWin;
+
+	CCNotePad* m_mainNotepad;
+};

+ 319 - 0
src/batchfindreplace.ui

@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>BatchFindReplaceClass</class>
+ <widget class="QMainWindow" name="BatchFindReplaceClass">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>902</width>
+    <height>737</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>BatchFindReplace</string>
+  </property>
+  <widget class="QWidget" name="centralWidget">
+   <layout class="QVBoxLayout" name="verticalLayout_3">
+    <property name="leftMargin">
+     <number>3</number>
+    </property>
+    <property name="topMargin">
+     <number>6</number>
+    </property>
+    <property name="rightMargin">
+     <number>3</number>
+    </property>
+    <property name="bottomMargin">
+     <number>3</number>
+    </property>
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout_2">
+      <item>
+       <layout class="QVBoxLayout" name="verticalLayout">
+        <item>
+         <widget class="QLabel" name="label">
+          <property name="text">
+           <string>Enter multiple find keywords, separated by blank characters</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPlainTextEdit" name="findKeywordEdit"/>
+        </item>
+       </layout>
+      </item>
+      <item>
+       <layout class="QVBoxLayout" name="verticalLayout_2">
+        <item>
+         <widget class="QLabel" name="label_2">
+          <property name="text">
+           <string>Enter multiple Replace keywords, separated by blank characters</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPlainTextEdit" name="replaceKeywordEdit"/>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <widget class="QTableWidget" name="findReplaceTable">
+      <attribute name="horizontalHeaderVisible">
+       <bool>true</bool>
+      </attribute>
+      <column>
+       <property name="text">
+        <string>Keyword</string>
+       </property>
+      </column>
+      <column>
+       <property name="text">
+        <string>Replace</string>
+       </property>
+      </column>
+     </widget>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <item>
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item>
+       <widget class="QPushButton" name="freshBt">
+        <property name="text">
+         <string>Fresh</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="swapBt">
+        <property name="text">
+         <string>swap</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="findBt">
+        <property name="text">
+         <string>Find</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="replaceBt">
+        <property name="text">
+         <string>Replace</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="markBt">
+        <property name="text">
+         <string>Mark</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton">
+        <property name="text">
+         <string>ClearMark</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="importBt">
+        <property name="text">
+         <string>Import</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="exportBt">
+        <property name="text">
+         <string>Export</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <spacer name="horizontalSpacer_2">
+        <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>
+   </layout>
+  </widget>
+  <widget class="QToolBar" name="mainToolBar">
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+  </widget>
+  <widget class="QStatusBar" name="statusBar"/>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>freshBt</sender>
+   <signal>clicked()</signal>
+   <receiver>BatchFindReplaceClass</receiver>
+   <slot>on_freshBtClick()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>204</x>
+     <y>710</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>218</x>
+     <y>703</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>findBt</sender>
+   <signal>clicked()</signal>
+   <receiver>BatchFindReplaceClass</receiver>
+   <slot>on_findBtClick()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>366</x>
+     <y>710</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>426</x>
+     <y>736</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>replaceBt</sender>
+   <signal>clicked()</signal>
+   <receiver>BatchFindReplaceClass</receiver>
+   <slot>on_replaceBtClick()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>447</x>
+     <y>710</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>530</x>
+     <y>709</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>swapBt</sender>
+   <signal>clicked()</signal>
+   <receiver>BatchFindReplaceClass</receiver>
+   <slot>on_swapFindReplace()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>285</x>
+     <y>710</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>378</x>
+     <y>736</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>importBt</sender>
+   <signal>clicked()</signal>
+   <receiver>BatchFindReplaceClass</receiver>
+   <slot>on_import()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>690</x>
+     <y>710</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>687</x>
+     <y>736</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>exportBt</sender>
+   <signal>clicked()</signal>
+   <receiver>BatchFindReplaceClass</receiver>
+   <slot>on_export()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>771</x>
+     <y>710</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>799</x>
+     <y>698</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>markBt</sender>
+   <signal>clicked()</signal>
+   <receiver>BatchFindReplaceClass</receiver>
+   <slot>on_mark()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>528</x>
+     <y>710</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>584</x>
+     <y>742</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>pushButton</sender>
+   <signal>clicked()</signal>
+   <receiver>BatchFindReplaceClass</receiver>
+   <slot>on_clearMark()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>577</x>
+     <y>693</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>570</x>
+     <y>746</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+ <slots>
+  <slot>on_freshBtClick()</slot>
+  <slot>on_findBtClick()</slot>
+  <slot>on_replaceBtClick()</slot>
+  <slot>on_swapFindReplace()</slot>
+  <slot>on_import()</slot>
+  <slot>on_export()</slot>
+  <slot>on_mark()</slot>
+  <slot>on_clearMark()</slot>
+ </slots>
+</ui>

+ 39 - 0
src/bigfilemessage.cpp

@@ -0,0 +1,39 @@
+#include "bigfilemessage.h"
+
+BigFileMessage::BigFileMessage(QWidget *parent)
+	: QDialog(parent), m_result(-1)
+{
+	ui.setupUi(this);
+}
+
+BigFileMessage::~BigFileMessage()
+{}
+
+
+void BigFileMessage::setTip(QString msg)
+{
+	ui.label->setText(msg);
+}
+
+void BigFileMessage::slot_okBt()
+{
+	if (ui.textMode->isChecked())
+	{
+		m_result = 0;
+	}
+	else if(ui.bigTextMode->isChecked())
+	{
+		m_result = 1;
+	}
+	else if (ui.hexMode->isChecked())
+	{
+		m_result = 2;
+	}
+	done(m_result);
+}
+
+void BigFileMessage::slot_cancelBt()
+{
+	m_result = -1;
+	done(m_result);
+}

+ 23 - 0
src/bigfilemessage.h

@@ -0,0 +1,23 @@
+#pragma once
+
+#include <QWidget>
+#include <QDialog>
+#include "ui_bigfilemessage.h"
+
+class BigFileMessage : public QDialog
+{
+	Q_OBJECT
+
+public:
+	BigFileMessage(QWidget *parent = nullptr);
+	~BigFileMessage();
+	void setTip(QString msg);
+
+private slots:
+	void slot_okBt();
+	void slot_cancelBt();
+
+private:
+	Ui::BigFileMessageClass ui;
+	int m_result;
+};

+ 163 - 0
src/bigfilemessage.ui

@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>BigFileMessageClass</class>
+ <widget class="QDialog" name="BigFileMessageClass">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>509</width>
+    <height>203</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>BigFileMessage</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="leftMargin">
+    <number>3</number>
+   </property>
+   <property name="topMargin">
+    <number>3</number>
+   </property>
+   <property name="rightMargin">
+    <number>3</number>
+   </property>
+   <property name="bottomMargin">
+    <number>6</number>
+   </property>
+   <item>
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>TextLabel</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Open Mode</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0">
+       <widget class="QRadioButton" name="textMode">
+        <property name="text">
+         <string>Text Mode</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLabel" name="label_2">
+        <property name="text">
+         <string>Open directly in text mode.May be slow, Need wait.</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QRadioButton" name="bigTextMode">
+        <property name="text">
+         <string>Big Text</string>
+        </property>
+        <property name="checked">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLabel" name="label_3">
+        <property name="text">
+         <string>Read only open, load in blocks, and turn pages manually.</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QRadioButton" name="hexMode">
+        <property name="text">
+         <string>Hex Bin</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QLabel" name="label_4">
+        <property name="text">
+         <string>Binary Open,load in blocks, and turn pages manually.</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="okBt">
+       <property name="text">
+        <string>Ok</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="cancelBt">
+       <property name="text">
+        <string>Cancel</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>okBt</sender>
+   <signal>clicked()</signal>
+   <receiver>BigFileMessageClass</receiver>
+   <slot>slot_okBt()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>359</x>
+     <y>168</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>284</x>
+     <y>193</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>cancelBt</sender>
+   <signal>clicked()</signal>
+   <receiver>BigFileMessageClass</receiver>
+   <slot>slot_cancelBt()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>448</x>
+     <y>176</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>446</x>
+     <y>196</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+ <slots>
+  <slot>slot_okBt()</slot>
+  <slot>slot_cancelBt()</slot>
+ </slots>
+</ui>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 486 - 152
src/cceditor/ccnotepad.cpp


+ 64 - 17
src/cceditor/ccnotepad.h

@@ -13,6 +13,7 @@
 #include <QTranslator>
 #include <QTimer>
 #include <QSettings>
+#include <QListWidgetItem>
 
 #include "rcglobal.h"
 #include "ui_ccnotepad.h"
@@ -20,6 +21,7 @@
 #include "extlexermanager.h"
 #include "scintillaeditview.h"
 #include "findwin.h"
+#include "pluginGl.h"
 
 
 //class ScintillaEditView;
@@ -32,15 +34,6 @@ class CompareWin;
 struct HexFileMgr;
 struct TextFileMgr;
 
-#define uos 1
-
-#ifdef Q_OS_WIN
-#undef uos
-#endif
-
-#ifdef Q_OS_MAC
-#undef uos
-#endif
 
 enum OpenAttr {
 	Text = 1,
@@ -69,7 +62,7 @@ enum LINE_SORT_TYPE {
 
 //打开模式。1 文本 2 二进制 3 大文本只读 4 文本只读
 //const char* Open_Attr = "openid";
-
+class FileListView;
 
 class CCNotePad : public QMainWindow
 {
@@ -127,8 +120,18 @@ public:
 	void getCurUseLexerTags(QVector<QString>& tag);
 
 	void clearHighlightWord(QString signWord, ScintillaEditView* pEdit = nullptr);
-
-
+	bool closeFileByEditWidget(QWidget* pEdit);
+	void showChangePageTips(QWidget* pEdit);
+	int markAtBack(QString keyword);
+	int findAtBack(QString keyword);
+	int replaceAtBack(QStringList& keyword, QStringList& replace);
+	void updateThemes();
+
+	void setGlobalFgColor(int style);
+	void setGlobalBgColor(int style);
+	void setGlobalFont(int style);
+
+	void changeMarkColor(int sytleId);
 signals:
 	void signSendRegisterKey(QString key);
 	void signRegisterReplay(int code);
@@ -146,6 +149,7 @@ public slots:
 	void slot_actionCloseLeftAll();
 	void slot_actionCloseRightAll();
 	void slot_quit(bool);
+
 	void slot_closeAllFile(bool);
 	void slot_batch_convert();
 	void slot_batch_rename();
@@ -160,6 +164,9 @@ public slots:
 
 	void slot_clearWordHighlight();
 	void slot_clearMark();
+	void slot_zoomValueChange();
+
+
 protected:
 	void closeEvent(QCloseEvent *event) override;
 	void dragEnterEvent(QDragEnterEvent* event) override;
@@ -239,7 +246,7 @@ private slots:
 	void slot_aboutNdd();
 	void slot_fileChange(QString filePath);
 	void slot_tabBarDoubleClicked(int index);
-	void slot_toLightBlueStyle();
+	/*void slot_toLightBlueStyle();
 	void slot_toDefaultStyle();
 	void slot_toThinBlueStyle();
 	void slot_toRiceYellow();
@@ -247,7 +254,7 @@ private slots:
 	void slot_toSilverStyle();
 	void slot_toDarkStyle();
 	void slot_toLavenderBlush();
-	void slot_toMistyRose();
+	void slot_toMistyRose();*/
 	void slot_register();
 
 	void slot_slectionChanged();
@@ -258,7 +265,7 @@ private slots:
 	void slot_tabFormatChange(bool tabLenChange, bool useTabChange);
 	void slot_searchResultShow();
 	void slot_saveFile(QString fileName, ScintillaEditView * pEdit);
-	void slot_skinStyleGroup(QAction * action);
+	/*void slot_skinStyleGroup(QAction * action);*/
 	void slot_changeIconSize(QAction * action);
 	void slot_langFormat();
 
@@ -312,6 +319,16 @@ private slots:
 	void slot_markColorGroup(QAction * action);
 	void slot_loadMarkColor();
 	void slot_saveSearchHistory();
+	void slot_fileListView(bool check);
+	void slot_fileListItemDoubleClick(QListWidgetItem* item);
+	void slot_showToolBar(bool);
+	void slot_dynamicLoadToolMenu();
+	void slot_batchFind();
+	void slot_pluginMgr();
+	void slot_showWebAddr(bool check);
+	void onPlugWork(bool check);
+
+
 private:
 	void initFindResultDockWin();
 	void enableEditTextChangeSign(ScintillaEditView * pEdit);
@@ -392,8 +409,19 @@ private:
 
 	void registerEscKeyShort(QWidget * parent);
 	void closeAllFileWhenQuit(bool isQuit=false);
-
-
+	void initFileListDockWin();
+	void addFileListView(QString file, QWidget* pw);
+	void delFileListView(QString file);
+	void fileListSetCurItem(QString filePath);
+	void syncFileTabToListView();
+	void setZoomLabelValue(int zoomValue);
+	void zoomto(int zoomValue);
+	void tabClose(QWidget* pEdit);
+
+	void init_toolsMenu();
+	void loadPluginLib();
+	void loadPluginProcs(QString strLibDir, QMenu* pMenu);
+	void onPlugFound(NDD_PROC_DATA& procData, QMenu* pUserData);
 private:
 	Ui::CCNotePad ui;
 
@@ -401,12 +429,16 @@ private:
 	QLabel* m_lineEndLabel;
 	QLabel* m_lineNumLabel;
 	QLabel* m_langDescLabel;
+	QLabel* m_zoomLabel;
 
 	QMenu* m_tabRightClickMenu;
 
 	QDockWidget* m_dockSelectTreeWin;
 	FindResultWin* m_pResultWin;
 
+	QPointer<QDockWidget> m_dockFileListWin;
+	FileListView* m_fileListView;
+
 	//一个用于查找,一个用于排序
 	QMap <QString,QAction*> m_receneOpenFile;
 	QList<QString> m_receneOpenFileList;
@@ -431,6 +463,7 @@ private:
 	QString m_cmpRightFilePath;
 
 	QPointer<QMainWindow> m_pFindWin;
+	QPointer <QWidget> m_columnEditWin;
 
 	QSharedMemory* m_shareMem;
 
@@ -506,12 +539,26 @@ private:
 	QToolButton* m_transcode;
 	QToolButton* m_rename;
 
+
+	QPointer<QMainWindow> m_batchFindWin;
+
 	int m_curIconSize;
 	int m_curColorIndex;
+
+	bool m_isInReloadFile;
+
+	bool m_isToolMenuLoaded;
+
+	bool m_isInitBookMarkAct;
+
+	QList<QAction*>m_styleMarkActList;
+	QList<NDD_PROC_DATA> m_pluginList;
+
 public:
 		static QString s_lastOpenDirPath;
 	static int s_restoreLastFile; //自动恢复上次打开的文件
 	static int s_curStyleId;
 	static int s_curMarkColorId;
+	static int s_hightWebAddr;//高亮网页地址
 };
 

+ 56 - 164
src/cceditor/ccnotepad.ui

@@ -224,8 +224,11 @@
     </widget>
     <addaction name="menudisplay_symbols"/>
     <addaction name="actionSearch_Result"/>
-    <addaction name="actionWrap"/>
     <addaction name="menuIcon_Size"/>
+    <addaction name="actionWrap"/>
+    <addaction name="actionFileListView"/>
+    <addaction name="actionShow_ToolBar"/>
+    <addaction name="actionShow_Web_Addr"/>
    </widget>
    <widget class="QMenu" name="menuCode">
     <property name="title">
@@ -466,20 +469,6 @@
     <property name="title">
      <string>Set(&amp;T)</string>
     </property>
-    <widget class="QMenu" name="menuStyle">
-     <property name="title">
-      <string>Style</string>
-     </property>
-     <addaction name="actionDefaultStyle"/>
-     <addaction name="actionLightBlueStyle"/>
-     <addaction name="actionThinBlue"/>
-     <addaction name="actionYellow"/>
-     <addaction name="actionRiceYellow"/>
-     <addaction name="actionSilver"/>
-     <addaction name="actionLavenderBlush"/>
-     <addaction name="actionMistyRose"/>
-     <addaction name="actionDark"/>
-    </widget>
     <widget class="QMenu" name="menuLanguage_2">
      <property name="title">
       <string>Language</string>
@@ -487,20 +476,10 @@
      <addaction name="actionChinese"/>
      <addaction name="actionEnglish"/>
     </widget>
-    <widget class="QMenu" name="menuFormat_Language">
-     <property name="title">
-      <string>Format Language</string>
-     </property>
-     <addaction name="actionFormat_Xml"/>
-     <addaction name="actionFormat_Json"/>
-    </widget>
     <addaction name="actionOptions"/>
-    <addaction name="menuStyle"/>
     <addaction name="menuLanguage_2"/>
     <addaction name="actionLanguage_Format"/>
     <addaction name="actionDefine_Language"/>
-    <addaction name="separator"/>
-    <addaction name="menuFormat_Language"/>
    </widget>
    <widget class="QMenu" name="menuAbout">
     <property name="title">
@@ -515,6 +494,11 @@
     </property>
     <addaction name="actioninfo"/>
    </widget>
+   <widget class="QMenu" name="menuTools">
+    <property name="title">
+     <string>Tools(&amp;O)</string>
+    </property>
+   </widget>
    <addaction name="menuFile"/>
    <addaction name="menuEdit"/>
    <addaction name="menuSearch"/>
@@ -522,6 +506,7 @@
    <addaction name="menuCode"/>
    <addaction name="menuLanguage"/>
    <addaction name="menuSet"/>
+   <addaction name="menuTools"/>
    <addaction name="menuAbout"/>
    <addaction name="menuAbout_2"/>
   </widget>
@@ -2007,6 +1992,38 @@
     <string>Clear History</string>
    </property>
   </action>
+  <action name="actionFileListView">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>FileListView</string>
+   </property>
+  </action>
+  <action name="actionShow_ToolBar">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="checked">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Show ToolBar</string>
+   </property>
+  </action>
+  <action name="actionBatch_Find">
+   <property name="text">
+    <string>Batch Find</string>
+   </property>
+  </action>
+  <action name="actionShow_Web_Addr">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Show Web Addr(Not recommended)</string>
+   </property>
+  </action>
  </widget>
  <layoutdefault spacing="6" margin="11"/>
  <resources>
@@ -2637,134 +2654,6 @@
     </hint>
    </hints>
   </connection>
-  <connection>
-   <sender>actionDefaultStyle</sender>
-   <signal>triggered()</signal>
-   <receiver>CCNotePad</receiver>
-   <slot>slot_toDefaultStyle()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>554</x>
-     <y>379</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>actionLightBlueStyle</sender>
-   <signal>triggered()</signal>
-   <receiver>CCNotePad</receiver>
-   <slot>slot_toLightBlueStyle()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>554</x>
-     <y>379</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>actionThinBlue</sender>
-   <signal>triggered()</signal>
-   <receiver>CCNotePad</receiver>
-   <slot>slot_toThinBlueStyle()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>554</x>
-     <y>379</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>actionRiceYellow</sender>
-   <signal>triggered()</signal>
-   <receiver>CCNotePad</receiver>
-   <slot>slot_toRiceYellow()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>554</x>
-     <y>379</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>actionYellow</sender>
-   <signal>triggered()</signal>
-   <receiver>CCNotePad</receiver>
-   <slot>slot_toYellow()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>554</x>
-     <y>379</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>actionSilver</sender>
-   <signal>triggered()</signal>
-   <receiver>CCNotePad</receiver>
-   <slot>slot_toSilverStyle()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>554</x>
-     <y>379</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>actionLavenderBlush</sender>
-   <signal>triggered()</signal>
-   <receiver>CCNotePad</receiver>
-   <slot>slot_toLavenderBlush()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>554</x>
-     <y>379</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>actionMistyRose</sender>
-   <signal>triggered()</signal>
-   <receiver>CCNotePad</receiver>
-   <slot>slot_toMistyRose()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>554</x>
-     <y>379</y>
-    </hint>
-   </hints>
-  </connection>
   <connection>
    <sender>actionEnglish</sender>
    <signal>triggered()</signal>
@@ -3454,10 +3343,10 @@
    </hints>
   </connection>
   <connection>
-   <sender>actionFormat_Xml</sender>
+   <sender>actionClear_History</sender>
    <signal>triggered()</signal>
    <receiver>CCNotePad</receiver>
-   <slot>slot_formatXml()</slot>
+   <slot>slot_clearHistoryOpenList()</slot>
    <hints>
     <hint type="sourcelabel">
      <x>-1</x>
@@ -3470,10 +3359,10 @@
    </hints>
   </connection>
   <connection>
-   <sender>actionFormat_Json</sender>
-   <signal>triggered()</signal>
+   <sender>actionFileListView</sender>
+   <signal>triggered(bool)</signal>
    <receiver>CCNotePad</receiver>
-   <slot>slot_formatJson()</slot>
+   <slot>slot_fileListView(bool)</slot>
    <hints>
     <hint type="sourcelabel">
      <x>-1</x>
@@ -3486,10 +3375,10 @@
    </hints>
   </connection>
   <connection>
-   <sender>actionDark</sender>
-   <signal>triggered()</signal>
+   <sender>actionShow_ToolBar</sender>
+   <signal>triggered(bool)</signal>
    <receiver>CCNotePad</receiver>
-   <slot>slot_toDarkStyle()</slot>
+   <slot>slot_showToolBar(bool)</slot>
    <hints>
     <hint type="sourcelabel">
      <x>-1</x>
@@ -3502,10 +3391,10 @@
    </hints>
   </connection>
   <connection>
-   <sender>actionClear_History</sender>
-   <signal>triggered()</signal>
+   <sender>actionShow_Web_Addr</sender>
+   <signal>triggered(bool)</signal>
    <receiver>CCNotePad</receiver>
-   <slot>slot_clearHistoryOpenList()</slot>
+   <slot>slot_showWebAddr(bool)</slot>
    <hints>
     <hint type="sourcelabel">
      <x>-1</x>
@@ -3615,5 +3504,8 @@
   <slot>slot_allWhite(bool)</slot>
   <slot>slot_toDarkStyle()</slot>
   <slot>slot_clearHistoryOpenList()</slot>
+  <slot>slot_fileListView(bool)</slot>
+  <slot>slot_showToolBar(bool)</slot>
+  <slot>slot_showWebAddr(bool)</slot>
  </slots>
 </ui>

+ 20 - 3
src/cceditor/filemanager.cpp

@@ -18,9 +18,9 @@ FileManager::~FileManager()
 {
 }
 
-ScintillaEditView* FileManager::newEmptyDocument()
+ScintillaEditView* FileManager::newEmptyDocument(bool isBigText)
 {
-	ScintillaEditView* pEdit = new ScintillaEditView(nullptr);
+	ScintillaEditView* pEdit = new ScintillaEditView(nullptr, isBigText);
 	return pEdit;
 }
 
@@ -500,6 +500,7 @@ int  FileManager::loadFilePreNextPage(int dir, QString& filePath, HexFileMgr* &
 const int ONE_PAGE_TEXT_SIZE = 200 * 1024;
 
 //加载下一页或者上一页。(文本模式)
+//返回值:0表示成功
 int  FileManager::loadFilePreNextPage(int dir, QString& filePath, TextFileMgr* & textFileOut)
 {
 	if (m_bigTxtFileMgr.contains(filePath))
@@ -802,7 +803,7 @@ bool FileManager::loadFileData(QString filePath, HexFileMgr* & hexFileOut)
 }
 
 //加载大文本文件。从0开始读取ONE_PAGE_TEXT_SIZE 500K的内容
-bool FileManager::loadFileData(QString filePath, TextFileMgr* & textFileOut)
+bool FileManager::loadFileData(QString filePath, TextFileMgr* & textFileOut, RC_LINE_FORM & lineEnd)
 {
 	QFile *file = new QFile(filePath);
 
@@ -834,6 +835,22 @@ bool FileManager::loadFileData(QString filePath, TextFileMgr* & textFileOut)
 		{
 			//给后面的字符填\0,让字符串正常结尾\0
 			buf[ret - preLineEndPos] = '\0';
+
+			if (ret - preLineEndPos >= 2)
+			{
+				if (buf[ret - preLineEndPos - 1] == '\n' && buf[ret - preLineEndPos - 2] == '\r')
+				{
+					lineEnd = DOS_LINE;
+		}
+				else if (buf[ret - preLineEndPos - 1] == '\n')
+				{
+					lineEnd = UNIX_LINE;
+				}
+				else if (buf[ret - preLineEndPos - 1] == '\r')
+				{
+					lineEnd = MAC_LINE;
+				}
+			}
 		}
 
 		TextFileMgr* txtFile = nullptr;

+ 2 - 2
src/cceditor/filemanager.h

@@ -96,7 +96,7 @@ class FileManager:public QObject
 {
 	Q_OBJECT
 public:
-	ScintillaEditView* newEmptyDocument();
+	ScintillaEditView* newEmptyDocument(bool isBigText = false);
 
 	ScintillaHexEditView * newEmptyHexDocument();
 
@@ -122,7 +122,7 @@ public:
 
 	bool loadFileData(QString filePath, HexFileMgr * & hexFileOut);
 
-	bool loadFileData(QString filePath, TextFileMgr *& textFileOut);
+	bool loadFileData(QString filePath, TextFileMgr *& textFileOut, RC_LINE_FORM & lineEnd);
 
 	HexFileMgr* getHexFileHand(QString filepath);
 

+ 66 - 4
src/columnedit.cpp

@@ -7,6 +7,7 @@ ColumnEdit::ColumnEdit(QWidget *parent)
 	ui.setupUi(this);
 
 	connect(ui.addPrefix, &QCheckBox::stateChanged, this, &ColumnEdit::slot_addPrefix);
+	connect(ui.is16, &QRadioButton::clicked, this, &ColumnEdit::slot_bigChar);
 }
 
 ColumnEdit::~ColumnEdit()
@@ -48,6 +49,11 @@ void ColumnEdit::slot_addPrefix(int s)
 	}
 }
 
+void ColumnEdit::slot_bigChar(bool isCheck)
+{
+	ui.capital->setEnabled(isCheck);
+}
+
 //自动调整当前窗口的状态
 QWidget* ColumnEdit::autoAdjustCurrentEditWin()
 {
@@ -83,8 +89,9 @@ void ColumnEdit::slot_ok()
 	int initNum = 0;
 	int inc = ui.incNum->value();
 	int repeNum = ui.repeNum->value();
-	bool addPrefix = ui.addPrefix->isChecked();
+	bool isAddPrefix = ui.addPrefix->isChecked();
 	QString prefix = ui.prefix->text();
+	bool isCapital = ui.capital->isChecked();
 
 	//是插入文本模式
 	if (ui.textGroupBox->isChecked())
@@ -124,13 +131,14 @@ void ColumnEdit::slot_ok()
 		{
 			text = QString::number(num, numType);
 
-			if (addPrefix)
+			if (isAddPrefix)
 			{
 				text = prefix + text;
 			}
 		}
 		else
 		{
+			//这里要加个提示
 			QApplication::beep();
 			return;
 		}
@@ -138,6 +146,45 @@ void ColumnEdit::slot_ok()
 
 	pEdit->execute(SCI_BEGINUNDOACTION);
 
+	if (ui.textGroupBox->isChecked())
+	{
+		if (pEdit->execute(SCI_SELECTIONISRECTANGLE) || pEdit->execute(SCI_GETSELECTIONS) > 1)
+		{
+			ColumnModeInfos colInfos = pEdit->getColumnModeSelectInfo();
+			std::sort(colInfos.begin(), colInfos.end(), SortInPositionOrder());
+
+			QByteArray bytes = text.toUtf8();
+			pEdit->columnReplace(colInfos, bytes);
+			std::sort(colInfos.begin(), colInfos.end(), SortInSelectOrder());
+			pEdit->setMultiSelections(colInfos);
+
+			return;
+		}
+	}
+	else
+	{
+		if (pEdit->execute(SCI_SELECTIONISRECTANGLE) || pEdit->execute(SCI_GETSELECTIONS) > 1)
+		{
+			ColumnModeInfos colInfos = pEdit->getColumnModeSelectInfo();
+
+			// If there is no column mode info available, no need to do anything
+			// If required a message can be shown to user, that select column properly or something similar
+			if (colInfos.size() > 0)
+			{
+				std::sort(colInfos.begin(), colInfos.end(), SortInPositionOrder());
+				QByteArray bytes;
+				if (isAddPrefix)
+				{
+					bytes = prefix.toUtf8();
+				}
+				pEdit->columnReplace(colInfos, initNum, inc, repeNum, numType, isCapital, bytes);
+				std::sort(colInfos.begin(), colInfos.end(), SortInSelectOrder());
+				pEdit->setMultiSelections(colInfos);
+			}
+			return;
+		}
+	}
+
 	auto cursorPos = pEdit->execute(SCI_GETCURRENTPOS);
 	auto cursorCol = pEdit->execute(SCI_GETCOLUMN, cursorPos);
 	auto cursorLine = pEdit->execute(SCI_LINEFROMPOSITION, cursorPos);
@@ -196,10 +243,25 @@ void ColumnEdit::slot_ok()
 
 			}
 			
+
+			if (numType != 16)
+			{
 			text = QString::number(initNum, numType);
+			}
+			else
+			{
+				if (isCapital)
+				{
+					text = QString::number(initNum, numType).toUpper();
+				}
+				else
+				{
+					text = QString::number(initNum, numType);
+				}
+			}
 
 
-			if (addPrefix)
+			if (isAddPrefix)
 			{
 				text = prefix + text;
 			}
@@ -207,4 +269,4 @@ void ColumnEdit::slot_ok()
 	}
 
 	pEdit->execute(SCI_ENDUNDOACTION);
-}
+}

+ 1 - 0
src/columnedit.h

@@ -24,6 +24,7 @@ private slots:
 	void slot_insertNumEnable(bool check);
 	void slot_insertTextEnable(bool check);
 	void slot_addPrefix(int s);
+	void slot_bigChar(bool isCheck);
 	void slot_ok();
 
 private:

+ 31 - 1
src/columnedit.ui

@@ -48,7 +48,11 @@
        </property>
        <layout class="QVBoxLayout" name="verticalLayout_4">
         <item>
-         <widget class="QLineEdit" name="inputText"/>
+         <widget class="QLineEdit" name="inputText">
+          <property name="maxLength">
+           <number>1024</number>
+          </property>
+         </widget>
         </item>
        </layout>
       </widget>
@@ -260,6 +264,19 @@
              </property>
             </widget>
            </item>
+           <item>
+            <spacer name="horizontalSpacer_5">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
            <item>
             <widget class="QRadioButton" name="is16">
              <property name="text">
@@ -267,6 +284,19 @@
              </property>
             </widget>
            </item>
+           <item>
+            <widget class="QCheckBox" name="capital">
+             <property name="enabled">
+              <bool>false</bool>
+             </property>
+             <property name="text">
+              <string>Capital</string>
+             </property>
+             <property name="checked">
+              <bool>true</bool>
+             </property>
+            </widget>
+           </item>
           </layout>
          </item>
          <item>

+ 1 - 9
src/encodeconvert.cpp

@@ -97,15 +97,7 @@ void EncodeConvert::slot_itemClicked(QTreeWidgetItem* item, int /*column*/)
 				}
 
 				path = QString("%1").arg(it->data(0, Qt::ToolTipRole).toString());
-#ifdef _WIN32
-				path = path.replace("/", "\\");
-				cmd = QString("explorer.exe /select,%1").arg(path);
-#else
-				path = path.replace("\\", "/");
-				cmd = QString("open -R %1").arg(path);
-#endif
-				QProcess process;
-				process.startDetached(cmd);
+				showFileInExplorer(path);
 				});
 		}
 		m_menu->move(QCursor::pos());

+ 116 - 0
src/filelistview.cpp

@@ -0,0 +1,116 @@
+#include "filelistview.h"
+#include "rcglobal.h"
+#include "ccnotepad.h"
+#include <QListWidgetItem>
+#include <QMenu>
+
+
+//当显示文件多了以后,把所有文件列在该列表中
+
+FileListView::FileListView(QWidget *parent)
+	: QWidget(parent), m_pNotepad(nullptr)
+{
+	ui.setupUi(this);
+
+	connect(ui.filelistWidget, &QListWidget::itemDoubleClicked, this, &FileListView::itemDoubleClicked);
+
+	setContextMenuPolicy(Qt::CustomContextMenu);  //设置枚举值
+
+	connect(this, &QListWidget::customContextMenuRequested, this, &FileListView::slot_ShowPopMenu);
+}
+
+FileListView::~FileListView()
+{
+	m_fileEditMap.clear();
+}
+
+void FileListView::setNotepadWin(QWidget* pNotepad)
+{
+	m_pNotepad = pNotepad;
+}
+
+//右键菜单
+void FileListView::slot_ShowPopMenu(const QPoint& pos)
+{
+	QListWidgetItem* curItem = ui.filelistWidget->itemAt(pos);
+	if (curItem != nullptr)
+	{
+		QMenu* menu = new QMenu(this);
+
+		QAction* actionAdd = menu->addAction(tr("Show File in Explorer"), this, [&]() {
+			showFileInExplorer(curItem->text());
+		});
+
+		menu->addAction(tr("Close File"), this, [&]() {
+
+			QString filePath = curItem->text();
+
+			if (m_fileEditMap.contains(filePath))
+			{
+				CCNotePad* pNotePad = dynamic_cast<CCNotePad*>(m_pNotepad);
+
+				if (m_pNotepad != nullptr)
+				{
+					pNotePad->closeFileByEditWidget(m_fileEditMap.value(curItem->text()).pEditWidget);
+				}
+				//注意这里不需要在删除m_fileEditMap元素,因为closeFileByEditWidget里面会调用。
+			}
+		});
+
+		//没有名称表示是对齐的item,不存在对应的文件,只是占位
+		if (curItem->text().isEmpty())
+		{
+			actionAdd->setEnabled(false);
+		}
+
+		if (menu)
+		{
+			menu->setAttribute(Qt::WA_DeleteOnClose);
+			menu->exec(QCursor::pos());
+		}
+	}
+}
+
+void FileListView::delFileItem(QString & filePath)
+{
+	if (m_fileEditMap.contains(filePath))
+	{
+		m_fileEditMap.remove(filePath);
+		QList<QListWidgetItem*> items = ui.filelistWidget->findItems(filePath, Qt::MatchFixedString);
+
+		if (!items.isEmpty())
+		{
+			delete items.at(0);
+		}
+
+	}
+}
+
+QWidget* FileListView::getWidgetByFilePath(QString filePath)
+{
+	if (m_fileEditMap.contains(filePath))
+	{
+		return m_fileEditMap.value(filePath).pEditWidget;
+	}
+	return nullptr;
+}
+
+void FileListView::setCurItem(QString filePath)
+{
+	if (m_fileEditMap.contains(filePath))
+	{
+		ui.filelistWidget->setCurrentItem(m_fileEditMap.value(filePath).pListItem);
+	}
+}
+
+void FileListView::addFileItem(QString& filePath, QWidget* edit)
+{
+	if (!m_fileEditMap.contains(filePath))
+	{
+		QListWidgetItem* newItem = new QListWidgetItem(filePath);
+		ui.filelistWidget->addItem(newItem);
+
+		m_fileEditMap.insert(filePath, FileListItemData(edit, newItem));
+	}
+}
+

+ 48 - 0
src/filelistview.h

@@ -0,0 +1,48 @@
+#pragma once
+
+#include <QWidget>
+#include <QListWidgetItem>
+
+#include "ui_filelistview.h"
+
+struct FileListItemData {
+	QWidget* pEditWidget;
+	QListWidgetItem* pListItem;
+
+	FileListItemData() = default;
+	FileListItemData(QWidget* pwid, QListWidgetItem* pItem) :pEditWidget(pwid),pListItem(pItem)
+	{
+
+	}
+};
+
+class FileListView : public QWidget
+{
+	Q_OBJECT
+
+public:
+	FileListView(QWidget *parent = nullptr);
+	virtual ~FileListView();
+
+	void setNotepadWin(QWidget* pNotepad);
+
+	void delFileItem(QString & filePath);
+
+	QWidget* getWidgetByFilePath(QString filePath);
+
+	void addFileItem(QString& filePath, QWidget* edit);
+
+	void setCurItem(QString filePath);
+signals:
+	void itemDoubleClicked(QListWidgetItem* item);
+
+private slots:
+	void slot_ShowPopMenu(const QPoint& pos);
+
+private:
+	Ui::FileListViewClass ui;
+
+	QWidget* m_pNotepad;
+
+	QMap<QString, FileListItemData> m_fileEditMap;
+};

+ 43 - 0
src/filelistview.ui

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>FileListViewClass</class>
+ <widget class="QWidget" name="FileListViewClass">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>550</width>
+    <height>693</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>FileListView</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <property name="horizontalSpacing">
+    <number>1</number>
+   </property>
+   <property name="verticalSpacing">
+    <number>3</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QListWidget" name="filelistWidget"/>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>

+ 92 - 7
src/findresultwin.cpp

@@ -373,11 +373,24 @@ void FindResultWin::highlightFindText(int index, QString &srcText, QString &find
 	srcText.replace(pos, lens, QString("<font style='background-color:#ffffbf'>%1</font>").arg(srcText.mid(pos,lens)));
 }
 
+const int MAX_HEAD_LENTGH = 20;
+const int MAX_TAIL_LENGTH = 80;
+
 //更复杂的高亮:在全词语匹配,大小写敏感,甚至正则表达式情况下,上面的highlightFindText是不够的。需要精确定位
 QString FindResultWin::highlightFindText(FindRecord& record)
 {
 	QByteArray utf8bytes = record.lineContents.toUtf8();
 
+	int lineLens = utf8bytes.length();
+
+	bool isNeedCut = false;
+
+	//行太长的进行缩短显示
+	if (lineLens > 300)
+	{
+		isNeedCut = true;
+	}
+
 	//高亮的开始、结束位置
 	int targetStart = record.pos - record.lineStartPos;
 	int targetLens = record.end - record.pos;
@@ -386,18 +399,72 @@ QString FindResultWin::highlightFindText(FindRecord& record)
 	QString head; 
 	QString src;
 	QString tail;
-	if (BLACK_SE != StyleSet::getCurrentSytleId())
+	if (!StyleSet::isCurrentDeepStyle())
 	{
+		if (!isNeedCut)
+		{
 		head = QString(utf8bytes.mid(0, targetStart)).toHtmlEscaped();
 		src = QString("<font style='background-color:#ffffbf'>%1</font>").arg(QString(utf8bytes.mid(targetStart, targetLens)).toHtmlEscaped());
 		tail = QString(utf8bytes.mid(tailStart)).toHtmlEscaped();
 	}
 	else
 	{
-		head = QString("<font style='color:#dcdcdc'>%1</font>").arg(QString(utf8bytes.mid(0, targetStart)).toHtmlEscaped());
+			head = QString(utf8bytes.mid(0, targetStart));
+			if (head.size() > MAX_HEAD_LENTGH)
+			{
+				head = (head.mid(0, MAX_HEAD_LENTGH) + "...").toHtmlEscaped();
+			}
+			else
+			{
+				head = head.toHtmlEscaped();
+			}
 		src = QString("<font style='background-color:#ffffbf'>%1</font>").arg(QString(utf8bytes.mid(targetStart, targetLens)).toHtmlEscaped());
+			tail = QString(utf8bytes.mid(tailStart));
+			if (tail > MAX_TAIL_LENGTH)
+			{
+				tail = (tail.mid(0, MAX_TAIL_LENGTH) + "...").toHtmlEscaped();
+			}
+			else
+			{
+				tail = tail.toHtmlEscaped();
+			}
+		}
+	}
+	else
+	{
+		if (!isNeedCut)
+		{
+			head = QString("<font style='color:#dcdcdc'>%1</font>").arg(QString(utf8bytes.mid(0, targetStart)).toHtmlEscaped());
+			src = QString("<font style='font-weight:bold;color:#ffaa00'>%1</font>").arg(QString(utf8bytes.mid(targetStart, targetLens)).toHtmlEscaped());
 		tail = QString("<font style='color:#dcdcdc'>%1</font>").arg(QString(utf8bytes.mid(tailStart)).toHtmlEscaped());
 	}
+		else
+		{
+			QString headContens = QString(utf8bytes.mid(0, targetStart));
+			if (headContens.size() > MAX_HEAD_LENTGH)
+			{
+				headContens = (headContens.mid(0, MAX_HEAD_LENTGH) + "...").toHtmlEscaped();
+			}
+			else
+			{
+				headContens = headContens.toHtmlEscaped();
+			}
+
+			head = QString("<font style='color:#dcdcdc'>%1</font>").arg(headContens);
+			src = QString("<font style='font-weight:bold;color:#ffaa00'>%1</font>").arg(QString(utf8bytes.mid(targetStart, targetLens)).toHtmlEscaped());
+
+			QString tailContens = QString(utf8bytes.mid(tailStart));
+			if (tailContens > MAX_TAIL_LENGTH)
+			{
+				tailContens = (tailContens.mid(0, MAX_TAIL_LENGTH) + "...").toHtmlEscaped();
+			}
+			else
+			{
+				tailContens = tailContens.toHtmlEscaped();
+			}
+			tail = QString("<font style='color:#dcdcdc'>%1</font>").arg(tailContens);
+		}
+	}
 
 	return QString("%1%2%3").arg(head).arg(src).arg(tail);
 }
@@ -408,10 +475,20 @@ void FindResultWin::appendResultsToShow(FindRecords* record)
 	{
 		return;
 	}
+
 	QString findTitle = tr("<font style='font-weight:bold;color:#343497'>Search \"%1\" (%2 hits)</font>").arg(record->findText.toHtmlEscaped()).arg(record->records.size());
 
 	QStandardItem* titleItem = new QStandardItem(findTitle);
+
+	if (!StyleSet::isCurrentDeepStyle())
+	{
 	setItemBackground(titleItem, QColor(0xbbbbff));
+	}
+	else
+	{
+		setItemBackground(titleItem, QColor(0xd5ffd5));
+	}
+
 	m_model->insertRow(0, titleItem);
 	titleItem->setData(QVariant(true), ResultItemRoot);
 
@@ -429,11 +506,19 @@ void FindResultWin::appendResultsToShow(FindRecords* record)
 		return;
 	}
 
-	QString desc = tr("<font style='font-weight:bold;color:#309730'>%1 (%2 hits)</font>").arg(record->findFilePath.toHtmlEscaped()).arg(record->records.size());
+	QString desc;
+	if (!StyleSet::isCurrentDeepStyle())
+	{
+		desc = tr("<font style='font-weight:bold;color:#309730'>%1 (%2 hits)</font>").arg(record->findFilePath.toHtmlEscaped()).arg(record->records.size());
+	}
+	else
+	{
+		desc = tr("<font style='color:#99cc99'>%1 (%2 hits)</font>").arg(record->findFilePath.toHtmlEscaped()).arg(record->records.size());
+	}
 
 	QStandardItem* descItem = new QStandardItem(desc);
 
-	if (BLACK_SE != StyleSet::getCurrentSytleId())
+	if (!StyleSet::isCurrentDeepStyle())
 	{
 	setItemBackground(descItem, QColor(0xd5ffd5));
 	}
@@ -460,7 +545,7 @@ void FindResultWin::appendResultsToShow(FindRecords* record)
 
 		QString richText = highlightFindText(v);
 
-		QString text = tr("Line <font style='color:#ff8040'>%1</font> : %2").arg(v.lineNum + 1).arg(richText);
+		QString text = tr("<font style='color:#ff8040'>Line %1</font> : %2").arg(v.lineNum + 1).arg(richText);
 
 		QStandardItem* childItem = new QStandardItem(text);
 		childItem->setData(QVariant(v.pos), ResultItemPos);
@@ -513,7 +598,7 @@ void FindResultWin::appendResultsToShow(QVector<FindRecords*>* record, int hits,
 	
 		QStandardItem* descItem = new QStandardItem(desc);
 
-		if (BLACK_SE != StyleSet::getCurrentSytleId())
+		if (!StyleSet::isCurrentDeepStyle())
 		{
 		setItemBackground(descItem, QColor(0xd5ffd5));
 		}
@@ -542,7 +627,7 @@ void FindResultWin::appendResultsToShow(QVector<FindRecords*>* record, int hits,
 			FindRecord  v = pr->records.at(i);
 			QString richText = highlightFindText(v);
 
-			QString text = QString("Line <font style='color:#ff8040'>%1</font> : %2").arg(v.lineNum + 1).arg(richText);
+			QString text = QString("<font style='color:#ff8040'>Line %1</font> : %2").arg(v.lineNum + 1).arg(richText);
 
 			QStandardItem* childItem = new QStandardItem(text);
 			childItem->setData(QVariant(v.pos), ResultItemPos);

+ 156 - 33
src/findwin.cpp

@@ -167,7 +167,7 @@ void FindWin::setFindHistory(QList<QString>* findHistory)
 }
 
 //标记高亮所有word单词
-void FindWin::markAllWord(QString & word)
+int FindWin::markAllWord(QString & word)
 {
 	ui.markTextBox->setCurrentText(word);
 	ui.findinfilesTab->setCurrentIndex(3);
@@ -175,7 +175,7 @@ void FindWin::markAllWord(QString & word)
 	//但是好像没有一个现成的方法来判断word中的字符。暂时不做全词匹配
 	ui.markMatchWholeBox->setChecked(false);
 	ui.markMatchCaseBox->setChecked(true);
-	slot_markAll();
+	return markAll();
 }
 
 //删除行首尾的空白字符
@@ -732,7 +732,7 @@ void FindWin::findNext()
 void FindWin::findPrev()
 {
 	slot_findPrev();
-}
+	}
 
 /*处理查找时零长的问题。一定要处理,否则会死循环,因为每次都在原地查找。
 * 就是把下次查找的startpos往前一个,否则每次都从这个startpos找到自己
@@ -1014,13 +1014,101 @@ void FindWin::addCurFindRecord(ScintillaEditView* pEdit, FindRecords& recordRet,
 	recordRet.records.append(aRecord);
 }
 
-void FindWin::slot_findAllInCurDoc()
+//在后台查找
+int FindWin::findAtBack(QString keyword)
+{
+	this->setCurrentTab(FIND_TAB);
+	ui.findComboBox->setCurrentText(keyword);
+	ui.findBackwardBox->setChecked(false);
+	ui.findMatchCaseBox->setChecked(true);
+	ui.findWrapBox->setChecked(false);
+	ui.findMatchWholeBox->setChecked(false);
+	ui.findModeNormalBt->setChecked(true);
+
+	m_isStatic = true;
+	int times = findAllInCurDoc();
+	m_isStatic = false;
+
+	return times;
+}
+
+//在后台替换
+int FindWin::replaceAtBack(QStringList& keyword, QStringList& replace)
+{
+	assert(keyword.size() == replace.size());
+
+	this->setCurrentTab(REPLACE_TAB);
+
+	QWidget* pw = autoAdjustCurrentEditWin();
+	ScintillaEditView* pEdit = dynamic_cast<ScintillaEditView*>(pw);
+	if (pEdit != nullptr)
+	{
+		if (pEdit->isReadOnly())
+		{
+			ui.statusbar->showMessage(tr("The ReadOnly document does not allow replacement."), 8000);
+			QApplication::beep();
+			return 0;
+		}
+	}
+
+	ui.replaceBackwardBox->setChecked(false);
+	ui.replaceMatchWholeBox->setChecked(false);
+	ui.replaceMatchCaseBox->setChecked(true);
+	ui.replaceWrapBox->setChecked(false);
+	ui.replaceModeNormalBox->setChecked(true);
+
+	m_isStatic = true;
+	int times = 0;
+
+	pEdit->execute(SCI_BEGINUNDOACTION);
+
+	ProgressWin* loadFileProcessWin = new ProgressWin(this);
+
+	loadFileProcessWin->setWindowModality(Qt::WindowModal);
+
+	loadFileProcessWin->info(tr("total %1 keyword, please wait ...").arg(keyword.size()));
+
+	loadFileProcessWin->setTotalSteps(keyword.size());
+
+	loadFileProcessWin->show();
+
+	for (int i = 0; i < keyword.size(); ++i)
+	{
+		if (loadFileProcessWin->isCancel())
+		{
+			break;
+		}
+
+		ui.replaceTextBox->setCurrentText(keyword.at(i));
+		ui.replaceWithBox->setCurrentText(replace.at(i));
+
+		updateParameterFromUI();
+
+		QString whatFind = ui.replaceTextBox->currentText();
+		QString replaceText = ui.replaceWithBox->currentText();
+
+		times += doReplaceAll(pEdit, whatFind, replaceText, false);
+
+		loadFileProcessWin->moveStep();
+
+		QCoreApplication::processEvents();
+	}
+	delete loadFileProcessWin;
+
+	pEdit->execute(SCI_ENDUNDOACTION);
+
+	m_isStatic = false;
+
+	return times;
+}
+
+int FindWin::findAllInCurDoc()
 {
 	if (ui.findComboBox->currentText().isEmpty())
 	{
 		ui.statusbar->showMessage(tr("what find is null !"), 8000);
 		QApplication::beep();
-		return;
+		return 0;
 	}
 
 	QWidget* pw = autoAdjustCurrentEditWin();
@@ -1029,9 +1117,12 @@ void FindWin::slot_findAllInCurDoc()
 	{
 		if (pEdit->isReadOnly())
 		{
-			ui.statusbar->showMessage(tr("The ReadOnly document does not allow this operation."), 8000);
+			if (!m_isStatic)
+			{
+				ui.statusbar->showMessage(tr("The ReadOnly document does not allow this operation."), 8000);
+			}
 			QApplication::beep();
-			return;
+			return 0;
 		}
 
 		FindRecords results;
@@ -1057,18 +1148,21 @@ void FindWin::slot_findAllInCurDoc()
 			convertExtendedToString(whatFind, extendFind);
 			whatFind = extendFind;
 		}
-		
+
 		//这里的forward一定要是true。回环一定是false
 		if (!pEdit->findFirst(whatFind, m_re, m_cs, m_wo, false, true, FINDNEXTTYPE_FINDNEXT, 0, 0))
 		{
 			ui.statusbar->showMessage(tr("cant't find text \'%1\'").arg(m_expr), 8000);
-			QApplication::beep();
-			
-			emit sign_findAllInCurDoc(&results);
+
+			if (!m_isStatic)
+			{
+				QApplication::beep();
+				emit sign_findAllInCurDoc(&results);
+			}
 
 			m_isFindFirst = true;
 
-			return;
+			return 0;
 		}
 		else
 		{
@@ -1097,12 +1191,23 @@ void FindWin::slot_findAllInCurDoc()
 		ui.statusbar->showMessage(tr("find finished, total %1 found!").arg(replaceNums), 10000);
 
 		emit sign_findAllInCurDoc(&results);
+
+		return replaceNums;
 	}
 	else
 	{
-		ui.statusbar->showMessage(tr("The mode of the current document does not allow this operation."), 8000);
-		QApplication::beep();
+		if (!m_isStatic)
+		{
+			ui.statusbar->showMessage(tr("The mode of the current document does not allow this operation."), 8000);
+			QApplication::beep();
+		}
 	}
+	return 0;
+}
+
+void FindWin::slot_findAllInCurDoc()
+{
+	findAllInCurDoc();
 }
 
 void FindWin::slot_findAllInOpenDoc()
@@ -1533,14 +1638,17 @@ struct FindReplaceInfo
 };
 
 //返回值替换数量
-int FindWin::doReplaceAll(ScintillaEditView* pEdit, QString &whatFind, QString& replaceText)
+int FindWin::doReplaceAll(ScintillaEditView* pEdit, QString &whatFind, QString& replaceText, bool isCombineUndo)
 {
 	int replaceNums = 0;
 
 	int srcPostion = pEdit->execute(SCI_GETCURRENTPOS);
 	int firstDisLineNum = pEdit->execute(SCI_GETFIRSTVISIBLELINE);
 
+	if (isCombineUndo)
+	{
 	pEdit->execute(SCI_BEGINUNDOACTION);
+	}
 
 	int flags = buildSearchFlags(m_re, m_cs, m_wo, false, true, FINDNEXTTYPE_REPLACENEXT, 0, 0);
 
@@ -1601,8 +1709,10 @@ int FindWin::doReplaceAll(ScintillaEditView* pEdit, QString &whatFind, QString&
 		findReplaceInfo._endRange += replaceDelta;									//adjust end of range in case of replace
 	}
 
-
+	if (isCombineUndo)
+	{
 	pEdit->execute(SCI_ENDUNDOACTION);
+	}
 
 	pEdit->execute(SCI_GOTOPOS, srcPostion);
 	pEdit->execute(SCI_SETFIRSTVISIBLELINE, firstDisLineNum);
@@ -1613,19 +1723,17 @@ int FindWin::doReplaceAll(ScintillaEditView* pEdit, QString &whatFind, QString&
 	return replaceNums;
 }
 
-//替换当前文档里面的所有。之前的要慢,是因为qscintilla中实时计算了行在屏幕需要的长度。
-//大量的这种计算一行实时长度的操作,非常耗时。查找、标记均不耗时,只有替换修改了文本才耗时。
-void FindWin::slot_replaceAll()
+int FindWin::replaceAll()
 {
 	if (ui.replaceTextBox->currentText().isEmpty())
 	{
 		ui.statusbar->showMessage(tr("what find is null !"), 8000);
-		return;
+		return 0;
 	}
 
-	if (!m_isStatic &&  QMessageBox::Yes != QMessageBox::question(this, tr("Replace All current Doc"), tr("Are you sure replace all occurrences in current documents?")))
+	if (!m_isStatic && QMessageBox::Yes != QMessageBox::question(this, tr("Replace All current Doc"), tr("Are you sure replace all occurrences in current documents?")))
 	{
-		return;
+		return 0;
 	}
 
 	QWidget* pw = autoAdjustCurrentEditWin();
@@ -1636,7 +1744,7 @@ void FindWin::slot_replaceAll()
 		{
 			ui.statusbar->showMessage(tr("The ReadOnly document does not allow replacement."), 8000);
 			QApplication::beep();
-			return;
+			return 0;
 		}
 	}
 	updateParameterFromUI();
@@ -1659,6 +1767,15 @@ void FindWin::slot_replaceAll()
 	//全部替换后,下次查找,必须算第一次查找
 	m_isFindFirst = true;
 	ui.statusbar->showMessage(tr("replace finished, total %1 replaced!").arg(replaceNums), 10000);
+
+	return replaceNums;
+}
+
+//替换当前文档里面的所有。之前的要慢,是因为qscintilla中实时计算了行在屏幕需要的长度。
+//大量的这种计算一行实时长度的操作,非常耗时。查找、标记均不耗时,只有替换修改了文本才耗时。
+void FindWin::slot_replaceAll()
+{
+	replaceAll();
 }
 
 void FindWin::slot_replaceAllInOpenDoc()
@@ -1737,22 +1854,20 @@ void FindWin::slot_replaceAllInOpenDoc()
 	ui.statusbar->showMessage(tr("Replace in Opened Files: %1 occurrences were replaced.").arg(replaceNums), 10000);
 }
 
-
-//标记高亮单词
-void FindWin::slot_markAll()
+int  FindWin::markAll()
 {
 	if (ui.markTextBox->currentText().isEmpty())
 	{
 		ui.statusbar->showMessage(tr("what mark is null !"), 8000);
 		QApplication::beep();
-		return;
+		return 0;
 	}
 
 	QWidget* pw = autoAdjustCurrentEditWin();
 	ScintillaEditView* pEdit = dynamic_cast<ScintillaEditView*>(pw);
 	if (pEdit != nullptr)
 	{
-		FindRecords *results = new FindRecords;
+		FindRecords* results = new FindRecords;
 		results->pEdit = pEdit;
 		results->hightLightColor = CCNotePad::s_curMarkColorId;
 
@@ -1778,8 +1893,8 @@ void FindWin::slot_markAll()
 		if (!pEdit->findFirst(whatMark, m_re, m_cs, m_wo, false, true, FINDNEXTTYPE_FINDNEXT, 0, 0))
 		{
 			ui.statusbar->showMessage(tr("cant't find text \'%1\'").arg(m_expr), 8000);
-			QApplication::beep();
-			return;
+			//QApplication::beep();
+			return 0;
 		}
 		else
 		{
@@ -1789,11 +1904,11 @@ void FindWin::slot_markAll()
 			{
 				ui.statusbar->showMessage(tr("cant't mark text \'%1\'").arg(m_expr), 8000);
 				QApplication::beep();
-				return;
+				return 0;
 			}
 		}
 
-		addCurFindRecord(pEdit, *results,true);
+		addCurFindRecord(pEdit, *results, true);
 
 		++replaceNums;
 
@@ -1813,7 +1928,7 @@ void FindWin::slot_markAll()
 
 			if (foundTextLen > 0)
 			{
-				pEdit->execute(SCI_SETINDICATORCURRENT,CCNotePad::s_curMarkColorId);
+				pEdit->execute(SCI_SETINDICATORCURRENT, CCNotePad::s_curMarkColorId);
 				pEdit->execute(SCI_INDICATORFILLRANGE, rs.pos, foundTextLen);
 			}
 		}
@@ -1831,12 +1946,20 @@ void FindWin::slot_markAll()
 		//全部替换后,下次查找,必须算第一次查找
 		m_isFindFirst = true;
 		ui.statusbar->showMessage(tr("mark finished, total %1 found!").arg(replaceNums), 10000);
+
+		return replaceNums;
 	}
 	else
 	{
 		ui.statusbar->showMessage(tr("The mode of the current document does not allow mark."), 8000);
 		QApplication::beep();
 	}
+	return 0;
+}
+//标记高亮单词
+void FindWin::slot_markAll()
+{
+	markAll();
 }
 
 //取消高亮当前关键字

+ 11 - 3
src/findwin.h

@@ -62,13 +62,17 @@ public:
 	void setFindText(QString & text);
 	void disableReplace();
 	void setFindHistory(QList<QString>* findHistory);
-	void markAllWord(QString& word);
+	int markAllWord(QString& word);
 	void removeLineHeadEndBlank(int mode);
 	static void showCallTip(QsciScintilla * pEdit, int pos);
 	void removeEmptyLine(bool isBlankContained);
 	void findNext();
 	void findPrev();
 	void setFindBackward(bool isBackward);
+	int findAtBack(QString keyword);
+	int replaceAtBack(QStringList& keyword, QStringList& replace);
+
+
 
 protected:
 	
@@ -108,8 +112,13 @@ private:
 
 	bool replace(ScintillaEditView* pEdit);
 
-	int doReplaceAll(ScintillaEditView * pEdit, QString& whatFind, QString& replaceText);
+	int doReplaceAll(ScintillaEditView * pEdit, QString& whatFind, QString& replaceText, bool isCombineUndo = true);
+
+	int replaceAll();
 
+	int markAll();
+
+	int findAllInCurDoc();
 
 private slots:
 
@@ -198,7 +207,6 @@ private:
 
 	ScintillaEditView* pEditTemp;
 
-
 	QWidget* m_curEditWin;
 
 	bool m_isStatic;//是否静默处理,不弹确认对话框

+ 307 - 100
src/findwin.ui

@@ -6,16 +6,10 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>589</width>
-    <height>362</height>
+    <width>633</width>
+    <height>384</height>
    </rect>
   </property>
-  <property name="maximumSize">
-   <size>
-    <width>1100</width>
-    <height>500</height>
-   </size>
-  </property>
   <property name="windowTitle">
    <string>MainWindow</string>
   </property>
@@ -24,18 +18,18 @@
     <normaloff>:/Resources/edit/global/ndd.ico</normaloff>:/Resources/edit/global/ndd.ico</iconset>
   </property>
   <widget class="QWidget" name="centralwidget">
-   <layout class="QHBoxLayout" name="horizontalLayout_17">
+   <layout class="QHBoxLayout" name="horizontalLayout_14">
     <property name="leftMargin">
      <number>3</number>
     </property>
     <property name="topMargin">
-     <number>2</number>
+     <number>3</number>
     </property>
     <property name="rightMargin">
      <number>2</number>
     </property>
     <property name="bottomMargin">
-     <number>0</number>
+     <number>2</number>
     </property>
     <item>
      <widget class="QTabWidget" name="findinfilesTab">
@@ -53,12 +47,21 @@
         <string>find</string>
        </attribute>
        <layout class="QHBoxLayout" name="horizontalLayout_3">
+        <property name="bottomMargin">
+         <number>2</number>
+        </property>
         <item>
          <layout class="QVBoxLayout" name="verticalLayout_4">
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout">
             <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 what :</string>
               </property>
@@ -72,6 +75,12 @@
                 <height>0</height>
                </size>
               </property>
+              <property name="maximumSize">
+               <size>
+                <width>350</width>
+                <height>16777215</height>
+               </size>
+              </property>
               <property name="editable">
                <bool>true</bool>
               </property>
@@ -90,7 +99,7 @@
             <property name="sizeHint" stdset="0">
              <size>
               <width>20</width>
-              <height>40</height>
+              <height>20</height>
              </size>
             </property>
            </spacer>
@@ -184,6 +193,19 @@
             </item>
            </layout>
           </item>
+          <item>
+           <spacer name="verticalSpacer_13">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>40</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
          </layout>
         </item>
         <item>
@@ -192,7 +214,7 @@
            <widget class="QPushButton" name="findTextNext">
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -208,7 +230,7 @@
            <widget class="QPushButton" name="findTextPrev">
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -222,6 +244,12 @@
           </item>
           <item>
            <widget class="QPushButton" name="countBt">
+            <property name="minimumSize">
+             <size>
+              <width>200</width>
+              <height>0</height>
+             </size>
+            </property>
             <property name="text">
              <string>Counter(T)</string>
             </property>
@@ -234,7 +262,7 @@
            <widget class="QPushButton" name="findAllinCourrent">
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>34</height>
              </size>
             </property>
@@ -248,7 +276,7 @@
            <widget class="QPushButton" name="findAllinAllOpen">
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>34</height>
              </size>
             </property>
@@ -260,6 +288,12 @@
           </item>
           <item>
            <widget class="QPushButton" name="findClearBt">
+            <property name="minimumSize">
+             <size>
+              <width>200</width>
+              <height>0</height>
+             </size>
+            </property>
             <property name="text">
              <string>Clear Result</string>
             </property>
@@ -267,6 +301,12 @@
           </item>
           <item>
            <widget class="QPushButton" name="findCloseBt">
+            <property name="minimumSize">
+             <size>
+              <width>200</width>
+              <height>0</height>
+             </size>
+            </property>
             <property name="text">
              <string>Close</string>
             </property>
@@ -294,6 +334,9 @@
         <string>Replace</string>
        </attribute>
        <layout class="QHBoxLayout" name="horizontalLayout_8">
+        <property name="bottomMargin">
+         <number>2</number>
+        </property>
         <item>
          <layout class="QVBoxLayout" name="verticalLayout_5">
           <item>
@@ -302,6 +345,12 @@
              <layout class="QHBoxLayout" name="horizontalLayout_6">
               <item>
                <widget class="QLabel" name="label_3">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
                 <property name="text">
                  <string>Find what :</string>
                 </property>
@@ -315,6 +364,12 @@
                   <height>0</height>
                  </size>
                 </property>
+                <property name="maximumSize">
+                 <size>
+                  <width>350</width>
+                  <height>16777215</height>
+                 </size>
+                </property>
                 <property name="editable">
                  <bool>true</bool>
                 </property>
@@ -329,6 +384,12 @@
              <layout class="QHBoxLayout" name="horizontalLayout_7">
               <item>
                <widget class="QLabel" name="label_4">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
                 <property name="text">
                  <string>Replace with :</string>
                 </property>
@@ -342,6 +403,12 @@
                   <height>0</height>
                  </size>
                 </property>
+                <property name="maximumSize">
+                 <size>
+                  <width>350</width>
+                  <height>16777215</height>
+                 </size>
+                </property>
                 <property name="editable">
                  <bool>true</bool>
                 </property>
@@ -451,6 +518,19 @@
               </layout>
              </widget>
             </item>
+            <item>
+             <spacer name="verticalSpacer_14">
+              <property name="orientation">
+               <enum>Qt::Vertical</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>20</width>
+                <height>40</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
            </layout>
           </item>
          </layout>
@@ -459,9 +539,15 @@
          <layout class="QVBoxLayout" name="verticalLayout_8">
           <item>
            <widget class="QPushButton" name="replaceFindNextBox">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -480,7 +566,7 @@
             </property>
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -499,7 +585,7 @@
             </property>
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -518,7 +604,7 @@
             </property>
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>34</height>
              </size>
             </property>
@@ -536,6 +622,12 @@
               <verstretch>0</verstretch>
              </sizepolicy>
             </property>
+            <property name="minimumSize">
+             <size>
+              <width>200</width>
+              <height>0</height>
+             </size>
+            </property>
             <property name="text">
              <string>Close</string>
             </property>
@@ -562,31 +654,50 @@
        <attribute name="title">
         <string>Dir Find</string>
        </attribute>
-       <layout class="QHBoxLayout" name="horizontalLayout_20">
+       <layout class="QHBoxLayout" name="horizontalLayout_10">
+        <property name="bottomMargin">
+         <number>2</number>
+        </property>
         <item>
          <layout class="QVBoxLayout" name="verticalLayout_17">
           <item>
            <layout class="QGridLayout" name="gridLayout_2">
             <item row="0" column="0">
-           <layout class="QHBoxLayout" name="horizontalLayout_10">
-            <item>
              <widget class="QLabel" name="label_8">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
               <property name="text">
                <string>Dest Dir :</string>
               </property>
              </widget>
             </item>
-            <item>
+            <item row="0" column="1">
              <widget class="QLineEdit" name="destFindDir">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
               <property name="minimumSize">
                <size>
                 <width>250</width>
                 <height>0</height>
                </size>
               </property>
+              <property name="maximumSize">
+               <size>
+                <width>350</width>
+                <height>16777215</height>
+               </size>
+              </property>
              </widget>
             </item>
-            <item>
+            <item row="0" column="2">
              <widget class="QToolButton" name="selectDir">
               <property name="minimumSize">
                <size>
@@ -599,18 +710,20 @@
               </property>
              </widget>
             </item>
-           </layout>
-          </item>
             <item row="1" column="0">
-           <layout class="QHBoxLayout" name="horizontalLayout_14">
-            <item>
              <widget class="QLabel" name="label_5">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
               <property name="text">
                <string>Find what :</string>
               </property>
              </widget>
             </item>
-            <item>
+            <item row="1" column="1">
              <widget class="QComboBox" name="dirFindWhat">
               <property name="minimumSize">
                <size>
@@ -618,6 +731,12 @@
                 <height>0</height>
                </size>
               </property>
+              <property name="maximumSize">
+               <size>
+                <width>350</width>
+                <height>16777215</height>
+               </size>
+              </property>
               <property name="editable">
                <bool>true</bool>
               </property>
@@ -628,79 +747,123 @@
             </item>
            </layout>
           </item>
-            <item row="2" column="0">
-           <layout class="QHBoxLayout" name="horizontalLayout_15">
-            <item>
-             <widget class="QLabel" name="label_6">
-              <property name="text">
-               <string>Replace with :</string>
+          <item>
+           <layout class="QGridLayout" name="gridLayout_5">
+            <item row="1" column="1">
+             <widget class="QLineEdit" name="fileType">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="minimumSize">
+               <size>
+                <width>300</width>
+                <height>0</height>
+               </size>
+              </property>
+              <property name="maximumSize">
+               <size>
+                <width>350</width>
+                <height>16777215</height>
+               </size>
+              </property>
+              <property name="placeholderText">
+               <string>*.c:*.cpp:*.h</string>
               </property>
              </widget>
             </item>
-            <item>
+            <item row="0" column="1">
              <widget class="QComboBox" name="dirReplaceWhat">
               <property name="minimumSize">
                <size>
-                <width>250</width>
+                <width>300</width>
                 <height>0</height>
                </size>
               </property>
+              <property name="maximumSize">
+               <size>
+                <width>350</width>
+                <height>16777215</height>
+               </size>
+              </property>
               <property name="editable">
                <bool>true</bool>
               </property>
              </widget>
             </item>
-           </layout>
-          </item>
-            <item row="3" column="0">
-           <layout class="QHBoxLayout" name="horizontalLayout_16">
-            <item>
+            <item row="1" column="0">
              <widget class="QCheckBox" name="dealFileType">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
               <property name="text">
-               <string>File Type</string>
+               <string>File Type :</string>
               </property>
              </widget>
             </item>
-            <item>
-             <widget class="QLineEdit" name="fileType">
+            <item row="0" column="0">
+             <widget class="QLabel" name="label_6">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Replace with :</string>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="0">
+             <widget class="QCheckBox" name="skipDir">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Skip Dir Name :</string>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="1">
+             <widget class="QLineEdit" name="skipDirNames">
               <property name="enabled">
                <bool>false</bool>
               </property>
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
               <property name="minimumSize">
                <size>
-                <width>250</width>
+                <width>300</width>
                 <height>0</height>
                </size>
               </property>
+              <property name="maximumSize">
+               <size>
+                <width>350</width>
+                <height>16777215</height>
+               </size>
+              </property>
               <property name="placeholderText">
-               <string>*.c:*.cpp:*.h</string>
+               <string>debug:Debug:.vs:.git:.svn</string>
               </property>
              </widget>
             </item>
            </layout>
-          </item>
-            <item row="4" column="0">
-             <layout class="QHBoxLayout" name="horizontalLayout_19">
-          <item>
-               <widget class="QCheckBox" name="skipDir">
-                <property name="text">
-                 <string>Skip Dir Name</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QLineEdit" name="skipDirNames">
-                <property name="enabled">
-                 <bool>false</bool>
-                </property>
-                <property name="placeholderText">
-                 <string>debug:Debug:.vs:.git:.svn</string>
-                </property>
-               </widget>
-              </item>
-             </layout>
-            </item>
-           </layout>
           </item>
           <item>
            <spacer name="verticalSpacer_11">
@@ -710,7 +873,7 @@
             <property name="sizeHint" stdset="0">
              <size>
               <width>20</width>
-              <height>40</height>
+              <height>20</height>
              </size>
             </property>
            </spacer>
@@ -737,21 +900,21 @@
               </property>
              </widget>
             </item>
-            <item>
-             <spacer name="verticalSpacer_12">
-              <property name="orientation">
-               <enum>Qt::Vertical</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>20</width>
-                <height>40</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
            </layout>
           </item>
+          <item>
+           <spacer name="verticalSpacer_12">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>20</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_18">
             <item>
@@ -887,7 +1050,7 @@
             </property>
             <property name="minimumSize">
              <size>
-              <width>160</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -899,14 +1062,14 @@
           <item>
            <widget class="QPushButton" name="dirReplaceAll">
             <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
               <horstretch>0</horstretch>
               <verstretch>0</verstretch>
              </sizepolicy>
             </property>
             <property name="minimumSize">
              <size>
-              <width>160</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -918,14 +1081,14 @@
           <item>
            <widget class="QPushButton" name="clearBt">
             <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
               <horstretch>0</horstretch>
               <verstretch>0</verstretch>
              </sizepolicy>
             </property>
             <property name="minimumSize">
              <size>
-              <width>160</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -937,14 +1100,14 @@
           <item>
            <widget class="QPushButton" name="dirClose">
             <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
               <horstretch>0</horstretch>
               <verstretch>0</verstretch>
              </sizepolicy>
             </property>
             <property name="minimumSize">
              <size>
-              <width>160</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -975,12 +1138,21 @@
         <string>Mark</string>
        </attribute>
        <layout class="QHBoxLayout" name="horizontalLayout_11">
+        <property name="bottomMargin">
+         <number>2</number>
+        </property>
         <item>
          <layout class="QVBoxLayout" name="verticalLayout_11">
           <item>
            <layout class="QHBoxLayout" name="horizontalLayout_4">
             <item>
              <widget class="QLabel" name="label_2">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
               <property name="text">
                <string>Mark What</string>
               </property>
@@ -994,6 +1166,12 @@
                 <height>0</height>
                </size>
               </property>
+              <property name="maximumSize">
+               <size>
+                <width>350</width>
+                <height>16777215</height>
+               </size>
+              </property>
               <property name="editable">
                <bool>true</bool>
               </property>
@@ -1012,7 +1190,7 @@
             <property name="sizeHint" stdset="0">
              <size>
               <width>20</width>
-              <height>40</height>
+              <height>20</height>
              </size>
             </property>
            </spacer>
@@ -1043,7 +1221,7 @@
             <property name="sizeHint" stdset="0">
              <size>
               <width>20</width>
-              <height>40</height>
+              <height>20</height>
              </size>
             </property>
            </spacer>
@@ -1085,15 +1263,34 @@
             </layout>
            </widget>
           </item>
+          <item>
+           <spacer name="verticalSpacer_15">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>40</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
          </layout>
         </item>
         <item>
          <layout class="QVBoxLayout" name="verticalLayout_12">
           <item>
            <widget class="QPushButton" name="markAllBox">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -1104,9 +1301,15 @@
           </item>
           <item>
            <widget class="QPushButton" name="markClearBox">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -1117,9 +1320,15 @@
           </item>
           <item>
            <widget class="QPushButton" name="markClearAllBox">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -1138,7 +1347,7 @@
             </property>
             <property name="minimumSize">
              <size>
-              <width>0</width>
+              <width>200</width>
               <height>28</height>
              </size>
             </property>
@@ -1182,7 +1391,6 @@
   <tabstop>findWrapBox</tabstop>
   <tabstop>findModeNormalBt</tabstop>
   <tabstop>findModeRegularBt</tabstop>
-  <tabstop>findinfilesTab</tabstop>
   <tabstop>replaceTextBox</tabstop>
   <tabstop>replaceWithBox</tabstop>
   <tabstop>replaceBackwardBox</tabstop>
@@ -1199,7 +1407,6 @@
   <tabstop>destFindDir</tabstop>
   <tabstop>selectDir</tabstop>
   <tabstop>dirFindWhat</tabstop>
-  <tabstop>dirReplaceWhat</tabstop>
   <tabstop>dealFileType</tabstop>
   <tabstop>fileType</tabstop>
   <tabstop>dirFindMatchWholeBox</tabstop>

+ 27 - 0
src/include/pluginGl.h

@@ -0,0 +1,27 @@
+#pragma once
+#include <QString>
+
+#define NDD_EXPORTDLL
+
+#if defined(Q_OS_WIN)
+#if defined(NDD_EXPORTDLL)
+#define NDD_EXPORT __declspec(dllexport)
+#else
+#define NDD_EXPORT __declspec(dllimport)
+#endif
+#endif
+
+struct ndd_proc_data
+{
+	QString m_strPlugName; //插件名称 必选
+	QString m_strFilePath; //lib 插件的全局路径。必选
+	QString m_strComment; //插件说明
+	QString m_version; //版本号码。可选
+	QString m_auther;//作者名称。可选
+};
+
+
+typedef struct ndd_proc_data NDD_PROC_DATA;
+
+typedef bool (*NDD_PROC_IDENTIFY_CALLBACK)(NDD_PROC_DATA* pProcData);
+typedef void (*NDD_PROC_FOUND_CALLBACK)(NDD_PROC_DATA* pProcData, void* pUserData);

+ 13 - 10
src/main.cpp

@@ -135,6 +135,18 @@ int main(int argc, char *argv[])
 
 	QStringList arguments = QCoreApplication::arguments();
 
+#ifdef uos
+	QFont font("Noto Sans CJK SC,9,-1,5,50,0,0,0,0,0,Regular", 9);
+	QApplication::setFont(font);
+#endif
+#ifdef Q_OS_MAC
+	//这里的字体大小,务必要和查找结果框的高度匹配,否则会结构字体拥挤
+	QFont font("Courier New,11,-1,5,50,0,0,0,0,0,Regular", 11);
+	// qDebug() << "font name mac";
+	QApplication::setFont(font);
+	// qDebug() << QApplication::font().toString();
+#endif
+
 #ifdef Q_OS_WIN
 	QSharedMemory shared("ccnotepad");
 	if (arguments.size() > 2)
@@ -298,15 +310,6 @@ drop_old:
 
 	pMainNotepad->syncCurSkinToMenu(id);
 
-#ifdef uos
-	QFont font("Noto Sans CJK JP,9,-1,5,50,0,0,0,0,0,Regular", 9);
-	QApplication::setFont(font);
-#endif
-#ifdef Q_OS_MAC
-	//这里的字体大小,务必要和查找结果框的高度匹配,否则会结构字体拥挤
-	QFont font("Courier New,11,-1,5,50,0,0,0,0,0,Regular", 11);
-	QApplication::setFont(font);
-#endif
 
 #ifdef Q_OS_WIN
 	//HWND hwnd = ::FindWindowA("Qt5QWindowIcon", "CCNotebook");
@@ -335,7 +338,7 @@ drop_old:
 #ifdef Q_OS_WIN
 	if (!s_isAdminAuth)
 	{
-		if (0 == pMainNotepad->restoreLastFiles())
+		if (0 == pMainNotepad->restoreLastFiles() && (arguments.size() == 1))
 		{
 		pMainNotepad->initTabNewOne();
 	}

+ 35 - 2
src/nddsetting.cpp

@@ -64,8 +64,8 @@ void NddSetting::init()
 
 		//tab的长度,默认为4
 		addKeyValueToNumSets("tablens", 4);
-		//space replace tab空格替换tab,默认1为true,0为false
-		addKeyValueToNumSets("tabnouse", 1);
+		//space replace tab空格替换tab,默认0, 1为true,0为false
+		addKeyValueToNumSets("tabnouse", 0);
 
 		addKeyValueToSets("mac", "0");
 		addKeyValueToNumSets("padtimes", 0);
@@ -100,6 +100,21 @@ void NddSetting::init()
 
 		//0 24 1 36 2 48
 		addKeyValueToNumSets(ICON_SIZE, 1);
+
+		addKeyValueToNumSets(ZOOMVALUE, 100);
+	
+		addKeyValueToNumSets(FINDRESULTPOS, Qt::BottomDockWidgetArea);
+
+		addKeyValueToNumSets(FILELISTPOS, Qt::LeftDockWidgetArea);
+
+		//默认0不显示
+		addKeyValueToNumSets(FILELISTSHOW, 0);
+
+		//默认显示工具栏
+		addKeyValueToNumSets(TOOLBARSHOW, 1);
+
+		//打开网页,默认不勾选,资源耗费多
+		addKeyValueToNumSets(SHOWWEBADDR, 0);
 	};
 
 	if (!s_nddSet->contains(VERSION))
@@ -188,6 +203,23 @@ void NddSetting::init()
 				QVariant v(Qt::BottomDockWidgetArea);
 				checkNoExistAdd(FINDRESULTPOS, v);
 			}
+
+			{
+				QVariant v(Qt::LeftDockWidgetArea);
+				checkNoExistAdd(FILELISTPOS, v);
+			}
+			{
+				QVariant v(0);
+				checkNoExistAdd(FILELISTSHOW, v);
+			}
+			{
+				QVariant v(1);
+				checkNoExistAdd(TOOLBARSHOW, v);
+			}
+			{
+				QVariant v(0);
+				checkNoExistAdd(SHOWWEBADDR, v);
+			}
 		} while (false);
 
 	}
@@ -197,6 +229,7 @@ void NddSetting::init()
 }
 
 
+
 //写一个总的获取配置的接口,避免以后每个字段都需要写一个读写接口
 QString NddSetting::getKeyValueFromSets(QString key)
 {

+ 5 - 0
src/nddsetting.h

@@ -18,6 +18,11 @@ static QString ICON_SIZE = "iconsize";//图
 static QString ZOOMVALUE = "zoom"; //放大倍数
 static QString VERSION = "version";//当前版本
 static QString FINDRESULTPOS = "findpos";//查找窗口悬浮的位置
+static QString FILELISTPOS = "filepos";//文件列表悬浮框的位置
+static QString FILELISTSHOW = "showfilelist"; //文件列表框是否显示
+static QString TOOLBARSHOW = "showbar"; //是否显示工具栏
+static QString FINDWINSIZE = "findwinsize";//保存查找框的大小。150%放大时界面永久。保留避免每次手动调整
+static QString SHOWWEBADDR = "showweb";//高亮web地址,双击网页打开
 
 class NddSetting
 {

+ 70 - 0
src/plugin.cpp

@@ -0,0 +1,70 @@
+#include "plugin.h"
+#include <QLibrary>
+#include <QDir>
+#include <QMenu>
+#include <QAction>
+
+
+bool loadApplication(const QString& strFileName, NDD_PROC_DATA* pProcData)
+{
+	QLibrary lib(strFileName);
+	NDD_PROC_IDENTIFY_CALLBACK procCallBack;
+
+	procCallBack = (NDD_PROC_IDENTIFY_CALLBACK)lib.resolve("NDD_PROC_IDENTIFY");
+
+	if (procCallBack == NULL)
+	{
+		return false;
+	}
+
+	if (!procCallBack(pProcData))
+	{
+		return false;
+	}
+	pProcData->m_strFilePath = strFileName;
+	return true;
+}
+
+
+
+
+int loadProc(const QString& strDirOut, std::function<void(NDD_PROC_DATA&, QMenu*)> funcallback, QMenu* pUserData)
+{
+	int nReturn = 0;
+	QStringList list;
+
+	QDir dir;
+	dir.setPath(strDirOut);
+
+	QString strDir, strName;
+	QStringList strFilter;
+
+	strDir = dir.absolutePath();
+	strDir += QDir::separator();
+#if  defined(Q_OS_WIN)
+	strFilter << "*.dll";
+#else
+	strFilter << "lib*.so";
+#endif
+	list = dir.entryList(strFilter, QDir::Files | QDir::Readable, QDir::Name);
+	QStringList::Iterator it = list.begin();
+
+	for (; it != list.end(); ++it)
+	{
+		NDD_PROC_DATA procData;
+		strName = *it;
+		strName = strDir + strName;
+
+		if (!loadApplication(strName, &procData))
+		{
+			continue;
+		}
+
+		funcallback(procData, pUserData);
+		
+		nReturn++;
+	}
+
+	return nReturn;
+}
+

+ 10 - 0
src/plugin.h

@@ -0,0 +1,10 @@
+#pragma once
+#include "pluginGl.h"
+#include <functional>
+class QMenu;
+class QsciScintilla;
+class QWidget;
+
+typedef int (*NDD_PROC_MAIN_CALLBACK)(QWidget* parent, const QString& strFileName, std::function<QsciScintilla*()>getCurEdit);
+
+int loadProc(const QString& strDirOut, std::function<void(NDD_PROC_DATA&, QMenu*)> funcallback, QMenu* pUserData);

+ 34 - 0
src/plugin/helloworld/helloworld.pro

@@ -0,0 +1,34 @@
+TEMPLATE	= lib
+LANGUAGE	= C++
+
+CONFIG	+= qt warn_on Release
+QT += core gui widgets
+
+HEADERS	+= *.h
+SOURCES	+= *.cpp
+FORMS	+= *.ui
+
+INCLUDEPATH	+= ../../include
+INCLUDEPATH	+= ../../qscint/src
+INCLUDEPATH	+= ../../qscint/src/Qsci
+
+
+win32 {
+   if(contains(QMAKE_HOST.arch, x86_64)){
+    CONFIG(Debug, Debug|Release){
+        DESTDIR = ../../x64/Debug/plugin
+		LIBS += -L../../x64/Debug
+		LIBS += -lqmyedit_qt5d
+    }else{
+        DESTDIR = ../../x64/Release/plugin
+		LIBS += -L../../x64/Release
+		LIBS += -lqmyedit_qt5
+    }
+   }
+}
+
+unix {
+  UI_DIR = .ui
+  MOC_DIR = .moc
+  OBJECTS_DIR = .obj
+}

+ 69 - 0
src/plugin/helloworld/helloworld.vcxproj.filters

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Form Files">
+      <UniqueIdentifier>{99349809-55BA-4b9d-BF79-8FDBB0286EB3}</UniqueIdentifier>
+      <Extensions>ui</Extensions>
+      <ParseFiles>false</ParseFiles>
+    </Filter>
+    <Filter Include="Form Files">
+      <UniqueIdentifier>{99349809-55BA-4b9d-BF79-8FDBB0286EB3}</UniqueIdentifier>
+      <Extensions>ui</Extensions>
+      <ParseFiles>false</ParseFiles>
+    </Filter>
+    <Filter Include="Generated Files">
+      <UniqueIdentifier>{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}</UniqueIdentifier>
+      <Extensions>cpp;c;cxx;moc;h;def;odl;idl;res;</Extensions>
+    </Filter>
+    <Filter Include="Generated Files">
+      <UniqueIdentifier>{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}</UniqueIdentifier>
+      <Extensions>cpp;c;cxx;moc;h;def;odl;idl;res;</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="helloworldexport.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="qttestclass.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <QtMoc Include="qttestclass.h">
+      <Filter>Header Files</Filter>
+    </QtMoc>
+    
+  </ItemGroup>
+  <ItemGroup>
+    <CustomBuild Include="debug\moc_predefs.h.cbt">
+      <Filter>Generated Files</Filter>
+    </CustomBuild>
+    <CustomBuild Include="release\moc_predefs.h.cbt">
+      <Filter>Generated Files</Filter>
+    </CustomBuild>
+    
+    
+    
+  </ItemGroup>
+  <ItemGroup>
+    <QtUic Include="qttestclass.ui">
+      <Filter>Form Files</Filter>
+    </QtUic>
+  </ItemGroup>
+</Project>

+ 10 - 0
src/plugin/helloworld/helloworld.vcxproj.user

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup />
+  <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <QtLastBackgroundBuild>2023-01-06T12:23:11.3148927Z</QtLastBackgroundBuild>
+  </PropertyGroup>
+  <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <QtLastBackgroundBuild>2023-01-06T12:23:11.4036545Z</QtLastBackgroundBuild>
+  </PropertyGroup>
+</Project>

+ 56 - 0
src/plugin/helloworld/helloworldexport.cpp

@@ -0,0 +1,56 @@
+#include <qobject.h>
+#include <qstring.h>
+#include <pluginGl.h>
+#include <functional>
+#include <qsciscintilla.h>
+#include "qttestclass.h"
+
+#define NDD_EXPORTDLL
+
+#if defined(Q_OS_WIN)
+#if defined(NDD_EXPORTDLL)
+#define NDD_EXPORT __declspec(dllexport)
+#else
+#define NDD_EXPORT __declspec(dllimport)
+#endif
+#endif
+
+#ifdef __cplusplus
+	extern "C" {
+#endif
+
+	NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData);
+	NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::function<QsciScintilla* ()>getCurEdit);
+
+
+#ifdef __cplusplus
+	}
+#endif
+
+bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData)
+{
+	if(pProcData == NULL)
+	{
+		return false;
+	}
+	pProcData->m_strPlugName = QObject::tr("Hello World Plug");
+	pProcData->m_strComment = QObject::tr("char to Upper.");
+
+	pProcData->m_version = QString("v1.0");
+	pProcData->m_auther = QString("zuowei.yin");
+	return true;
+}
+
+//插件的入口点函数
+int NDD_PROC_MAIN(QWidget* pNotepad, const QString &strFileName, std::function<QsciScintilla*()>getCurEdit)
+{
+	QsciScintilla* pEdit = getCurEdit();
+
+	//做一个简单的转大写的操作
+	QtTestClass* p = new QtTestClass(pNotepad,pEdit);
+	//主窗口关闭时,子窗口也关闭。避免空指针操作
+	p->setWindowFlag(Qt::Window);
+	p->show();
+
+	return 0;
+}

+ 30 - 0
src/plugin/helloworld/qttestclass.cpp

@@ -0,0 +1,30 @@
+#include "qttestclass.h"
+#include <qsciscintilla.h>
+
+QtTestClass::QtTestClass(QWidget *parent, QsciScintilla* pEdit)
+	: QWidget(parent)
+{
+	ui.setupUi(this);
+	m_pEdit = pEdit;
+}
+
+QtTestClass::~QtTestClass()
+{}
+
+void QtTestClass::on_upper()
+{
+	QString text = m_pEdit->text();
+
+	text = text.toUpper();
+
+	m_pEdit->setText(text);
+}
+
+void QtTestClass::on_lower()
+{
+	QString text = m_pEdit->text();
+
+	text = text.toLower();
+
+	m_pEdit->setText(text);
+}

+ 21 - 0
src/plugin/helloworld/qttestclass.h

@@ -0,0 +1,21 @@
+#pragma once
+
+#include <QWidget>
+#include "ui_qttestclass.h"
+
+class QsciScintilla;
+class QtTestClass : public QWidget
+{
+	Q_OBJECT
+
+public:
+	QtTestClass(QWidget *parent, QsciScintilla* pEdit);
+	~QtTestClass();
+
+private slots:
+	void on_upper();
+	void on_lower();
+private:
+	Ui::QtTestClassClass ui;
+	QsciScintilla* m_pEdit;
+};

+ 108 - 0
src/plugin/helloworld/qttestclass.ui

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QtTestClassClass</class>
+ <widget class="QWidget" name="QtTestClassClass">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>544</width>
+    <height>251</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>QtTestClass</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>这是一个插件例子,把当前文档全部变成大写字母。
+请给我们提交插件!</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QPushButton" name="upperBt">
+       <property name="text">
+        <string>TransUpper</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="lowerBt">
+       <property name="text">
+        <string>TransLower</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pushButton_2">
+       <property name="text">
+        <string>Close</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>pushButton_2</sender>
+   <signal>clicked()</signal>
+   <receiver>QtTestClassClass</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>435</x>
+     <y>188</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>446</x>
+     <y>246</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>upperBt</sender>
+   <signal>clicked()</signal>
+   <receiver>QtTestClassClass</receiver>
+   <slot>on_upper()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>177</x>
+     <y>181</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>187</x>
+     <y>247</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>lowerBt</sender>
+   <signal>clicked()</signal>
+   <receiver>QtTestClassClass</receiver>
+   <slot>on_lower()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>296</x>
+     <y>182</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>323</x>
+     <y>244</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+ <slots>
+  <slot>on_upper()</slot>
+  <slot>on_lower()</slot>
+ </slots>
+</ui>

+ 57 - 0
src/plugin/test/test.cpp

@@ -0,0 +1,57 @@
+#include <qobject.h>
+#include <qstring.h>
+#include <pluginGl.h>
+#include <functional>
+#include <qsciscintilla.h>
+
+#define NDD_EXPORTDLL
+
+#if defined(Q_OS_WIN)
+#if defined(NDD_EXPORTDLL)
+#define NDD_EXPORT __declspec(dllexport)
+#else
+#define NDD_EXPORT __declspec(dllimport)
+#endif
+#endif
+
+#ifdef __cplusplus
+	extern "C" {
+#endif
+
+	NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData);
+	NDD_EXPORT int NDD_PROC_MAIN(QWidget* parent, const QString& strFileName, std::function<QsciScintilla* ()>getCurEdit);
+
+
+#ifdef __cplusplus
+	}
+#endif
+
+bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData)
+{
+	if(pProcData == NULL)
+	{
+		return false;
+	}
+	pProcData->m_strPlugName = QObject::tr("Test Plug");
+	pProcData->m_strComment = QObject::tr("char to lower.");
+
+	pProcData->m_version = QString("v1.0");
+	pProcData->m_auther = QString("zuowei.yin");
+	return true;
+}
+
+//插件的入口点函数
+int NDD_PROC_MAIN(QWidget* parent, const QString &strFileName, std::function<QsciScintilla*()>getCurEdit)
+{
+	QsciScintilla* pEidt = getCurEdit();
+
+	QString text = pEidt->text();
+
+	//做一个简单的转大写的操作
+
+	text = text.toLower();
+
+	pEidt->setText(text);
+
+	return 0;
+}

+ 34 - 0
src/plugin/test/test.pro

@@ -0,0 +1,34 @@
+TEMPLATE	= lib
+LANGUAGE	= C++
+
+CONFIG	+= qt warn_on Debug
+QT += core gui widgets
+
+HEADERS	+= *.h
+SOURCES	+= *.cpp
+FORMS	+= *.ui
+
+INCLUDEPATH	+= ../../include
+INCLUDEPATH	+= ../../qscint/src
+INCLUDEPATH	+= ../../qscint/src/Qsci
+
+
+win32 {
+   if(contains(QMAKE_HOST.arch, x86_64)){
+    CONFIG(Debug, Debug|Release){
+        DESTDIR = ../../x64/Debug/Plugin
+		LIBS += -L../../x64/Debug
+		LIBS += -lqmyedit_qt5d
+    }else{
+        DESTDIR = ../../x64/Release/Plugin
+		LIBS += -L../../x64/Release
+		LIBS += -lqmyedit_qt5
+    }
+   }
+}
+
+unix {
+  UI_DIR = .ui
+  MOC_DIR = .moc
+  OBJECTS_DIR = .obj
+}

+ 18 - 0
src/pluginGl.h

@@ -0,0 +1,18 @@
+#pragma once
+#include <QString>
+
+struct ndd_proc_data
+{
+	QString m_strPlugName; //插件名称 必选
+	QString m_strFilePath; //lib 插件的全局路径。必选
+	QString m_strComment; //插件说明
+	QString m_version; //版本号码。可选
+	QString m_auther;//作者名称。可选
+};
+
+//#define NDD_PROC_IDENTIFY ("nddProc")
+
+typedef struct ndd_proc_data NDD_PROC_DATA;
+
+typedef bool (*NDD_PROC_IDENTIFY_CALLBACK)(NDD_PROC_DATA* pProcData);
+typedef void (*NDD_PROC_FOUND_CALLBACK)(NDD_PROC_DATA* pProcData, void* pUserData);

+ 41 - 0
src/pluginmgr.cpp

@@ -0,0 +1,41 @@
+#include "pluginmgr.h"
+#include "rcglobal.h"
+
+
+PluginMgr::PluginMgr(QWidget *parent, QList<NDD_PROC_DATA>& pluginList)
+	: QMainWindow(parent)
+{
+	ui.setupUi(this);
+
+	init(pluginList);
+}
+
+PluginMgr::~PluginMgr()
+{}
+
+void PluginMgr::init(QList<NDD_PROC_DATA>& pluginList)
+{
+	ui.pluginTable->clearContents();
+	ui.pluginTable->setRowCount(0);
+
+	for (int i = 0; i < pluginList.size(); ++i)
+	{
+		ui.pluginTable->insertRow(i);
+
+		NDD_PROC_DATA v = pluginList.at(i);
+
+		ui.pluginTable->setItem(i, 0, new QTableWidgetItem(v.m_strPlugName));
+		ui.pluginTable->setItem(i, 1, new QTableWidgetItem(v.m_version));
+		ui.pluginTable->setItem(i, 2, new QTableWidgetItem(v.m_auther));
+		ui.pluginTable->setItem(i, 3, new QTableWidgetItem(v.m_strComment));
+		ui.pluginTable->setItem(i, 4, new QTableWidgetItem(v.m_strFilePath));
+	}
+}
+
+void PluginMgr::slot_openPluginDir()
+{
+	QString strDir = qApp->applicationDirPath();
+	QString path = QString("%1/plugin").arg(strDir);
+
+	showFileInExplorer(path);
+}

+ 23 - 0
src/pluginmgr.h

@@ -0,0 +1,23 @@
+#pragma once
+
+#include <QMainWindow>
+#include "ui_pluginmgr.h"
+#include "pluginGl.h"
+
+class PluginMgr : public QMainWindow
+{
+	Q_OBJECT
+
+public:
+	PluginMgr(QWidget *parent, QList<NDD_PROC_DATA>& pluginList);
+	~PluginMgr();
+
+private:
+	void init(QList<NDD_PROC_DATA>& pluginList);
+
+private slots:
+	void slot_openPluginDir();
+
+private:
+	Ui::PluginMgrClass ui;
+};

+ 161 - 0
src/pluginmgr.ui

@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PluginMgrClass</class>
+ <widget class="QMainWindow" name="PluginMgrClass">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>974</width>
+    <height>488</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>PluginMgr</string>
+  </property>
+  <widget class="QWidget" name="centralWidget">
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <property name="leftMargin">
+     <number>3</number>
+    </property>
+    <property name="rightMargin">
+     <number>3</number>
+    </property>
+    <property name="bottomMargin">
+     <number>3</number>
+    </property>
+    <item>
+     <widget class="QTableWidget" name="pluginTable">
+      <column>
+       <property name="text">
+        <string>Name</string>
+       </property>
+      </column>
+      <column>
+       <property name="text">
+        <string>Version</string>
+       </property>
+      </column>
+      <column>
+       <property name="text">
+        <string>Auther</string>
+       </property>
+      </column>
+      <column>
+       <property name="text">
+        <string>Comment</string>
+       </property>
+      </column>
+      <column>
+       <property name="text">
+        <string>Path</string>
+       </property>
+      </column>
+     </widget>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <item>
+       <spacer name="horizontalSpacer_2">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pluginDirBt">
+        <property name="text">
+         <string>Plugin Dir</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="cancelBt">
+        <property name="text">
+         <string>Close</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <spacer name="horizontalSpacer">
+        <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>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menuBar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>974</width>
+     <height>23</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QToolBar" name="mainToolBar">
+   <attribute name="toolBarArea">
+    <enum>TopToolBarArea</enum>
+   </attribute>
+   <attribute name="toolBarBreak">
+    <bool>false</bool>
+   </attribute>
+  </widget>
+  <widget class="QStatusBar" name="statusBar"/>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>cancelBt</sender>
+   <signal>clicked()</signal>
+   <receiver>PluginMgrClass</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>539</x>
+     <y>449</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>637</x>
+     <y>461</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>pluginDirBt</sender>
+   <signal>clicked()</signal>
+   <receiver>PluginMgrClass</receiver>
+   <slot>slot_openPluginDir()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>453</x>
+     <y>453</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>463</x>
+     <y>490</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+ <slots>
+  <slot>slot_openPluginDir()</slot>
+ </slots>
+</ui>

+ 2 - 10
src/qscidisplaywindow.cpp

@@ -3,6 +3,7 @@
 #include "textfind.h"
 #include "common.h"
 #include "styleset.h"
+#include "rcglobal.h"
 
 #include <QScrollBar>
 #include <QFileInfo>
@@ -538,15 +539,6 @@ void QsciDisplayWindow::slot_FindTextWithPara(int prevOrNext, QString text)
 //定位到文件夹
 void QsciDisplayWindow::slot_showFileInExplorer()
 {
-	QString path, cmd;
-#ifdef _WIN32
-	path = m_filePath.replace("/", "\\");
-	cmd = QString("explorer.exe /select,%1").arg(path);
-#else
-	path = m_filePath.replace("\\", "/");
-	cmd = QString("open -R %1").arg(path);
-#endif
-	QProcess process;
-	process.startDetached(cmd);
+	showFileInExplorer(m_filePath);
 }
 

+ 2 - 2
src/qscint/scintilla/include/Scintilla.h

@@ -1,4 +1,4 @@
-/* Scintilla source code edit control */
+/* Scintilla source code edit control */
 /** @file Scintilla.h
  ** Interface to the edit control.
  **/
@@ -1101,7 +1101,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
 #define SCN_URIDROPPED 2015
 #define SCN_DWELLSTART 2016
 #define SCN_DWELLEND 2017
-#define SCN_ZOOM 2018
+#define SCN_ZOOM_CODE 2018
 #define SCN_HOTSPOTCLICK 2019
 #define SCN_HOTSPOTDOUBLECLICK 2020
 #define SCN_CALLTIPCLICK 2021

+ 1 - 1
src/qscint/scintilla/src/Editor.cpp

@@ -2488,7 +2488,7 @@ void Editor::NotifyDwelling(Point pt, bool state) {
 
 void Editor::NotifyZoom() {
 	SCNotification scn = {};
-	scn.nmhdr.code = SCN_ZOOM;
+	scn.nmhdr.code = SCN_ZOOM_CODE;
 	NotifyParent(scn);
 }
 

+ 1 - 0
src/qscint/src/Qsci/qsciglobal.h

@@ -37,6 +37,7 @@
 // Define QSCINTILLA_MAKE_DLL to create a QScintilla shared library, or
 // define QSCINTILLA_DLL to link against a QScintilla shared library, or define
 // neither to either build or link against a static QScintilla library.
+
 #if defined(QSCINTILLA_DLL)
 #define QSCINTILLA_EXPORT       Q_DECL_IMPORT
 #elif defined(QSCINTILLA_MAKE_DLL)

+ 20 - 0
src/qscint/src/Qsci/qscilexer.h

@@ -302,9 +302,21 @@ public:
                const char *prefix = "/Scintilla") const;
 
 	StyleData &styleData(int style) const;
+    StyleData& setThemesDefaultStyleData(int style) const;
 
 	void resetStyleDefaults();
 
+    QByteArray getCommentLineSymbol();
+    void setCommentLineSymbol(QByteArray comment);
+
+    QByteArray getCommentStart();
+    QByteArray getCommentEnd();
+
+    void setCommentStart(QByteArray commentStart);
+    void setCommentEnd(QByteArray commentEnd);
+
+    static void setCurThemes(int themesId);
+
 public slots:
     //! The auto-indentation style is set to \a autoindentstyle.
     //!
@@ -365,6 +377,14 @@ protected:
 	bool m_isUserDefineKeyword; //是否使用用户自定义关键字。默认false
 
 	QByteArray m_userDefineKeyword;//用户自定义的关键字
+
+    QByteArray m_commentSymbol;
+    QByteArray m_commentStart;
+    QByteArray m_commentEnd;
+
+    //当前主题id
+    static int m_themesId;
+
 private:
 
 

+ 48 - 1
src/qscint/src/Qsci/qscilexerglobal.h

@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 #include <QObject>
 #include <Qsci/qsciglobal.h>
 #include <Qsci/qscilexer.h>
@@ -7,6 +7,47 @@
 class QsciScintilla;
 class QsciStyle;
 
+enum GLOBAL_STYLES {
+	GLOBAL_OVERRIDE=0,
+	DEFAULT_STYLE,
+	INDENT_GUIDELINE,
+	BRACE_HIGHIGHT,
+	BAD_BRACE_COLOUR,
+	CURRENT_LINE_BACKGROUND_COLOR,
+	SELECT_TEXT_COLOR,
+	CARET_COLOUR,
+	EDGE_COLOUR,
+	LINE_NUMBER_MARGIN,
+	BOOKMARK_MARGIN,
+	FOLD,
+	FOLD_ACTIVE,
+	FOLD_MARGIN,
+	WHITE_SPACE_SYMBOL,
+	SMART_HIGHLIGHTING,
+	FIND_MARK_STYLE,
+	MARK_STYLE_1,
+	MARK_STYLE_2,
+	MARK_STYLE_3,
+	MARK_STYLE_4,
+	MARK_STYLE_5,
+	INCREMENTAL_HIGHLIGHT,
+	TAGS_MATCH_HIGHLIGHT,
+	TAGS_ATTRIBUTE,
+	//ACTIVE_TAB_FOCUSED,
+	//ACTIVE_TAB_UNFOCUSED,
+	//ACTIVE_TAB_TEXT,
+	//INACTIVE_TABS,
+	URL_HOVERRED,
+};
+
+enum CHANGE_OPER_BIT {
+	FG_BIT = 0x1,
+	BG_BIT = 0x2,
+	FONT_BIT = 0x4,
+	SIZE_BIT = 0x8,
+	ALL_OPER_BIT = 0xf,
+};
+
 class QSCINTILLA_EXPORT QsciLexerGlobal  : public QsciLexer
 {
 	Q_OBJECT
@@ -19,4 +60,10 @@ public:
 	const char* language() const;
 	QString description(int style) const;
 	QFont defaultFont(int style) const;
+	virtual QColor defaultColor(int style) const;
+	virtual QColor defaultPaper(int style) const;
+
+	int changeOperBit(int style) const;
+
+	static int getRealStyleId(int style);
 };

+ 12 - 5
src/qscint/src/Qsci/qsciscintilla.h

@@ -72,10 +72,10 @@ struct FindState
 	bool show;
 };
 
-enum FindNextType {
-	FINDNEXTTYPE_FINDNEXT,
-	FINDNEXTTYPE_REPLACENEXT,
-	FINDNEXTTYPE_FINDNEXTFORREPLACE
+enum FindNextType {
+	FINDNEXTTYPE_FINDNEXT,
+	FINDNEXTTYPE_REPLACENEXT,
+	FINDNEXTTYPE_FINDNEXTFORREPLACE
 };
 
 //! \brief The QsciScintilla class implements a higher level, more Qt-like,
@@ -1670,6 +1670,8 @@ public:
 	void setHtmlHighLightTag(bool v);
 	bool getHtmlHighLightTag();
 
+   /* virtual void adjuctSkinStyle() {}*/
+
 public slots:
     //! Appends the text \a text to the end of the text edit.  Note that the
     //! undo/redo history is cleared by this function.
@@ -2214,6 +2216,10 @@ protected:
     //! \reimp
     virtual void wheelEvent(QWheelEvent *e);
 
+	virtual void addHotSpot() {}
+
+    void setStylesFont(const QFont& f, int style);
+
 private slots:
     void handleCallTipClick(int dir);
     void handleCharAdded(int charadded);
@@ -2225,6 +2231,7 @@ private slots:
             int added, int line, int foldNow, int foldPrev, int token,
             int annotationLinesAdded);
     void handlePropertyChange(const char *prop, const char *val);
+
     void handleSavePointReached();
     void handleSavePointLeft();
     void handleSelectionChanged(bool yes);
@@ -2271,7 +2278,7 @@ private:
             int visLevels = 0, int level = -1);
     void setFoldMarker(int marknr, int mark = SC_MARK_EMPTY);
     void setLexerStyle(int style);
-    void setStylesFont(const QFont &f, int style);
+ 
     void setEnabledColors(int style, QColor &fore, QColor &back);
 
     void braceMatch();

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 876 - 780
src/qscint/src/qscilexer.cpp


+ 1 - 0
src/qscint/src/qscilexerbash.cpp

@@ -29,6 +29,7 @@
 QsciLexerBash::QsciLexerBash(QObject *parent)
     : QsciLexer(parent), fold_comments(false), fold_compact(true)
 {
+    m_commentSymbol = "#";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexerbatch.cpp

@@ -29,6 +29,7 @@
 QsciLexerBatch::QsciLexerBatch(QObject *parent)
     : QsciLexer(parent)
 {
+    m_commentSymbol = "REM";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexercmake.cpp

@@ -29,6 +29,7 @@
 QsciLexerCMake::QsciLexerCMake(QObject *parent)
     : QsciLexer(parent), fold_atelse(false)
 {
+    m_commentSymbol = "#";
 }
 
 

+ 3 - 0
src/qscint/src/qscilexercpp.cpp

@@ -34,6 +34,9 @@ QsciLexerCPP::QsciLexerCPP(QObject *parent, bool caseInsensitiveKeywords)
       highlight_escape(false), vs_escape(false),
       nocase(caseInsensitiveKeywords)
 {
+    m_commentSymbol = "//";
+    m_commentStart = "/*";
+    m_commentEnd = "*/";
 }
 
 

+ 3 - 0
src/qscint/src/qscilexercsharp.cpp

@@ -29,6 +29,9 @@
 QsciLexerCSharp::QsciLexerCSharp(QObject *parent)
     : QsciLexerCPP(parent)
 {
+    m_commentSymbol = "//";
+    m_commentStart = "/*";
+    m_commentEnd = "*/";
 }
 
 

+ 2 - 0
src/qscint/src/qscilexercss.cpp

@@ -31,6 +31,8 @@ QsciLexerCSS::QsciLexerCSS(QObject *parent)
       fold_comments(false), fold_compact(true), hss_language(false),
       less_language(false), scss_language(false)
 {
+    m_commentStart = "/*";
+    m_commentEnd = "*/";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexerfortran.cpp

@@ -29,6 +29,7 @@
 QsciLexerFortran::QsciLexerFortran(QObject *parent)
     : QsciLexerFortran77(parent)
 {
+    m_commentSymbol = "!";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexerfortran77.cpp

@@ -29,6 +29,7 @@
 QsciLexerFortran77::QsciLexerFortran77(QObject *parent)
     : QsciLexer(parent), fold_compact(true)
 {
+    m_commentSymbol = "!";
 }
 
 

+ 469 - 7
src/qscint/src/qscilexerglobal.cpp

@@ -1,5 +1,9 @@
-#include "Qsci/qscilexerglobal.h"
+#include "Qsci/qscilexerglobal.h"
 #include "Qsci/qsciscintilla.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+//golbal是一个特殊的语法编辑器,他不影响某一种具体的语法。而是对所有编辑器lexer以外的风格进行表示
 
 QsciLexerGlobal::QsciLexerGlobal(QObject *parent)
 	: QsciLexer(parent)
@@ -16,28 +20,486 @@ int QsciLexerGlobal::lexerId() const
 // Returns the language name.
 const char* QsciLexerGlobal::language() const
 {
-	return "Gloabl";
+	return "Global";
 }
 
 QString QsciLexerGlobal::description(int style) const
 {
-	if (style == 0)
+	switch (style)
 	{
-		return "All Language Modify";
+	case GLOBAL_OVERRIDE:
+		return tr("Global override");
+	case DEFAULT_STYLE:
+		return tr("Default");
+	case INDENT_GUIDELINE:
+		return tr("Indent guideline style");
+	case BRACE_HIGHIGHT:
+		return tr("Brace highlight style");
+	case BAD_BRACE_COLOUR:
+		return tr("Bad brace colour");
+	case CURRENT_LINE_BACKGROUND_COLOR:
+		return  tr("Current line background colour");
+	case SELECT_TEXT_COLOR:
+		return tr("Select text colour");
+	case CARET_COLOUR:
+		return tr("Caret colour");
+	case EDGE_COLOUR:
+		return tr("Edge colour");
+	case LINE_NUMBER_MARGIN:
+		return tr("Line number margin");
+	case BOOKMARK_MARGIN:
+		return tr("Bookmark margin");
+	case FOLD:
+		return tr("Fold");
+	case FOLD_ACTIVE:
+		return tr("Fold active");
+	case FOLD_MARGIN:
+		return tr("Fold margin");
+	case WHITE_SPACE_SYMBOL:
+		return tr("White space symbol");
+	case SMART_HIGHLIGHTING:
+		return tr("Smart HighLighting");
+	case FIND_MARK_STYLE:
+		return tr("Find Mark Style");
+	case MARK_STYLE_1:
+		return tr("Mark Style 1");
+	case MARK_STYLE_2:
+		return tr("Mark Style 2");
+	case MARK_STYLE_3:
+		return tr("Mark Style 3");
+	case MARK_STYLE_4:
+		return tr("Mark Style 4");
+	case MARK_STYLE_5:
+		return tr("Mark Style 5");
+	case INCREMENTAL_HIGHLIGHT:
+		return tr("Incremental highlight");
+	case TAGS_MATCH_HIGHLIGHT:
+		return tr("Tags match highlight");
+	case TAGS_ATTRIBUTE:
+		return tr("Tags attribute");
+	/*case ACTIVE_TAB_FOCUSED:
+		return tr("Active tab focused");
+	case ACTIVE_TAB_UNFOCUSED:
+		return tr("Active tab unfocused indicator");
+	case ACTIVE_TAB_TEXT:
+		return tr("Active tab text");
+	case INACTIVE_TABS:
+		return tr("Inactive tabs");*/
+	case URL_HOVERRED:
+		return tr("URL hovered");
+	default:
+		break;
 	}
 
 	return QString();
 }
 
+//字体大小。对于DEFAULT_STYLE BRACE_HIGHIGHT BAD_BRACE_COLOUR LINE_NUMBER_MARGIN
+//四个特殊属性而言,他们的字体大小,是用来表示符号的大小的。
+
 QFont QsciLexerGlobal::defaultFont(int style) const
 {
+#if defined(Q_OS_WIN)
+	QFont f("Courier New", 14);
+#elif defined(Q_OS_MAC)
+	QFont f("Menlo", s_defaultFontSize);
+#else
+	QFont f("Courier 10 Pitch", 14);
+#endif
+
 	switch (style)
 	{
-	case 0:
-		return QsciLexer::s_defaultLangFont;
+
+	case INDENT_GUIDELINE:
+	case CURRENT_LINE_BACKGROUND_COLOR:
+	case SELECT_TEXT_COLOR:
+	case CARET_COLOUR:
+	case EDGE_COLOUR:
+	case BOOKMARK_MARGIN:
+	case FOLD:
+	case FOLD_ACTIVE:
+	case FOLD_MARGIN:
+	case WHITE_SPACE_SYMBOL:
+	case SMART_HIGHLIGHTING:
+	case FIND_MARK_STYLE:
+	case MARK_STYLE_1:
+	case MARK_STYLE_2:
+	case MARK_STYLE_3:
+	case MARK_STYLE_4:
+	case MARK_STYLE_5:
+	case INCREMENTAL_HIGHLIGHT:
+	case TAGS_MATCH_HIGHLIGHT:
+	case TAGS_ATTRIBUTE:
+	/*case ACTIVE_TAB_FOCUSED:
+	case ACTIVE_TAB_UNFOCUSED:
+	case ACTIVE_TAB_TEXT:
+	case INACTIVE_TABS:*/
+	case URL_HOVERRED:
+		//这些都是不能设置字体的,统一设置为空
+		f.setFamily("");
+		f.setPointSize(-1);
 		break;
+
+	case GLOBAL_OVERRIDE:
+	case BAD_BRACE_COLOUR:
+	case DEFAULT_STYLE:
+	case BRACE_HIGHIGHT:
+		return f;
+
+	case LINE_NUMBER_MARGIN:
+		//这个对应STYLE_LINENUMBER的默认大小为10
+		f.setPointSize(12);
+		return f;
 	default:
 		break;
-	}	
+	}
 	return QsciLexer::s_defaultLangFont;
 }
+
+
+// Returns the foreground colour of the text for a style.
+QColor QsciLexerGlobal::defaultColor(int style) const
+{
+	switch (style)
+	{
+	case GLOBAL_OVERRIDE:
+		return QColor(0xFFFF80);
+
+	case DEFAULT_STYLE:
+		return QColor(Qt::black);
+
+	case INDENT_GUIDELINE:
+		return QColor(0xC0C0C0);
+
+	case BRACE_HIGHIGHT:
+		return QColor(0xFF0000);
+
+	case BAD_BRACE_COLOUR:
+		return QColor(0x800000);
+
+	case CURRENT_LINE_BACKGROUND_COLOR:
+		return QColor(0x0080C0);
+
+	case SELECT_TEXT_COLOR:
+		return QColor(Qt::black);
+
+	case CARET_COLOUR:
+		return QColor(0x8000FF);
+
+	case EDGE_COLOUR:
+		return QColor(0x80FFFF);
+
+	case LINE_NUMBER_MARGIN:
+		return QColor(0x808080);
+
+	case BOOKMARK_MARGIN:
+		return QColor(0xEEEEEC);
+
+	case FOLD:
+		return QColor(0x808080);
+
+	case FOLD_ACTIVE:
+		return QColor(0xFF0000);
+
+	case FOLD_MARGIN:
+		return QColor(0xFFFFFF);
+
+	case WHITE_SPACE_SYMBOL:
+		return QColor(0xFFB56A);
+
+	case SMART_HIGHLIGHTING:
+		return QColor(0x00ff00);
+
+	case FIND_MARK_STYLE:
+		return QColor(0xFCAF3E);
+
+	case MARK_STYLE_1:
+		return QColor(0x555753);
+
+	case MARK_STYLE_2:
+		return QColor(0xFCAF3E);
+
+	case MARK_STYLE_3:
+		return QColor(0xFAAA3C);
+
+	case MARK_STYLE_4:
+		return QColor(0xFFCAB0);
+
+	case MARK_STYLE_5:
+		return QColor(Qt::black);
+
+	case INCREMENTAL_HIGHLIGHT:
+		return QColor(0x808080);
+
+	case TAGS_MATCH_HIGHLIGHT:
+		return QColor(0xFFCAB0);
+
+	case TAGS_ATTRIBUTE:
+		return QColor(0xFFCAB0);
+
+	/*case ACTIVE_TAB_FOCUSED:
+		return QColor(0xFAAA3C);
+
+	case ACTIVE_TAB_UNFOCUSED:
+		return QColor(0xFFCAB0);
+
+	case ACTIVE_TAB_TEXT:
+		return QColor(Qt::black);
+
+	case INACTIVE_TABS:
+		return QColor(0x808080);*/
+
+	case URL_HOVERRED:
+		return QColor(0xFFFF80);
+
+	default:
+		break;
+	}
+
+	return QsciLexer::defaultColor(style);
+}
+
+
+//global其实不是一个风格,它里面的风格是约束编辑器其他细节设置的。但是保存又是安装内部的styleid来进行的。
+//故提供该函数,把内部风格转换为外部的风格id功能。没有则为-2
+int QsciLexerGlobal::getRealStyleId(int style)
+{
+	switch (style)
+	{
+		//可设置前景、背景、字体
+	case DEFAULT_STYLE:
+		return STYLE_DEFAULT;
+
+	case INDENT_GUIDELINE:
+		return STYLE_INDENTGUIDE;
+
+	case BRACE_HIGHIGHT:
+		return STYLE_BRACELIGHT;
+
+	case BAD_BRACE_COLOUR:
+		return STYLE_BRACEBAD;
+
+	case CARET_COLOUR:
+		return SCI_SETCARETFORE;
+
+	case LINE_NUMBER_MARGIN:
+		return STYLE_LINENUMBER;
+
+	case SMART_HIGHLIGHTING:
+		return SCE_UNIVERSAL_FOUND_STYLE_SMART;
+
+	case FIND_MARK_STYLE:
+		return SCE_UNIVERSAL_FOUND_STYLE;
+
+	case MARK_STYLE_1:
+		return SCE_UNIVERSAL_FOUND_STYLE_EXT1;
+
+	case MARK_STYLE_2:
+		return SCE_UNIVERSAL_FOUND_STYLE_EXT2;
+
+	case MARK_STYLE_3:
+		return SCE_UNIVERSAL_FOUND_STYLE_EXT3;
+
+	case MARK_STYLE_4:
+		return SCE_UNIVERSAL_FOUND_STYLE_EXT4;
+
+	case MARK_STYLE_5:
+		return SCE_UNIVERSAL_FOUND_STYLE_EXT5;
+
+	case INCREMENTAL_HIGHLIGHT:
+		return SCE_UNIVERSAL_FOUND_STYLE_INC;
+
+	case TAGS_MATCH_HIGHLIGHT:
+		return SCE_UNIVERSAL_TAGMATCH;
+
+	case TAGS_ATTRIBUTE:
+		return SCE_UNIVERSAL_TAGATTR;
+
+	default:
+		break;
+	}
+
+	//-1是表示所以,已经被占用,所以使用-2
+	return -2;
+}
+
+QColor QsciLexerGlobal::defaultPaper(int style) const
+{
+	switch (style)
+	{
+	case GLOBAL_OVERRIDE:
+		return QColor(0xFF8000);
+
+	case DEFAULT_STYLE:
+		return QColor(0xFFFFFF);
+
+	case INDENT_GUIDELINE:
+		return QColor(0xFFFFFF);
+
+	case BRACE_HIGHIGHT:
+		return QColor(0xFFFFFF);
+
+	case BAD_BRACE_COLOUR:
+		return QColor(0xFFFFFF);
+
+	case CURRENT_LINE_BACKGROUND_COLOR:
+		return QColor(0xE8E8FF);
+
+	case SELECT_TEXT_COLOR:
+		return QColor(0xC0C0C0);
+
+	case CARET_COLOUR:
+		return QColor(0x919994);
+			
+	case EDGE_COLOUR:
+		return QColor(0x112435);
+
+	case LINE_NUMBER_MARGIN:
+		return QColor(0xE4E4E4);
+
+	case BOOKMARK_MARGIN:
+		return QColor(0xE0E0E0);
+
+	case FOLD:
+		return QColor(0xF3F3F3);
+
+	case FOLD_ACTIVE:
+		return QColor(0x2E3436);
+
+	case FOLD_MARGIN:
+		return QColor(0xE9E9E9);
+
+	case WHITE_SPACE_SYMBOL:
+		return QColor(0x80FF00);
+
+	case SMART_HIGHLIGHTING:
+		return QColor(0x00FF00);
+
+	case FIND_MARK_STYLE:
+		return QColor(0xFF0000);
+
+	case MARK_STYLE_1:
+		return QColor(0x00FFFF);
+
+	case MARK_STYLE_2:
+		return QColor(0xFF8000);
+
+	case MARK_STYLE_3:
+		return QColor(0xFFFF00);
+
+	case MARK_STYLE_4:
+		return QColor(0x8000FF);
+
+	case MARK_STYLE_5:
+		return QColor(0x008000);
+
+	case INCREMENTAL_HIGHLIGHT:
+		return QColor(0x0080FF);
+
+	case TAGS_MATCH_HIGHLIGHT:
+		return QColor(0x8000FF);
+
+	case TAGS_ATTRIBUTE:
+		return QColor(0xFFFF00);
+
+	//case ACTIVE_TAB_FOCUSED:
+	//	return QColor(0x8000FF);
+
+	//case ACTIVE_TAB_UNFOCUSED:
+	//	return QColor(0xFFFF00);
+
+	//case ACTIVE_TAB_TEXT:
+	//	return QColor(0xFF0000);
+
+	//case INACTIVE_TABS:
+	//	return QColor(0xC0C0C0);
+
+	case URL_HOVERRED:
+		return QColor(0xC0C0C0);
+
+	default:
+		break;
+	}
+
+	return QsciLexer::defaultPaper(style);
+}
+//enum CHANGE_OPER_BIT {
+//	FG_BIT = 1,
+//	BG_BIT = 2,
+//	FONT_BIT = 4,
+//	SIZE_BIT = 8,
+//};
+
+//全局样式哪些位可以修改。在设置的界面,把不能修改的界面回调
+int QsciLexerGlobal::changeOperBit(int style) const
+{
+	switch (style)
+	{
+	case GLOBAL_OVERRIDE:
+		return ALL_OPER_BIT;
+
+	case DEFAULT_STYLE:
+		return ALL_OPER_BIT;
+
+	case INDENT_GUIDELINE:
+		return FG_BIT | BG_BIT;
+
+	case BRACE_HIGHIGHT:
+		return ALL_OPER_BIT;
+
+	case BAD_BRACE_COLOUR:
+		return ALL_OPER_BIT;
+
+	case CURRENT_LINE_BACKGROUND_COLOR:
+		return BG_BIT;
+
+	case SELECT_TEXT_COLOR:
+		return FG_BIT | BG_BIT;
+
+	case CARET_COLOUR:
+		return FG_BIT;
+
+	case EDGE_COLOUR:
+		return FG_BIT;
+
+	case LINE_NUMBER_MARGIN:
+		return ALL_OPER_BIT;
+
+	case BOOKMARK_MARGIN:
+		return BG_BIT;
+
+	case FOLD:
+	case FOLD_ACTIVE:
+	case FOLD_MARGIN:
+		return FG_BIT | BG_BIT;
+
+	case WHITE_SPACE_SYMBOL:
+		return FG_BIT;
+
+	case SMART_HIGHLIGHTING:
+		return FG_BIT;
+
+	case FIND_MARK_STYLE:
+		return FG_BIT;
+
+	case MARK_STYLE_1:
+	case MARK_STYLE_2:
+	case MARK_STYLE_3:
+	case MARK_STYLE_4:
+	case MARK_STYLE_5:
+		return BG_BIT;
+
+	case INCREMENTAL_HIGHLIGHT:
+		break;
+	case TAGS_MATCH_HIGHLIGHT:
+		return FG_BIT;
+	case TAGS_ATTRIBUTE:
+		return FG_BIT;
+	case URL_HOVERRED:
+		return FG_BIT;
+
+	default:
+		break;
+	}
+	return 0;
+}

+ 3 - 0
src/qscint/src/qscilexergo.cpp

@@ -28,6 +28,9 @@
 QsciLexerGO::QsciLexerGO(QObject *parent)
 	: QsciLexerCPP(parent)
 {
+	m_commentSymbol = "//";
+	m_commentStart = "/*";
+	m_commentEnd = "*/";
 }
 
 

+ 4 - 1
src/qscint/src/qscilexerhtml.cpp

@@ -35,6 +35,9 @@ QsciLexerHTML::QsciLexerHTML(QObject *parent)
       fold_script_comments(false), fold_script_heredocs(false),
       django_templates(false), mako_templates(false)
 {
+    m_commentSymbol = "";
+    m_commentStart = "<!--";
+    m_commentEnd = "-->";
 }
 
 
@@ -565,7 +568,7 @@ QString QsciLexerHTML::description(int style) const
     switch (style)
     {
     case Default:
-        return tr("HTML default");
+        return tr("Default");
 
     case Tag:
         return tr("Tag");

+ 3 - 0
src/qscint/src/qscilexerjava.cpp

@@ -25,6 +25,9 @@
 QsciLexerJava::QsciLexerJava(QObject *parent)
     : QsciLexerCPP(parent)
 {
+    m_commentSymbol = "//";
+    m_commentStart = "/*";
+    m_commentEnd = "*/";
 }
 
 

+ 3 - 0
src/qscint/src/qscilexerjavascript.cpp

@@ -39,6 +39,9 @@ const char *QsciLexerJavaScript::keywordClass =
 QsciLexerJavaScript::QsciLexerJavaScript(QObject *parent)
     : QsciLexerCPP(parent)
 {
+    m_commentSymbol = "//";
+    m_commentStart = "/*";
+    m_commentEnd = "*/";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexerlua.cpp

@@ -29,6 +29,7 @@
 QsciLexerLua::QsciLexerLua(QObject *parent)
     : QsciLexer(parent), fold_compact(true)
 {
+    m_commentSymbol = "--";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexermakefile.cpp

@@ -28,6 +28,7 @@
 QsciLexerMakefile::QsciLexerMakefile(QObject *parent)
     : QsciLexer(parent)
 {
+    m_commentSymbol = "#";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexermatlab.cpp

@@ -28,6 +28,7 @@
 QsciLexerMatlab::QsciLexerMatlab(QObject *parent)
     : QsciLexer(parent)
 {
+    m_commentSymbol = "%";
 }
 
 

+ 2 - 2
src/qscint/src/qscilexernsis.cpp

@@ -8,7 +8,7 @@
 QsciLexerNsis::QsciLexerNsis(QObject *parent)
 	: QsciLexer(parent)
 {
-	
+	m_commentSymbol = "#";
 }
 
 QsciLexerNsis::~QsciLexerNsis()
@@ -123,7 +123,7 @@ QString QsciLexerNsis::description(int style) const
 	switch (style)
 	{
 	case NSIS_DEFAULT:
-		return tr("DEFAULT");
+		return tr("Default");
 	case NSIS_COMMENT:
 		return tr("COMMENT");
 	case NSIS_STRINGDQ:

+ 2 - 0
src/qscint/src/qscilexerpascal.cpp

@@ -31,6 +31,8 @@ QsciLexerPascal::QsciLexerPascal(QObject *parent)
       fold_comments(false), fold_compact(true), fold_preproc(false),
       smart_highlight(true)
 {
+    m_commentStart = "{";
+    m_commentEnd = "}";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexerperl.cpp

@@ -31,6 +31,7 @@ QsciLexerPerl::QsciLexerPerl(QObject *parent)
       fold_atelse(false), fold_comments(false), fold_compact(true),
       fold_packages(true), fold_pod_blocks(true)
 {
+    m_commentSymbol = "#";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexerproperties.cpp

@@ -29,6 +29,7 @@
 QsciLexerProperties::QsciLexerProperties(QObject *parent)
     : QsciLexer(parent), fold_compact(true), initial_spaces(true)
 {
+    m_commentSymbol = "#";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexerpython.cpp

@@ -39,6 +39,7 @@ QsciLexerPython::QsciLexerPython(QObject *parent)
       indent_warn(NoWarning), strings_over_newline(false), v2_unicode(true),
       v3_binary_octal(true), v3_bytes(true), highlight_subids(true)
 {
+    m_commentSymbol = "#";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexerruby.cpp

@@ -29,6 +29,7 @@
 QsciLexerRuby::QsciLexerRuby(QObject *parent)
     : QsciLexer(parent), fold_comments(false), fold_compact(true)
 {
+    m_commentSymbol = "#";
 }
 
 

+ 4 - 2
src/qscint/src/qscilexerrust.cpp

@@ -8,7 +8,9 @@
 QsciLexerRust::QsciLexerRust(QObject *parent)
 	: QsciLexer(parent)
 {
-	
+	m_commentSymbol = "//";
+	m_commentStart = "/*";
+	m_commentEnd = "*/";
 }
 
 QsciLexerRust::~QsciLexerRust()
@@ -69,7 +71,7 @@ QString QsciLexerRust::description(int style) const
 	switch (style)
 	{
 	case RUST_DEFAULT:
-		return "default";
+		return "Default";
 	case RUST_COMMENTBLOCK:
 		return "comment";
 	case RUST_COMMENTLINE:

+ 3 - 0
src/qscint/src/qscilexersql.cpp

@@ -33,6 +33,9 @@ QsciLexerSQL::QsciLexerSQL(QObject *parent)
       numbersign_comment(false), backslash_escapes(false),
       allow_dotted_word(false)
 {
+    m_commentSymbol = "--";
+    m_commentStart = "/*";
+    m_commentEnd = "*/";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexertext.cpp

@@ -18,6 +18,7 @@ QsciLexerText::QsciLexerText(QObject *parent)
 	: QsciLexer(parent)
 {
 	setLexerId(L_TXT);
+	m_commentSymbol = "#";
 }
 
 QsciLexerText::~QsciLexerText()

+ 2 - 1
src/qscint/src/qscilexervb.cpp

@@ -4,6 +4,7 @@ QsciLexerVB::QsciLexerVB(QObject *parent)
 	: QsciLexer(parent)
 {
 	setLexerId(L_VB);
+	m_commentSymbol = "'";
 }
 
 QsciLexerVB::~QsciLexerVB()
@@ -85,7 +86,7 @@ QString QsciLexerVB::description(int style) const
 	switch (style)
 	{
 	case VB_DEFAULT:
-		return "default";
+		return "Default";
 	case VB_COMMENT:
 		return "comment";
 	case VB_NUMBER:

+ 3 - 0
src/qscint/src/qscilexerverilog.cpp

@@ -31,6 +31,9 @@ QsciLexerVerilog::QsciLexerVerilog(QObject *parent)
       fold_atelse(false), fold_comments(false), fold_compact(true),
       fold_preproc(false), fold_atmodule(false)
 {
+    m_commentSymbol = "//";
+    m_commentStart = "/*";
+    m_commentEnd = "*/";
 }
 
 

+ 3 - 0
src/qscint/src/qscilexervhdl.cpp

@@ -31,6 +31,9 @@ QsciLexerVHDL::QsciLexerVHDL(QObject *parent)
       fold_comments(true), fold_compact(true), fold_atelse(true),
       fold_atbegin(true), fold_atparenth(true)
 {
+    m_commentSymbol = "--";
+    m_commentStart = "/*";
+    m_commentEnd = "*/";
 }
 
 

+ 3 - 0
src/qscint/src/qscilexerxml.cpp

@@ -29,6 +29,9 @@
 QsciLexerXML::QsciLexerXML(QObject *parent)
     : QsciLexerHTML(parent), scripts(true)
 {
+    m_commentSymbol = "";
+    m_commentStart = "<!--";
+    m_commentEnd = "-->";
 }
 
 

+ 1 - 0
src/qscint/src/qscilexeryaml.cpp

@@ -29,6 +29,7 @@
 QsciLexerYAML::QsciLexerYAML(QObject *parent)
     : QsciLexer(parent), fold_comments(false)
 {
+    m_commentSymbol = "#";
 }
 
 

+ 1 - 1
src/qscint/src/qscintilla.pro

@@ -21,7 +21,7 @@
 !win32:VERSION = 15.1.0
 
 TEMPLATE = lib
-CONFIG += qt warn_off thread exceptions hide_symbols release staticlib
+CONFIG += qt warn_off thread exceptions hide_symbols debug staticlib
 
 CONFIG(debug, debug|release) {
     mac: {

+ 261 - 0
src/qscint/src/qscintilla.pro.user

@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE QtCreatorProject>
+<!-- Written by QtCreator 9.0.0, 2022-12-16T16:09:40. -->
+<qtcreator>
+ <data>
+  <variable>EnvironmentId</variable>
+  <value type="QByteArray">{ee8a8311-48c9-435d-8d33-c3e67e1c3f3d}</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.ActiveTarget</variable>
+  <value type="qlonglong">0</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.EditorSettings</variable>
+  <valuemap type="QVariantMap">
+   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
+   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
+   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
+    <value type="QString" key="language">Cpp</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
+    </valuemap>
+   </valuemap>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
+    <value type="QString" key="language">QmlJS</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
+    </valuemap>
+   </valuemap>
+   <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
+   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
+   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
+   <value type="int" key="EditorConfiguration.IndentSize">4</value>
+   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
+   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
+   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
+   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
+   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
+   <value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
+   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
+   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
+   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
+   <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
+   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
+   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
+   <value type="int" key="EditorConfiguration.TabSize">8</value>
+   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
+   <value type="bool" key="EditorConfiguration.UseIndenter">false</value>
+   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
+   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
+   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
+   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
+   <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
+   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
+   <value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
+   <value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.PluginSettings</variable>
+  <valuemap type="QVariantMap">
+   <valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
+    <value type="bool" key="AutoTest.Framework.Boost">true</value>
+    <value type="bool" key="AutoTest.Framework.CTest">false</value>
+    <value type="bool" key="AutoTest.Framework.Catch">true</value>
+    <value type="bool" key="AutoTest.Framework.GTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtTest">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
+   <value type="int" key="AutoTest.RunAfterBuild">0</value>
+   <value type="bool" key="AutoTest.UseGlobal">true</value>
+   <valuemap type="QVariantMap" key="ClangTools">
+    <value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
+    <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
+    <value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
+    <value type="int" key="ClangTools.ParallelJobs">3</value>
+    <valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
+    <valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
+    <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
+    <value type="bool" key="ClangTools.UseGlobalSettings">true</value>
+   </valuemap>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.0</variable>
+  <valuemap type="QVariantMap">
+   <value type="QString" key="DeviceType">Desktop</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.2 MSVC2019 64bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.2 MSVC2019 64bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5152.win64_msvc2019_64_kit</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+    <value type="int" key="EnableQmlDebugging">0</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\notepad--\qscint\src\..\build-qscintilla-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/notepad--/qscint/build-qscintilla-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\notepad--\qscint\src\..\build-qscintilla-Desktop_Qt_5_15_2_MSVC2019_64bit-Release</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/notepad--/qscint/build-qscintilla-Desktop_Qt_5_15_2_MSVC2019_64bit-Release</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
+    <value type="int" key="EnableQmlDebugging">0</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\notepad--\qscint\src\..\build-qscintilla-Desktop_Qt_5_15_2_MSVC2019_64bit-Profile</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/notepad--/qscint/build-qscintilla-Desktop_Qt_5_15_2_MSVC2019_64bit-Profile</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+     </valuemap>
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="int" key="QtQuickCompiler">0</value>
+    <value type="int" key="SeparateDebugInfo">0</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">部署</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
+    <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="CustomOutputParsers"/>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+   </valuemap>
+   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.TargetCount</variable>
+  <value type="qlonglong">1</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+  <value type="int">22</value>
+ </data>
+ <data>
+  <variable>Version</variable>
+  <value type="int">22</value>
+ </data>
+</qtcreator>

+ 586 - 97
src/qscint/src/qscintilla.vcxproj

@@ -1,102 +1,70 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
     <ProjectConfiguration Include="Debug|x64">
       <Configuration>Debug</Configuration>
       <Platform>x64</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectGuid>{9BC42707-EE25-3B28-9906-F7919E273020}</ProjectGuid>
-    <RootNamespace>qmyedit_qt5</RootNamespace>
+    <RootNamespace>qmyedit_qt5d</RootNamespace>
     <Keyword>QtVS_v304</Keyword>
     <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
     <WindowsTargetPlatformMinVersion>10.0.19041.0</WindowsTargetPlatformMinVersion>
-    <QtMsBuild Condition="'$(QtMsBuild)'=='' or !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
-  </PropertyGroup>
+  <QtMsBuild Condition="'$(QtMsBuild)'=='' or !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild></PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <PlatformToolset>v141</PlatformToolset>
-    <OutputDirectory>..\..\x64\Release\</OutputDirectory>
+    <OutputDirectory>..\..\x64\Debug\</OutputDirectory>
     <ATLMinimizesCRunTimeLibraryUsage>false</ATLMinimizesCRunTimeLibraryUsage>
     <CharacterSet>NotSet</CharacterSet>
     <ConfigurationType>StaticLibrary</ConfigurationType>
-    <IntermediateDirectory>release\</IntermediateDirectory>
-    <PrimaryOutput>qmyedit_qt5</PrimaryOutput>
+    <IntermediateDirectory>debug\</IntermediateDirectory>
+    <PrimaryOutput>qmyedit_qt5d</PrimaryOutput>
   </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <PlatformToolset>v141</PlatformToolset>
-    <OutputDirectory>..\..\x64\Release\</OutputDirectory>
+    <OutputDirectory>..\..\x64\Debug\</OutputDirectory>
     <ATLMinimizesCRunTimeLibraryUsage>false</ATLMinimizesCRunTimeLibraryUsage>
     <CharacterSet>NotSet</CharacterSet>
     <ConfigurationType>StaticLibrary</ConfigurationType>
-    <IntermediateDirectory>debug\</IntermediateDirectory>
-    <PrimaryOutput>qmyedit_qt5</PrimaryOutput>
+    <IntermediateDirectory>release\</IntermediateDirectory>
+    <PrimaryOutput>qmyedit_qt5d</PrimaryOutput>
   </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <Target Name="QtMsBuildNotFound" BeforeTargets="CustomBuild;ClCompile" Condition="!Exists('$(QtMsBuild)\qt.targets') or !Exists('$(QtMsBuild)\qt.props')">
-    <Message Importance="High" Text="QtMsBuild: could not locate qt.targets, qt.props; project may not build correctly." />
-  </Target>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /><Target Name="QtMsBuildNotFound" BeforeTargets="CustomBuild;ClCompile" Condition="!Exists('$(QtMsBuild)\qt.targets') or !Exists('$(QtMsBuild)\qt.props')"><Message Importance="High" Text="QtMsBuild: could not locate qt.targets, qt.props; project may not build correctly." /></Target>
   <ImportGroup Label="ExtensionSettings" />
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
-  </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
   </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')">
-    <Import Project="$(QtMsBuild)\qt_defaults.props" />
-  </ImportGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <OutDir>..\..\x64\Debug\</OutDir>
-    <IntDir>debug\</IntDir>
-    <TargetName>qmyedit_qt5d</TargetName>
-    <IgnoreImportLibrary>true</IgnoreImportLibrary>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <OutDir>..\..\x64\Release\</OutDir>
-    <IntDir>release\</IntDir>
-    <TargetName>qmyedit_qt5</TargetName>
-    <IgnoreImportLibrary>true</IgnoreImportLibrary>
-  </PropertyGroup>
-  <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <QtInstall>5.15.2_msvc2019_64</QtInstall>
-    <QtModules>core;gui;widgets;printsupport</QtModules>
-  </PropertyGroup>
-  <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <QtInstall>5.15.2_msvc2019_64</QtInstall>
-    <QtModules>core;gui;widgets;printsupport</QtModules>
-  </PropertyGroup>
-  <ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')">
-    <Import Project="$(QtMsBuild)\qt.props" />
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
   </ImportGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+  <PropertyGroup Label="UserMacros" /><ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')"><Import Project="$(QtMsBuild)\qt_defaults.props" /></ImportGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><OutDir>..\..\x64\Debug\</OutDir><IntDir>release\</IntDir><TargetName>qmyedit_qt5d</TargetName><IgnoreImportLibrary>true</IgnoreImportLibrary></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><OutDir>..\..\x64\Debug\</OutDir><IntDir>debug\</IntDir><TargetName>qmyedit_qt5d</TargetName><IgnoreImportLibrary>true</IgnoreImportLibrary></PropertyGroup><PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"><QtInstall>5.12.10_msvc2017_64</QtInstall><QtModules>core;gui;widgets;printsupport</QtModules></PropertyGroup><PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"><QtInstall>5.12.10_msvc2017_64</QtInstall><QtModules>core;gui;widgets;printsupport</QtModules></PropertyGroup><ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')"><Import Project="$(QtMsBuild)\qt.props" /></ImportGroup>
+  
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <ClCompile>
-      <AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.;..\scintilla\include;..\scintilla\lexlib;..\scintilla\src;..\scintilla\boostregex;release;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.;..\scintilla\include;..\scintilla\lexlib;..\scintilla\src;..\scintilla\boostregex;debug;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
-      <AssemblerListingLocation>release\</AssemblerListingLocation>
+      <AssemblerListingLocation>debug\</AssemblerListingLocation>
       <BrowseInformation>false</BrowseInformation>
-      <DebugInformationFormat>None</DebugInformationFormat>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <ExceptionHandling>Sync</ExceptionHandling>
-      <ObjectFileName>release\</ObjectFileName>
-      <Optimization>MaxSpeed</Optimization>
-      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;SCINTILLA_QT;SCI_LEXER;INCLUDE_DEPRECATED_FEATURES;NDEBUG;QT_NO_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ObjectFileName>debug\</ObjectFileName>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;SCINTILLA_QT;SCI_LEXER;INCLUDE_DEPRECATED_FEATURES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessToFile>false</PreprocessToFile>
-      <ProgramDataBaseFileName>
-      </ProgramDataBaseFileName>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <WarningLevel>TurnOffAllWarnings</WarningLevel>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-    </ClCompile>
+    <MultiProcessorCompilation>true</MultiProcessorCompilation></ClCompile>
     <Lib>
-      <OutputFile>$(OutDir)\qmyedit_qt5.lib</OutputFile>
+      <OutputFile>$(OutDir)\qmyedit_qt5d.lib</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
     </Lib>
     <Midl>
@@ -105,35 +73,27 @@
       <WarningLevel>0</WarningLevel>
     </Midl>
     <ResourceCompile>
-      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;SCINTILLA_QT;SCI_LEXER;INCLUDE_DEPRECATED_FEATURES;NDEBUG;QT_NO_DEBUG;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;SCINTILLA_QT;SCI_LEXER;INCLUDE_DEPRECATED_FEATURES;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ResourceCompile>
-    <QtMoc>
-      <CompilerFlavor>msvc</CompilerFlavor>
-      <Include>./$(Configuration)/moc_predefs.h</Include>
-      <ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription>
-      <DynamicSource>output</DynamicSource>
-      <QtMocDir>$(Configuration)</QtMocDir>
-      <QtMocFileName>moc_%(Filename).cpp</QtMocFileName>
-    </QtMoc>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+  <QtMoc><CompilerFlavor>msvc</CompilerFlavor><Include>./$(Configuration)/moc_predefs.h</Include><ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription><DynamicSource>output</DynamicSource><QtMocDir>$(Configuration)</QtMocDir><QtMocFileName>moc_%(Filename).cpp</QtMocFileName></QtMoc></ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <ClCompile>
-      <AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.;..\scintilla\include;..\scintilla\lexlib;..\scintilla\src;..\scintilla\boostregex;debug;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.;..\scintilla\include;..\scintilla\lexlib;..\scintilla\src;..\scintilla\boostregex;release;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <AdditionalOptions>-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
-      <AssemblerListingLocation>debug\</AssemblerListingLocation>
+      <AssemblerListingLocation>release\</AssemblerListingLocation>
       <BrowseInformation>false</BrowseInformation>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <DebugInformationFormat>None</DebugInformationFormat>
       <ExceptionHandling>Sync</ExceptionHandling>
-      <ObjectFileName>debug\</ObjectFileName>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;SCINTILLA_QT;SCI_LEXER;INCLUDE_DEPRECATED_FEATURES;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ObjectFileName>release\</ObjectFileName>
+      <Optimization>MaxSpeed</Optimization>
+      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;SCINTILLA_QT;SCI_LEXER;INCLUDE_DEPRECATED_FEATURES;QT_NO_DEBUG;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PreprocessToFile>false</PreprocessToFile>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <ProgramDataBaseFileName></ProgramDataBaseFileName>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <WarningLevel>TurnOffAllWarnings</WarningLevel>
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>
-    </ClCompile>
+    <MultiProcessorCompilation>true</MultiProcessorCompilation></ClCompile>
     <Lib>
       <OutputFile>$(OutDir)\qmyedit_qt5d.lib</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
@@ -144,17 +104,9 @@
       <WarningLevel>0</WarningLevel>
     </Midl>
     <ResourceCompile>
-      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;SCINTILLA_QT;SCI_LEXER;INCLUDE_DEPRECATED_FEATURES;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;SCINTILLA_QT;SCI_LEXER;INCLUDE_DEPRECATED_FEATURES;QT_NO_DEBUG;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ResourceCompile>
-    <QtMoc>
-      <CompilerFlavor>msvc</CompilerFlavor>
-      <Include>./$(Configuration)/moc_predefs.h</Include>
-      <ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription>
-      <DynamicSource>output</DynamicSource>
-      <QtMocDir>$(Configuration)</QtMocDir>
-      <QtMocFileName>moc_%(Filename).cpp</QtMocFileName>
-    </QtMoc>
-  </ItemDefinitionGroup>
+  <QtMoc><CompilerFlavor>msvc</CompilerFlavor><Include>./$(Configuration)/moc_predefs.h</Include><ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription><DynamicSource>output</DynamicSource><QtMocDir>$(Configuration)</QtMocDir><QtMocFileName>moc_%(Filename).cpp</QtMocFileName></QtMoc></ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="..\scintilla\lexlib\Accessor.cpp" />
     <ClCompile Include="..\scintilla\src\AutoComplete.cpp" />
@@ -421,12 +373,28 @@
     <ClInclude Include="..\scintilla\src\RunStyles.h" />
     <ClInclude Include="SciAccessibility.h" />
     <QtMoc Include="SciClasses.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <ClInclude Include="..\scintilla\include\SciLexer.h" />
     <ClInclude Include="..\scintilla\include\Sci_Position.h" />
     <ClInclude Include="..\scintilla\include\Scintilla.h" />
     <ClInclude Include="..\scintilla\src\ScintillaBase.h" />
     <QtMoc Include="ScintillaQt.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <ClInclude Include="..\scintilla\include\ScintillaWidget.h" />
     <ClInclude Include="..\scintilla\src\Selection.h" />
@@ -444,142 +412,663 @@
     <ClInclude Include="..\scintilla\lexlib\WordList.h" />
     <ClInclude Include="..\scintilla\src\XPM.h" />
     <QtMoc Include="Qsci\qsciabstractapis.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qsciapis.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <ClInclude Include="Qsci\qscicommand.h" />
     <ClInclude Include="Qsci\qscicommandset.h" />
     <ClInclude Include="Qsci\qscidocument.h" />
     <ClInclude Include="Qsci\qsciglobal.h" />
     <QtMoc Include="Qsci\qscilexer.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexeravs.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerbash.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerbatch.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexercmake.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexercoffeescript.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexercpp.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexercsharp.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexercss.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexercustom.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerd.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerdiff.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexeredifact.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerfortran.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerfortran77.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerglobal.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexergo.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerhtml.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexeridl.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerjava.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerjavascript.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerjson.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerlua.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexermakefile.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexermarkdown.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexermatlab.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexernsis.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexeroctave.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerpascal.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerperl.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerpo.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerpostscript.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerpov.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerproperties.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerpython.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerruby.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerrust.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerspice.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexersql.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexertcl.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexertex.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexertext.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexervb.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerverilog.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexervhdl.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexerxml.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscilexeryaml.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qscimacro.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <ClInclude Include="Qsci\qsciprinter.h" />
     <QtMoc Include="Qsci\qsciscintilla.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <QtMoc Include="Qsci\qsciscintillabase.h">
+      
+      
+      
+      
+      
+      
+      
+      
     </QtMoc>
     <ClInclude Include="Qsci\qscistyle.h" />
     <ClInclude Include="Qsci\qscistyledtext.h" />
     <ClInclude Include="xmlMatchedTagsHighlighter.h" />
   </ItemGroup>
   <ItemGroup>
+    
+    
+    
+    
     <CustomBuild Include="debug\moc_predefs.h.cbt">
       <FileType>Document</FileType>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
       <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\mkspecs\features\data\dummy.cpp;%(AdditionalInputs)</AdditionalInputs>
       <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">cl -Bx"$(QTDIR)\bin\qmake.exe" -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -Zi -MDd -EHsc -W0 -E $(QTDIR)\mkspecs\features\data\dummy.cpp 2&gt;NUL &gt;debug\moc_predefs.h</Command>
       <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Generate moc_predefs.h</Message>
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">debug\moc_predefs.h;%(Outputs)</Outputs>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </CustomBuild>
     <CustomBuild Include="release\moc_predefs.h.cbt">
       <FileType>Document</FileType>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\mkspecs\features\data\dummy.cpp;%(AdditionalInputs)</AdditionalInputs>
       <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">cl -Bx"$(QTDIR)\bin\qmake.exe" -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -O2 -MD -EHsc -W0 -E $(QTDIR)\mkspecs\features\data\dummy.cpp 2&gt;NUL &gt;release\moc_predefs.h</Command>
       <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Generate moc_predefs.h</Message>
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">release\moc_predefs.h;%(Outputs)</Outputs>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
     </CustomBuild>
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
   </ItemGroup>
   <ItemGroup>
     <None Include="qscintilla_ch.ts" />
   </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">
-    <Import Project="$(QtMsBuild)\qt.targets" />
-  </ImportGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /><ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')"><Import Project="$(QtMsBuild)\qt.targets" /></ImportGroup>
   <ImportGroup Label="ExtensionTargets" />
 </Project>

+ 3 - 3
src/qscint/src/qscintilla.vcxproj.user

@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup />
   <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <QtLastBackgroundBuild>2022-12-11T10:28:17.8337419Z</QtLastBackgroundBuild>
+    <QtLastBackgroundBuild>2023-01-07T07:01:28.9194699Z</QtLastBackgroundBuild>
   </PropertyGroup>
   <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <QtLastBackgroundBuild>2022-12-11T10:28:18.9624294Z</QtLastBackgroundBuild>
+    <QtLastBackgroundBuild>2023-01-07T07:01:28.9902806Z</QtLastBackgroundBuild>
   </PropertyGroup>
 </Project>

+ 4 - 2
src/qscint/src/qsciscintilla.cpp

@@ -3713,10 +3713,12 @@ void QsciScintilla::handleUpdateUI(int)
 		if (line != oldLine)
 		{
 			oldLine = line;
-			emit cursorPosChange(line, newPos);
-    }
+			emit cursorPosChange(line, newPos);	
+        }
     }
 
+	addHotSpot();
+
     if (braceMode != NoBraceMatch)
         braceMatch();
 

+ 36 - 19
src/qss/black.qss

@@ -68,11 +68,16 @@ border:1px solid #00BB9E;
 background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464,stop:1 #525252);
 }
 
+QToolButton,QToolButton:disabled{
+	color:#000000;
+	background-color:#ffffff;
+}
+
 QToolButton#leftBt,#leftSaveBt,#rightBt,#rightSaveBt,#leftReload,#rightReload,#toolButton,#toolButton1,#subToolButton,#addToolButton,#selectDir,#toolButtonBrowse,#definedFilterExt,#proLangBt{
 border-style:none;
 border:1px solid #646464;
 background-color:#383838;
-/*color:#386487;*/
+color:#ffffff;
 padding:1px;
 min-height:8px;
 border-radius:1px;
@@ -82,22 +87,33 @@ QToolButton#leftBt:hover,#leftSaveBt:hover,#rightBt:hover,#rightSaveBt:hover,#le
 background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #484848,stop:1 #383838);
 }
 
-QToolBar,QMessageBox,QHeaderView::section{
-		background-color:#444444;
+QToolBar{
+	background-color:rgb(232,232,232);
+	border:none;
+	padding:1px;
+}
+
+QHeaderView{
+	background-color:#383838;
 	border: none;
 	padding:0px;
 }
 
+QFrame#leftSrc,QFrame#rightSrc{
+	border:none;
+	padding:0px;
+}
+
 QTabBar QToolButton[accessibleName="Scroll Left"]{border:0px;background-color:#444444;}
 
 QTabBar QToolButton[accessibleName="Scroll Right"]{border:0px;background-color:#444444;}
 
-QLineEdit,QTextEdit,QPlainTextEdit,QSpinBox,QDoubleSpinBox,QComboBox,QDateEdit,QTimeEdit,QDateTimeEdit{
+QLineEdit,QTextEdit,QPlainTextEdit,QSpinBox,QDoubleSpinBox,QComboBox,QDateEdit,QTimeEdit,QDateTimeEdit,QMessageBox{
 border:1px solid #242424;
 border-radius:3px;
 padding:2px;
 background:none;
-selection-background-color:#484848;
+selection-background-color:#000000;
 selection-color:#DCDCDC;
 }
 
@@ -132,16 +148,17 @@ border:1px solid #242424;
 color:#DCDCDC;
 padding:5px;
 min-height:15px;
+min-width:50px;
 border-radius:5px;
 background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #484848,stop:1 #383838);
 }
 
-.QPushButton:hover,.QToolButton:hover{
+.QPushButton:hover{
 background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464,stop:1 #525252);
 border:0px;
 }
 
-.QPushButton:pressed,.QToolButton:pressed{
+.QPushButton:pressed{
 background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #484848,stop:1 #383838);
 }
 
@@ -278,21 +295,23 @@ top:1px;
 }
 
 QMenuBar::item{
-color:#DCDCDC;
-background-color:#484848;
+color:#000000;
+background-color:#e8e8e8;
 margin:0px;
 padding:3px 10px;
 }
 
 QMenu,QMenuBar,QMenu:disabled,QMenuBar:disabled{
-color:#DCDCDC;
-background-color:#484848;
-border:1px solid #242424;
+color:#000000;
+background-color:#e8e8e8;
+border:0px solid #242424;
 margin:0px;
 }
 
 QMenu::item{
 padding:3px 20px;
+min-width:80;
+margin-left:3px;
 }
 
 QMenu::indicator{
@@ -512,15 +531,14 @@ background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464,stop:1
 }
 
 QTabBar::tab{
-border:0px solid #242424;
 color:#DCDCDC;
-background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464,stop:1 #525252);
+background-color:rgb(82,82,82);
 margin-top:1px; 
 margin-right:1px; 
-margin-left:0px; 
-margin-bottom:0px; 
-padding:0px;
-min-width:55px;
+margin-left:1px; 
+margin-bottom:2px; 
+padding:1px;
+min-width:50px;
 }
 
 QTabBar::tab:selected{
@@ -536,7 +554,6 @@ margin-bottom:0px;
 padding:0px;
 }
 
-
 QStatusBar::item{
 color:0x222222;
 border:0px solid #484848;

+ 97 - 0
src/qss/common.qss

@@ -0,0 +1,97 @@
+.QPushButton{
+border-style:none;
+border:1px solid #C0DCF2;
+color:#000000;
+background-color:#E1E1E1;
+padding:3px;
+min-height:15px;
+min-width:50px;
+border-radius:3px;
+}
+
+.QPushButton:hover{
+background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #F2F9FF,stop:1 #DAEFFF);
+}
+
+QTabBar::tab{ 
+		background-color:rgb(224,224,224);
+		margin-top:1px; 
+		margin-right:1px; 
+		margin-left:1px; 
+		margin-bottom:2px; 
+		padding:1px;
+		min-width:50px;
+}
+
+QTabBar::tab:selected{ 
+		background-color:rgb(255,255,255);
+		border-top:3px solid;
+		border-top-color:#FAAA3C;
+		margin-top:1px; 
+		margin-right:1px; 
+		margin-left:1px; 
+		margin-bottom:2px; 
+		padding:0px;
+}
+QTabBar::close-button{ 
+		image: url(\":/notepad/closeTabButton.png\");
+}
+QTabBar::close-button:hover{ 
+		image: url(\":/notepad/closeTabButton_hover.png\");
+}
+
+QToolBar,QMessageBox,QHeaderView::section{ 
+		background-color:rgba(255, 255, 255, 255); 
+		border: none; 
+		padding: 1px; 
+}
+
+QTabBar QToolButton[accessibleName="Scroll Left"]{border:0px;background-color:#F0F0F0;}
+
+QTabBar QToolButton[accessibleName="Scroll Right"]{border:0px;background-color:#F0F0F0;}
+
+
+QTreeWidget{ 
+		background-color:rgba(255, 255, 255, 255);
+		border:1px solid #C0DCF2;
+}
+
+QTreeWidget::item
+{
+height:22px;
+} 
+
+QTreeView::item::selected
+{
+background-color:#00CCFF;
+}
+
+QTreeView#resultTreeView{ 
+	background-color:#444444;
+	border:1px solid #C0DCF2;
+}
+
+QListWidget#filelistWidget{ 
+	color:#ffffff;
+	background-color:#444444;
+	border:1px solid #C0DCF2;
+}
+
+QMainWindow::separator
+{ 
+		height:1px; 
+    margin: 0px;
+    padding: 0px;
+    background:#FF0000;
+}
+
+QDockWidget{
+    border:0px solid red;
+}
+
+QDockWidget::title {
+    background:#f0f0f0;
+    padding-top:0px;
+}
+
+

+ 8 - 7
src/qss/lightbluestyle.qss

@@ -3,7 +3,8 @@ border-style:none;
 border:1px solid #C0DCF2;
 color:#386487;
 padding:3px;
-/*min-height:15px;*/
+min-height:15px;
+min-width:50px;
 border-radius:3px;
 }
 
@@ -41,9 +42,9 @@ background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #DEF0FE,stop:1
 }
 
 QToolBar,QMessageBox,QHeaderView::section{
-    background-color:rgba(255, 255, 255, 255); 
-		border: none;
-		padding: 1px;
+   background-color:rgba(255, 255, 255, 255); 
+	border: none;
+	padding: 1px;
 }
 
 QComboBox,QLineEdit,QSpinBox{
@@ -146,7 +147,7 @@ QTabBar::close-button:hover{
 
 /*设置垂直滚动条基本样式*/
 QScrollBar:vertical {
-    width: 12px;
+    width: 15px;
     background: rgba(0,0,0,0%);
     margin: 0px,0px,0px,0px;
     /*留出9px给上面和下面的箭头*/
@@ -156,7 +157,7 @@ QScrollBar:vertical {
 }
 
 QScrollBar::handle:vertical {
-    width: 12px;
+    width: 15px;
     background: rgba(0,0,0,25%);
     /*滚动条两端变成椭圆 */
     border-radius: 4px;
@@ -164,7 +165,7 @@ QScrollBar::handle:vertical {
 }
 
 QScrollBar::handle:vertical:hover {
-    width: 12px;
+    width: 15px;
     /*鼠标放到滚动条上的时候,颜色变深*/
     background: rgba(0,0,0,50%);
     border-radius: 4px;

+ 220 - 0
src/qss/myblack.qss

@@ -0,0 +1,220 @@
+.QPushButton{
+border-style:none;
+border:1px solid #C0DCF2;
+color:#000000;
+background-color:#E1E1E1;
+padding:3px;
+min-height:15px;
+min-width:50px;
+border-radius:3px;
+}
+
+.QPushButton:hover{
+background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #F2F9FF,stop:1 #DAEFFF);
+}
+
+QTabBar::tab{ 
+		background-color:rgb(224,224,224);
+		margin-top:1px; 
+		margin-right:1px; 
+		margin-left:1px; 
+		margin-bottom:2px; 
+		padding:1px;
+		min-width:50px;
+}
+
+QTabBar::tab:selected{ 
+		background-color:rgb(255,255,255);
+		border-top:3px solid;
+		border-top-color:#FAAA3C;
+		margin-top:1px; 
+		margin-right:1px; 
+		margin-left:1px; 
+		margin-bottom:2px; 
+		padding:0px;
+}
+QTabBar::close-button{ 
+		image: url(\":/notepad/closeTabButton.png\");
+}
+QTabBar::close-button:hover{ 
+		image: url(\":/notepad/closeTabButton_hover.png\");
+}
+
+QToolBar,QMessageBox,QHeaderView::section{ 
+		background-color:rgba(255, 255, 255, 255); 
+		border: none; 
+		padding: 1px; 
+}
+
+QTabBar QToolButton[accessibleName="Scroll Left"]{border:0px;background-color:#F0F0F0;}
+
+QTabBar QToolButton[accessibleName="Scroll Right"]{border:0px;background-color:#F0F0F0;}
+
+
+QTreeWidget{ 
+		background-color:rgba(255, 255, 255, 255);
+		border:1px solid #C0DCF2;
+}
+
+QTreeWidget::item
+{
+height:22px;
+} 
+
+QTreeView::item::selected
+{
+background-color:#00CCFF;
+}
+
+QTreeView#resultTreeView{ 
+	background-color:#444444;
+	border:1px solid #C0DCF2;
+}
+
+QListWidget#filelistWidget{ 
+	color:#ffffff;
+	background-color:#444444;
+	border:1px solid #C0DCF2;
+}
+
+
+/*设置垂直滚动条基本样式*/
+QScrollBar:vertical {
+    width: 15px;
+    background: rgba(0,0,0,0%);
+    margin: 0px,0px,0px,0px;
+    /*留出9px给上面和下面的箭头*/
+    padding-top: 9px;
+    padding-bottom: 9px;
+}
+
+QScrollBar::handle:vertical {
+    width: 15px;
+    background: rgba(0,0,0,25%);
+    /*滚动条两端变成椭圆 */
+    border-radius: 4px;
+    min-height: 20;
+}
+
+QScrollBar::handle:vertical:hover {
+    width: 15px;
+    /*鼠标放到滚动条上的时候,颜色变深*/
+    background: rgba(0,0,0,50%);
+    border-radius: 4px;
+    min-height: 20;
+}
+
+/*这个应该是设置下箭头的,3.png就是箭头*/
+QScrollBar::add-line:vertical 
+{
+    height: 9px;
+    width: 12px;
+    border-image: url(:/Resources/img/3.png);
+    subcontrol-position: bottom;
+}
+
+
+/*设置上箭头 */
+QScrollBar::sub-line:vertical 
+{
+    height: 9px;
+    width: 12px;
+    border-image: url(:/Resources/img/1.png);
+    subcontrol-position: top;
+}
+
+/*当鼠标放到下箭头上的时候 */
+QScrollBar::add-line:vertical:hover 
+{
+    height: 9px;
+    width: 12px;
+    border-image: url(:/Resources/img/4.png);
+    subcontrol-position: bottom;
+}
+
+/*当鼠标放到下箭头上的时候*/
+QScrollBar::sub-line:vertical:hover 
+{
+    height: 9px;
+    width: 12px;
+    border-image: url(:/Resources/img/2.png);
+    subcontrol-position: top;
+}
+
+
+
+/*当滚动条滚动的时候,上面的部分和下面的部分*/
+QScrollBar::sub-page {
+    background: rgba(0,0,0,10%);
+    border-radius: 4px;
+}
+
+QScrollBar::add-page 
+{
+    background: rgba(0,0,0,10%);
+    border-radius: 4px;
+}
+
+/*设置水平滚动条基本样式*/
+QScrollBar:horizontal {
+    height: 10px;
+    background: rgba(0,0,0,0%);
+    margin: 0px,0px,0px,0px;
+    /*留出9px给上面和下面的箭头*/
+    padding-left: 9px;
+    padding-right: 9px;
+}
+
+QScrollBar::handle:horizontal {
+    height: 10px;
+    background: rgba(0,0,0,25%);
+    /*滚动条两端变成椭圆 */
+    border-radius: 4px;
+    min-height: 20;
+}
+
+QScrollBar::handle:horizontal:hover {
+    height: 10px;
+    /*鼠标放到滚动条上的时候,颜色变深*/
+    background: rgba(0,0,0,50%);
+    border-radius: 4px;
+    min-height: 20;
+}
+
+/*这个应该是设置下箭头的,3.png就是箭头*/
+QScrollBar::add-line:horizontal 
+{
+    height: 10px;
+    width: 10px;
+    border-image: url(:/Resources/img/5.png);
+    subcontrol-position: right;
+}
+
+
+/*设置上箭头 */
+QScrollBar::sub-line:horizontal 
+{
+    height: 10px;
+    width: 10px;
+    border-image: url(:/Resources/img/6.png);
+    subcontrol-position: left;
+}
+
+QMainWindow::separator
+{ 
+		height:1px; 
+    margin: 0px;
+    padding: 0px;
+    background:#FF0000;
+}
+
+QDockWidget{
+    border:0px solid red;
+}
+
+QDockWidget::title {
+    background:#f0f0f0;
+    padding-top:0px;
+}
+
+

+ 15 - 122
src/qss/mystyle.qss

@@ -1,3 +1,18 @@
+.QPushButton{
+border-style:none;
+border:1px solid #C0DCF2;
+color:#000000;
+background-color:#E1E1E1;
+padding:3px;
+min-height:15px;
+min-width:50px;
+border-radius:3px;
+}
+
+.QPushButton:hover{
+background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #F2F9FF,stop:1 #DAEFFF);
+}
+
 QTabBar::tab{ 
 		background-color:rgb(224,224,224);
 		margin-top:1px; 
@@ -51,128 +66,6 @@ QTreeView::item::selected
 background-color:#00CCFF;
 }
 
-/*设置垂直滚动条基本样式*/
-QScrollBar:vertical {
-    width: 12px;
-    background: rgba(0,0,0,0%);
-    margin: 0px,0px,0px,0px;
-    /*留出9px给上面和下面的箭头*/
-    padding-top: 9px;
-    padding-bottom: 9px;
-}
-
-QScrollBar::handle:vertical {
-    width: 12px;
-    background: rgba(0,0,0,25%);
-    /*滚动条两端变成椭圆 */
-    border-radius: 4px;
-    min-height: 20;
-}
-
-QScrollBar::handle:vertical:hover {
-    width: 12px;
-    /*鼠标放到滚动条上的时候,颜色变深*/
-    background: rgba(0,0,0,50%);
-    border-radius: 4px;
-    min-height: 20;
-}
-
-/*这个应该是设置下箭头的,3.png就是箭头*/
-QScrollBar::add-line:vertical 
-{
-    height: 9px;
-    width: 12px;
-    border-image: url(:/Resources/img/3.png);
-    subcontrol-position: bottom;
-}
-
-
-/*设置上箭头 */
-QScrollBar::sub-line:vertical 
-{
-    height: 9px;
-    width: 12px;
-    border-image: url(:/Resources/img/1.png);
-    subcontrol-position: top;
-}
-
-/*当鼠标放到下箭头上的时候 */
-QScrollBar::add-line:vertical:hover 
-{
-    height: 9px;
-    width: 12px;
-    border-image: url(:/Resources/img/4.png);
-    subcontrol-position: bottom;
-}
-
-/*当鼠标放到下箭头上的时候*/
-QScrollBar::sub-line:vertical:hover 
-{
-    height: 9px;
-    width: 12px;
-    border-image: url(:/Resources/img/2.png);
-    subcontrol-position: top;
-}
-
-
-
-/*当滚动条滚动的时候,上面的部分和下面的部分*/
-QScrollBar::sub-page {
-    background: rgba(0,0,0,10%);
-    border-radius: 4px;
-}
-
-QScrollBar::add-page 
-{
-    background: rgba(0,0,0,10%);
-    border-radius: 4px;
-}
-
-/*设置水平滚动条基本样式*/
-QScrollBar:horizontal {
-    height: 10px;
-    background: rgba(0,0,0,0%);
-    margin: 0px,0px,0px,0px;
-    /*留出9px给上面和下面的箭头*/
-    padding-left: 9px;
-    padding-right: 9px;
-}
-
-QScrollBar::handle:horizontal {
-    height: 10px;
-    background: rgba(0,0,0,25%);
-    /*滚动条两端变成椭圆 */
-    border-radius: 4px;
-    min-height: 20;
-}
-
-QScrollBar::handle:horizontal:hover {
-    height: 10px;
-    /*鼠标放到滚动条上的时候,颜色变深*/
-    background: rgba(0,0,0,50%);
-    border-radius: 4px;
-    min-height: 20;
-}
-
-/*这个应该是设置下箭头的,3.png就是箭头*/
-QScrollBar::add-line:horizontal 
-{
-    height: 10px;
-    width: 10px;
-    border-image: url(:/Resources/img/5.png);
-    subcontrol-position: right;
-}
-
-
-/*设置上箭头 */
-QScrollBar::sub-line:horizontal 
-{
-    height: 10px;
-    width: 10px;
-    border-image: url(:/Resources/img/6.png);
-    subcontrol-position: left;
-}
-
 QMainWindow::separator
 { 
 		height:1px; 

+ 638 - 240
src/qtlangset.cpp

@@ -11,7 +11,9 @@
 #include <QColorDialog> 
 #include <QMessageBox>
 #include <QSpinBox>
-//#include <QDebug>
+#include <Qsci/qscilexerglobal.h>
+
+#include <QDebug>
 #include <QDir>
 
 #if 0
@@ -37,43 +39,27 @@ enum LangType {
 };
 #endif
 
-static const QColor blackColor(Qt::black);
-static const QColor lightColor(0xdedede);
-
-static const QColor blackColor1(0x0000ff);
-static const QColor lightColor1(0xffaa00);
-
-//C++注释的默认颜色,不显眼
-static const QColor blackColor2(0x007f00);
-static const QColor lightColor2(0x009000);
-
-static const QColor blackColor3(0x7f7f00);
-static const QColor lightColor3(0xfca287);
-
-static const QColor blackColor4(0x8000ff);
-static const QColor lightColor4(0xffaa00);
-
-static const QColor blackColor5(0x007f7f);
-static const QColor lightColor5(0xaaff7f);
-
-static const QColor blackColor6(0x7f007f);
-static const QColor lightColor6(0x00ffff);
-
-QMap<QString, QColor> QtLangSet::s_darkColorMap;
-
-static void initDarkColorMap()
-{
-	if (QtLangSet::s_darkColorMap.isEmpty())
-	{
-		QtLangSet::s_darkColorMap.insert(blackColor.name(), lightColor);
-		QtLangSet::s_darkColorMap.insert(blackColor1.name(), lightColor1);
-		QtLangSet::s_darkColorMap.insert(blackColor2.name(), lightColor2);
-		QtLangSet::s_darkColorMap.insert(blackColor3.name(), lightColor3);
-		QtLangSet::s_darkColorMap.insert(blackColor4.name(), lightColor4);
-		QtLangSet::s_darkColorMap.insert(blackColor5.name(), lightColor5);
-		QtLangSet::s_darkColorMap.insert(blackColor6.name(), lightColor6);
-	}
-}
+//static const QColor blackColor(Qt::black);
+//static const QColor lightColor(0xdedede);
+//
+//static const QColor blackColor1(0x0000ff);
+//static const QColor lightColor1(0xffaa00);
+//
+////C++注释的默认颜色,不显眼
+//static const QColor blackColor2(0x007f00);
+//static const QColor lightColor2(0xaaff7f);
+//
+//static const QColor blackColor3(0x7f7f00);
+//static const QColor lightColor3(0xfca287);
+//
+//static const QColor blackColor4(0x8000ff);
+//static const QColor lightColor4(0xffaa00);
+//
+//static const QColor blackColor5(0x007f7f);
+//static const QColor lightColor5(0xaaff7f);
+//
+//static const QColor blackColor6(0x7f007f);
+//static const QColor lightColor6(0x00ffff);
 
 QtLangSet::QtLangSet(QString initTag, QWidget *parent)
 	: QMainWindow(parent), m_selectLexer(nullptr), m_selectStyleId(0), m_isStyleChange(false),m_isStyleChildChange(false), m_initShowLexerTag(initTag), m_previousSysLangItem(nullptr),m_isGlobelItem(false)
@@ -83,7 +69,11 @@ QtLangSet::QtLangSet(QString initTag, QWidget *parent)
 	initUserDefineLangList();
 
 	startSignSlot();
-	initDarkColorMap();
+	//initDarkColorMap();
+
+	m_themesId = StyleSet::getCurrentSytleId();
+	m_lastThemesId = -1;
+	ui.mainThemesCbox->setCurrentIndex(m_themesId);
 }
 
 QtLangSet::~QtLangSet()
@@ -122,8 +112,13 @@ void QtLangSet::startSignSlot()
 	//开始本来使用的是QListWidget::currentItemChanged信号,但是发现该信号存在莫名其妙的触发机制。
 	//估计是QT5.12的bug。所以换成itemClicked信号
 	connect(ui.langListWidget, &QListWidget::itemClicked, this, &QtLangSet::slot_itemSelect);
+	connect(ui.langListWidget, &QListWidget::currentRowChanged, this, &QtLangSet::slot_langListCurRowChanged);
+
 	connect(ui.userLangListWidget, &QListWidget::itemClicked, this, &QtLangSet::slot_userLangItemSelect);
+
+
 	connect(ui.styleListWidget, &QListWidget::itemClicked, this, &QtLangSet::slot_styleItemSelect);
+	connect(ui.styleListWidget, &QListWidget::currentRowChanged, this, &QtLangSet::slot_styleListCurRowChanged);
 
 	connect(ui.boldCheckBox, &QCheckBox::stateChanged, this, &QtLangSet::slot_fontBoldChange);
 	connect(ui.italicCheckBox, &QCheckBox::stateChanged, this, &QtLangSet::slot_fontItalicChange);
@@ -181,9 +176,31 @@ void QtLangSet::slot_fontBoldChange(int state)
 
 			if (m_isGlobelItem)
 			{
-				if (ui.useGbFontBold->isChecked())
+				if (ui.useGlobalFont->isVisible() && ui.useGbFontBold->isChecked())
 				{
 					slot_useAlobalFontBold(true);
+					saveLangeSet(m_selectLexer);
+				}
+				else if (ui.useGlobalFont->isVisible() && !ui.useGbFontBold->isChecked())
+				{
+					//保存全局样式第一条样式本身
+					saveLangeSet(m_selectLexer);
+			}
+				else if (!ui.useGlobalFont->isVisible())
+				{
+					//全局非第一个样式,修改当前全局字体大小
+						//全局样式的非第一个
+					setGlobalFont(m_selectStyleId, m_curStyleData.font);
+
+					//保存全局样式第一条样式本身
+					saveLangeSet(m_selectLexer);
+
+					//这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式
+					CCNotePad* pMainNote = dynamic_cast<CCNotePad*>(parent());
+					if (pMainNote != nullptr)
+					{
+						pMainNote->setGlobalFont(m_selectStyleId);
+					}
 				}
 			}
 			else
@@ -206,9 +223,29 @@ void QtLangSet::slot_fontItalicChange(int state)
 			m_isStyleChange = true;
 			if (m_isGlobelItem)
 			{
-				if (ui.useGbFontItalic->isChecked())
+				if (ui.useGlobalFont->isVisible() && ui.useGbFontItalic->isChecked())
 				{
 					slot_useAlobalFontItalic(true);
+					saveLangeSet(m_selectLexer);
+				}
+				else if (ui.useGlobalFont->isVisible() && !ui.useGbFontItalic->isChecked())
+				{
+					//保存全局样式第一条样式本身
+					saveLangeSet(m_selectLexer);
+			}
+				else if (!ui.useGlobalFont->isVisible())
+				{
+					//全局非第一个样式,修改当前全局字体大小
+						//全局样式的非第一个
+					setGlobalFont(m_selectStyleId, m_curStyleData.font);
+					saveLangeSet(m_selectLexer);
+
+					//这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式
+					CCNotePad* pMainNote = dynamic_cast<CCNotePad*>(parent());
+					if (pMainNote != nullptr)
+					{
+						pMainNote->setGlobalFont(m_selectStyleId);
+					}
 				}
 			}
 			else
@@ -231,9 +268,29 @@ void QtLangSet::slot_fontUnderlineChange(int state)
 			m_isStyleChange = true;
 			if (m_isGlobelItem)
 			{
-				if (ui.useGbFontUnderline->isChecked())
+				if (ui.useGlobalFont->isVisible() && ui.useGbFontUnderline->isChecked())
 				{
 					slot_useAlobalFontUnderline(true);
+					saveLangeSet(m_selectLexer);
+				}
+				else if (ui.useGlobalFont->isVisible() && !ui.useGbFontUnderline->isChecked())
+				{
+					//保存全局样式第一条样式本身
+					saveLangeSet(m_selectLexer);
+			}
+				else if (!ui.useGlobalFont->isVisible())
+				{
+					//全局非第一个样式,修改当前全局字体大小
+						//全局样式的非第一个
+					setGlobalFont(m_selectStyleId, m_curStyleData.font);
+					saveLangeSet(m_selectLexer);
+
+					//这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式
+					CCNotePad* pMainNote = dynamic_cast<CCNotePad*>(parent());
+					if (pMainNote != nullptr)
+					{
+						pMainNote->setGlobalFont(m_selectStyleId);
+					}
 				}
 			}
 			else
@@ -260,13 +317,45 @@ void QtLangSet::slot_fontSizeChange(int v)
 				//qDebug() << m_curStyleData.font.family();
 				m_isStyleChange = true;
 				m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId);
-				if (ui.useGbFontSize->isChecked())
+
+				//全局第一个样式,修改所有语法样式
+				if (ui.useGlobalFont->isVisible() && ui.useGbFontSize->isChecked())
 				{
 					slot_useAlobalFontSize(true);
+					saveLangeSet(m_selectLexer);
+				}
+				else if (ui.useGlobalFont->isVisible() && !ui.useGbFontSize->isChecked())
+				{
+					//保存全局样式第一条样式本身
+					saveLangeSet(m_selectLexer);
+			}
+				else if (!ui.useGlobalFont->isVisible())
+				{
+					//全局非第一个样式,修改当前全局字体大小
+					//全局样式的非第一个
+					setGlobalFont(m_selectStyleId, m_curStyleData.font);
+					saveLangeSet(m_selectLexer);
+
+					//这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式
+					CCNotePad* pMainNote = dynamic_cast<CCNotePad*>(parent());
+					if (pMainNote != nullptr)
+					{
+						pMainNote->setGlobalFont(m_selectStyleId);
+		}
 				}
 			}
 		}
-		else if (!ui.modifyAllFont->isChecked())
+		else
+		{
+			if (m_curStyleData.font.pointSize() != v)
+			{
+				m_curStyleData.font.setPointSize(v);
+				m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId);
+				m_isStyleChange = true;
+				emit viewStyleChange(m_selectLexer->lexerTag(), m_selectStyleId, m_curStyleData.color, m_curStyleData.paper, m_curStyleData.font, true);
+			}
+		}
+		/*else if (!ui.modifyAllFont->isChecked())
 		{
 			if (m_curStyleData.font.pointSize() != v)
 			{
@@ -302,9 +391,9 @@ void QtLangSet::slot_fontSizeChange(int v)
 				saveCurLangSettings();
 				emit viewLexerChange(m_selectLexer->lexerTag());
 			}
+		}*/
 		}
 	}
-}
 
 
 void QtLangSet::getCurUseLexerTags(QVector<QString>& tag)
@@ -323,6 +412,12 @@ void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag)
 
 	for (int index = 0; index <= L_TXT; ++index)
 	{
+		//GLOBAL本身不保存,因为GLOBAL不是语法样式,而是全局的属性风格
+		if (index == L_GLOBAL)
+		{
+			continue;
+		}
+
 		QsciLexer *pLexer = ScintillaEditView::createLexer(index);
 		if (nullptr != pLexer)
 		{
@@ -451,10 +546,10 @@ void  QtLangSet::restoreOriginLangAllStyle()
 //只在restoreOriginLangOneStyle中调用
 static void restoreLangFontFgColorToDarkStyle(QsciLexer *pLexer, int i)
 {
-	if (QtLangSet::s_darkColorMap.contains(pLexer->color(i).name()))
-	{
-		pLexer->setColor(QtLangSet::s_darkColorMap.value(pLexer->color(i).name()), i);
-	}
+	//if (QtLangSet::s_darkColorMap.contains(pLexer->color(i).name()))
+	//{
+	//	pLexer->setColor(QtLangSet::s_darkColorMap.value(pLexer->color(i).name()), i);
+	//}
 	}
 
 //只在restoreOriginLangOneStyle中调用
@@ -534,10 +629,10 @@ void QtLangSet::restoreOriginLangOneStyle(GLOBAL_STYLE_SET flag)
 						oldClor = pOriginLexer->color(i);
 						pLexer->setColor(oldClor, i);
 
-						if (BLACK_SE == StyleSet::getCurrentSytleId())
+						/*if (BLACK_SE == StyleSet::getCurrentSytleId())
 						{
 							restoreLangFontFgColorToDarkStyle(pLexer, i);
-					}
+						}*/
 
 					}
 					break;
@@ -546,10 +641,10 @@ void QtLangSet::restoreOriginLangOneStyle(GLOBAL_STYLE_SET flag)
 						oldClor = pOriginLexer->paper(i);
 						pLexer->setPaper(oldClor, i);
 
-						if (BLACK_SE == StyleSet::getCurrentSytleId())
+						/*if (BLACK_SE == StyleSet::getCurrentSytleId())
 						{
 						restoreLangPaperColorToDarkStyle(pLexer, i);
-					}
+						}*/
 					}
 					break;
 					default:
@@ -581,7 +676,8 @@ void QtLangSet::slot_fontChange(const QFont &font)
 	//即时设置风格
 	if (m_selectLexer != nullptr)
 	{
-	  if (!ui.modifyAllFont->isChecked())
+		//全局修改
+		if (m_isGlobelItem)
 	  {
 			if (m_curStyleData.font != font)
 			{
@@ -589,21 +685,37 @@ void QtLangSet::slot_fontChange(const QFont &font)
 				m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId);
 				m_isStyleChange = true;
 
-				if (m_isGlobelItem)
+				//修改所有字体
+				if (ui.useGlobalFont->isVisible() && ui.useGbFont->isChecked())
 				{
-					if (ui.useGbFont->isChecked())
-					{
 						slot_useAlobalFont(true);
+					saveLangeSet(m_selectLexer);
 					}
+				else if (ui.useGlobalFont->isVisible() && !ui.useGbFont->isChecked())
+				{
+					//保存全局样式第一条样式本身
+					saveLangeSet(m_selectLexer);
 				}
-				else
+				else if(!ui.useGlobalFont->isVisible())
 				{
-					emit viewStyleChange(m_selectLexer->lexerTag(), m_selectStyleId, m_curStyleData.color, m_curStyleData.paper, m_curStyleData.font, true);
+					//全局样式的非第一个
+					setGlobalFont(m_selectStyleId, m_curStyleData.font);
+
+					//保存全局样式第一条样式本身
+					saveLangeSet(m_selectLexer);
+
+					//这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式
+					CCNotePad* pMainNote = dynamic_cast<CCNotePad*>(parent());
+					if (pMainNote != nullptr)
+					{
+						pMainNote->setGlobalFont(m_selectStyleId);
 				}
 			}
 		}
+		}
 		else
 		{
+#if 0
 			//统一修改字体,大小和风格保存不变
 			QFont oldf = m_curStyleData.font;
 			m_curStyleData.font = font;
@@ -638,9 +750,19 @@ void QtLangSet::slot_fontChange(const QFont &font)
 				saveCurLangSettings();
 				emit viewLexerChange(m_selectLexer->lexerTag());
 			}
+#endif
+			if (m_curStyleData.font != font)
+			{
+				m_curStyleData.font.setFamily(font.family());
+				m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId);
+				m_isStyleChange = true;
+
+				emit viewStyleChange(m_selectLexer->lexerTag(), m_selectStyleId, m_curStyleData.color, m_curStyleData.paper, m_curStyleData.font, true);
+				
 		}
 	}
 }
+}
 
 void QtLangSet::initLangList()
 {
@@ -730,6 +852,14 @@ void QtLangSet::slot_itemSelect(QListWidgetItem *item)
 	}
 	//qDebug() << item->text() << (previous ? previous->text() : 0);
 
+	//如果前后主题发生了变化,则依旧要走更新,防止主题切换后没及时更新
+	if (m_previousSysLangItem == item && (m_lastThemesId == m_themesId))
+	{
+		return;
+	}
+
+	ui.curThemes->setText(tr("Current themes : %1, language : %2").arg(StyleSet::getCurrentStyle()).arg(item->text()));
+
 
 	ui.langListWidget->scrollToItem(item);
 
@@ -762,7 +892,6 @@ void QtLangSet::slot_itemSelect(QListWidgetItem *item)
 		m_selectLexer = nullptr;
 	}
 
-
 	int lexId = item->data(Qt::UserRole).toInt();
 
 	//全局的这个要单独对待,暂时没有任何风格。
@@ -770,27 +899,13 @@ void QtLangSet::slot_itemSelect(QListWidgetItem *item)
 	{
 		m_isGlobelItem = true;
 		ui.stackedWidget->setCurrentIndex(1);
-
-		//全部修改模式下,目前暂时不存在修改所有的说法,目前就只能全部修改
-		ui.modiryAllColor->setChecked(false);
-		ui.modifyAllFont->setChecked(false);
-		ui.modiryAllColor->setEnabled(false);
-		ui.modifyAllFont->setEnabled(false);
 	}
 	else
 	{
 		m_isGlobelItem = false;
 		ui.stackedWidget->setCurrentIndex(0);
 
-		if (!ui.modiryAllColor->isEnabled())
-		{
-			ui.modiryAllColor->setEnabled(true);
-		}
-		if (!ui.modifyAllFont->isEnabled())
-		{
-			ui.modifyAllFont->setEnabled(true);
 		}
-	}
 
 	QsciLexer *pLexer = ScintillaEditView::createLexer(lexId);
 	if (nullptr != pLexer)
@@ -830,6 +945,12 @@ void QtLangSet::slot_itemSelect(QListWidgetItem *item)
 	ui.motherLangCb->setCurrentIndex(0);
 }
 
+void QtLangSet::slot_langListCurRowChanged(int row)
+{
+	QListWidgetItem* current = ui.langListWidget->item(row);
+	slot_itemSelect(current);
+}
+
 //根据母亲模块语言,把属性风格显示出来
 void QtLangSet::displayUserMotherLangsStyle(QString langTagName, UserLangMother motherLang)
 {
@@ -902,15 +1023,15 @@ void QtLangSet::slot_userLangItemSelect(QListWidgetItem *item)
 		m_isGlobelItem = false;
 		ui.stackedWidget->setCurrentIndex(0);
 
-		if (!ui.modiryAllColor->isEnabled())
+		/*if (!ui.modiryAllColor->isEnabled())
 		{
 			ui.modiryAllColor->setEnabled(true);
 		}
 		if (!ui.modifyAllFont->isEnabled())
 		{
 			ui.modifyAllFont->setEnabled(true);
+		}*/
 		}
-	}
 
 
 	m_previousSysLangItem = nullptr;
@@ -959,28 +1080,112 @@ void QtLangSet::syncShowStyleItemToUI(QListWidgetItem *item)
 	if (item != nullptr && m_selectLexer != nullptr)
 	{
 		int styleId = item->data(Qt::UserRole).toInt();
+
+		if (m_selectStyleId == styleId && (m_lastThemesId == m_themesId))
+		{
+			return;
+		}
+
+		if (!item->isSelected())
+		{
+			item->setSelected(true);
+		}
+
+		if (!ui.label_fc->isEnabled())
+		{
+			ui.label_fc->setEnabled(true);
+			ui.toolButton->setEnabled(true);
+		}
+		if (!ui.label_bc->isEnabled())
+		{
+			ui.label_bc->setEnabled(true);
+			ui.toolButton1->setEnabled(true);
+		}
+		if (!ui.fontComboBox->isEnabled())
+		{
+			ui.fontComboBox->setEnabled(true);
+			ui.boldCheckBox->setEnabled(true);
+			ui.italicCheckBox->setEnabled(true);
+			ui.underlineCheckBox->setEnabled(true);
+		}
+		if (!ui.fontSpinBox->isEnabled())
+		{
+			ui.fontSpinBox->setEnabled(true);
+		}
+		
 		m_selectStyleId = styleId;
 		QsciLexer::StyleData & sd = m_selectLexer->styleData(styleId);
 		m_curStyleData = sd;
 		setStyleShow(sd.font, sd.color, sd.paper);
 		m_isStyleChange = false;
+
+		//如果是全局,则把不能修改的全局样式灰掉,避免干扰用户的选择
+		if (m_isGlobelItem)
+		{
+			QsciLexerGlobal* pGlobalLexer = dynamic_cast<QsciLexerGlobal*>(m_selectLexer);
+			if (pGlobalLexer != nullptr)
+			{
+
+				int enableMask = pGlobalLexer->changeOperBit(styleId);
+
+				if (!(enableMask & FG_BIT))
+				{
+					ui.label_fc->setEnabled(false);
+					ui.toolButton->setEnabled(false);
+	}
+				if (!(enableMask & BG_BIT))
+				{
+					ui.label_bc->setEnabled(false);
+					ui.toolButton1->setEnabled(false);
+}
+				if (!(enableMask & FONT_BIT))
+				{
+					ui.fontComboBox->setEnabled(false);
+					ui.boldCheckBox->setEnabled(false);
+					ui.italicCheckBox->setEnabled(false);
+					ui.underlineCheckBox->setEnabled(false);
+				}
+				if (!(enableMask & SIZE_BIT))
+				{
+					ui.fontSpinBox->setEnabled(false);
+				}
+			}
+			
+		}
 	}
 }
 //点击当前的风格item
 void QtLangSet::slot_styleItemSelect(QListWidgetItem *current)
 {
-#if 0
-	if (current != nullptr && m_selectLexer != nullptr)
+	qDebug() << "slot_styleItemSelect";
+
+	syncShowStyleItemToUI(current);
+
+	if (m_isGlobelItem && ui.styleListWidget->item(0) == current)
 	{
-		int styleId = current->data(Qt::UserRole).toInt();
-		m_selectStyleId = styleId;
-		QsciLexer::StyleData & sd = m_selectLexer->styleData(styleId);
-		m_curStyleData = sd;
-		setStyleShow(sd.font, sd.color, sd.paper);
-		m_isStyleChange = false;
+		ui.useGlobalColor->setVisible(true); 
+		ui.useGlobalFont->setVisible(true);
 	}
-#endif
-	syncShowStyleItemToUI(current);
+	else
+	{
+		if (ui.useGlobalColor->isVisible())
+		{
+			ui.useGlobalColor->setVisible(false);
+}
+		if (ui.useGlobalFont->isVisible())
+		{
+			ui.useGlobalFont->setVisible(false);
+		}
+	}
+
+}
+
+//使用键盘上下切换
+void QtLangSet::slot_styleListCurRowChanged(int row)
+{
+	qDebug() << "slot_curRowChanged";
+	QListWidgetItem* current = ui.styleListWidget->item(row);
+	slot_styleItemSelect(current);
 }
 
 void QtLangSet::fillForegroundColor(QColor& fcColor)
@@ -1017,28 +1222,54 @@ void QtLangSet::setStyleShow(QFont& font, QColor& fcColor, QColor &bkColor)
 	
 }
 
-//读取特定语言的设置
-bool QtLangSet::readLangSettings(QsciLexer *lexer, QString tag)
+//读取特定语言的设置;StyleId-1则读取当前主题,否则指定的StyleId主题
+bool QtLangSet::readLangSettings(QsciLexer *lexer, QString tag, int StyleId)
 {
-	QString cfgPath = QString("notepad/userstyle/%1/%2").arg(StyleSet::getCurrentStyle()).arg(tag);
+	QString cfgPath = QString("notepad/userstyle/%1/%2").arg((StyleId == -1) ? StyleSet::getCurrentStyle() : StyleSet::getStyleName(StyleId)).arg(tag);
 
 	QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath);
 	if (QFile::exists(qs.fileName()))
 	{
 		return lexer->readSettings(qs);
 	}
+	else//这里应该加个逻辑完备的保护。如果没有读取到用户配置,则应该从标准目标去读原始配置
+	{
+		return readLangOriginSettings(lexer, tag, StyleId);
+	}
+	
+	return false;
+}
+
+//读取特定语言的原始样式设置;StyleId-1则读取当前主题,否则指定的StyleId主题
+bool QtLangSet::readLangOriginSettings(QsciLexer* lexer, QString tag, int StyleId)
+{
+	//默认主题不需要读取,内存中已经存在
+	if (StyleId == 0)
+	{
+		return true;
+	}
+
+	//默认皮肤路径放在软件的同级目录下面的themes目录
+	QString cfgPath = QString("%1/themes/%2/%3.ini").arg(QCoreApplication::applicationDirPath()).arg((StyleId == -1)?StyleSet::getCurrentStyle(): StyleSet::getStyleName(StyleId)).arg(tag);
+	QSettings qs(cfgPath, QSettings::IniFormat);
+
+	//QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath);
+	if (QFile::exists(qs.fileName()))
+	{
+		return lexer->readSettings(qs);
+	}
 	return false;
 }
 
 
 //保存一种语言的配置。
-void QtLangSet::saveLangeSet(QsciLexer *lexer)
+void QtLangSet::saveLangeSet(QsciLexer *lexer, int StyleId)
 {
 	if (lexer != nullptr)
 	{
 		QString tag = lexer->lexerTag();
 
-		QString cfgPath =  QString("notepad/userstyle/%1/%2").arg(StyleSet::getCurrentStyle()).arg(tag);
+		QString cfgPath =  QString("notepad/userstyle/%1/%2").arg((StyleId == -1) ? StyleSet::getCurrentStyle() : StyleSet::getStyleName(StyleId)).arg(tag);
 
 		QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath);
 		lexer->writeSettings(qs);
@@ -1053,18 +1284,30 @@ bool QtLangSet::saveCurLangSettings()
 	{
 		saveLangeSet(m_selectLexer);
 		m_isStyleChange = false;
+		ui.statusBar->showMessage(tr("Save Finished !"),10000);
 		return true;
 	}
+	ui.statusBar->showMessage(tr("Not change, no need save !"),10000);
 	return false;
 }
 
+bool QtLangSet::isUseGlobalFgColor()
+{
+	return ui.useGlobalColor->isVisible() && ui.useGbFc->isChecked();
+}
+
+bool QtLangSet::isUseGlobalBgColor()
+{
+	return ui.useGlobalColor->isVisible() && ui.useGbBc->isChecked();
+}
+
 //修改前景色
 void QtLangSet::slot_changeFgColor()
 {
 	QColor color = QColorDialog::getColor(m_curStyleData.color, this, tr("Style Foreground Color"));
 	if (color.isValid())
 	{
-		//全局修改,把所有语言的所有风格都设置
+		//全局修改
 		if (m_isGlobelItem)
 		{
 			if (m_curStyleData.color != color)
@@ -1076,17 +1319,33 @@ void QtLangSet::slot_changeFgColor()
 				//即时设置风格
 				if (m_selectLexer != nullptr)
 				{
+					//此时一定是QsciLexerGlobal
 					m_selectLexer->setColor(color, m_selectStyleId);
 				}
 
-				if (ui.useGbFc->isChecked())
+				//只有在第一个全局样式时,isUseGlobalFgColor下面才为true。把所有语言的所有风格都设置
+				if (isUseGlobalFgColor())
 				{
 					slot_useAlobalFgColor(true);
 				}
+				else if(!ui.useGlobalColor->isVisible())
+				{
+					//全局样式的非第一个
+					setGlobalFgColor(m_selectStyleId, color);
+
+					//这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式
+					CCNotePad* pMainNote = dynamic_cast<CCNotePad*>(parent());
+					if (pMainNote != nullptr)
+					{
+						pMainNote->setGlobalFgColor(m_selectStyleId);
 			}
 			
 		}
-		else if (!ui.modiryAllColor->isChecked())
+				
+			}
+			
+		}
+		else
 		{
 			//当前前景色是否变化
 			if (m_curStyleData.color != color)
@@ -1104,34 +1363,42 @@ void QtLangSet::slot_changeFgColor()
 				}
 			}
 		}
-		else
+		/*else if (!ui.modiryAllColor->isChecked())
 		{
-			//全部风格颜色修改
-			//当前前景色是否变化
+			当前前景色是否变化
+			if (m_curStyleData.color != color)
+			{
 			m_curStyleData.color = color;
 			fillForegroundColor(color);
 			m_isStyleChange = true;
 
-			//即时设置风格
+				即时设置风格
 			if (m_selectLexer != nullptr)
 			{
-				/*int row = ui.styleListWidget->count();
-
-				QListWidgetItem* item = nullptr;
+					m_selectLexer->setColor(color, m_selectStyleId);
 
-				for (int i = 0; i < row; ++i)
+					emit viewStyleChange(m_selectLexer->lexerTag(), m_selectStyleId, color, m_curStyleData.paper, m_curStyleData.font, false);
+				}
+			}
+		}*/
+		/*else
 				{
-					item = ui.styleListWidget->item(i);
-					int styleId = item->data(Qt::UserRole).toInt();*/
-					m_selectLexer->setColor(color, -1);
-				/*}*/
+			全部风格颜色修改
+			当前前景色是否变化
+			m_curStyleData.color = color;
+			fillForegroundColor(color);
+			m_isStyleChange = true;
 
+			即时设置风格
+			if (m_selectLexer != nullptr)
+			{
+					m_selectLexer->setColor(color, -1);
 				saveCurLangSettings();
 				emit viewLexerChange(m_selectLexer->lexerTag());
 			}
-			
+			*/
+	//	}
 		}
-	}
 	
 }
 
@@ -1156,30 +1423,42 @@ void QtLangSet::slot_changeBkColor()
 					m_selectLexer->setPaper(color, m_selectStyleId);
 				}
 
-				if (ui.useGbBc->isChecked())
+				if (isUseGlobalBgColor())
 				{
 					slot_useAlobalBkColor(true);
 				}
-			}
-
-		}
-		else if (!ui.modiryAllColor->isChecked())
-		{
-		//当前前景色是否变化
-		if (m_curStyleData.paper != color)
+				else if (!ui.useGlobalColor->isVisible())
 		{
-			m_curStyleData.paper = color;
-			fillBackgroundColor(color);
-			m_isStyleChange = true;
+					setGlobalBgColor(m_selectStyleId, color);
 
-			//即时设置风格
-			if (m_selectLexer != nullptr)
-			{
-				m_selectLexer->setPaper(color, m_selectStyleId);
-				emit viewStyleChange(m_selectLexer->lexerTag(), m_selectStyleId, color, m_curStyleData.paper, m_curStyleData.font, false);
+					//这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式
+					CCNotePad* pMainNote = dynamic_cast<CCNotePad*>(parent());
+					if (pMainNote != nullptr)
+		{
+						pMainNote->setGlobalBgColor(m_selectStyleId);
 			}
+
 		}
 	}
+
+		}
+	//	else if (!ui.modiryAllColor->isChecked())
+	//	{
+	//	//当前前景色是否变化
+	//	if (m_curStyleData.paper != color)
+	//	{
+	//		m_curStyleData.paper = color;
+	//		fillBackgroundColor(color);
+	//		m_isStyleChange = true;
+
+	//		//即时设置风格
+	//		if (m_selectLexer != nullptr)
+	//		{
+	//			m_selectLexer->setPaper(color, m_selectStyleId);
+	//			emit viewStyleChange(m_selectLexer->lexerTag(), m_selectStyleId, color, m_curStyleData.paper, m_curStyleData.font, false);
+	//		}
+	//	}
+	//}
 		else
 		{
 			//全部风格颜色修改
@@ -1230,27 +1509,27 @@ void QtLangSet::slot_reset()
 				QFile::remove(qs.fileName());
 			}
 
-			//如果是暗色风格,还需要多做一步,替换暗色下不显眼的颜色
-			if (BLACK_SE == StyleSet::getCurrentSytleId())
-			{
-				setLangFontFgColorToDarkStyle((LangType)m_selectLexer->lexerId(), m_selectLexer->lexerTag());
-			}
-
 			//一定要先保存,因为selectInitLangTag后可能会变化
-
 			int row = ui.styleListWidget->currentRow();
 
+			//强行让slot_itemSelect里面的进行切换
+			m_previousSysLangItem = nullptr;
+
 			selectInitLangTag(m_selectLexer->lexerTag());
 
 			//手动刷新UI
 			QListWidgetItem* styleItem = ui.styleListWidget->item(row);
 
+			m_selectStyleId = -1;
+
 			syncShowStyleItemToUI(styleItem);
 
 			emit viewLexerChange(m_selectLexer->lexerTag());
 		}
 		else
 		{
+			if (ui.useGlobalFont->isVisible())
+			{
 			//如果是全局重置,则把所有语言都重置
 			if (QMessageBox::Yes != QMessageBox::question(this, tr("Reset All Style"), tr("Are you sure to reset All language sytle")))
 			{
@@ -1258,12 +1537,6 @@ void QtLangSet::slot_reset()
 			}
 			restoreOriginLangAllStyle();
 
-			//如果是暗色风格,还需要多做一步,替换暗色下不显眼的颜色
-			if (BLACK_SE == StyleSet::getCurrentSytleId())
-			{
-				setAllLangFontFgColorToDarkStyle();
-			}
-
 			previewAllGoblalChange();
 
 			//手动刷新UI。全局目前只有一行全局设置
@@ -1273,13 +1546,52 @@ void QtLangSet::slot_reset()
 				delete m_selectLexer;
 			}
 
-			//如果是暗黑风格,则不能读取源分隔;非暗黑则读取源
-			m_selectLexer  = ScintillaEditView::createLexer(L_GLOBAL,"",(BLACK_SE != StyleSet::getCurrentSytleId()));
+				m_selectLexer = ScintillaEditView::createLexer(L_GLOBAL);
 
 			QListWidgetItem* styleItem = ui.styleListWidget->item(0);
 
+				m_selectStyleId = -1;
+
 			syncShowStyleItemToUI(styleItem);
 		}
+			else
+			{
+				//重置所有全局样式
+				//一旦重置,当前修改无条件不保存。否则避免当前的刚刚重置,又被保存
+				m_isStyleChange = false;
+
+				//如果存在自定义的配置,也删除掉
+				QString cfgPath = QString("notepad/userstyle/%1/%2").arg(StyleSet::getCurrentStyle()).arg(m_selectLexer->lexerTag());
+
+				QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath);
+				if (QFile::exists(qs.fileName()))
+				{
+					QFile::remove(qs.fileName());
+	}
+
+				//一定要先保存,因为selectInitLangTag后可能会变化
+
+				int row = ui.styleListWidget->currentRow();
+
+				//强行让slot_itemSelect里面的进行切换
+				m_previousSysLangItem = nullptr;
+
+				//这里必须写ALLglobal,否则中文查找不到
+				selectInitLangTag(tr("AllGlobal"));
+
+				//手动刷新UI
+				QListWidgetItem* styleItem = ui.styleListWidget->item(row);
+
+				m_selectStyleId = -1;
+
+				syncShowStyleItemToUI(styleItem);
+
+				//重新从加载一次纯净的全局样式。因为前面保存的已经删了,所以加载的是纯净的。
+				StyleSet::loadGolbalStyle();
+
+				updateThemes();
+}
+		}
 	}
 }
 
@@ -1387,128 +1699,214 @@ void QtLangSet::slot_useAlobalFontItalic(bool check)
 
 //把默认语言风格的部分颜色,替换为暗色下显眼的颜色
 //这个函数是可以处理自定义语言的。
-void QtLangSet::setLangFontFgColorToDarkStyle(LangType langId, QString tag)
-{
-	//QColor blackColor(Qt::black);
-	//QColor lightColor(0xdedede);
-
-	//QColor blackColor1(0x0000ff);
-	//QColor lightColor1(0xffaa00);
-
-
-	////C++注释的默认颜色,不显眼
-	//QColor blackColor2(0x007f00);
-	//QColor lightColor2(0x009000);
-
-	//QColor blackColor3(0x7f7f00);
-	//QColor lightColor3(0xfca287);
-
-
-	//QColor blackColor4(0x8000ff);
-	//QColor lightColor4(0xffaa00);
-
-	//注意下面这个颜色和void StyleSet::setBlackStyle()中保持一致
-	//QColor bkPaperColor(0, 0, 0);
-
-	QsciLexer *pLexer = ScintillaEditView::createLexer(langId, tag);
-		if (nullptr != pLexer)
-		{
-			for (int i = 0; i <= 255; ++i)
-			{
-				if (!pLexer->description(i).isEmpty())
-				{
-				/*if (blackColor == pLexer->color(i))
-					{
-					pLexer->setColor(lightColor, i);
-					}
-					else if (blackColor1 == pLexer->color(i))
-					{
-						pLexer->setColor(lightColor1, i);
-					}
-				else if (blackColor2 == pLexer->color(i))
-				{
-					pLexer->setColor(lightColor2, i);
-				}
-				else if (blackColor3 == pLexer->color(i))
-				{
-					pLexer->setColor(lightColor3, i);
-				}
-				else if (blackColor4 == pLexer->color(i))
-				{
-					pLexer->setColor(lightColor4, i);
-				}*/
-
-				if (QtLangSet::s_darkColorMap.contains(pLexer->color(i).name()))
-				{
-					pLexer->setColor(QtLangSet::s_darkColorMap.value(pLexer->color(i).name()), i);
-				}
-
-				//背景也变成暗黑色
-				if (StyleSet::foldbgColor != pLexer->paper(i))
-				{
-					pLexer->setPaper(StyleSet::foldbgColor, i);
-				}
-			}
-		}
-		//默认纸背景色会和QPalette保持一致。但是因为黑色特色,其背景和QPalette不一样,所有需要单独设置一下
-		pLexer->setDefaultPaper(StyleSet::foldbgColor);
-			saveLangeSet(pLexer);
-			delete pLexer;
-		}
-	}
-
-//把暗色系下面不容易看清的颜色给替换一下。默认是有风格的,但是默认风格是亮色系的。
-//把凡是0x000000的字体,变成0xdedede
-//凡是0x0000ff的颜色,变成0xffff00
-//这个函数没有处理自定义语言。
-void QtLangSet::setAllLangFontFgColorToDarkStyle()
-{
-	initDarkColorMap();
-
-	for (int index = 0; index <= L_TXT; ++index)
-	{
-		setLangFontFgColorToDarkStyle((LangType)index);
-					}
-					}
-
-//检查当前是否已经存在暗黑色语言配置
-bool QtLangSet::isExistDarkLangSetings()
-{
-	QString cfgPath = QString("notepad/userstyle/black/AllGlobal");
-	QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath);
-	return QFile::exists(qs.fileName());
-				}
-
-////把凡是0xdedede的字体,变成0x000000
-//void QtLangSet::setAllLangFontFgColorToLightStyle()
+//void QtLangSet::setLangFontFgColorToDarkStyle(LangType langId, QString tag)
 //{
 //	QColor blackColor(Qt::black);
 //	QColor lightColor(0xdedede);
 //
-//	QColor blackColor1(0xffaa00);
-//	QColor lightColor1(0x0000ff);
+//	QColor blackColor1(0x0000ff);
+//	QColor lightColor1(0xffaa00);
 //
-//	for (int index = 0; index <= L_TXT; ++index)
-//	{
-//		QsciLexer *pLexer = ScintillaEditView::createLexer(index);
+//
+//	//C++注释的默认颜色,不显眼
+//	QColor blackColor2(0x007f00);
+//	QColor lightColor2(0x009000);
+//
+//	QColor blackColor3(0x7f7f00);
+//	QColor lightColor3(0xfca287);
+//
+//
+//	QColor blackColor4(0x8000ff);
+//	QColor lightColor4(0xffaa00);
+//
+//	注意下面这个颜色和void StyleSet::setBlackStyle()中保持一致
+//	QColor bkPaperColor(0, 0, 0);
+//
+//	QsciLexer *pLexer = ScintillaEditView::createLexer(langId, tag);
 //		if (nullptr != pLexer)
 //		{
 //			for (int i = 0; i <= 255; ++i)
 //			{
 //				if (!pLexer->description(i).isEmpty())
 //				{
-//					if (lightColor == pLexer->color(i))
+//				/*if (blackColor == pLexer->color(i))
 //					{
-//						pLexer->setColor(blackColor, i);
+//					pLexer->setColor(lightColor, i);
 //					}
 //					else if (blackColor1 == pLexer->color(i))
 //					{
 //						pLexer->setColor(lightColor1, i);
 //					}
+//				else if (blackColor2 == pLexer->color(i))
+//				{
+//					pLexer->setColor(lightColor2, i);
+//				}
+//				else if (blackColor3 == pLexer->color(i))
+//				{
+//					pLexer->setColor(lightColor3, i);
+//				}
+//				else if (blackColor4 == pLexer->color(i))
+//				{
+//					pLexer->setColor(lightColor4, i);
+//				}*/
+//
+//				if (QtLangSet::s_darkColorMap.contains(pLexer->color(i).name()))
+//				{
+//					pLexer->setColor(QtLangSet::s_darkColorMap.value(pLexer->color(i).name()), i);
+//				}
+//
+//				背景也变成暗黑色
+//				if (StyleSet::foldbgColor != pLexer->paper(i))
+//				{
+//					pLexer->setPaper(StyleSet::foldbgColor, i);
 //				}
 //			}
+//		}
+//		默认纸背景色会和QPalette保持一致。但是因为黑色特色,其背景和QPalette不一样,所有需要单独设置一下
+//		pLexer->setDefaultPaper(StyleSet::foldbgColor);
 //			saveLangeSet(pLexer);
 //			delete pLexer;
 //		}
 //	}
+
+//把暗色系下面不容易看清的颜色给替换一下。默认是有风格的,但是默认风格是亮色系的。
+//把凡是0x000000的字体,变成0xdedede
+//凡是0x0000ff的颜色,变成0xffff00
+//这个函数没有处理自定义语言。
+//void QtLangSet::setAllLangFontFgColorToDarkStyle()
+//{
+//	initDarkColorMap();
+//
+//	for (int index = 0; index <= L_TXT; ++index)
+//	{
+//		setLangFontFgColorToDarkStyle((LangType)index);
+//	}
+//}
+
+
+//从默认主题模板创建一份用户的语言风格文件
+void QtLangSet::createOneLangStyleFromThemes(int styleId, LangType langId, QString tag)
+{
+	if (langId == L_GLOBAL)
+	{
+		qDebug("global call");
+	}
+	//指定从原始模板的主题中读取一份数据
+	QsciLexer* pLexer = ScintillaEditView::createLexer(langId, tag, true, styleId);
+	if (nullptr != pLexer)
+	{
+		saveLangeSet(pLexer, styleId);
+		delete pLexer;
+	}
+}
+
+//从原始主题模板中,创建一份用户主题文件
+void QtLangSet::createUserStyleFormThemes(int styleId)
+{
+	for (int index = 0; index <= L_TXT; ++index)
+	{
+		createOneLangStyleFromThemes(styleId, (LangType)index);
+	}
+}
+
+//检查当前是否已经存在暗黑色语言配置
+//bool QtLangSet::isExistDarkLangSetings()
+//{
+//	QString cfgPath = QString("notepad/userstyle/black/AllGlobal");
+//	QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath);
+//	return QFile::exists(qs.fileName());
 //}
+
+//检查当前是否已经存在主题配置
+bool QtLangSet::isExistThemesSetings(int styleId)
+{
+	QString cfgPath = QString("notepad/userstyle/%1/AllGlobal").arg(StyleSet::getStyleName(styleId));
+	QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath);
+	return QFile::exists(qs.fileName());
+}
+
+//当前主题发生变化
+void QtLangSet::on_themesChange(int styleIndex)
+{
+	//第一次启动时,防止初始情况没有初始化主题,故检测一下isExistThemesSetings
+	if (m_themesId == styleIndex && isExistThemesSetings(styleIndex))
+	{
+		return;
+	}
+	ui.statusBar->showMessage(tr("themes changing, please waiting ..."), 5000);
+
+	m_themesId = styleIndex;
+
+	//这个有个耦合:先要设置QsciLexer的当前主题。只有默认主题才有详细独立的风格。
+	//非默认主题,其初始风格全是默认样式。
+
+	QsciLexer::setCurThemes(m_themesId);
+
+	//如果不存在主题设置,则从模板里面拷贝一份出来
+	if (!isExistThemesSetings(styleIndex))
+	{
+		createUserStyleFormThemes(styleIndex);
+	}
+
+	StyleSet::setCurrentStyle(styleIndex);
+
+	NddSetting::updataKeyValueFromNumSets(SKIN_KEY, m_themesId);
+
+	//这里就要及时切换当前主题,预览颜色
+	updateThemes();
+
+	//下一步就是要更好当前编辑器的语法设置
+	previewAllGoblalChange();
+
+	int row = ui.langListWidget->currentRow();
+
+	//手动刷新UI
+	QListWidgetItem* styleItem = ui.langListWidget->item(row);
+
+	slot_itemSelect(styleItem);
+
+	m_lastThemesId = m_themesId;
+
+	ui.statusBar->showMessage(tr("themes changed finished ..."), 5000);
+}
+
+//更新当前编辑框中主题的样式
+void QtLangSet::updateThemes()
+{
+	CCNotePad* pMainNote = dynamic_cast<CCNotePad*>(parent());
+	if (pMainNote != nullptr)
+	{
+		pMainNote->updateThemes();
+	}
+}
+
+//全局的前景背景和一般的不一样。
+void QtLangSet::setGlobalFgColor(int style, QColor color)
+{
+	One_Stype_Info* pStyle = &StyleSet::s_global_style->global_style;
+
+	if (pStyle[style].fgColor != color)
+	{
+		pStyle[style].fgColor = color;
+	}
+}
+
+void QtLangSet::setGlobalBgColor(int style, QColor color)
+{
+	One_Stype_Info* pStyle = &StyleSet::s_global_style->global_style;
+
+	if (pStyle[style].bgColor != color)
+	{
+		pStyle[style].bgColor = color;
+	}
+}
+
+void QtLangSet::setGlobalFont(int style, QFont font)
+{
+	One_Stype_Info* pStyle = &StyleSet::s_global_style->global_style;
+
+	if (pStyle[style].font != font)
+	{
+		pStyle[style].font = font;
+	}
+}

+ 33 - 8
src/qtlangset.h

@@ -6,6 +6,9 @@
 #include <QCloseEvent>
 #include "ui_qtlangset.h"
 #include "rcglobal.h"
+#include "Qsci/qsciscintilla.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
 
 class QsciLexer;
 
@@ -20,6 +23,8 @@ enum GLOBAL_STYLE_SET {
 	GLOBAL_BK_COLOR,
 };
 
+
+
 class QtLangSet : public QMainWindow
 {
 	Q_OBJECT
@@ -28,12 +33,14 @@ public:
 	QtLangSet(QString initTag, QWidget *parent = nullptr);
 	~QtLangSet();
 
-	static void setAllLangFontFgColorToDarkStyle();
-    static bool isExistDarkLangSetings();
+	/*static void setAllLangFontFgColorToDarkStyle();*/
+    //static bool isExistDarkLangSetings();
 	void selectInitLangTag(QString initLangTag);
-	static bool readLangSettings(QsciLexer * lexer, QString tag);
+	static bool readLangSettings(QsciLexer * lexer, QString tag, int StyleId = -1);
+	static bool readLangOriginSettings(QsciLexer* lexer, QString tag, int StyleId=-1);
 private:
-	static void setLangFontFgColorToDarkStyle(LangType langId, QString tag="");
+	//static void setLangFontFgColorToDarkStyle(LangType langId, QString tag="");
+	static void createOneLangStyleFromThemes(int styleId, LangType langId, QString tag = "");
 	void startSignSlot();
 
 
@@ -52,7 +59,11 @@ protected:
 private slots:
 
 	void slot_itemSelect(QListWidgetItem * item);
+	void slot_langListCurRowChanged(int row);
+	
 	void slot_styleItemSelect(QListWidgetItem * item);
+	void slot_styleListCurRowChanged(int row);
+
 	void slot_saveClick();
 	void slot_reset();
 	void slot_changeFgColor();
@@ -71,7 +82,7 @@ private slots:
 	void slot_useAlobalFontBold(bool);
 	void slot_useAlobalFontUnderline(bool);
 	void slot_useAlobalFontItalic(bool);
-
+	void on_themesChange(int index);
 
 
 
@@ -80,7 +91,7 @@ private:
 	bool readLangSetFile(QString langName, QString & keyword, QString & motherLang, QString & extTypes);
 	void initUserDefineLangList();
 	void setStyleShow(QFont & font, QColor& fcColor, QColor &bkColor);
-	static void saveLangeSet(QsciLexer * lexer);
+	static void saveLangeSet(QsciLexer * lexer, int styleId=-1);
 	bool saveCurLangSettings();
 	void fillForegroundColor(QColor & fcColor);
 	void fillBackgroundColor(QColor & bkColor);
@@ -93,7 +104,17 @@ private:
 
 	void getCurUseLexerTags(QVector<QString>& tag);
 	void enableFontChangeSensitive(bool isSensitive);
+	void updateThemes();
 
+	bool isUseGlobalFgColor();
+	bool isUseGlobalBgColor();
+
+	void setGlobalFgColor(int style, QColor color);
+	void setGlobalBgColor(int style, QColor color);
+	void setGlobalFont(int style, QFont font);
+
+	bool isExistThemesSetings(int styleId);
+	void createUserStyleFormThemes(int styleId);
 private:
 	Ui::QtLangSetClass ui;
 
@@ -116,7 +137,11 @@ private:
 	//是否是全局修改项
 	bool m_isGlobelItem;
 
+	int m_themesId;
+
+	int m_lastThemesId;
+
 public:
-	//黑色模式下不显眼的颜色,替换到显眼颜色
-	static QMap<QString, QColor> s_darkColorMap;
+	////黑色模式下不显眼的颜色,替换到显眼颜色
+	//static QMap<QString, QColor> s_darkColorMap;
 };

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 531 - 368
src/qtlangset.ui


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است