From fd65fe6dd4238b1af86e6e716fdca33c94be8e82 Mon Sep 17 00:00:00 2001 From: Vlad Mihalachi Date: Fri, 27 Sep 2013 08:43:16 +0200 Subject: [PATCH] v0.2 Release --- .gitignore | 8 +- LICENSE | 797 +++++++++++--- Turbo Editor/.gitignore | 1 + Turbo Editor/build.gradle | 28 + Turbo Editor/libs/eventbus-2.1.0-beta-1.jar | Bin 0 -> 42209 bytes Turbo Editor/src/main/AndroidManifest.xml | 101 ++ Turbo Editor/src/main/LICENSE | 621 +++++++++++ Turbo Editor/src/main/README.md | 4 + .../turboeditor/DialogStandardFragment.java | 68 ++ .../turboeditor/EditTextDialog.java | 107 ++ .../turboeditor/EditorFragment.java | 980 ++++++++++++++++++ .../vmihalachi/turboeditor/HomeActivity.java | 341 ++++++ .../turboeditor/LicensesActivity.java | 16 + .../NavigationDrawerListFragment.java | 291 ++++++ .../turboeditor/NoFileOpenedFragment.java | 42 + .../turboeditor/PreferenceAbout.java | 126 +++ .../turboeditor/SelectFileActivity.java | 224 ++++ .../adapter/AdapterDetailedList.java | 260 +++++ .../turboeditor/event/CloseDrawerEvent.java | 23 + .../event/ErrorOpeningFileEvent.java | 23 + .../turboeditor/event/FileSavedEvent.java | 32 + .../turboeditor/event/FileSelectedEvent.java | 33 + .../turboeditor/event/NewFileOpened.java | 32 + .../turboeditor/event/OpenDrawerEvent.java | 23 + .../turboeditor/helper/FileHelper.java | 49 + .../turboeditor/helper/PixelDipConverter.java | 58 ++ .../turboeditor/helper/PreferenceHelper.java | 68 ++ .../turboeditor/helper/StringHelper.java | 41 + .../turboeditor/util/AlphanumComparator.java | 138 +++ .../turboeditor/util/MimeTypes.java | 146 +++ .../vmihalachi/turboeditor/util/Patterns.java | 66 ++ .../turboeditor/view/CapitalizedTextView.java | 44 + .../main/res/drawable-hdpi/ic_action_redo.png | Bin 0 -> 729 bytes .../main/res/drawable-hdpi/ic_action_tick.png | Bin 0 -> 393 bytes .../main/res/drawable-hdpi/ic_action_undo.png | Bin 0 -> 716 bytes .../src/main/res/drawable-hdpi/ic_drawer.png | Bin 0 -> 2842 bytes .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 5581 bytes .../main/res/drawable-mdpi/ic_action_redo.png | Bin 0 -> 481 bytes .../main/res/drawable-mdpi/ic_action_tick.png | Bin 0 -> 332 bytes .../main/res/drawable-mdpi/ic_action_undo.png | Bin 0 -> 485 bytes .../src/main/res/drawable-mdpi/ic_drawer.png | Bin 0 -> 2837 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 3165 bytes .../res/drawable-xhdpi/ic_action_redo.png | Bin 0 -> 886 bytes .../res/drawable-xhdpi/ic_action_tick.png | Bin 0 -> 327 bytes .../res/drawable-xhdpi/ic_action_undo.png | Bin 0 -> 926 bytes .../src/main/res/drawable-xhdpi/ic_drawer.png | Bin 0 -> 1056 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 8096 bytes .../res/drawable-xxhdpi/ic_action_redo.png | Bin 0 -> 1345 bytes .../res/drawable-xxhdpi/ic_action_tick.png | Bin 0 -> 777 bytes .../res/drawable-xxhdpi/ic_action_undo.png | Bin 0 -> 1361 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 14079 bytes .../src/main/res/drawable/holo_selector.xml | 34 + .../src/main/res/layout/activity_home.xml | 39 + .../src/main/res/layout/activity_licenses.xml | 30 + .../main/res/layout/activity_select_file.xml | 30 + ...demo_changelog_fragment_dialogstandard.xml | 7 + .../res/layout/dialog_fragment_edittext.xml | 50 + .../src/main/res/layout/fragment_editor.xml | 42 + .../res/layout/fragment_navigation_drawer.xml | 38 + .../main/res/layout/fragment_no_file_open.xml | 28 + .../src/main/res/layout/item_drawer_list.xml | 32 + .../src/main/res/layout/item_file_list.xml | 71 ++ .../menu/action_mode_navigation_drawer.xml | 26 + .../src/main/res/menu/activity_home.xml | 31 + .../main/res/menu/activity_select_file.xml | 25 + .../src/main/res/menu/fragment_editor.xml | 59 ++ .../src/main/res/values-de-rDE/strings.xml | 117 +++ .../values-de-rDE/strings_aboutactivity.xml | 41 + .../src/main/res/values-el-rGR/strings.xml | 117 +++ .../values-el-rGR/strings_aboutactivity.xml | 41 + .../src/main/res/values-it-rIT/strings.xml | 117 +++ .../values-it-rIT/strings_aboutactivity.xml | 41 + .../src/main/res/values-ms-rMY/strings.xml | 117 +++ .../values-ms-rMY/strings_aboutactivity.xml | 41 + .../src/main/res/values-nl-rNL/strings.xml | 117 +++ .../values-nl-rNL/strings_aboutactivity.xml | 41 + .../src/main/res/values-pl-rPL/strings.xml | 117 +++ .../values-pl-rPL/strings_aboutactivity.xml | 41 + .../src/main/res/values-sw600dp/dimens.xml | 23 + .../main/res/values-sw720dp-land/dimens.xml | 24 + Turbo Editor/src/main/res/values/colors.xml | 38 + Turbo Editor/src/main/res/values/dimens.xml | 38 + Turbo Editor/src/main/res/values/ids.xml | 38 + Turbo Editor/src/main/res/values/integers.xml | 22 + Turbo Editor/src/main/res/values/strings.xml | 117 +++ .../main/res/values/strings_aboutactivity.xml | 41 + Turbo Editor/src/main/res/values/styles.xml | 47 + Turbo Editor/src/main/res/xml/about.xml | 100 ++ build.gradle | 1 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 50518 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 +++ gradlew.bat | 90 ++ settings.gradle | 1 + 94 files changed, 6875 insertions(+), 156 deletions(-) create mode 100644 Turbo Editor/.gitignore create mode 100644 Turbo Editor/build.gradle create mode 100644 Turbo Editor/libs/eventbus-2.1.0-beta-1.jar create mode 100644 Turbo Editor/src/main/AndroidManifest.xml create mode 100644 Turbo Editor/src/main/LICENSE create mode 100644 Turbo Editor/src/main/README.md create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/DialogStandardFragment.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/EditTextDialog.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/EditorFragment.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/HomeActivity.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/LicensesActivity.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/NavigationDrawerListFragment.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/NoFileOpenedFragment.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/PreferenceAbout.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/SelectFileActivity.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/adapter/AdapterDetailedList.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/CloseDrawerEvent.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/ErrorOpeningFileEvent.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/FileSavedEvent.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/FileSelectedEvent.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/NewFileOpened.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/OpenDrawerEvent.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/FileHelper.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/PixelDipConverter.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/PreferenceHelper.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/StringHelper.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/AlphanumComparator.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/MimeTypes.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/Patterns.java create mode 100644 Turbo Editor/src/main/java/com/vmihalachi/turboeditor/view/CapitalizedTextView.java create mode 100644 Turbo Editor/src/main/res/drawable-hdpi/ic_action_redo.png create mode 100644 Turbo Editor/src/main/res/drawable-hdpi/ic_action_tick.png create mode 100644 Turbo Editor/src/main/res/drawable-hdpi/ic_action_undo.png create mode 100644 Turbo Editor/src/main/res/drawable-hdpi/ic_drawer.png create mode 100644 Turbo Editor/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 Turbo Editor/src/main/res/drawable-mdpi/ic_action_redo.png create mode 100644 Turbo Editor/src/main/res/drawable-mdpi/ic_action_tick.png create mode 100644 Turbo Editor/src/main/res/drawable-mdpi/ic_action_undo.png create mode 100644 Turbo Editor/src/main/res/drawable-mdpi/ic_drawer.png create mode 100644 Turbo Editor/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 Turbo Editor/src/main/res/drawable-xhdpi/ic_action_redo.png create mode 100644 Turbo Editor/src/main/res/drawable-xhdpi/ic_action_tick.png create mode 100644 Turbo Editor/src/main/res/drawable-xhdpi/ic_action_undo.png create mode 100644 Turbo Editor/src/main/res/drawable-xhdpi/ic_drawer.png create mode 100644 Turbo Editor/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 Turbo Editor/src/main/res/drawable-xxhdpi/ic_action_redo.png create mode 100644 Turbo Editor/src/main/res/drawable-xxhdpi/ic_action_tick.png create mode 100644 Turbo Editor/src/main/res/drawable-xxhdpi/ic_action_undo.png create mode 100644 Turbo Editor/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 Turbo Editor/src/main/res/drawable/holo_selector.xml create mode 100644 Turbo Editor/src/main/res/layout/activity_home.xml create mode 100644 Turbo Editor/src/main/res/layout/activity_licenses.xml create mode 100644 Turbo Editor/src/main/res/layout/activity_select_file.xml create mode 100644 Turbo Editor/src/main/res/layout/demo_changelog_fragment_dialogstandard.xml create mode 100644 Turbo Editor/src/main/res/layout/dialog_fragment_edittext.xml create mode 100644 Turbo Editor/src/main/res/layout/fragment_editor.xml create mode 100644 Turbo Editor/src/main/res/layout/fragment_navigation_drawer.xml create mode 100644 Turbo Editor/src/main/res/layout/fragment_no_file_open.xml create mode 100644 Turbo Editor/src/main/res/layout/item_drawer_list.xml create mode 100644 Turbo Editor/src/main/res/layout/item_file_list.xml create mode 100644 Turbo Editor/src/main/res/menu/action_mode_navigation_drawer.xml create mode 100644 Turbo Editor/src/main/res/menu/activity_home.xml create mode 100644 Turbo Editor/src/main/res/menu/activity_select_file.xml create mode 100644 Turbo Editor/src/main/res/menu/fragment_editor.xml create mode 100644 Turbo Editor/src/main/res/values-de-rDE/strings.xml create mode 100644 Turbo Editor/src/main/res/values-de-rDE/strings_aboutactivity.xml create mode 100644 Turbo Editor/src/main/res/values-el-rGR/strings.xml create mode 100644 Turbo Editor/src/main/res/values-el-rGR/strings_aboutactivity.xml create mode 100644 Turbo Editor/src/main/res/values-it-rIT/strings.xml create mode 100644 Turbo Editor/src/main/res/values-it-rIT/strings_aboutactivity.xml create mode 100644 Turbo Editor/src/main/res/values-ms-rMY/strings.xml create mode 100644 Turbo Editor/src/main/res/values-ms-rMY/strings_aboutactivity.xml create mode 100644 Turbo Editor/src/main/res/values-nl-rNL/strings.xml create mode 100644 Turbo Editor/src/main/res/values-nl-rNL/strings_aboutactivity.xml create mode 100644 Turbo Editor/src/main/res/values-pl-rPL/strings.xml create mode 100644 Turbo Editor/src/main/res/values-pl-rPL/strings_aboutactivity.xml create mode 100644 Turbo Editor/src/main/res/values-sw600dp/dimens.xml create mode 100644 Turbo Editor/src/main/res/values-sw720dp-land/dimens.xml create mode 100644 Turbo Editor/src/main/res/values/colors.xml create mode 100644 Turbo Editor/src/main/res/values/dimens.xml create mode 100644 Turbo Editor/src/main/res/values/ids.xml create mode 100644 Turbo Editor/src/main/res/values/integers.xml create mode 100644 Turbo Editor/src/main/res/values/strings.xml create mode 100644 Turbo Editor/src/main/res/values/strings_aboutactivity.xml create mode 100644 Turbo Editor/src/main/res/values/styles.xml create mode 100644 Turbo Editor/src/main/res/xml/about.xml create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore index df1ce3d..adcf2f2 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,10 @@ proguard/ *.iml *.ipr *.iws -.idea/ \ No newline at end of file +.idea/ + +# Android Studio +.gradle +/local.properties +/.idea/workspace.xml +.DS_Store \ No newline at end of file diff --git a/LICENSE b/LICENSE index 37ec93a..3dc9644 100644 --- a/LICENSE +++ b/LICENSE @@ -1,191 +1,678 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 -1. Definitions. + 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. -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. + Preamble -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. + The GNU General Public License is a free, copyleft license for +software and other kinds of works. -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. + 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. -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. + 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. -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. + 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. -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. + 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. -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). + 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. -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. + 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. -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." + 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. -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. + 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. -2. Grant of Copyright License. + The precise terms and conditions for copying, distribution and +modification follow. -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. + TERMS AND CONDITIONS -3. Grant of Patent License. + 0. Definitions. -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. + "This License" refers to version 3 of the GNU General Public License. -4. Redistribution. + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: + "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. -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. + 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. -5. Submission of Contributions. + A "covered work" means either the unmodified Program or a work based +on the Program. -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. + 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. -6. Trademarks. + 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. -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. + 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. -7. Disclaimer of Warranty. + 1. Source Code. -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. + 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. -8. Limitation of Liability. + 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. -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. + 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. -9. Accepting Warranty or Additional Liability. + 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. -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. -END OF TERMS AND CONDITIONS + The Corresponding Source for a work in source code form is that +same work. -APPENDIX: How to apply the Apache License to your work + 2. Basic Permissions. -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. + 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. - Copyright [yyyy] [name of copyright owner] + 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. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. - http://www.apache.org/licenses/LICENSE-2.0 + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + 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: + + {project} Copyright (C) {year} {fullname} + 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]. + + + \ No newline at end of file diff --git a/Turbo Editor/.gitignore b/Turbo Editor/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/Turbo Editor/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Turbo Editor/build.gradle b/Turbo Editor/build.gradle new file mode 100644 index 0000000..7ba5fd8 --- /dev/null +++ b/Turbo Editor/build.gradle @@ -0,0 +1,28 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:0.5.+' + } +} +apply plugin: 'android' + +repositories { + mavenCentral() +} + +android { + compileSdkVersion 18 + buildToolsVersion "18.1.0" + + defaultConfig { + minSdkVersion 14 + targetSdkVersion 18 + } +} + +dependencies { + compile 'com.github.gabrielemariotti.changeloglib:library:1.2.0' + compile fileTree(dir: 'libs', include: '*.jar') +} diff --git a/Turbo Editor/libs/eventbus-2.1.0-beta-1.jar b/Turbo Editor/libs/eventbus-2.1.0-beta-1.jar new file mode 100644 index 0000000000000000000000000000000000000000..c68edd41b64af03c04cf4a73310f4135a14e6915 GIT binary patch literal 42209 zcma&NW0YmhvNl?_?JnE4ZQHiZF5AW`+wLygw!3WGRk!!u-x+tmXN>cmJIBiPD`w`* zhZWM$~+=ip`NsHZ1qnv@wAS#}Qh4nh87ve+b&f2<1n zcQRA6f2{Z4Nf7=`V&QCNX7B7^?BMzjYBxjKe@ytVulqaUe^8sbo7w;Koquf|hr~4S z?(g39A%K9${)cyjT)gZ}6dhb#&7A2?Y>ix80ID`B3yMg5r!;~jX1@4e(eA=b3dzb^DIhc(+`hlLclvc!5U4xr&>yMsyUa#Ss2+!vP!Nks7*IL-F; zN<7Ee6ZjpYe6-GQD16Ji&e?O+{7JYh@{l+JQYP@3A^j3<}ESG=No0adVfAv?iK+5J7!k;2sH@xJwbpt=QSt-k)jHY zBm}wHI7Lz)S&g~nqerbhQY>or)fy-`1;22UX#64BBZS!|^;g$XQs)tW;p+urGahkk zt|G$h9iX%Of?wMsl$x&)K*-kwWr7DoK02+0tKwEe&WB<|JOV2%ny53+;5sgu%tyXH z_5u7)Ga%z5@e&0F1Qht!SWy2Dpb<7Qv9WM=aI-i42XfQ`R8Te0_+(JnNo9!gm8;bh z2NQsh=@bK%BZHJdzXThaTQ14H!b0nDIXZSMPBC{JxY_2pRV)tTryr6ZSX_tK@AZ`h z1r533uCF?-H{YlEuDjC(zF#jrfHV~2^6^dJU$6{Lu;K|70lwIMZnC3R+VT#pJLKd= z8U1vp9dzNRP<{rdzfr}-M`XdKu%ZnyJPsWdldM`g7GZBp6Rn+2@PONa0=|2kAdVc~Q#LbNoyj*EtzCZBCNXbqX8CE_>Fipv zV>XLfo#yc$)Z}(YX|T2X8(v!Rj#6Tn?loV#!EKYTYtGXx(z%DLMVVwSOS0&49SQB( zdMI29OswM_j5yOj0O6H1b+pC?((rThac5|!<-tax`#B@)=95WDLL))kdIU1Pk5W`f z>AY;}YYjF%R@pee{l`#W$Bwy_N=mu+2C$c1jCk&{7g7X@Q;7?~-%d0QhZU9ev z(f^WvS7&0-#gB%drN!11pX-IeLOs`HnZQ@4%agV26;hHI>t*@F&80QdeDRzR|7}o5P?Xq?Fx`nus&hJNwBo*k%0#iL zMpLGbDK_$4ZA^W<%C+sLHu}yfwZqBj<&YX~V0Sy|-&VySF-C=9Cbck9@ge-dS#Ca| z@0KPecY2WvvC{y}GIOrE|GE7E=5j4IHd02|spTSe0j}z!!JlF-#Sf12w)dX?EV0-Q z2sE0hXqTL6zOOYotjaRSd)2SA!r~#^FUY-2!@JBJHv2+o5gD-hdTJikncA*v?wn|* zyA#WYzv)3ej%@F(lgL?_%a!d6Nt5gr)Z0S`fn`AU4V;C*Jew^E3dZB%bT16-qrmb_ z%vD)3blpeE?>-=>4Xu+@u#2WMKC=o>?#eFDlcS9R+a~oFDz5_puz#Q$LtkNhVZ%on zAXkX^INIRPB_i4RoIFAd6iF85QN1~-t^Fi+BQT2FlJ$>_;M8tAv?7%x8q@j_7LiJd z8uf9*K4#>dL`u=)9hv+95h2HPZKh_sL$}8b;i{Xt==A7tA{r3ZXDzgjx+gs7)flC@ zQwLL+dGJG$6vJHA2p!A$PYzUlFZxm3Y`O>U!^ zl@w1+?P?`GMF~EmO+2NATZ`S-s=%*o4ckgRH(otUzoxYOxX*IT!rn?%F6TBy=T6+pSbxh|)Z+}JFWWIau zyoGxn%%VrROw+3IZ$88RQwwkhbI!W{YJvCvA1z@1w-%%->&f8$OAF*0$J(u9*4LMZ z%aN0y?4kXt(C4Vp=AVQjUpS@0OiclaYkC3cewLwsmEf&N`ntM8lnVBW*~5G~$K?tT zza8NJ0W#aCjxE;tv{QIwJQWjIF+icWlP(At z?n|O1gbU6K4O;jtGZP1&dg7OwlnpkyDVs;W8|80qmX9-Otg!sGadt0C!VxlM-5VQ% z5Z%}yhEG_g2x$7e(ZoF`W6FtJv|U$Qupgxx>we0me9VvXuEr31n(HPRpCg+MSFYX? z)<|cPm2(ux@sG1ZrST}^{JgAKt$7KPBgAQ^Nlo#|Mz1~Z#+p+o%$!r|h;H5*^nBdv z6|2-%2a5NMCfBLr4v9s12~STP^-pxp23BbUv_r&BKc6#-PRdLW@5`0*ex)klaSyiI zl;k;1J0$ja6>sOwr(Zp!A{Ga*&p|G3v=UCtqQjixMRcl+9H?C!5|Nddh>QuEd+(33O;{+QVzQ1)A8C$-gX`9ZX9#2 z@PEF3g7tDQ!_)3~W1G>YL2oI#N{z^gSyOK+@3zLZ$C-ttZTXy2T-8r(ujbZ6CL%Gz zyc-!uCniMtF~)#Bw--=gIZJfFl~CC4$Ow3i{{(8@`7 z;dIDw-aGVfmB~mCxM+Y0|DJsBVecBOPX*8Bt=LXW5oHVki>f!YhrwKABcH1~L=k3b zB8|ImiIP=SkzL7cRua*9t7|ah(_ubMlF`Yj<%wmMrP0tJcn0~E@zNk)H4|;lrER~` z#8uS|P!*g^u45^@Q)3vXiNiY)DAuGNl~^KjL%8Ig4t=~^ zLbdfr^Ye0-FKg@ETjH4HZS=79@0D|-gV!X;HMjXs9KEZFTYsBqdSj%}iihEne)A9g zcJ)|-3?algEwv@%P(@*IOsW|q9XVpScOv>vHsZtbPg6!yATBZAZVFG zMm{zJ{kYYI+=si`zzHxierflNTHQLOL@(iJZjhH)Co}6o>iS?BgSzZ)p|Wwgey|;m zo9$!{+ag@j8s7VXFj7q(x5kOPrhA(sS4%&>&d>S;nA0nkep^dmF=-d(`Ea z6GSo$cD#uPgxGUcE8CHuk!LyQptgQ%|1?=Vm;g#T?lWNIqW?`Q3!N6#^9|ySp*-M> zj+Drc1moZjSs&zn=ux>YCc}tU7nW<<+WjBpgMVf2n43Kq$A8(X`F z+1eWa%}V|aT)zYbnZL{(+Fs0BT-ENYl0bag3tEYS6oC~MB--&yMld>W*LhO7ZSuMS zeJL1}>y<%<49gtB_2)f0f8R&#r90w^!ei;*%(6HavD$Xe0(F4GTv<}TDv1!XQlk2i z7LD02Rl`jp;wnpt$Z%B&A3e>4Yk`XkcD)9sG&1~4p6x>Yn(jKN(R>Ma;yqAvk-a@_ zMVjKk){&sF=X8u~8Y;RcqsKx+#InMTWJ9C>L69G3pmuTI=PBf#s3xrxRbeV^L-6+p zVlHq9@>?O(F4TT;d@>G^3;=NhY=JfUp!j%)HT&bg@vPwi0g?W10Y^aq2#EN9;n~00 z)S?aTtGcu#V3F22c3?(?WVni_K41zGgheD|x?%}ssTre#pOns+G&z_Foh_p$T&36C zqAYevtZq_chrWgeZq@|5wA{Y5T&a4l+(NIXo8bHHvYpM5Y}$BoP4jhk<@XHmxoSK9 znsFc5#`Ez+M3!?yGfxh-u=1_MytHMAJ>+6$<_JH&_4U#tj1Sdc?`>k^pOVq%*Mp*F z;~$V|JDSKOs7-QD9A46=K3KbJ)FhB$<)4rVo=R+DtG&Hb);}Wq!H}Maj+3`vl1QGe z9Xs=wwC&5Kuzzo6#&!$hrArxKXX%?5E}~C;luGObfKq1&5k~+F!*gwpRvjQOzZer~ z(#4nBX7x`smP8CI#p-mrG8^obFz3<*Go7-HYU=KXq|5KF5!k1?$MP+bJ3 zUb2}#=)8P+a6xn#x^P*);?jF2IIKUqY}w0teykKPZXzlB;bx+Aa zZ0E{x+#rTbAd1cZ@OmBb4WG3~_S>fN?pAs5DH|5Jz0uRRM!uci?+7i`^L`#Z6PP;k zd9}FvJrg}L!}b+=@tTgaeO)r~0*vVJcoW?C#E$4NQws5CcNZ{!l{6wk;J-T1(RIRK zcw0p9hXnTW@y_Jqx22e!6Q4=V&b|*GSr*!Xk#g$d7%PnKSHd(2QpV^VDczV= zZ{ofUyRpNld}0J)Vn?dYy`3qtJgLm$!AQu~HsnS&eq#x_{m z4CZnY?GLu;oiK7xpc(wAkdem)IIZWPMN(4Oiwvju8*wT#BnNjH)xom8c-rwl%KFkz zH&Lx;6zbR4PBTt{7srYlcULfy2iy*J$851NXxGv5;xSd~WcS%wS(>4WJKLZr0t1!* z*`;FR2g6_7^)w!*Gi0*39XymJ*{>R)t60#oAMA(UZBKw|W{jFbpuU3Hg~?Pezp3X% zgPj0buDoh5oehKMe6Ux^pPEKBOj#}#%9I6@K5MOwnV9!)iOwPz8eVQR46 zpvFt5nv)dyjf_xNNwL%sHG_VXn=yyQ&ZMlmxn&zd>XzFuZNE`y#LYi2d3B|CYc1at z-FdLiHeSMr{u~{j)R9l4>BAgb%NY7Q?uPRnD`loU1deEs(sv?CrxEU?9mrLEc4+3O zzc}^h*fUx9N>2MA1Bl zzA$I5F8TbpJI$BMyldRU{5xSu0l2GmudF{oxB=_tz?zxZ@;AyA6*xW{q!wwCVXVHG zd);ka#`K%>{6qVIt&dV^X6DN?Z2EZX!$WbHmF#u}q^_N|Hju|A6`e8lX+R+fmENGH z&Vp1(O3MlbYW&dmOq+LH1b7St_`0d?YE!ETkCD z9%<}AT{ru(0>#(3I&W!#DxPzWD$ggGvhs70nXfhW@)m7gt*OE~dPEBOpGL-ysoYI z)TEUZ{DUfT@r;nubIG*q@_dXN#x(gOvZw6@p zW0l@O#B*27tu4$`RlpT8_0)Wk{PR2=;}+VoJmQc>0ss7|glmVq$L!?|0iWos=}NA1 znPU7^lkw7v2e-hOLgZ@C%Bh9xkNUMdXSK4t1%`~c^CI!3({xt>5Yz7}B>+Kw4YysH z9XFrkhT&kB)f@!q!eU8z(T91%o`ZcX#Rm<%z*!r45kVKk!TOh?Y1g(akTHx~6F?^4ki6`V79tOzl*sdzPt&`ff6yZ?z4CFzdAyPV>@j#U(^`c_^Tsbe zY($&_NV6oj^S!<8Q{yg^p@r!_#<=Bt-jVx|G1~% z<`en(TK17SEaCR0%c?Z4;>tg)VmP;jP)m+1jb&A)-b~xbjiQHpOQCvp>=3ss(!%Y* zDS2$1Th4>kdf<4YIJLXTh51$zFxTT29!)`nIg6h)019|&)(EJ~ zx(BV4o^7f3?=f=OVU}Pw)QhY~Mqnd*yuO)NSXYI;L!6Ts^m!MhkNxR;V0I1D__Pm%*VgN6U=(XL+ZfSM3yvd+DO7rF73aI9 zw1btuK>o(RR|_8U2Xrd(Mz{;b^=r$}FbpdWtl@o0rmTr|OMwDc8z~xE$-ZpE+zr$s zV7*eYb6qoC zQKO`sT^IS0xt!BvYi|&P88ZuejHdem5OOlHHlKBJUt9g_uqj4HTSU%TjoM#LI%8f| zV!>`SDiB@ogoSn~^-ppHxznar@Kc?h*3|OUVLjYwwVw`GbD4wllrgDnFd|KdbD?Qp z|I~T1<219444xflcYYgLU{Wh#q$(=DQpAW&hpwS(kCDt-nX*xl@=v`?r5Q2o0ExhY zT4**Y>H4{uB6A2f_W zDsh?lt}5Wc@y0XuO6X)5z~fa3@-FkVH}RRjVucnvTs_As--6&RdC3VoL*|(a9@Ru7 z1RtAk#u}(TJMfaEFkQqdT(ou1=6#^zEQEx%nnozpe5bH2R$Fu6ACUmVFL)=w33blv zyywNAi>Zj97m-Oh*ib#G3xtz-j&MONSIW7BR=1uWXohp*WMqpn$G;x`Bv_UhY$?}8 z0CG-YTkv7}<#I`^AdQuLKcs2FChl*hA`lON9hm^-q2j5}?rb?Zu%*EN)IB}6EBg>M z>T}2WnJ7%@vEz=Da)wdBgSADpVMW>At!-)wu z*^t3v&l8LIyLBN1@?xK|NSBu(5M&%^LB$d6-U@E0JY|m+fWjKDZADd65N%1vHpk7o zvS0?}CasmeP=}t9=`YgL!tRCKO1JR?WmSB{0V4%%1w(#QDzGbXcloaL3$}rAPOW%u ziS_5YC8M2cHDvYz-SRxDZliESvL{e`_^HRT^?k4Cs0#?0ro&Gciqv9u%iMuj%bxUM zu92f05;6eDh|ycu&b$V5X7ui+n>z$kenB-`a2}F|D=@$c605 z*#X8=Krdqx)uC1(iox)#CXu2LO^$)CIFe|{we4+Pnuz64R8W^LENkC9z|~k|q#jk)gGvdMyn#-=_U~_VoAON8J5+z@1N7;1 z>{sy9FOnB??u4G*9K;2iG|F@lv|rHC`Av(*~|q@=K_R zx>m%8l!-~(aXZ;m^XIeE3w%~1sY*QIlJ;ER9P3`(Mee$pE%&7BWnUxfYs4OIrIH^o z!}pAT$V-7Y2PA#9#zk54%(Eg!jvHi2N%re_O|tk1_i^Sj%AZ>X zqd6|DIha|G0_u)j($gE-0|xm;tQXm35X=|#r*_02j=GQ|KT}sbrp;lm3bR%~(qV36 zb{HlLD%W9uv}~tC)0Q2+Ol{nluMk$}*sgVY!xr#M3xkGlu3P3&^xb~c2mBM%L@R;2 z^g>I8g4n`p+*R?iS`HxRe1zE$BBsYndbc8$YHuk7e%Q(o>vXf+fE=#>*zN*DegL zma1{2dsg)W*sJ@(siB%yZAE-zam4A1LeI%tIX z^|ROW8*lh1=8f4auOz?wT&73zku?RTvDp&n>>BQafu$1bT7fod9{j<;y_@Cj_3S>b z;7s=D+n=Bje_V@C#A3_qd1-G%t6_mt@{>>VH;%^LZ^EiithN)1X53DMS&QDqW6o0q z@660UhLE4pfD1!Rn~S5w3nfqcJ{TIS%1u%bfLd?Qj_Sa>sH3km(nL{GgxHKQt#^=Z z_*rJe)NUY#ad;Ez`y1AsLhn7Q<8+X26`>kRgMao{zT7wViCkq72KNv0YbNb{pyxL6 zkvL@x!)I&p_TwxAItdNK#}tjAjEAVvME9F|uxXxGIgt1!qT+|^}=ieLZ66@ug< zY{3M%X+tzmdGOd>(9~*;=GX8}t`6Cdj;fAkS2D)+Wk|=_yof4x%A%1%=7v_9T8i4i zA7THzDoPt_MJTANVzLsD!6u-dR$9-NbeSK8O+%#QS~=Eu#!O!|&8$|?6Uu2oAJ>J4 zG|Kjl)VgR5^7hjuzSCuix`IWCOldAeQ+>NRfnO-}h1vwNu@^<`1hs@N?CdIWc$x@0 zB4a43^t0f-cy+q@xFq{2uqhzsMVD9X>sR(9K(Ev(EJ^CXX$;y8@`6TpeC5v61>D9e z_(Ln<=&3wCpliRnmVCQKkV z;0YJI-=I3Yf1*mD;Nk^B*SngDr-+jSt|d*rH};2H}=M5&fNC^W>B|%ajSV}BJ5bsSMsB~tl{pUz93V>bYRbby z1r8+}uqWb2t1ne(45-QHmJ#x5j_Fd29#D_wy3ZfyJIKcCE-(41o0rUxc^Ef|FGMRq zrUgR<91ti;;$C{4f1k=OE$a|p;LGMJ^hX*LRHzI@ z7PAvkb>b*{I-H~64%)h{TVIH;iXK;=bs24`;o{AOkOer)k zW<-_*dgsrhdtvSI)cPrw6W?ZdT{D_mxU!M~GT2-kJ2$p*2JuyEgp>P}c5x-Lpf5L1Y;iu4J$vD-_!@;k)3X8+16~sx;1^ zn-$2bZJ;kqRgOFAo(dML7%lM?kci5lM-s8NI~SHS!l}%3mjA>W7*{rt#X$hcvEupS z_Ag%RP_nWd&z1+7DbZ0iVl53z7If|4Ju2P4&u6Y%jVpw!aCkxeSaQ&2QHt5fNN4|j}wM8%Z`TosY)+Pldf)t!2XB18(GVwrSEyAah} zSWV~3MEu)4H2Hp*dB98tneO6LWUgJErCgZ zMN6#%DOYY~f&OijrK~dno!%k4Q6zTZPXm#(8#lbZ7S^!3VA}2CjgevmdhO-OM&guI2%ycm8hcBVwUi3V?7H`;2<2g zf)k-A9+{E^Wo|J~(!wHBFvyDmUPJuShrt!8u?EbFa=ae-js&<-GYNh>3DrMg4kD-g zgXUwB2%3&eE8LcKkJ!t~ylAAd1QIppiQ;z=;kOw-8C3)Z)zdDVm=9g?#miLQPNxKa zZYnh<;obKiqB{FZUt#lVR}hq7_OfG)1!HFpo5t-aues!6FaK#)QFZ8QW&HGdyy1xZ_1~>B*Z`OAMnk~vm}X97&^v06kW2~ zbF{3QEs>$DC7)+Ms@gi7MHyi{$bE=l9miWyZv(q-O0m39jQU@RAGsi^-FHRA2^7J; z9;?puh>Cju)b^wq^1|I3N`u{JK7R>jU&91YDP}t2=q~hPtMCI>-v*trHnahJCBBBNVgl zl_h1G^;?i)5#t6dQ?~qB+ABrP1mbob!^YX6sY?6s^lqC_b!_nIBlCIY|gCGFSoV{Z%h~m zNUsxY;uWc6(ZGtcC#L)x#?U1M~$m~@V zSTW&o;Zy&0dFuoB+D#rzo0%QD>S|JqGz|S-7EfrWqgH<5?A4E%Oco3O;{axc>v#pA zWhQ_i=5VYmR%UZT6XOu$4y=N687;3t`n@0O2K+v`8&!5e%PCl8i zmr_+_2PV_BsN;{M4FnChj$*!wGu#QYFwMRi=rC0!Y9};S>VBSG^l<9aLY)$!oZ-1P zwU|?uQx;kboBmoKVal1B-|HCZ!d5;jC+<7f`Wi!_J9()K%QL%FPji2`XWlO6mIg)^h|iL?VBJ$OH9Z8x6!gT1|sl=e^^KHDlwgn(qfJ(sSc=)%=8Sxa)45J(QfWB_i!*W%_v}LN-33ENM|SYvopB( zvC||4tdg8`B9h$wRA;4P)8pd-YO@t(1@*k?bDVpfa}RL1x^M{i{($|7nju$+DnfVC zTaP!5&6yVxhunrGM;s38%tfBQFNJ`4=s4CZ%0f?Jw6{fimyu#on)ExU3ZfSKcP-JE zmY8ZtShug1sW}KyXD`E>k~l34!?-TG{@Sg1?VFLSTrTe7EQ z=r)zb2V?T{Cpa>kJYIK&(9Eluamz8jf~?w6H1TgEOuZ}DgU_VPKh2;LwKmz_tmlkN zpztPY6R@P9q89eGQAGt!LXPlZH`XBttkYeJRAD8(S`m2LxRcv0n3pj&J}j9uLmh=^ z@Z%R#^;a=rpE~>XvDO+GFCfKX%b`>3)~mnN%FHxi67{mOn=#SEAYdTuu{<4$^l&f# zq}G-dwCdFmJ0A^&a8MO$^-Ol_lXDrFLMHA|v;Ua3T%8+DKZPKsor-cELN_B*DI|mS zC!>sXl5o3iE5%Dj&pzp+L#-n*D}?P}#q&kylBs)^yXciqvoyx}C5P9KkLr-WF$noG zJ1Fs@IZ%*Z;b>byYF)FQd{1NFwsK$eC!xUGX8j6Kw@g0ZXZ&*vLy1`lBJ*=`5bmm; zMkgxXZDmf)r`YHkBh-5J$w5l7Gh2tl9Q6BsedE@cht;(N7fO$vGc9f3y$5S8?pe22 z=Ud^eE`K68Ht`&Bta!arYH7*wMWC2`qd7Ihi{w&v|K<4&hwL3u96ZB#=@ zs~fXfPI;x7>Fe2$gHm%^xYljmzA6Ad%gq#AZuts*uv%iaYz4_cXfM$D&qM>PQ=AXi z6LF-U<%oX}!46D)CFAB6VtFQ9RmB=G9%)d{Sc)k~_^gJ^jz=wOa~sJgqLHlDg4Sol zBPxo7#+>YiGhzpwA2?lFOVk0i_I1G}^5kh;D_du4?tI>+gbllVc2u2!VS+jwq0DdE zX)0Wm$masFSm@3%R4Zn;j7S|{_Ye~SdE#It=igeA_C*PJe)E+HcwMx^l7QlKMnro(V}->47@JwtV^)Qazcp3HB~wkJgE5@vQ)tHU|_J$qmia=iZbHXZ0D zEfs^PRpC#-6pg~c>}J*XrYh9kQJ13Y6c8wS&{u=quU`@m><1D*DhoFQp7dI^nM2qVaNk!cp0QqG`gw zMX(bR8-g+YG^`v~RE?aIs@bC+Ov-);U{aNY`vCGs+gm#mMHWum=GnNu%DtSadqxC0 zUUgII7l#+K&8k-u>Ikw6tIUXI?HIFw1AJ+Qpwfv}suefR=7xAo+{=Wu&pQ*VrAPeY{H_iw!Nzk{zMdbRt*Og%%xXg9WW%$#`8*tFsU#p zi0jHU>Dyy8Sx5nXe4eo?4)A6TX(vUvm0WEWjJwfZl^Fffpq7_YAke+=q%7Jih{74z z?ODXm5^xyYarGg|nF~%o!Gy8IRuiTpkB;wTS^=et< z7Rw9yi7>=hcx{3Y$tpBDZ^;TA9RuGqiiHmKt2*i%{+}@gr1mI3=imNB#Q)2EB}FrP zQ!9Ime|eq%!+2Fag@1J_FW7gK=+Ty!t09A@xa(90L1BQ!4i6SvqQ*dMw_bv2oYSw_ z-|mmRv=*i}yg%M?A zXk4^2jbSVt)ia?{lc}BQrC3UckL6@35{3H)V+6g`yxmrGDqg1Q_uk&Ukdr4sZUvD)(lR(;6NLS47X1^V~kaM!MgiSNj}d-MiK z9es(IS-0ShShg#SiRxmW=)nNigT*Y=n)XYwe+%vf+DevDeH(JLvvk-KF2xS&*34O1 zu~vbMk@cW293bjg1one-#8<2DlC$syj@R!$}bk^JcE2Iy@x%0a1Cff>YyVYhy=vGgRY&o0m#|T z7SF9c!fDzk6ebSRp|CisNrQY(#AX#_ZWR$9&r_XU%|)$@kBq!09tw3Ao_L^mdg3DV zG$kHd=$%C|nJnYy5&j-JK{1OWa{l2TJ`vL6t=SFnSNVxdn!&di_&R*=RGZ4dn1aW$41pl9JJ^cstl-$hR%>E01Itr*tNM8sk_ByS)<8p!pP?l@NVx7d2 z#t|^3gb*NozwCTMhRlB1|BAR>+wPA>OmdWBP2`aLkQ;shlqf%xl%7uJtYyA-XRb8~ z`1^e#7=o}cv67S+k%EwfaTga^_FJO;Vl1tW3A=@|A3+k*7L%uRq8O&|VB1`9G$3rI znhNR_Y$asD%}t3rKGGE+@hIN6NGn#U&xs}bb)dks$U&z=$ZN-yCP1Q?hoe>Eu}mi! zcvO8jI&|kQ?@ePqT}qMYc3;|M?VZN0kwX-)Kn=ZF4*pz8JCT%;<@$$8#gI}hxv+3S zvzi-hZ=yRhpu-U3yBAY0n+~p2+!|xyMlf)CCC>DIvd9Dmix=j-F9M=$*s9SFJEB|d&8BTIofPP-B@w~-EL7LNZ&k%KdI!pAEI`y1ic5O!MIWY_jsTaBX(FwHPje}p} z$!(2!uA9Z$ZE;l1=NZE$_1}kG$C__8re8~Mo!09#n0{Kn2b)Mz zYr<&X30Q)M!tvTBJ}4=SyIyZZYq%cxSH&nFjZM+_eb2MKtj=EcB|&JAPmsRxcr>%s z!?YDSutt#Hg)}M5I31UZqLl>@d(mB0DCUCyNZ(mtR2AjQo({6Z9i=&N9yAYtqjkk|O_2Dhalvgy-NgwH2guad#GWOOJr>gCt@rBJp zLM5+rtwa!wvVI;0sUt=Q{i4=2t7&VGR zQD&X#Im7{bTq-I3_(OBWWY~>an24y)+qAQvB{0h6)%T%KR+LT;QIJjQe#ai zLkw{2DCX+%dJGY&FlLb)#5UZV5YRB^qJgQ}nYMGER?Lh_lU%vCaJb0)V;_&Stz)>? z;TE>$$?ik8@M)xW|{Xa9$=?NRC$(W$T$YuE0#$DXbrFtIE~aE zJK3erin}IdI~L0_{qRW(oc=@1U3jWr!{-M$xh9VrX$%Km%8Nm{`Pa&M)+Y-eYh42l zpu273B$w&7-UZh;E=1ue{v^vKBKX+V=Mf|YB#~VB+{)bZl1z(VMdOU$enw%ICF{ck zpO;vA5b#=5B9t_#s^m|8AOfQ?_< znOhD5{JtQJak5~5-&o>6>8rZtE@A^qP&F$rjL3iQep+Wl5ys#m%kGch|tDVF}(NgT241!!{DZ|pEIwlj?=c-={ z)0$$|kyOJ;^(veOSkxv7+8cn;@o5v=ZQu(%mNsu0|B6wg%$A=b4|w+fPGOQGYL}ti zUsZ1-oNc2RAEG4ZG)twk&^F|9Vtnsuuq)tbq~FO?sasEM9d~YP%}jmD%A}JzQX0!F zaa(A8xd`+xvs42Q3)rAmnNW9W6(hrOeqzTY%Ip-b`o87U6!%Zf_tj^S5v{XuxJ|u) zSjxroB1S6b6tm)xxo87Nu)t$^wjJBN!y0xLlR7S4dqLThm{_h>&V|Ld%Ur5HFZ3=b z)S_$OQ(gzrtC1}+KR)OjTJm{{cFUzX<&1OTZlA3wg6!gca}?cq=!vKy8LJpUT5;4E zVVs6}!0(OQ*j%X3-{;3*D|Vwb(i(vwsMlJ$O^Bz8ffjwHSpxfXGxRaR~y z1Z*&CFmnmX$>q~9-DNYBn*0#;R=H|y8#7Q;8NOOEvbP&!cEgryZr5RPw?I>v{2aq~ zrlt>Jdb@O;-yVynR0wxhB1q7-63?#^d}n`1EQe!G{9YlP(YQg?6Md(EV*UG-Gn7d1G9z4($9%rjeR3##p?QVR z;D^(l*TpoFIA$=dOHzoVI`1oZ;K~V^wa`9(^MM7JWd%v|<%YfEx$0+lzS5(JYRM1i zp@~a8hnpx=eqnsLRI0ZzAf88_zX!^LKX<&bEnR-|>WhR)4Xom@EQO1*k_2ae=&LZ`KK#K`W zf!4S;@{odNZ<)ELq4=8k(P*Q?Hj8P`X|{}u1Y1!Ps-Z1vS1nOTc=P5ixOmHd&#J^f z5Z-!N{P41)#OdF>_J8i!erHOS;mG9yH3a@T6G3`M^BoN5y|~{+_Ei=BksKdCF+u_3 zh{>-Np|HCE!(X)1#E&)(`|d~C&(FYrJaBwlj%jeS7k&4Z?#oH&h1Z*YIA(I^R1XyH zxEeijcm&<%H6Kml{27HQarl;!a@U-4rv^UK`I3e9>Gq?vKtgysp+8sYM(zjoZH@5D zO-#z89W>whkVofBZKsbezx?P(6O6pK)3^kz51Q{x_>l7P^?SW)Z5NC@ESfvEy9MoL zc{n$G;9e>In|&9%Rd(XKIbXMKe*Vx!#F_j2-f8P@nOlXOXuSJk>uMVIr6zw!{+R5l zo19Tm>i~01Il4{!TFbCKiS{s%ge^z4xx~|*_ZMnL?yA+WN(Q`ldc#ot zwH)G+_8p=^A4V~@m=F15UDp8Qhbx;&ayFBetM!zPzB~nqWv2fRXI~i%V4iSIYXdO zY)tCmW8lZ2((pWESr`DAzN#W*VMFt|*pCr>z+kc$=68)7 zY}^IfVAM}YH8#YMrZQ|yYbRQup2$$03w0&zFFVYmkQ?C=MrV_vljTcxar>D)5}`_J z6!uRG>(O8#QZmYJuB1aXg{-s*bl?mLlV95J4iHTvaTN*xQO%EKH%KBI;`p;|EYL@7 zPQg95{eTT^o;V(rj&XI>lk7cwK70=2K)y1U>DI)iM}HZUv{r|W2#uvnv#)a{M;f!rfAq|qHnk+Uc;l%wHGaAgrT$qQMTPMG zd(E4XaK3+X9uIeY5e8}!itTImK1#85^;vBLq}Ho8?D?B&s>D%9;KT!btL%mv%4dM_ zPCMww-7&5bKD=eRty27mU9>eFQ9fuXbzv2Az{v)}TMs4)ZfYS^|Bb|Gd<~kEpXNi0 zj39{-x$4Wvt)H>P*6sm(6KYziLz}vCNNubJD0@@i2dRfTT`e_sXMuA<^j3(@x#`ApZQ`Nf94P-i9g!IlN4YsTg z=PpC5urCukdajpIPC^^^DZ1^2AHBc1z9_|qxn4u*XTF9KVLublR3>)DSDM4aOiqD%T_3{a!I-LxH z(h;67d!A*Woi;2?tvU)-1j)~6)_#M*vKH^bAtoq`sdB#Trh7aZFsXTpKBM`@eX`}_ z>{~BJPwIvfN(~^@+Jq3Lzp?E}_mVQ9qbLncm&Tnoi?Aj+jzzGD9A3^96LNhtwjnAG zV15PEFxqE)DEP=k<|%mQj7B%;^C1*obvJM%fLBq#dtsNa_HP4hG_wVsu`~;J-d#_CuCh( zu5X{#OY>)sd*_T#M72Cyt#m7FkGigmvO0|IA3Pq3Fc|AF81Fb^Y7UG@IWhIga2CLADa9~b42dBgqzAuE&r3eT`oya! zn4rEq;risdeEY+CN69c`Zt=ED^Xz{7lr??xk#9hwMH=bcHa|~NTBtldLI)tW6=PkE z#HvQO_sg1JpztWrJ|BQ?K*k?2)uPEA_CLUB4JT@D#JI$+Gx|KZ_6O{IB=4bLb4;GT zQth!Hni8%SVK|zT6j&7SHkPH`@MX?NqsbVg34F3pj(HtHO2q+*+|-3s?3-^ohH_`M zg`w@v&G%R9(XUT4?;$AbK^g(2f}v;a#P&490KFj%5xN5tRR2{3CM1=xuTq*M@GPp; zAwfK>V0>=?iUNAi5%@G`JNwe~{aU{bqUMN^!jf{9P+~Sq_`K*8P z?kn2bseqD06lA2Fw-Sz4Gmcu5w#ka`1_k@)y)oQq!|B3r(#}Cf!ybqzF39}KMqrbO zavsdEP!I0QD1t)I;^Z(*6tf%?hCGN6cOs{ZN_6WN=R~P5`OVGEPds!O=eR~iUF^~y zz*juDV+3YyxY6EtmODng%-Ktw}nHc$n^E#Ql9mJW*lFIUVu6 z=~eqE3I3BKtC~Z93x!lvP7J^K7hcg6^^8+VKc{jFeS_!D6{<*QygZdP2u#ARenQc` z@r%OnS3r&)t{`nSU(L&Fh6V9>i4RHHZ+$i1$q(XbgN&=az&`;D7T7v2a617El+EWD z;N*3hPB~)JVFVk*?@a$p=ITfqqX|B{<%7=-i|YSP=Kl8^C z;WHyDV0!KG8P(I5@1&DS_qC944X5!JE+VS0ahP${4ypqu8d>Rpt)%J>?uSL2 za}F)5)>j!e&^U5un&TjsM%N)Ab{|Z?j^ZabqP91*incd`&)MBHDMTgNeI$z+1;`KD zb+T+edy@7}v64;ljE@~0%UZt>*jDbAVIpL#2ZY*&OitvGqqQzhC^eR|+flTuJi20z zRc81eyx^peuYU6UgHJlASYU7(AO|8x@GnQkyx<<@PuD6qu43D2p$*w)LJgtXQgp5i zp>s}^E-U!>Jn9eV4@s?Z?|HCmrX#QnQmLqDi6F>hm?lTy5-Nq7j54`8oGPQm z1^S=yWvq4csP>63>(9&U|6A6Hnw5*Wv6;N1*?%gSDp!h2N*Mf(XR8hv9IaqM=+7l~ z`D#=&79l?%(UVB2Mku55b~Bz6~@WRSjX zoTyx3oc-@cr?I`lZc8fZ4prlH~I zAP<@-S^mav;nbxXI^4=qPYT<<*dzp=syqu$rpTKB9z4C5N-)`%H@wH{ z)haJ;MIGApnh{yA2^VTp9W`cG_@cVpFL_m%Rn#E`>&-8T#a()T!%%CP;`Evfr5*9O zfAvMmVKC>h9|*2hl(|Wiv#LtPXV?68=MZuEX(v=zJ5)_KSZh1Sj=f8N&eDt5;Q=1W zMW1*Dl_7xE&Q57e#K$N~$#BFJBn?D_2T@!QAkz33b#-g0t*%5W{02T0Tz6Z+|Frqt zNO0)yoT}CNBu!PW+>2+DBCQPy{mVu((9;Cq;rO6~qHSGNQ zfZL!tET}x}l*NpDEK$)L&a3>!VzO^zNHn>PO`%XQ4qPt*I*YtjBX|N(k53C>N`}b} z?jU||``tiJ6xnX7%gJ7)!`fa75BU$WQWKw2{MmYgE=f=YQP0OFzy&v>LHir$QxE0~ zB0wh^$1C@#Vq7g`vnLb1OiL7o1vDj`lbR9*6TWo>8&kkg&&O$Ru8`;rpm|4&=UOPk zb^OKuFI4_(c;7$b1^-XseeQ17cK?+6_m3Qa$7Q)akIzzR`1Q+|Z~w19{#%TnxR<%9 zyPKoSe}?$vsQas;OX7UkqiJy=MXWccyr5Cqpv7M=9>6bSnTD)?u~A{Tkh6@P!kZ=P za=Su0rT*i{d+)#bzKgtgHJ_odWywU7kAUvW`gnfH@7VXt{wnUf!8^1O+U~;v4HaTW zWB-jcu|U5i!4lS}a|Ea{l)im43U~Tp&lP^{8fq+!KfTEa)QL)`JKQ~>yx%@y2_@lF7VRnC%g*?;TdTqX11ET=NfP5k&ylk*)9|lsHV*hH6%2XWJ0^Ch2Cl0 zju6a##Pc3m#P7QEoX*m~{G(vKq7N31TAG$BlM@NuB#2bich8QSayOwy#e54htDuYm z)?>sX`d0t_&nCn^aM%nozmJIL5;k2#yJYTVJH1g@zTOM#~G@ze6xJU-e1 z!0Bsk2=e9V9iVepFLTdtKEI{kqRjES>NV!t%|L>{zDeDd^V}SFG5kEr{+29Ev1rX2`lW^~(QTLdgm930m|wVy-c4bV zM~T22T!X+rNbCkTG0t=#Nvum6#p(b*Wz6aTcueevXA5joE9jV zUa=6!FX{PP^Lph_>W$V1i+KNOaqfh$St7USYKMNkD)8(KL5%Uv!xytd992weN> zvn6Gp9obj&7^I!|#jC)RyfO3(ha7{k9|->&gD`etc*qwKaxD$VxB zHkNS8(YNsQ{4YK^Ly{c|?9UTS4)f&;+kgKAi@00c{g;BJZmYOtgb}c#PeV`Wc>{!i zbVex9Q#aZM#;50tXi5EDcW0{B(pAySMF$XWq$>n)}uw|JZ(NRV|V0Pgi@(*aCM+R=K(Ts<7hm+;dl8YhhA_cGvI7 z3POT-ZM&)U7Pd45T%Nk$OBGNo)`#F^pieX2>aE^Scdj-9Udyh^I%Q1={tb>|#3?6i zoWY3#d*FCv4)tED`_O@7PaOB9SxdIGPuMfVQy<@|g&Tl4Ee#5SXK zsnyF>Mv@|KQkLSxd!8g!zp0fwWXEQIL1EY?1S6aZ0)42L8*YG10SItVvm1tGG4()@ zQ-}NBufG@<2}j=^{0+*PjowPQDhSCu@V}uj+tcl1^yl{EM++E;HGV-lr>oEI?&Yl+ag_j|q zx$qP!cP`bhCox2C$u){M3^*IHzvK?D$2;68-!m~^5GODR=if9069FKlrJxEeZJSBk zI+YX^b%Bs(lP~U&ZIkv{j3>|J5k0AL^odi*$n7T~^NM_>pcNn9IS2`5MW!jM=} zpQ19fi=yD)0iHlsW=vdIWrZaKBRx#Jt~)Qv1Je%pCr+lbSv3|e$9HO>f%GfbQD?mI4Eh&Y$(CHT8kpYSfy$G>=Yq+S@V zCq54t{pWog=YRj8skl2h7@OFci+lb1B~FZ@tPF%Oia#c(8Mg@N1(jfyB;iQHBBBu_ z^1yG8O2xKPAZXm336H#2Fq|8cm(xxr)QbmRDN$i@;$Vn4{~cF+euo$_gwdgg0tvFq>bcUGtS zWO2E(_S2|qM;84kr*=;&iP(^h{OX*9ngBabJM{fO)c5|R`!C<4=)sLc2CVc1M%u4I zgV5D7;wfGs=yLF@IGxm7HB|qS*OZ*e&*=Nfi8JB9d|~)+Kb?PnBsCiLs#_8$0kb$1 zyg-~R5z!K_+z|*{~h6n3z(JBaS0$(t$1hH8u3S zH{>gti?Ucf*?vKYI&NH{)rcwVGtGgQ3zDrD-F`;MFEj&YG2-^p3QRh_rXdtvW_gD> z^=6wCP26JbwQ`J(nJ?fx=2^BQ=2Ml-cV?W;_KX)i5|lN%rI(u=oH=e5VQ00b8>$HU zXPL^*_PHBW1KH*pgj*}pZuz#fg=5N~W1)PNf7bSL+`oCfyots8c+JwG)!b?i z9m-x>1a8rj`64j#l#CU`;H@)c*k*9Z4P_X&=kZXMP>-#|Q(irlLTlinY0IwBRb|@4 zL<%TM?CwB6C8oIE{~`07)BrRU-7=2V%b}L5a?s>e>@^JI$N3%IV{zMj{J<9dWvmf$ zo8e9XwT9Hj{>$n`F={jQ>#fXV3FJ)GT^Is=9*6T_*?7({zki`Ss}m$Q2JKbT$B+{;w6Ak0%;j9T+_+h_cx*{~`3j z>l{`b0dqDn*Hqgxza13GRIXw^GOm&Qd`@6gJBBD61OmAwKCws@N^tC%iDq;GzTrF# zw~HLY#0wL>`IZkQ92s=1J6>)X+c!~9LgA4^oUCr)c0NN}<&mPwlfk^kQw_qBYI|34 z)jOZU6iuM22163PZf1?WOW0OqOD)%Oy$nPRh722JP-;1Hs*lzby#MXBl0aA-am&C#AR;3?0EtmR>UTcG7-MGb=D z*E&$!#_m42=mv)md7F@!`>+#l<9tdg$e=UUZGNQ$7FPLJvuyZmLDsPOX4t&w)v`i! z+DYqT7(K;lS)0KkO5Qlppm%H3F(=AeTvc=HJo-4=U%cAa>i}Y+t*}1HDdiY*7s)r7 zs`;m|0DCM?I(O_uo+qS6o;xHtLZpvCsa{%X(>?y#9?=u*W<}uRe5PWvKFrm@UqispOW5aZci|mPgB*UtSf{JJT%&lKIjDsGqQC{K*LMXT6uS-I*(0aj>uHCEhHXNnQ(NqJ1 zE)#8y*(%=QypeCZdD^2McH?38YrbMTi}6b(#17v-d911-X;A@U90v~a`DUMhc}f&y zag97&Y~4|%oh>@6zDQ)$(}9$@ZGXMY{eF$ngIclc)@MwR_S>Vc5^mm#Pie1bFoaHK z8We1#ZK#$GLy~{p3;`w?ey~hjd7XiGo@~fh3lyF3>XKpDqvb8pj`eU|3;tId^^a~y z-156D%cnt!8{z+c6Zmg!l(>tFql=iev7Mu(sH200wdKDTvK$R*&m|3vcMR%O`(%{t z25A@t*{CAOZRXYx=LPp!ervX>~M-b-_H zcV3IfYr~o=upjw*e0M$jc%|P#b-Mvyod|Zzm_tO+9QV+%=ouUu+e;2S;BJIG!#wjE zpBO^tZp6_H4{G7aLlrR4w2oTF3x`FD>!FjbewrFLw9g#~M_z8wt*UduCFas}Vb;-1 z!XYu@DNMN5sMMbD^g8_|pmpW+Kq$p@OBv2oZg>ki+9ESl$v?y-fI-IQo4Ze)q{^#0 z8yy86rNb#Ori#tpg*fqfuH3ttBn8sn)R3pLO@zJn%R)Z*q}&bTmt-!q{g^gJ)1jaHA54${B&Iv?KwRd zy5!Eq)zMhxxypvLeqV4IUYUHUyoMXCWaPqXvs$MITHd&NtzYgo(acWhv&@yikvr$G zN3rIIHUKf@a7z{!6;PSX@DHZrt`K{Rtnd|c=R1k^9zT+}k2uT(cj6l(GLr`R=lsWk zOW9+(h}}APS1DKdw0|j;zu{A{^RTOgh*#RF5`);_rTc7F*Ont$gfNd0?v_t()qGXG zwx_0gmHmV=(oU83RVpV3^Bh-mFSIuZP1XIUBrfc$Nel_CWZ@U|;>P+0kN1$6S8wqk{u`~<%3fjlg zGl50zh5O7qtIW};h+hGf`zR8a*-ykw42ZbV)?A@=Y+f{~8*ESID1?YvTq38{b7OWR zjk1HP%+4z_$(&*fI!%!o_xT`}Wiqe;D#1K$S9*nr;s<5Qq1szh5V)y#;SGatibqO?E~yCVyxE- z9^yoy@2{Us=)$gIdEdx9ieVe5)MyKnapgbVmsDN%j$=#pIXPSOkVEO&X`dwD zNHuM~cc?6lv(sPn=Rp3J+iWpTM4|N}AkQdDB1RGA-CZ#hTG(ovFIBW7Ese7)&=+hE zMS8+tuN2#QgQco2kxQ9lH4aIdM%w(exUiVETbfQf`1X#eLBH{ z2%fYBchP0u+20GkXN3&1Vt(Q**h9eA0jJY|$sW-i5I~ zh^mq*Ns+3^EI_J@uQnuFaWSHK!E{;aJ~}Qb4SjJ6No7xbKvK&tJj3f@jXawwgq6|D z<<@mtwtW-9HlOH>!C1bn|6srbxJKg$reRk;wn8{z|wQTiSnSOG_A=ekxPm z6jF{3=H8}`_9p+qEtBm(JyR%SAHIzIG)KZpenP?+Ef|wvz09TI!ubisCS;H%%nKLp z{Hc1L6A!hMZHt_VRtI0NMR6_TR78SC3*|ez+IVlXGCpQ5;_?jpAhh~Lu)bY(ja%*; zO(KOdu%vqcK!xM++Q~8!vIqvfD(D7AAxaXO?uQYjN(tDKEO)EX3l{2sl)lpI^rQ(} z+hmdU6xs$E=aZ$Zho7k%w|cP`=M+Rfc(>2QG|$z{xHVJbBk<3)poR6;YT~+_$-p+D z{gDuzUs&ps$+z=TDhpCniiUhoGv?d9~-T4;)xrk}CFSdYu2=psaL_$kN% z1)N)x#|WjjxX6Fcek2&@adu$4V0tlCy$-gya}obKXI8|tpA@&G@XQLYHsRDrHj=pMrmBXz|y2JQ_O~$C$_#MB?2nBJ*I8LPNIC~aiF7<0WoQd^5+T&w;NUb%{Voa)fi961K4(_^F?UnJvb=S ziQja!36`9c0fe0KczPv9MKwmY!;Nfh%<{^e3c+S*zj7c0Ue}8eJ)N7NJe}zS%K)if zu}L*K)J|g@m>b(AABQ}b%0&4pIb!_*XtM(ly#Jb&t^lYxm;Z!#)hEP-|34wF>h9#^ z=<*-q2{p;K|Hx1V8kVKmmFSMafo5?KPTX-hZwgG&+-le=qGij#^WwLBv`ZOkvy1!t zf|%sMBZ&LsL{n$0N6zzVcmhI}&_#K-ZDtt#xch{)j);z6a5M<2V*@tY^ZwpuMXmaf4 zrr}hH^zAE_mA6Cgp#JXf4}Wh1o>CtCw+2xZixs z{89P%c#PpYK)qJ*vTj-F^NI*^UE=nUJFBOafO18w$gf7kR%UyUEfrR+fsjPx@Ye6;e2(-42J__5rKcnyD51k6EKNzlPhV$P%M6^$`nON)vd={F#Hf;{(TrCM9=* zE|ZQHFJk4AO;AmK;?9<|a|j;(hA?6?yvWw1M3FL_AjJZ=6TPPitt;V#jveNNo<`<{ zkXAG%`s0dwq`p)~$beJqWsOHBfPE`>Ivzu9V@x1v5&sUUT#yokRf|C7*iyo9rm%PobJ z&Dc7-z*2|vdE~_;V@tfn4uu+EudW8Fv^fiU$RPC;_QZ*8JEC-~S`p_NufkkwOrxEB zm$d)3wt60GH@c_Qz{R7W;kj&Qplbh(a?K2U6VfxX@~|M1w#nfgc-`w z)q#En*FGXXG2eJra4$cHp{)Z+`85c=51={FKfz30h}SIDe>=?# z;!Rh(1_&rSp@HB8Ml9h3#>^l+G5rFWF#SU7F#UoZabxXGrU7=o-Kz-HoW>_YOZ04= zxNmzozvZIJ$h#V*gmX%G2SenKQVnWP7BOaOm@x;61-23#yob7AZ8TTpfALXsy(}sk z&>B-{RCN(eIMs*B!81;hDd<=-OzqL#2YiQb;U-P7{?ImGFS_w=acF0;znRo$@dsP5 zajWyq>K#gUyW`y{;`+Nx;6}g3KzF--$$QU-2?GEKcaGZ#8|~6H1rkd8-hC}kP#kRtU}UE*7Ra?Q-lWpoLeTjW&61rxtR8?ITv`T(-$w7Bs4EU zk))TG2o-Z|=B!Vd;ZVV<27|cxb@ST`bnz%!aIA-Mh}C6}Saw=OXDreS*v&LV{q(it z$x}+X0zvUdO*1$@MIR#Ij!a&yk2;3b>`Mo_MukeVrq%r{(gNO~v6*yccRlgA3igdg z82(9j7_%<-Uljf@e3-Y;YpD}#n(rijAh1pe5r_h@;=mKdlPLt`5WMi15GY%cZJ}(A zpEH(`d}ju{TV!*cBMzDny4Dv7*=olEJeQ_hqIYn)itH3AR;lX&bD(E62wpxxe|i?; zzzJ@O6Twgz4|J;6dZ=I=637SD+%TyFt^ziNbvabBvT^7GiZQo{56F;l)rJAmd^eBUsR5I zUj2lyPYUAqS=#ykhh^RMU-@;;zs)4z@Qcb~PpV)*cF^YM+oNiTla>xcRt-}j;*fSL zdX9Ox@rqisslTW6(%cLX@5QkMboDq@RlL;SUihWm&SZ15ei|D-!1e&Gi}g;_F&LK; zLoRsq?bwKqjAo374Am^fttE;3u0Syk&*69m8%5^mloB-G7$5O;QG=TaR)f`Vk8$k@ z3*8rTKz3YaguYdo?DkFr<9b;cSk*gk6c{*udf&kcJksO^OhTSQTD224kyGBf=!N5w z!`|9UJcAll60J)zOdJ*+%$U6bD@wp&qj@b~QOU29e(wdPTqd}V+Bjlj-WoMJB4jUB zFG|c1y^aGC3LIbr(LDmz{Y}Yhpz%?4V3j%!V+)j4VTAXXzA}wCLrM2TWa`T?D?&iE zblYgZ48keIPv+Y76jWc<9vrRjb6MHOm-eEejo)M{X(6P|u4qcE(N*Y8?jJUCyBvPS zXH~*@#+olTO}qi6;t?e55XkLK5zjaX_?oZBsqF36|KWqs{qW{PXwtO4I@De_b9!NJ z>fSZ!VSs>x7cJ~Mz>VNI1UAwRp#x9PN186htol5Xttw-@QV^1UvCQS&Z3$v z6bHe~5Hv=g8@=PNW53}3kT<3Ca4<@i=t}v4P@7Z|6%pZagA|AuPdM{^0yD(TudK%oGGzsyu@9OaK!Jl^}i%=sdULh9>%BAoLR z;k^H2g#Q!0&QY^hT@peGsAYsrZni?j5C?<0h(Zx36kJ{iq}$9u;tC#mv~_7MBR$ot zRsTo{P##5o|MEQ)&)Uf- z3hmmrbqXoNs^z|mU3q-NjNx|Oz7N+`5^}9RkI>BMGq~oVDLWTXpq8I2dkIxTIHDWo zhEn_BT#4}9Uq?I8BBh5TGXnjnk14f=B;wn3)|FeH3gp;1U5}uL!WP***(T6M`~LT(ijSNnW@!Q54JVPzisJtXBeX58LTrjZ1PByyJv@D zWRf&Mw6yx$Ktx*<=*EB{KgB)eCVRptIhDJdheJ04isDK79`C&;m#wW_ZQ~9?!Z}ue z%)A--)P4N+qdo8VZJd4VBpV_2VbsX(8t8hO{3E= zUg<{l6uQIGz4Zn}vRUJ*+9h^q8Acb@oCDngHK3gVqHl@^9Fe2Tj{nTI<%|+& z{>ipk|EHk+cb;9MVf(ot5GNoOmI3w*3I$VGJc@$^r9xaczZEUG7+Oh)=1zn&OH>Q7 zt9|3g!)LnU>(7U;&BRp~!x=nF0k@*xRmM*5xbY)l3PgA_HeCPgFwJ?-J%j2Dze8N3 z^dc954dF=)t%uxV;=r2{C{_rfW2UQ}Es-vRa9eyiNP=Lhe!Bi<{hW6QGbSk+SdOp# zflvguL~6#29ux|1tS811t-X%vlzh~|{B2+*ereBo9Nvojxr2M`9`Y{4UY0YJ-Gy8F zpsX!H`ph#&V8VpWGs)SA)g&eC8qmUh=h=`~#k{Gd$ zD?`nMb1T7SyPi?**pRgnW&QECP&U|(VqI!Cxzg{s-ZxVDK}*`nzHDTlME6+>Td3_+G%QBXg}k* zq@5b)$q-l@pH3_QUy|3v%Vl6;(<>b#*d}gyR}e1mm7) zfq=PLh#WYua-@%{=y_nESZX<=yOW}_qB)NWDR#jUKf;vdGTTIub(8!YuSC;1MJ%Hq zUrJ{YI(I(PlM%z2C=_LOO_*OTlv#@kF7;Qc~AJ~A?*&n+|yKv1mCmcIyvM9KL z&{{Y){f#L0Iy}i!e#4S>c`XIpy-P+;5^@Ib#B$f)rdI+RbnKx8++@HjTV zY7n|#GYr~_Ft;ip7)wHz|?~(8t`HQLWutc!I?E8oW*5BCQb!5~6 zaLwID-LaN29=E)__?_^X?XcAK@#HpK^=6A^5%m}R#o3`f?*z*$g18@=#noDBr|hTG zE+57=eM+?T3ORe-T-h4iA3J#Q-ecy*rn8ekfweK!4vCe1>6bo))bxmC_L32~@*Ikd zV4Lb83Q11jvF34x`7i$P@3ughxqyz`-{+2^^g}Au9IvP#cH{a^^uh#A% zm;a{g3ayOz{kyXk5K1(X=)H#7AEfqAGZG$;W`M*O zu=jzN_r3#@!W>@Itj7q&s<5{%UQCrS4Se~LWtO#_xQ%~Rgp4YF0|qi({($@%S;QI( zLgoT7y^9_^UC2uX7ng9o$N!wUiFzSbdBFzrUF1Igi_ zr&o)zmJV`7S+jQ+h|Px5vY;Oe^F?z4bfa!9aJHDs)OJ*cwu}e6iyn3mL1+gp z?bQQHk${qT81jf@ykekt;CQ!nhJ%IIPSPyx()gw|7=U`-j>}q*nsF{>V>TVMUb1w7 z4oq>eW5sOwc@pke(&(a;uklUAYuFPiH$!T|YBOQcn6KVS7E-?QzgF> zG+!-bwX7f=Xpde>S@u^?gvXgY;YeXAB!{iB320jRF)|aM2CyzZYPO$9DbA6V!%Iy_ zRhR}WP8x#wZ#NdRX0q#Ps<3D*5bm-zEwC7fCqtYK&_%YoD|8}6{;<$p0$#abHq`vs zC^pu)i6)Op?oWulmsc4zP?0kMX516v(jZqdFGH$;hvjK#=i3NS*S95Oljp?=+;vF> zi^RBWxbZK^)QQ{7k<*0=C8IjT(+SufAhPBrbbp%Sg4L{~nx1g5hCm)v4)AwweBfN! zchllay13a@N-U8sHOk2->+0G`EVtsX)h2=0(HFeZxUA~5Y=XIcJ5Z(xCS7ySsg}ow z?JZWFR5^sL3|p*xORYiRj2m?Jk{|}JQ^a5Lo7LKEjlI>!j5TWw#9!UqKtF)dNa*l* zwI}0bWdn=GK*E&BgourN35Z?J3q+=UzNs+}oVB8?&I9C`5jdOa+k}t&(T9}g8t zdS6uwNeFA5v+eF?A^s@m>SdKJUL^jCip!0Y?6vU(YlH8YZ8?PKzf;AUfGM%L@(kl< z1z@56w(>NI)8mIJu)O@O*~#ASqU&*|OQzggl4~3eeD*HdRQ`$zvh*Vl=$;5u>ezzq zQGVdZaCJ(*3y#NSwv8ZprhaDM5L6;*aERmUOuD(2%Jvg_OCBRWj7s{heMV?cU}k+L zr+}gkEzT(edt(tnN`ceoeYF!#75E%f=`d9cD(8e}!yR(rz309`Fc1#KPhvS0=XR7# zoW?1fWNEBDBv~N4u$jL`V3nvU@{v{Xzg4rV)T$2kAPP3=#(q6BO=_3_ob^R%gJ=jQ zXoJj3y8)N%A^Cyi=8RQIh@DbKTQj>^uD9|GQF%qu9GTg*zUUp+r*35%F7E~@^T*r>k+Od0M;`cV63~__&h0In zdEhs7mu5lUm4l7e$f{w3edRBK=3I5QL~(3Hi6>i~5f3875FOD+o0<=&lN za&$)6-KXefGGz}z_o6gn$5{T{dRFHHY!H~{>%>^UJkmqaptmnj^++XT{SkM2XUHv~+^M5o17?K$L zJq$<;!IPo}nc>Q)sbhG7I5)5`2{2NS!VAL)T{A3=)77j^;nLHuZ-285v0$A%jP%J-Z|Z=Fsgr1TW(@MytLsN(@2%W#fw6H??dYy0k_Z9A zUe?hQB@2=mhhwmjqT2-=HDLrs=>Be~CZ$wrveGH-VrxH<{?%<=d|vz`9ovd6+sr~- zCzscTmpsobv=Y`bHAiY9L~Mq3KXL8Y<1O2>pj-h%y7AKjT znUO}-y@aXRab>9$K|^6ZTA zf`3JCq&CbU>f?dOZ5z`(vKUkp9qaN^+;fsn{Ox5(+Cq2t%SmbM>yy%$NXkFoxHRyNe83~!l0ULxyZj@}`6 zBVlggdm`Q#^tRP(Ojz}!V0#1QsJ-pNVZ}KetjBsAl}@vpZD3{bodgH3m#y!Z2fyEL z-^Hx}x3Dkv`jS9xtt^AN*2H>As4h$HnPftA3TI^m)5O!C_8bE3sHtYlO{^>`*G-is z8ddrZ|h&dWl6`>Nc(4;``(gn>(xo~L9O+Q}9+MB5{bi&q9l z9o68dP(H175`jHD$tAi?A`(G{yr#M`Bkg?pI^Cx9^rgRuBLM_^aV2kmd$5j)w@L*~ ze;wke5dI|I`g>1^@|(Wj^6Rb%0o2%^6NvCD|0XLVNa*uJ)j8b!sL{P_!?=EK;WL!6 zRjXeRA%%kZ=K_P;$#tfZcLE6Rv*SI6dwa@ogh1$9Q!l=&}@3xaFvP8n<{lf8v zNx`v@Ah#N%dDsV^FrcV`&F-gw1{_(grA-;B-ja5Y`wQ=)Mflu+nie+YcT!? z2}krT7{HxAL{RmSY?uZ@V1#8fQn^%1s2c77@ZxV$#O6CucL{ap6wNFIuYN9ZwENGp z5T=c?=*H)C)*j0LeG%@zdJ_NRUGVRWK1b_S6@QHIgJ5u5I@^>1-xPn0f6d_wSfc5e zH_mUhANA_+`(&8dj|D_!;ykZzl9vixcL~k%F9F3@$<5aIOF$0kB_NN`#c+;*1z!^J zOS-~GhTO~30vr)? zHvw<%5Qlmc9`B_!r< ze1w8oI7!$1i&uUoWNGpis<5!T*z?m931U>D2xtK$`7w$J)Jqf79eRFTS>-`ePX%*1 z1O)QG5=GH+?>o>z5pEo5IqmV|3zJ4RY@$knX!FZ;S)INTLitU$dP1Q56zZ~bnNup+ zG})x-*~%nn5KueQCc3J1*7|$n0^{%4A3Ka4^Kso3wgt}6Vq-t`?9r2Ikq8MRZ1Um?^gGJe&8+PvtHKd+A>5D{~Oxj+Im0Y zGZ&AQcC&j(5mk~Gn=RGJXh-;9AD_Xi*3Nei6Zr=FjiSz%%;Kjd<610VKILNM)^sA; zY)r%QT+hYFSwJ5DBd-$y!-eN=SLav_~VWTj|*%WBXes zo(T@0^qZU$`9A5DrE;^!Y=_?prx@QyHV_qM846!?aJ=T#Z1>TVzh`NrnY#IG z4D3wA9dY!UhiV^NY1CbgH$tr_5khl1TV&_-eKaps&)K*d@1-`@NggT%`L6hMiQqHd z840jUlX-#=(a=QtJ{8fpGZ4dcVjI8twye8X>eZ!m^Cq!mxbc)~OoGueW5(01yP{t$ zY^QaGi&|tdV>j;i;H@Ia%bs_ZSbDKJ>K3~;Q*2tHGrJ&!P;)dhlZxT7s0s3~`OyqS zIjVBB&>&!T$HRVwt`4TjB zgIQm;`5`W96k3VEU1EXq`jBsN!)0+9?=opI(ZhR>-$;Ii)9cO4;zD;Gk?qP-XHBc+ zA6X)w8cc7$U>aB%kSR{!W{Iuy0ebRSozi^!wJh!tq)C>pUOibvx=Sw3bMCq(>P}Va zMP_}c4tKpw+kq23sp&>kcSA^gD`MiOj%~-Vg~WGD_qfxkKD{c=tix+<_br|6OHoM` zuci1vwH@J@2g0Z8<9BB=|UjV>_XMZmr$$=OuXaPs$?%nH&2CaOneJrT+Rm)U3A|* znvfaD>VOtTMd#Ea6fZa5Fc=Nx^g!no^YFk#3@gJsXGlYjw-Ot6U6SUI+b{;Y?dvzNiAV>^h@ghisD-Qx%6 z34GEc?}z|P!CoMD;poL$KV2dX5&E|72v0X_TP;f$7r^uQ&&66Mm%L9IQSNBp_v-PO zxvNh=Nk^F_UNDqZYIHqV?b1C;awXg3)VyP8&9o$!Qwu&XSw15}&$VP=!JADeqys{bC;}Wc!z*kjls?c$ zj*_Pry|Sc7EqdTuo^6yU+O#uVDRD@T7^NZc^eZ`eAxA{5FWQ9VZkT$aL|O7Fh)~?M zS2_4RLAK?6HrzpG(vNZ&NXzhbu2hJReaMfjh@`K&J?tSZ3fCkwBx4ZQhA^0Rb$GaB zX=Jik=J7SPOX**E>Qi%G{2h&P?Lz_Ur_SCV>*7$7+b|i}O8i7T$NQeKYePi3hN!~pLOPU$|}m%IM7x!L-3K zC2A1kHci?yHI54;giiJkB=f^=yjo5bUX^h+?OEE$y@Vx6-QV|uk_^A24`*#fY$Dx* zq{~=)wl(ryQ~Dz%rqr6T)A_mz*JDe$B~lWcIiseN3ZErb54o!lo>kA<>EcS_R{69o zM}tN$FJ$J9NY{1VtqY#7@gnhR7s9t+IH{c6 zY0NBS8T9Z*t+ka!-G0SeT(7m_+?19X62;!^0avCouxPPQMY$Na5KC~BuZoR_OzRpU z`a5!RSi8lnT86liL|We2!1Zg(V&cz@^rwzptdkRSwkxH)bi2)>S)<6;w1vmVsL4^v zyv3IRF{(w1K>N@wbTFqdDljaJ%i!y@Y<&x$=v`u#?O8gP&#}5&VVaL z#_Tr|YLA;y0vJ8$7MH=G>>ZDap(1e zA1Bu|;-G#74%4e$#U++c$SaZA^S*IrDS|^3zJn_kzp>sF=kwR^P;0m%xilYhlhr}f zJAbaI#zICUN~SQ1*F~4hke*&d$TTm)OMmS~3stHQx<*(cE_ZF7jo>MVdU?2o2HB!P zct`t0xJ!QS|Je{|8hrQ^6o(k7*d>h9uF4RV_Qt%sYLO zcYGNL6e@!$CSK*4Wf3lbrv%CdE1T$fs%cuh@Jy=>l8ss`uz4O-0I|;sqp@0bqMAi( z#qNmo_z|;h-Ej!;q3nDY+govL{-Wv+r8w0Rl{pl&1Dj-=A_^z=OB24|b^MC3tq6+R zFd@>E*BJ#p<+(d#$tMb>QrrzMe~uv{N@pFN9qV79aL7>B!Wz&!|M)BZ8)Z8+zRqmz z%qP5NViB+DV^!Pj^aNZ8k2zE->AuJ^h;VpvvFJ^^R1-?jKHR*K`}JV1+ zb=nTdkY?Ozve#QHCb#AyU0h*wUTu+|AQOHtFpTOjYXZ zV~NRw(GSj?Eqo^UnRk_%m!w-k8{rRKV48H3+ALHI4YYi&JeiDyMTR1WNkTup5tYUs zYCb`F1gilsf=)6I6j8*xm#dXqdQa`(dZ3Q@C53svFcp?TR9HQ{t9BUETr z=JU!Eo@d!@@6TvF)78bLmJJ|dOHVS6fKZ=wo9g)db?GUPA$)-~x8OgNh?3rgP;x|bgmm?muF6)KP| zgG_SB?sOK)Sq~=0p`LA=R$cOpXjge;RCuNm_6V(>wZ7eC=)t9cEZxNOmb&k5fnUnx z_KkFdl_M%dJd?4uF@jA_H{b3%QTNt|-)q90AE2o9tn$ajkS+4j$5R4=(VW=tdIp1?S`C|5YjrYosL|vaYcEjUl z22B1mdDl>16S+yuh^y?%2RBbeCV$6WfoiC7#;ak)a&^Yk1?hFXC)QlES&hV&GH^;n zQg1B^7oB_A#6!4f8_t7k!M2!;6j--;Im&HdKogrFID(j%sg|!@Czt@HIjGy!_-6G% zviDG3iJIgo-g3=!VdGpd(QP0R2OEd-7!ej00Rh%tDkSg_8VguK_4@{RqyD*(W6kd+ zEnsOW8$$UmXsZC`TL+sx_Q&~32kfwCLPNQ?=bu|nAQ$lIuVz|M?F%Z(28R4vD*Fj{ z@3S5d2L99j-1daMfX{%j%~1_b{M;XFuR+ou4eZ=(ZJpf^RtS#+ZNa`dnC|YiZTVYU zTQ4BX=m23aP7qd`z-1s%=D^g8?JspKten8De<1wsq_e-M(f$M4Lu%Ym{T2?S(gy-@ z-!q8*x#a{30)IWs+DF0C+R@Gp;puF16xY6kprjeNfDM7Lp8W|0e&z(?07{2(f4_1S zJl%i#{eXK)*PJ?A4-l{ajYt5zm_Cvy^v7fqOpN15*dYbN>Hjz4ap2X+kwoFci5YsV zWaK~}bAj)32aej9>|clq2n5{L(%Hlfm>&N$`vrHHdg$fpX#jf}zzZC}R{;;~j_mN> zxl*)*!>xd`cX;0`R!@-e1DBJI92OSK0XUlCX!zkga80$J$echEzN2}d3TxmffXjJd zz@k7<4vWGe#l65#aIqW=louF(4uk$f=^QW^Tm}XME*3o;yst9F;gJQGx4(? z!vWZ$?I$QFu>L5_p@wZ>HrPB0!}d2kqKgOF2dt#P3Sie9jKYk`FDrmObig8D^BIf? zzUi-u9DZGc9U(B}cGwZ*efi1z{UN~p2Io6t=o;3)M*q2Z>mRb8!GhrIQ;Z=0)&EcM zz+!o@95{gxBR6>M|B^fWB!LrJFftX+|4rs^=`G+R0%sOrq#n5bSE(aI2VM=15mNK` zk3xqB4ZMU9Bj9oU*93lTK_NJT;H54YU8R8krhC-F7qBY$EhzdVWs9|iap93wLmdxXppH{`k+c)*Pd78WP)wE@hqd*k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Turbo Editor/src/main/LICENSE b/Turbo Editor/src/main/LICENSE new file mode 100644 index 0000000..e9d3223 --- /dev/null +++ b/Turbo Editor/src/main/LICENSE @@ -0,0 +1,621 @@ +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 \ No newline at end of file diff --git a/Turbo Editor/src/main/README.md b/Turbo Editor/src/main/README.md new file mode 100644 index 0000000..47ddbc5 --- /dev/null +++ b/Turbo Editor/src/main/README.md @@ -0,0 +1,4 @@ +turboeditor +=========== + +simple and beatiful android file editor diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/DialogStandardFragment.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/DialogStandardFragment.java new file mode 100644 index 0000000..f2a5394 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/DialogStandardFragment.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2013 Gabriele Mariotti. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +package com.vmihalachi.turboeditor; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.LayoutInflater; + +import it.gmariotti.changelibs.library.view.ChangeLogListView; + +/** + * Example with Dialog + * + * @author Gabriele Mariotti (gabri.mariotti@gmail.com) + */ +public class DialogStandardFragment extends DialogFragment { + + public DialogStandardFragment() { + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + + LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + ChangeLogListView chgList = (ChangeLogListView) layoutInflater.inflate(R.layout.demo_changelog_fragment_dialogstandard, null); + + return new AlertDialog.Builder(getActivity()) + .setTitle(R.string.aboutactivity_changelog) + .setView(chgList) + .setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + } + } + ) + .setPositiveButton(R.string.vota, new DialogInterface.OnClickListener() { + @Override + public void onClick(final DialogInterface dialog, final int which) { + try { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + getActivity().getPackageName()))); + } catch (Exception e) { + } + } + }) + .create(); + + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/EditTextDialog.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/EditTextDialog.java new file mode 100644 index 0000000..181a548 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/EditTextDialog.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor; + +import android.app.Dialog; +import android.app.DialogFragment; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +// ... +public class EditTextDialog extends DialogFragment implements TextView.OnEditorActionListener { + + private EditText mEditText; + + public static EditTextDialog newInstance(final String hint) { + final EditTextDialog f = new EditTextDialog(); + + // Supply num input as an argument. + final Bundle args = new Bundle(); + args.putString("hint", hint); + f.setArguments(args); + return f; + } + + @Override + public View onCreateView(final LayoutInflater inflater, final ViewGroup container, + final Bundle savedInstanceState) { + + final Dialog dialog = getDialog(); + final String title = getString(R.string.codifica); + dialog.setTitle(title); + + final View view = inflater.inflate(R.layout.dialog_fragment_edittext, container); + this.mEditText = (EditText) view.findViewById(android.R.id.edit); + + // Show soft keyboard automatically + this.mEditText.setText(getArguments().getString("hint")); + this.mEditText.requestFocus(); + dialog.getWindow().setSoftInputMode( + WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + this.mEditText.setOnEditorActionListener(this); + + final Button button = (Button) view.findViewById(android.R.id.button1); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View v) { + returnData(); + } + }); + + return view; + } + + void returnData() { + EditDialogListener target = (EditDialogListener) getTargetFragment(); + if (target == null) { + target = (EditDialogListener) getActivity(); + } + target.onFinishEditDialog(this.mEditText.getText().toString(), + (Actions) getArguments().getSerializable("action"), getArguments().getString("hint")); + this.dismiss(); + } + + @Override + public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event) { + if (EditorInfo.IME_ACTION_DONE == actionId) { + returnData(); + return true; + } + return false; + } + + public enum Actions { + NewRemoteFolder, NewRemoteFile, NewLocalFolder, Rename, Move, EditEncoding + } + + public interface EditDialogListener { + void onFinishEditDialog(String inputText, Actions action, String hint); + } +} + + diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/EditorFragment.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/EditorFragment.java new file mode 100644 index 0000000..c3559dd --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/EditorFragment.java @@ -0,0 +1,980 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor; + +import android.app.Fragment; +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Canvas; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.InputFilter; +import android.text.Selection; +import android.text.Spannable; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.TextWatcher; +import android.text.style.ForegroundColorSpan; +import android.text.style.UnderlineSpan; +import android.util.AttributeSet; +import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.Toast; + +import com.vmihalachi.turboeditor.event.ErrorOpeningFileEvent; +import com.vmihalachi.turboeditor.event.FileSavedEvent; +import com.vmihalachi.turboeditor.helper.PixelDipConverter; +import com.vmihalachi.turboeditor.helper.PreferenceHelper; +import com.vmihalachi.turboeditor.util.Patterns; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.LinkedList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import de.greenrobot.event.EventBus; + +public class EditorFragment extends Fragment implements EditTextDialog.EditDialogListener{ + + private static final String TAG = "A0A"; + private Editor mEditor; + + // Editor Variables + static boolean sWrapText; + static boolean sColorSyntax; + // + private String mCurrentEncoding; + private static String sFilePath; + + + public static EditorFragment newInstance(String filePath) { + EditorFragment frag = new EditorFragment(); + Bundle args = new Bundle(); + args.putString("filePath", filePath); + frag.setArguments(args); + return frag; + } + + /** + * {@inheritDoc} + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + } + + /** + * {@inheritDoc} + */ + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + // Out custom layout + View rootView = inflater.inflate(R.layout.fragment_editor, container, false); + // + mEditor = (Editor) rootView.findViewById(R.id.editor); + return rootView; + } + + /** + * {@inheritDoc} + */ + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + // + this.sFilePath = getArguments().getString("filePath"); + this.mCurrentEncoding = PreferenceHelper.getEncoding(getActivity()); + this.sColorSyntax = PreferenceHelper.getSyntaxHiglight(getActivity()); + this.sWrapText = PreferenceHelper.getWrapText(getActivity()); + String fileName = FilenameUtils.getName(getArguments().getString("filePath")); + // + getActivity().getActionBar().setTitle(fileName); + // + configureEditText(); + // + try { + final FileInputStream inputStream = + new FileInputStream( + new File(this.sFilePath)); + mEditor.setText(IOUtils.toString(inputStream, this.mCurrentEncoding)); + inputStream.close(); + } catch (Exception e) { + Log.e(TAG, e.getMessage(), e); + Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG).show(); + EventBus.getDefault().post(new ErrorOpeningFileEvent()); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.fragment_editor, menu); + menu.findItem(R.id.im_wrap_text).setChecked(this.sWrapText); + menu.findItem(R.id.im_syntax_highlight).setChecked(this.sColorSyntax); + super.onCreateOptionsMenu(menu, inflater); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int i = item.getItemId(); + if (i == R.id.im_save) { + new SaveFile().execute(); + } else if (i == R.id.im_undo) { + this.mEditor.onKeyShortcut(KeyEvent.KEYCODE_Z, new KeyEvent(KeyEvent.ACTION_DOWN, + KeyEvent.KEYCODE_Z)); + } else if (i == R.id.im_redo) { + this.mEditor.onKeyShortcut(KeyEvent.KEYCODE_Y, new KeyEvent(KeyEvent.ACTION_DOWN, + KeyEvent.KEYCODE_Y)); + } else if (i == R.id.im_editor_encoding) { + showEncodingDialog(); + } else if (i == R.id.im_syntax_highlight) { + item.setChecked(!item.isChecked()); + PreferenceHelper.setSyntaxHiglight(getActivity(), item.isChecked()); + updateTextEditor(); + } else if (i == R.id.im_wrap_text) { + item.setChecked(!item.isChecked()); + PreferenceHelper.setWrapText(getActivity(), item.isChecked()); + updateTextEditor(); + } + return super.onOptionsItemSelected(item); + } + + private void showEncodingDialog() { + EditTextDialog dialogFrag = EditTextDialog.newInstance(this.mCurrentEncoding); + dialogFrag.setTargetFragment(this, 0); + dialogFrag.show(getFragmentManager().beginTransaction(), "encodingDialog"); + } + + /** + * {@inheritDoc} + */ + @Override + public void onFinishEditDialog(final String inputText, final EditTextDialog.Actions action, final String hint) { + PreferenceHelper.setEncoding(getActivity(), inputText); + updateTextEditor(); + } + + private void updateTextEditor() { + final boolean countLines = PreferenceHelper.getWrapText(getActivity()); + final boolean syntaxHighlight = PreferenceHelper.getSyntaxHiglight(getActivity()); + final String encoding = PreferenceHelper.getEncoding(getActivity()); + + if (this.sWrapText != countLines) { + this.sWrapText = countLines; + final String s = this.mEditor.getText().toString(); + //inflateOfWrapText(); + this.mEditor.setText(s); + configureEditText(); + } + + if (this.sColorSyntax != syntaxHighlight) { + this.sColorSyntax = syntaxHighlight; + final String s = this.mEditor.getText().toString(); + //inflateOfWrapText(); + this.mEditor.setText(s); + } + + if (!this.mCurrentEncoding.equals(encoding)) { + try { + final byte[] oldText = this.mEditor.getText().toString().getBytes(this.mCurrentEncoding); + this.mEditor.setText(new String(oldText, encoding)); + this.mCurrentEncoding = encoding; + } catch (UnsupportedEncodingException ignored) { + } + } + } + + private void configureEditText(){ + this.mEditor.setHorizontallyScrolling(!this.sWrapText); + if (!this.sWrapText) { + int paddingLeft = (int) PixelDipConverter.convertDpToPixel(25, getActivity()); + mEditor.setPadding(paddingLeft, 0, 0, 0); + } else { + int paddingLeft = (int) PixelDipConverter.convertDpToPixel(5, getActivity()); + mEditor.setPadding(paddingLeft, 0, 0, 0); + } + } + + class SaveFile extends AsyncTask { + + @Override + protected Void doInBackground(final Void... voids) { + try { + FileUtils.write(new File(EditorFragment.this.sFilePath), + EditorFragment.this.mEditor.getText(), + EditorFragment.this.mCurrentEncoding); + } catch (IOException e) { + Log.e(TAG, e.getMessage(), e); + } + return null; + } + + @Override + protected void onPostExecute(final Void aVoid) { + super.onPostExecute(aVoid); + EventBus.getDefault().post(new FileSavedEvent(EditorFragment.this.sFilePath)); + } + } + + + + public static class Editor extends EditText { + + protected static final int + ID_SELECT_ALL =android. R.id.selectAll, + ID_CUT = android.R.id.cut, + ID_COPY = android.R.id.copy, + ID_PASTE = android.R.id.paste, + ID_UNDO = R.id.im_undo, + ID_REDO = R.id.im_redo; + private static final int SYNTAX_DELAY_MILLIS = + 0; + private static final float textSize = 16; + private final Handler updateHandler = + new Handler(); + private final TextPaint mPaintNumbers = + new TextPaint(); + //private final Rect mLineBounds = new Rect(); + private final float mScale; + private boolean modified = true; + + /** + * Is undo/redo being performed? This member + * signals if an undo/redo operation is + * currently being performed. Changes in the + * text during undo/redo are not recorded + * because it would mess up the undo history. + */ + private boolean mIsUndoOrRedo = false; + + /** + * The edit history. + */ + private EditHistory mEditHistory; + + /** + * The change listener. + */ + private EditTextChangeListener + mChangeListener; + + private final Runnable updateRunnable = + new Runnable() { + @Override + public void run() { + replaceTextKeepCursor(getText()); + } + }; + + public Editor(Context context, + AttributeSet attrs) { + super(context, attrs); + this.mScale = context.getResources() + .getDisplayMetrics().density; + init(context); + } + + // Init the class + private void init(final Context context) { + mEditHistory = new EditHistory(); + mChangeListener = + new EditTextChangeListener(); + addTextChangedListener(mChangeListener); + + this.mPaintNumbers + .setColor( + getTextColors().getDefaultColor()); + this.mPaintNumbers + .setTextSize( + textSize * this.mScale * 0.8f); + this.mPaintNumbers.setAntiAlias(true); + + // Syntax editor + setFilters(new InputFilter[]{ + new InputFilter() { + @Override + public CharSequence filter( + CharSequence source, + int start, + int end, + Spanned dest, + int dstart, + int dend) { + if (modified) { + return autoIndent( + source, + start, + end, + dest, + dstart, + dend); + } + + return source; + } + }}); + } + + @Override + public boolean onKeyShortcut( + final int keyCode, final KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_A: + return onTextContextMenuItem( + ID_SELECT_ALL); + case KeyEvent.KEYCODE_X: + return onTextContextMenuItem(ID_CUT); + case KeyEvent.KEYCODE_C: + return onTextContextMenuItem(ID_COPY); + case KeyEvent.KEYCODE_V: + return onTextContextMenuItem(ID_PASTE); + case KeyEvent.KEYCODE_Z: + if (getCanUndo()) { + return onTextContextMenuItem(ID_UNDO); + } + break; + case KeyEvent.KEYCODE_Y: + if (getCanRedo()) { + return onTextContextMenuItem(ID_REDO); + } + break; + } + + return super.onKeyShortcut(keyCode, event); + } + + @Override + public boolean onTextContextMenuItem( + final int id) { + if (id == ID_UNDO) { + undo(); + return true; + } else if (id == ID_REDO) { + redo(); + return true; + } else { + return super.onTextContextMenuItem(id); + } + } + + @Override + public void onDraw(final Canvas canvas) { + if (!EditorFragment.sWrapText) { + final int max = getLineCount(); + final TextPaint paint = mPaintNumbers; + for (int min = 0; min < max; min++) { + canvas.drawText(String.valueOf(min + 1), + 0, + getLineBounds(min, null), + paint); + } + } + super.onDraw(canvas); + } + + private CharSequence autoIndent( + CharSequence source, + int start, + int end, + Spanned dest, + int dstart, + int dend) { + if (end - start != 1 || + start >= source.length() || + source.charAt(start) != '\n' || + dstart >= dest.length()) { + return source; + } + + int istart = dstart; + int iend; + String indent = ""; + + // skip end of line if cursor is at the end of a line + if (dest.charAt(istart) == '\n') { + --istart; + } + + // indent next line if this one isn't terminated + if (istart > -1) { + // skip white space + for (; istart > -1; --istart) { + char c = dest.charAt(istart); + + if (c != ' ' && + c != '\t') { + break; + } + } + + if (istart > -1) { + char c = dest.charAt(istart); + + if (c != ';' && + c != '\n') { + indent = "\t"; + } + } + } + + // find start of previous line + for (; istart > -1; --istart) { + if (dest.charAt(istart) == '\n') { + break; + } + } + + // cursor is in the first line + if (istart < 0) { + return source; + } + + // span over previous indent + for (iend = ++istart; + iend < dend; + ++iend) { + char c = dest.charAt(iend); + + if (c != ' ' && + c != '\t') { + break; + } + } + + // copy white space of previous lines and append new indent + return "\n" + dest.subSequence( + istart, + iend) + indent; + } + + private void cancelUpdate() { + updateHandler.removeCallbacks( + updateRunnable); + } + + private void replaceTextKeepCursor( + Editable e) { + int p = getSelectionStart(); + + replaceText(e); + + if (p > -1) { + setSelection(p); + } + } + + private void replaceText(Editable e) { + disconnect(); + modified = false; + setText(highlight(e)); + modified = true; + addTextChangedListener(mChangeListener); + } + + private CharSequence highlight(Editable editable) { + final String fileExtension = FilenameUtils.getExtension(EditorFragment.sFilePath); + editable.clearSpans(); + + if (editable.length() == 0) { + return editable; + } + + if (fileExtension.contains("html") + || fileExtension.contains("xml")) { + color(Patterns.HTML_OPEN_TAGS, editable); + color(Patterns.HTML_CLOSE_TAGS, editable); + color(Patterns.HTML_ATTRS, editable); + color(Patterns.GENERAL_STRINGS, editable); + color(Patterns.XML_COMMENTS, editable); + } else if (fileExtension.equals("css")) { + //color(CSS_STYLE_NAME, editable); + color(Patterns.CSS_ATTRS, editable); + color(Patterns.CSS_ATTR_VALUE, editable); + color(Patterns.GENERAL_COMMENTS, editable); + } else if (fileExtension.equals("js")) { + color(Patterns.GENERAL_KEYWORDS, editable); + color(Patterns.NUMBERS, editable); + color(Patterns.GENERAL_COMMENTS, editable); + } else { + color(Patterns.GENERAL_KEYWORDS, editable); + color(Patterns.NUMBERS, editable); + color(Patterns.GENERAL_COMMENTS, editable); + } + + return editable; + } + + private void color(Pattern pattern, + Editable editable) { + int color = 0; + if (pattern.equals(Patterns.HTML_OPEN_TAGS) + || pattern.equals(Patterns.HTML_CLOSE_TAGS) + || pattern.equals(Patterns.GENERAL_KEYWORDS) + //|| pattern.equals(CSS_STYLE_NAME) + ) { + color = Patterns.COLOR_KEYWORD; + } else if (pattern.equals(Patterns.HTML_ATTRS) + || pattern.equals(Patterns.CSS_ATTRS)) { + color = Patterns.COLOR_ATTR; + } else if (pattern.equals(Patterns.CSS_ATTR_VALUE)) { + color = Patterns.COLOR_ATTR_VALUE; + } else if (pattern.equals(Patterns.XML_COMMENTS) + || pattern.equals(Patterns.GENERAL_COMMENTS)) { + color = Patterns.COLOR_COMMENT; + } else if (pattern.equals( + Patterns.GENERAL_STRINGS)) { + color = Patterns.COLOR_STRING; + } else if (pattern.equals(Patterns.NUMBERS)) { + color = Patterns.COLOR_NUMBER; + } + + for (final Matcher m = + pattern.matcher(editable); + m.find(); ) { + editable.setSpan( + new ForegroundColorSpan(color), + m.start(), + m.end(), + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + } + + // =================================================================== // + + /** + * Disconnect this undo/redo from the text + * view. + */ + public void disconnect() { + removeTextChangedListener(mChangeListener); + } + + /** + * Set the maximum history size. If size is + * negative, then history size is only limited + * by the device memory. + */ + public void setMaxHistorySize( + int maxHistorySize) { + mEditHistory.setMaxHistorySize( + maxHistorySize); + } + + /** + * Clear history. + */ + public void clearHistory() { + mEditHistory.clear(); + } + + /** + * Can undo be performed? + */ + public boolean getCanUndo() { + return (mEditHistory.mmPosition > 0); + } + + /** + * Perform undo. + */ + public void undo() { + EditItem edit = mEditHistory.getPrevious(); + if (edit == null) { + return; + } + + Editable text = getEditableText(); + int start = edit.mmStart; + int end = start + (edit.mmAfter != null + ? edit.mmAfter.length() : 0); + + mIsUndoOrRedo = true; + text.replace(start, end, edit.mmBefore); + mIsUndoOrRedo = false; + + // This will get rid of underlines inserted when editor tries to come + // up with a suggestion. + for (Object o : text.getSpans(0, + text.length(), UnderlineSpan.class)) { + text.removeSpan(o); + } + + Selection.setSelection(text, + edit.mmBefore == null ? start + : (start + edit.mmBefore.length())); + } + + /** + * Can redo be performed? + */ + public boolean getCanRedo() { + return (mEditHistory.mmPosition + < mEditHistory.mmHistory.size()); + } + + /** + * Perform redo. + */ + public void redo() { + EditItem edit = mEditHistory.getNext(); + if (edit == null) { + return; + } + + Editable text = getEditableText(); + int start = edit.mmStart; + int end = start + (edit.mmBefore != null + ? edit.mmBefore.length() : 0); + + mIsUndoOrRedo = true; + text.replace(start, end, edit.mmAfter); + mIsUndoOrRedo = false; + + // This will get rid of underlines inserted when editor tries to come + // up with a suggestion. + for (Object o : text.getSpans(0, + text.length(), UnderlineSpan.class)) { + text.removeSpan(o); + } + + Selection.setSelection(text, + edit.mmAfter == null ? start + : (start + edit.mmAfter.length())); + } + + /** + * Store preferences. + */ + public void storePersistentState( + SharedPreferences.Editor editor, + String prefix) { + // Store hash code of text in the editor so that we can check if the + // editor contents has changed. + editor.putString(prefix + ".hash", + String.valueOf( + getText().toString().hashCode())); + editor.putInt(prefix + ".maxSize", + mEditHistory.mmMaxHistorySize); + editor.putInt(prefix + ".position", + mEditHistory.mmPosition); + editor.putInt(prefix + ".size", + mEditHistory.mmHistory.size()); + + int i = 0; + for (EditItem ei : mEditHistory.mmHistory) { + String pre = prefix + "." + i; + + editor.putInt(pre + ".start", ei.mmStart); + editor.putString(pre + ".before", + ei.mmBefore.toString()); + editor.putString(pre + ".after", + ei.mmAfter.toString()); + + i++; + } + } + + /** + * Restore preferences. + * + * @param prefix The preference key prefix + * used when state was stored. + * @return did restore succeed? If this is + * false, the undo history will be empty. + */ + public boolean restorePersistentState( + SharedPreferences sp, String prefix) + throws IllegalStateException { + + boolean ok = + doRestorePersistentState(sp, prefix); + if (!ok) { + mEditHistory.clear(); + } + + return ok; + } + + private boolean doRestorePersistentState( + SharedPreferences sp, String prefix) { + + String hash = + sp.getString(prefix + ".hash", null); + if (hash == null) { + // No state to be restored. + return true; + } + + if (Integer.valueOf(hash) + != getText().toString().hashCode()) { + return false; + } + + mEditHistory.clear(); + mEditHistory.mmMaxHistorySize = + sp.getInt(prefix + ".maxSize", -1); + + int count = sp.getInt(prefix + ".size", -1); + if (count == -1) { + return false; + } + + for (int i = 0; i < count; i++) { + String pre = prefix + "." + i; + + int start = sp.getInt(pre + ".start", -1); + String before = + sp.getString(pre + ".before", null); + String after = + sp.getString(pre + ".after", null); + + if (start == -1 + || before == null + || after == null) { + return false; + } + mEditHistory.add( + new EditItem(start, before, after)); + } + + mEditHistory.mmPosition = + sp.getInt(prefix + ".position", -1); + if (mEditHistory.mmPosition == -1) { + return false; + } + + return true; + } + + // =================================================================== // + + /** + * Keeps track of all the edit history of a + * text. + */ + private final class EditHistory { + + /** + * The position from which an EditItem will + * be retrieved when getNext() is called. If + * getPrevious() has not been called, this + * has the same value as mmHistory.size(). + */ + private int mmPosition = 0; + + /** + * Maximum undo history size. + */ + private int mmMaxHistorySize = -1; + + /** + * The list of edits in chronological + * order. + */ + private final LinkedList + mmHistory = new LinkedList(); + + /** + * Clear history. + */ + private void clear() { + mmPosition = 0; + mmHistory.clear(); + } + + /** + * Adds a new edit operation to the history + * at the current position. If executed + * after a call to getPrevious() removes all + * the future history (elements with + * positions >= current history position). + */ + private void add(EditItem item) { + while (mmHistory.size() > mmPosition) { + mmHistory.removeLast(); + } + mmHistory.add(item); + mmPosition++; + + if (mmMaxHistorySize >= 0) { + trimHistory(); + } + } + + /** + * Set the maximum history size. If size is + * negative, then history size is only + * limited by the device memory. + */ + private void setMaxHistorySize( + int maxHistorySize) { + mmMaxHistorySize = maxHistorySize; + if (mmMaxHistorySize >= 0) { + trimHistory(); + } + } + + /** + * Trim history when it exceeds max history + * size. + */ + private void trimHistory() { + while (mmHistory.size() + > mmMaxHistorySize) { + mmHistory.removeFirst(); + mmPosition--; + } + + if (mmPosition < 0) { + mmPosition = 0; + } + } + + /** + * Traverses the history backward by one + * position, returns and item at that + * position. + */ + private EditItem getPrevious() { + if (mmPosition == 0) { + return null; + } + mmPosition--; + return mmHistory.get(mmPosition); + } + + /** + * Traverses the history forward by one + * position, returns and item at that + * position. + */ + private EditItem getNext() { + if (mmPosition >= mmHistory.size()) { + return null; + } + + EditItem item = mmHistory.get(mmPosition); + mmPosition++; + return item; + } + } + + /** + * Represents the changes performed by a + * single edit operation. + */ + private final class EditItem { + private final int mmStart; + private final CharSequence mmBefore; + private final CharSequence mmAfter; + + /** + * Constructs EditItem of a modification + * that was applied at position start and + * replaced CharSequence before with + * CharSequence after. + */ + public EditItem(int start, + CharSequence before, CharSequence after) { + mmStart = start; + mmBefore = before; + mmAfter = after; + } + } + + /** + * Class that listens to changes in the text. + */ + private final class EditTextChangeListener + implements TextWatcher { + + /** + * The text that will be removed by the + * change event. + */ + private CharSequence mBeforeChange; + + /** + * The text that was inserted by the change + * event. + */ + private CharSequence mAfterChange; + + public void beforeTextChanged( + CharSequence s, int start, int count, + int after) { + if (mIsUndoOrRedo) { + return; + } + + mBeforeChange = + s.subSequence(start, start + count); + } + + public void onTextChanged(CharSequence s, + int start, int before, + int count) { + if (mIsUndoOrRedo) { + return; + } + + mAfterChange = + s.subSequence(start, start + count); + mEditHistory.add( + new EditItem(start, mBeforeChange, + mAfterChange)); + } + + public void afterTextChanged(Editable s) { + cancelUpdate(); + + if (!EditorFragment.sColorSyntax || !modified) { + return; + } + + updateHandler.postDelayed( + updateRunnable, + SYNTAX_DELAY_MILLIS); + } + } + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/HomeActivity.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/HomeActivity.java new file mode 100644 index 0000000..dd2e082 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/HomeActivity.java @@ -0,0 +1,341 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor; + +import android.app.ActionBar; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.os.IBinder; +import android.support.v4.app.ActionBarDrawerToggle; +import android.support.v4.widget.DrawerLayout; +import android.text.TextUtils; +import android.util.Log; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +import com.vmihalachi.turboeditor.event.ErrorOpeningFileEvent; +import com.vmihalachi.turboeditor.event.FileSavedEvent; +import com.vmihalachi.turboeditor.event.FileSelectedEvent; +import com.vmihalachi.turboeditor.event.NewFileOpened; + +import de.greenrobot.event.EventBus; + +public class HomeActivity extends Activity { + + private String TAG = "A0A"; + public static final int SELECT_FILE_CODE = 121; + + /* + * This class provides a handy way to tie together the functionality of + * {@link DrawerLayout} and the framework ActionBar to implement the recommended + * design for navigation drawers. + */ + protected ActionBarDrawerToggle mDrawerToggle; + /* + * The Drawer Layout + */ + protected DrawerLayout mDrawerLayout; + + /** + * {@inheritDoc} + */ + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // + checkTaskRoot(); + // + setContentView(R.layout.activity_home); + // + setupDrawerLayout(); + // Replace fragment + getFragmentManager() + .beginTransaction() + .replace(R.id.fragment_editor, new NoFileOpenedFragment()) + .commit(); + /* First Time we open this activity */ + if (savedInstanceState == null) { + // Open + mDrawerLayout.openDrawer(Gravity.START); + // Set the default title + getActionBar().setTitle(getString(R.string.nome_app_turbo_editor)); + } + // + receiveIntent(); + } + + /** + * {@inheritDoc} + */ + @Override + protected final void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + mDrawerToggle.syncState(); + } + + /** + * {@inheritDoc} + */ + @Override + public void onResume() { + super.onResume(); + // Register the Event Bus for events + EventBus.getDefault().register(this); + } + + /** + * {@inheritDoc} + */ + @Override + public void onPause() { + super.onPause(); + // Unregister the Event Bus + EventBus.getDefault().unregister(this); + } + + /** + * {@inheritDoc} + */ + @Override + protected void onDestroy() { + try { + closeKeyBoard(); + } catch (NullPointerException e) { + Log.e(TAG, e.getMessage(), e); + } + super.onDestroy(); + } + + /** + * {@inheritDoc} + */ + @Override + public final void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mDrawerToggle.onConfigurationChanged(newConfig); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.activity_home, menu); + return super.onCreateOptionsMenu(menu); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + /* If we clicked on the Navigation Drawer Menu item */ + if (mDrawerToggle.onOptionsItemSelected(item)) { + return true; + } else switch (item.getItemId()){ + case R.id.im_open: + startActivityForResult(new Intent(HomeActivity.this, SelectFileActivity.class) + .putExtra("path", "") + .putExtra("action", SelectFileActivity.Actions.SelectFile), + SELECT_FILE_CODE); + return true; + case R.id.im_info: + startActivity(new Intent(this, PreferenceAbout.class)); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + /** + * {@inheritDoc} + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK && requestCode == SELECT_FILE_CODE) { + String path = data.getStringExtra("path"); + if(!TextUtils.isEmpty(path)){ + EventBus.getDefault().postSticky(new NewFileOpened(path)); + } + } + } + + /** + * + * @param event + */ + public void onEvent(FileSelectedEvent event){ + // Close the drawer + mDrawerLayout.closeDrawer(Gravity.LEFT); + // Replace fragment + getFragmentManager() + .beginTransaction() + .replace(R.id.fragment_editor, EditorFragment.newInstance(event.getPath())) + .commit(); + } + + /** + * When a file is saved + * Invoked by the EditorFragment + * @param event The event called + */ + public void onEvent(FileSavedEvent event){ + try { + closeKeyBoard(); + } catch (NullPointerException e) { + Log.e(TAG, e.getMessage(), e); + } + // Get intent, action and MIME type + final Intent intent = getIntent(); + final String action = intent.getAction(); + final String type = intent.getType(); + + if (Intent.ACTION_VIEW.equals(action) + || Intent.ACTION_EDIT.equals(action) + || Intent.ACTION_PICK.equals(action) + && type != null) { + //This Activity was called by startActivityForResult + final Intent returnIntent = new Intent(); + setResult(Activity.RESULT_OK, returnIntent); + // finish the activity + finish(); + } else { + //This Activity was called by startActivity + // + mDrawerLayout.openDrawer(Gravity.LEFT); + // + getActionBar().setTitle(getString(R.string.nome_app_turbo_editor)); + // Replace fragment + getFragmentManager() + .beginTransaction() + .replace(R.id.fragment_editor, new NoFileOpenedFragment()) + .commit(); + } + } + + /** + * + */ + public void onEvent(ErrorOpeningFileEvent event){ + // + mDrawerLayout.openDrawer(Gravity.LEFT); + // + getActionBar().setTitle(getString(R.string.nome_app_turbo_editor)); + // Replace fragment + getFragmentManager() + .beginTransaction() + .replace(R.id.fragment_editor, new NoFileOpenedFragment()) + .commit(); + } + + private void closeKeyBoard() throws NullPointerException { + // Central system API to the overall input method framework (IMF) architecture + InputMethodManager inputManager = + (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + + // Base interface for a remotable object + IBinder windowToken = getCurrentFocus().getWindowToken(); + + // Hide type + int hideType = InputMethodManager.HIDE_NOT_ALWAYS; + + // Hide the KeyBoard + inputManager.hideSoftInputFromWindow(windowToken, hideType); + } + + /** + * + */ + private void checkTaskRoot(){ + } + + /** + * + */ + private void setupDrawerLayout(){ + final String defaultTitle = getString(R.string.nome_app_turbo_editor); + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + /* Action Bar */ + final ActionBar ab = getActionBar(); + ab.setDisplayHomeAsUpEnabled(true); + ab.setHomeButtonEnabled(true); + /* Navigation drawer */ + mDrawerToggle = + new ActionBarDrawerToggle( + this, + mDrawerLayout, + R.drawable.ic_drawer, + R.string.nome_app_turbo_editor, + R.string.nome_app_turbo_editor) { + + @Override + public void onDrawerClosed(View view) { + invalidateOptionsMenu(); + } + + @Override + public void onDrawerOpened(View drawerView) { + invalidateOptionsMenu(); + } + }; + /* link the mDrawerToggle to the Drawer Layout */ + mDrawerLayout.setDrawerListener(mDrawerToggle); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + final String action = intent.getAction(); + final String type = intent.getType(); + + if (Intent.ACTION_VIEW.equals(action) + || Intent.ACTION_EDIT.equals(action) + || Intent.ACTION_PICK.equals(action) + && type != null) { + // Post the NewFileOpened Event + EventBus.getDefault().postSticky(new NewFileOpened(intent.getData().getPath())); + } + } + + /** + * + */ + private void receiveIntent(){ + // Get intent, action and MIME type + final Intent intent = getIntent(); + final String action = intent.getAction(); + final String type = intent.getType(); + + if (Intent.ACTION_VIEW.equals(action) + || Intent.ACTION_EDIT.equals(action) + || Intent.ACTION_PICK.equals(action) + && type != null) { + // Post the NewFileOpened Event + EventBus.getDefault().postSticky(new NewFileOpened(intent.getData().getPath())); + } + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/LicensesActivity.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/LicensesActivity.java new file mode 100644 index 0000000..f87bb2e --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/LicensesActivity.java @@ -0,0 +1,16 @@ +package com.vmihalachi.turboeditor; + +import android.app.Activity; +import android.os.Bundle; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +public class LicensesActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_licenses); + ListView listView = (ListView) findViewById(android.R.id.list); + listView.setAdapter(adapter); + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/NavigationDrawerListFragment.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/NavigationDrawerListFragment.java new file mode 100644 index 0000000..1482333 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/NavigationDrawerListFragment.java @@ -0,0 +1,291 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor; + +import android.app.ListFragment; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.util.SparseBooleanArray; +import android.view.ActionMode; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import com.vmihalachi.turboeditor.event.FileSelectedEvent; +import com.vmihalachi.turboeditor.event.NewFileOpened; + +import org.apache.commons.io.FilenameUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import de.greenrobot.event.EventBus; + +public class NavigationDrawerListFragment extends ListFragment implements AbsListView.MultiChoiceModeListener { + + List fileNames; + ArrayAdapter arrayAdapter; + + /** + * {@inheritDoc} + */ + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + // Out custom layout + View rootView = inflater.inflate(R.layout.fragment_navigation_drawer, container, false); + return rootView; + } + + /** + * {@inheritDoc} + */ + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + getListView().setMultiChoiceModeListener(this); + } + + /** + * {@inheritDoc} + */ + @Override + public void onResume() { + super.onResume(); + // Register the Event Bus for events + EventBus.getDefault().registerSticky(this); + // + refreshList(); + } + + /** + * {@inheritDoc} + */ + @Override + public void onPause() { + super.onPause(); + // Unregister the Event Bus + EventBus.getDefault().unregister(this); + } + + /** + * {@inheritDoc} + */ + @Override + public void onListItemClick(ListView l, View v, int position, long id) { + super.onListItemClick(l, v, position, id); + // don't open the same file twice + //if(this.mCurrentCheckedPosition == position) return; + // set current checked position + //this.mCurrentCheckedPosition = position; + // Shared Preferences + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); + // File paths saved in preferences + String[] savedPaths = sharedPreferences.getString("savedPaths", "").split(","); + // Path of the file selected + String filePath = savedPaths[position]; + // Send the event that a file was selected + EventBus.getDefault().post(new FileSelectedEvent(filePath)); + } + + /** + * {@inheritDoc} + */ + @Override + public void onItemCheckedStateChanged(ActionMode actionMode, int position, long l, boolean isChecked) { + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { + MenuInflater inflater = actionMode.getMenuInflater(); + inflater.inflate(R.menu.action_mode_navigation_drawer, menu); + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { + return false; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { + switch (menuItem.getItemId()) { + case R.id.im_remove: + // Shared Preferences + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); + // File paths saved in preferences + String[] savedPaths = sharedPreferences.getString("savedPaths", "").split(","); + // + SparseBooleanArray checkedItems = getListView().getCheckedItemPositions(); + // + if (checkedItems != null) { + for (int i=0; i(savedPaths.length); + // + StringBuilder sb = new StringBuilder(); + // for cycle to convert paths to names + for(String path : savedPaths){ + + if(!path.isEmpty()){ + File file = new File(path); + if(file.exists()){ + fileNames.add(FilenameUtils.getName(path)); + sb.append(path).append(","); + } + } + } + // save list without empty or non existed files + sharedPreferences.edit().putString("savedPaths", sb.toString()).commit(); + // Adapter + arrayAdapter = new ArrayAdapter(getActivity(), R.layout.item_drawer_list, fileNames); + // Set adapter + setListAdapter(arrayAdapter); + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/NoFileOpenedFragment.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/NoFileOpenedFragment.java new file mode 100644 index 0000000..5de1102 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/NoFileOpenedFragment.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor; + +import android.app.Fragment; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * Created by Vlad on 9/23/13. + */ +public class NoFileOpenedFragment extends Fragment { + + /** + * {@inheritDoc} + */ + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + // Out custom layout + View rootView = inflater.inflate(R.layout.fragment_no_file_open, container, false); + return rootView; + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/PreferenceAbout.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/PreferenceAbout.java new file mode 100644 index 0000000..f3b9389 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/PreferenceAbout.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor; + +import android.app.Fragment; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceActivity; + +public class PreferenceAbout extends PreferenceActivity { + @Override + public void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.about); + setupClickablePreferences(); + } + + public void setupClickablePreferences() { + final Preference email = findPreference("aboutactivity_authoremail"), + changelog = findPreference("aboutactivity_changelog"), + open_source_licenses = findPreference("aboutactivity_open_source_licenses"), + market = findPreference("aboutactivity_authormarket"); + if (email != null) { + email.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(final Preference preference) { + Intent i = new Intent(Intent.ACTION_SEND); + i.setType("message/rfc822"); + i.putExtra(Intent.EXTRA_EMAIL, new String[]{"app.feedback.mail@gmail.com"}); + i.putExtra(Intent.EXTRA_SUBJECT, getApplicationName(getBaseContext()) + " " + getCurrentVersion(getBaseContext())); + i.putExtra(Intent.EXTRA_TEXT, ""); + try { + startActivity(Intent.createChooser(i, getString(R.string.aboutactivity_authoremail_summary))); + } catch (android.content.ActivityNotFoundException ex) { + } + return false; + } + }); + } + if (changelog != null) { + changelog.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(final Preference preference) { + openDialogFragment(new DialogStandardFragment()); + return false; + } + }); + } + if (open_source_licenses != null) { + open_source_licenses.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(final Preference preference) { + startActivity(new Intent(PreferenceAbout.this, LicensesActivity.class)); + return false; + } + }); + } + if (market != null) { + market.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(final Preference preference) { + try { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pub:Vlad+Mihalachi")) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + } catch (Exception e) { + } + return false; + } + }); + } + } + + private void openDialogFragment(DialogStandardFragment dialogStandardFragment) { + if (dialogStandardFragment != null) { + FragmentManager fm = getFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + Fragment prev = fm.findFragmentByTag("changelogdemo_dialog"); + if (prev != null) { + ft.remove(prev); + } + ft.addToBackStack(null); + + dialogStandardFragment.show(ft, "changelogdemo_dialog"); + } + } + + public static String getApplicationName(final Context context) { + final ApplicationInfo applicationInfo = context.getApplicationInfo(); + return context.getString(applicationInfo.labelRes); + } + + public static String getCurrentVersion(final Context context) { + try { + final PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), + 0); + return packageInfo.versionName; + } catch (PackageManager.NameNotFoundException e) { + return ""; + } + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/SelectFileActivity.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/SelectFileActivity.java new file mode 100644 index 0000000..94473f1 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/SelectFileActivity.java @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor; + +import android.app.Activity; +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Environment; +import android.text.TextUtils; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.TextView; + +import com.vmihalachi.turboeditor.adapter.AdapterDetailedList; +import com.vmihalachi.turboeditor.util.AlphanumComparator; + +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.AbstractMap; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedList; + +/** + * Created by Vlad on 9/24/13. + */ +public class SelectFileActivity extends Activity implements AdapterView.OnItemClickListener { + private String currentFolder; + private ListView listView; + private boolean wantAFile, wantAFolder; + + // The android SD card root path + public static final String SD_CARD_ROOT = + Environment.getExternalStorageDirectory() + .getAbsolutePath(); + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_select_file); + final Actions action = (Actions) getIntent().getExtras().getSerializable("action"); + wantAFile = action == Actions.SelectFile; + wantAFolder = action == Actions.SelectFolder; + + this.listView = (ListView) findViewById(android.R.id.list); + this.listView.setOnItemClickListener(this); + + String path = getIntent().getExtras().getString("path"); + if (TextUtils.isEmpty(path)) { + new UpdateList().execute(SD_CARD_ROOT); + } else { + new UpdateList().execute(path); + } + } + + void returnData(String path) { + final Intent returnIntent = new Intent(); + returnIntent.putExtra("path", path); + setResult(RESULT_OK, returnIntent); + // finish the activity + finish(); + } + + @Override + public void onItemClick(AdapterView parent, + View view, int position, long id) { + final String name = ((TextView) view.findViewById(android.R.id.title)).getText().toString(); + if (name.equals("..")) { + vaiIndietro(); + return; + } else if (name.equals(getString(R.string.home))) { + new UpdateList().execute(SD_CARD_ROOT); + return; + } + + final File selectedFile = new File(currentFolder, name); + + if (selectedFile.isFile() && wantAFile) { + returnData(selectedFile.getAbsolutePath()); + } else if (selectedFile.isDirectory()) { + new UpdateList().execute(selectedFile.getAbsolutePath()); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.activity_select_file, menu); + menu.findItem(R.id.im_button).setTitle(getString(wantAFolder ? R.string.seleziona + : android.R.string.cancel)); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int i = item.getItemId(); + if (i == R.id.im_button) { + if (wantAFolder) { + returnData(currentFolder); + } else if (wantAFile) { + returnData(""); + } + } + return super.onOptionsItemSelected(item); + } + + void vaiIndietro() { + if (currentFolder.equals("/")) { + new UpdateList().execute(SD_CARD_ROOT); + } else { + File tempFile = new File(currentFolder); + if (tempFile.isFile()) { + tempFile = tempFile.getParentFile() + .getParentFile(); + } else { + tempFile = tempFile.getParentFile(); + } + new UpdateList().execute(tempFile.getAbsolutePath()); + } + } + + private class UpdateList extends + AsyncTask> { + + @Override + protected LinkedList doInBackground(final String... params) { + try { + + final String path = params[0]; + if (TextUtils.isEmpty(path)) { + return null; + } + + File tempFile = new File(path); + if (tempFile.isFile()) { + tempFile = tempFile.getParentFile(); + } + + final File[] files = tempFile.listFiles(); + Arrays.sort(files, + getFileNameComparator()); + + final LinkedList fileDetails = new LinkedList(); + final LinkedList + folderDetails = new LinkedList(); + final AbstractMap tempList = new HashMap(); + currentFolder = tempFile.getAbsolutePath(); + + if (files != null) { + for (final File f : files) { + if (f.isHidden()) { + continue; + } else if (f.isDirectory() + && f.canRead()) { + folderDetails.add(new AdapterDetailedList.FileDetail(f.getName(), + getString(R.string.folder), + "")); + } else if (f.isFile()) { + final long fileSize = f.length(); + SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy hh:mm a"); + String date = format.format(f.lastModified()); + fileDetails.add(new AdapterDetailedList.FileDetail(f.getName(), + FileUtils.byteCountToDisplaySize(fileSize), date)); + } + tempList.put(f.getName(), f); + } + } + + folderDetails.addAll(fileDetails); + return folderDetails; + } catch (Exception e) { + return null; + } + } + + @Override + protected void onPostExecute(final LinkedList names) { + boolean isRoot = currentFolder.equals("/"); + if (names != null) { + listView.setAdapter(new AdapterDetailedList(getBaseContext(), names, isRoot)); + } + super.onPostExecute(names); + } + + public final Comparator getFileNameComparator() { + return new AlphanumComparator() { + @Override + public String getTheString(Object obj) { + return ((File) obj).getName() + .toLowerCase(); + } + }; + } + } + + public enum Actions { + SelectFile, SelectFolder + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/adapter/AdapterDetailedList.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/adapter/AdapterDetailedList.java new file mode 100644 index 0000000..aa944e2 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/adapter/AdapterDetailedList.java @@ -0,0 +1,260 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.adapter; + +import android.content.Context; +import android.graphics.Typeface; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.vmihalachi.turboeditor.R; +import com.vmihalachi.turboeditor.helper.FileHelper; +import com.vmihalachi.turboeditor.util.MimeTypes; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Set; + +public class AdapterDetailedList extends + ArrayAdapter { + + // Layout Inflater + final LayoutInflater inflater; + + // The Context to get drawables from resources + private final Context context; + + // The list of names + final LinkedList fileDetails; + + // Change HashMap to SparseBooleanArray + private HashMap mSelection = + new HashMap(); + + private final int default_text_color; + private final int highlight_text_color; + + public static class ViewHolder { + + // Text view with the name of the file + public TextView label; + + // Text view with the name of the file + public TextView sizeLabel; + + public TextView dateLabel; + + // The icon of the file + public ImageView icon; + } + + public AdapterDetailedList(final Context context, + final LinkedList fileDetails, + final boolean isRoot) { + // super + super(context, + R.layout.item_file_list, + fileDetails); + this.context = context; + this.fileDetails = fileDetails; + // Cache the LayoutInflate to avoid asking for a new one each time. + this.inflater = LayoutInflater.from(context); + this.default_text_color = context.getResources().getColor(android.R.color.primary_text_dark); + this.highlight_text_color = context.getResources().getColor(android.R.color.holo_blue_dark); + if (!isRoot) { + this.fileDetails.addFirst(new FileDetail("..", + context.getString(R.string.folder), "")); + } else { + this.fileDetails.addFirst(new FileDetail(context.getString(R.string.home), + context.getString(R.string.folder), + "")); + } + } + + @Override + public View getView(final int position, + View convertView, final ViewGroup parent) { + if (convertView == null) { + convertView = this.inflater + .inflate(R.layout.item_file_list, + null); + final ViewHolder hold = new ViewHolder(); + hold.label = (TextView) convertView.findViewById(android.R.id.title); + hold.sizeLabel = (TextView) convertView.findViewById(android.R.id.text1); + hold.dateLabel = (TextView) convertView.findViewById(android.R.id.text2); + hold.icon = (ImageView) convertView.findViewById(android.R.id.icon); + convertView.setTag(hold); + final FileDetail fileDetail = fileDetails.get(position); + final String fileName = fileDetail.getName(); + setIcon(hold, fileDetail); + hold.label + .setText(fileName); + hold.sizeLabel + .setText(fileDetail.getSize()); + hold.dateLabel + .setText(fileDetail.getDateModified()); + if (isPositionChecked(fileName)) { + hold.label + .setTextColor(this.highlight_text_color); + hold.label + .setTypeface(null, Typeface.ITALIC); + } else { + hold.label + .setTextColor(this.default_text_color); + hold.label + .setTypeface(null, Typeface.NORMAL); + } + } else { + final ViewHolder hold = ((ViewHolder) convertView.getTag()); + final FileDetail fileDetail = fileDetails.get(position); + final String fileName = fileDetail.getName(); + setIcon(hold, fileDetail); + hold.label + .setText(fileName); + hold.sizeLabel + .setText(fileDetail.getSize()); + hold.dateLabel + .setText(fileDetail.getDateModified()); + if (isPositionChecked(fileName)) { + hold.label + .setTextColor(this.highlight_text_color); + hold.label + .setTypeface(null, Typeface.ITALIC); + } else { + hold.label + .setTextColor(this.default_text_color); + hold.label + .setTypeface(null, Typeface.NORMAL); + } + } + return convertView; + } + + private void setIcon(final ViewHolder viewHolder, + final FileDetail fileDetail) { + final String fileName = fileDetail.getName(); + final String ext = FileHelper.getExtension(fileName); + if (fileDetail.isFolder()) { + viewHolder.icon + .setImageResource(R.color.file_folder); + } else if (Arrays.asList(MimeTypes.MIME_HTML) + .contains(ext) || ext.endsWith("html")) { + viewHolder.icon + .setImageResource(R.color.file_html); + } else if (Arrays.asList(MimeTypes.MIME_CODE) + .contains(ext) + || fileName.endsWith("css") + || fileName.endsWith("js")) { + viewHolder.icon + .setImageResource(R.color.file_code); + } else if (Arrays.asList(MimeTypes.MIME_ARCHIVE).contains(ext)) { + viewHolder.icon + .setImageResource(R.color.file_archive); + } else if (Arrays.asList(MimeTypes.MIME_MUSIC) + .contains(ext)) { + viewHolder.icon + .setImageResource(R.color.file_media_music); + } else if (Arrays.asList(MimeTypes.MIME_PICTURE).contains(ext)) { + viewHolder.icon + .setImageResource(R.color.file_media_picture); + } else if (Arrays.asList(MimeTypes.MIME_VIDEO) + .contains(ext)) { + viewHolder.icon + .setImageResource(R.color.file_media_video); + } else { + viewHolder.icon + .setImageResource(R.color.file_text); + } + } + + public void checkPosition(final String name) { + if (isPositionChecked(name)) { + removeSelection(name); + } else { + setNewSelection(name, true); + } + } + + void setNewSelection(final String name, + final boolean value) { + this.mSelection.put(name, value); + notifyDataSetChanged(); + } + + boolean isPositionChecked(final String name) { + final Boolean result = this.mSelection.get(name); + return (result == null) ? false : result; + } + + public Set getCurrentCheckedPosition() { + return this.mSelection.keySet(); + } + + private void removeSelection(final String name) { + this.mSelection.remove(name); + notifyDataSetChanged(); + } + + public void clearSelection() { + this.mSelection = new HashMap(); + notifyDataSetChanged(); + } + + public static class FileDetail { + private String name; + private String size; + private String dateModified; + private boolean isFolder; + + public FileDetail(String name, String size, + String dateModified) { + this.name = name; + this.size = size; + this.dateModified = dateModified; + if (TextUtils.isEmpty(dateModified)) { + isFolder = true; + } else { + isFolder = false; + } + } + + public String getDateModified() { + return dateModified; + } + + public String getSize() { + return size; + } + + public String getName() { + return name; + } + + public boolean isFolder() { + return isFolder; + } + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/CloseDrawerEvent.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/CloseDrawerEvent.java new file mode 100644 index 0000000..ed4846b --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/CloseDrawerEvent.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.event; + +public class CloseDrawerEvent { +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/ErrorOpeningFileEvent.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/ErrorOpeningFileEvent.java new file mode 100644 index 0000000..44929a4 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/ErrorOpeningFileEvent.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.event; + +public class ErrorOpeningFileEvent { +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/FileSavedEvent.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/FileSavedEvent.java new file mode 100644 index 0000000..3d94b7b --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/FileSavedEvent.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.event; + +public class FileSavedEvent { + private String filePath; + + public FileSavedEvent(String filePath) { + this.filePath = filePath; + } + + public String getFilePath() { + return filePath; + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/FileSelectedEvent.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/FileSelectedEvent.java new file mode 100644 index 0000000..8035062 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/FileSelectedEvent.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.event; + +public class FileSelectedEvent { + + private String path; + + public FileSelectedEvent(String path){ + this.path = path; + } + + public String getPath() { + return path; + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/NewFileOpened.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/NewFileOpened.java new file mode 100644 index 0000000..1377608 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/NewFileOpened.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.event; + +public class NewFileOpened { + private String filePath; + + public NewFileOpened(String filePath) { + this.filePath = filePath; + } + + public String getFilePath() { + return filePath; + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/OpenDrawerEvent.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/OpenDrawerEvent.java new file mode 100644 index 0000000..d2a7a17 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/event/OpenDrawerEvent.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.event; + +public class OpenDrawerEvent { +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/FileHelper.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/FileHelper.java new file mode 100644 index 0000000..78c24b9 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/FileHelper.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.helper; + +import java.io.File; + +public class FileHelper { + /** + * Get the extension of a file + * @param f the file + * @return the extension of a file + */ + public static String getExtension(File f) { + return getExtension(f.getAbsolutePath()); + } + + /** + * Get the extension from a file path + * @param path the path + * @return the extension from a file path + */ + public static String getExtension(String path) { + String ext = null; + String s = path; + int i = s.lastIndexOf('.'); + + if (i > 0 && i < s.length() - 1) { + ext = s.substring(i+1).toLowerCase(); + } + return ext; + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/PixelDipConverter.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/PixelDipConverter.java new file mode 100644 index 0000000..aa0b8fe --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/PixelDipConverter.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.helper; + +import android.content.Context; +import android.content.res.Resources; +import android.util.DisplayMetrics; + +public final class PixelDipConverter { + + private PixelDipConverter() { + } + + /** + * This method convets dp unit to equivalent device specific value in pixels. + * + * @param dp A value in dp(Device independent pixels) unit. Which we need to convert into pixels + * @param context Context to get resources and device specific display metrics + * @return A float value to represent Pixels equivalent to dp according to device + */ + public static float convertDpToPixel(final float dp, final Context context) { + final Resources resources = context.getResources(); + final DisplayMetrics metrics = resources.getDisplayMetrics(); + final float px = dp * metrics.densityDpi / 160f; + return px; + } + + /** + * This method converts device specific pixels to device independent pixels. + * + * @param px A value in px (pixels) unit. Which we need to convert into db + * @param context Context to get resources and device specific display metrics + * @return A float value to represent db equivalent to px value + */ + public static float convertPixelsToDp(final float px, final Context context) { + final Resources resources = context.getResources(); + final DisplayMetrics metrics = resources.getDisplayMetrics(); + final float dp = px / (metrics.densityDpi / 160f); + return dp; + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/PreferenceHelper.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/PreferenceHelper.java new file mode 100644 index 0000000..cc60f19 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/PreferenceHelper.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.helper; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +public final class PreferenceHelper { + + private PreferenceHelper() { + } + + /** + * Getter Methods + */ + public static SharedPreferences getPrefs(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context); + } + + public static SharedPreferences.Editor getEditor(Context context) { + return getPrefs(context).edit(); + } + + public static boolean getWrapText(Context context) { + return getPrefs(context).getBoolean("editor_wrap_text", true); + } + + public static boolean getSyntaxHiglight(Context context) { + return getPrefs(context).getBoolean("editor_syntax_highlight", true); + } + + public static String getEncoding(Context context) { + return getPrefs(context).getString("editor_encoding", "UTF-8"); + } + /** + * Setter Methods + */ + + public static void setWrapText(Context context, boolean value) { + getEditor(context).putBoolean("editor_wrap_text", value).commit(); + } + + public static void setSyntaxHiglight(Context context, boolean value) { + getEditor(context).putBoolean("editor_syntax_highlight", value).commit(); + } + + public static void setEncoding(Context context, String value) { + getEditor(context).putString("editor_encoding", value).commit(); + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/StringHelper.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/StringHelper.java new file mode 100644 index 0000000..a9e387f --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/helper/StringHelper.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.helper; + +public final class StringHelper { + + private StringHelper() { + } + + public static String join(final String... strings) { + final StringBuffer buffer = new StringBuffer(); + for (String string : strings) { + if (!string.endsWith("/")) { + string += "/"; + } + buffer.append(string); + } + String result = buffer.toString(); + if (result.endsWith("/")) { + result = result.substring(0, result.length() - 1); + } + return result; + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/AlphanumComparator.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/AlphanumComparator.java new file mode 100644 index 0000000..57aa46b --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/AlphanumComparator.java @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.util;/* + * The Alphanum Algorithm is an improved sorting algorithm for strings + * containing numbers. Instead of sorting numbers in ASCII order like + * a standard sort, this algorithm sorts numbers in numeric order. + * + * The Alphanum Algorithm is discussed at http://www.DaveKoelle.com + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +import java.util.Comparator; + +/** + * This is an updated version with enhancements made by Daniel Migowski, Andre Bogus, and David + * Koelle + *

+ * To convert to use Templates (Java 1.5+): - Change "implements Comparator" to "implements + * Comparator" - Change "compare(Object o1, Object o2)" to "compare(String s1, String s2)" - + * Remove the type checking and casting in compare(). + *

+ * To use this class: Use the static "sort" method from the java.util.Collections class: + * Collections.sort(your list, new AlphanumComparator()); + */ +public class AlphanumComparator implements Comparator { + private final boolean isDigit(char ch) { + return ch >= 48 && ch <= 57; + } + + /** + * Length of string is passed in for improved efficiency (only need to calculate it once) * + */ + private final String getChunk(String s, int slength, int marker) { + StringBuilder chunk = new StringBuilder(); + char c = s.charAt(marker); + chunk.append(c); + marker++; + if (isDigit(c)) { + while (marker < slength) { + c = s.charAt(marker); + if (!isDigit(c)) { + break; + } + chunk.append(c); + marker++; + } + } else { + while (marker < slength) { + c = s.charAt(marker); + if (isDigit(c)) { + break; + } + chunk.append(c); + marker++; + } + } + return chunk.toString(); + } + + public String getTheString(Object obj) { + return (String) obj; + } + + public int compare(Object o1, Object o2) { + String s1 = getTheString(o1); + String s2 = getTheString(o2); + + int thisMarker = 0; + int thatMarker = 0; + int s1Length = s1.length(); + int s2Length = s2.length(); + + while (thisMarker < s1Length && thatMarker < s2Length) { + String thisChunk = getChunk(s1, s1Length, thisMarker); + thisMarker += thisChunk.length(); + + String thatChunk = getChunk(s2, s2Length, thatMarker); + thatMarker += thatChunk.length(); + + // If both chunks contain numeric characters, sort them numerically + int result = 0; + if (isDigit(thisChunk.charAt(0)) && isDigit(thatChunk.charAt(0))) { + // Simple chunk comparison by length. + int thisChunkLength = thisChunk.length(); + result = thisChunkLength - thatChunk.length(); + // If equal, the first different number counts + if (result == 0) { + for (int i = 0; i < thisChunkLength; i++) { + result = thisChunk.charAt(i) - thatChunk.charAt(i); + if (result != 0) { + return result; + } + } + } + } else { + result = thisChunk.compareTo(thatChunk); + } + + if (result != 0) { + return result; + } + } + + return s1Length - s2Length; + } +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/MimeTypes.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/MimeTypes.java new file mode 100644 index 0000000..434fbfb --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/MimeTypes.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.util; + +public class MimeTypes { + public static final String[] MIME_TEXT = { + "ajx", + "am", + "asa", + "asc", + "asp", + "aspx", + "awk", + "bat", + "c", + "cdf", + "cf", + "cfg", + "cfm", + "cgi", + "cnf", + "conf", + "cpp", + "css", + "csv", + "ctl", + "dat", + "dhtml", + "diz", + "file", + "forward", + "grp", + "h", + "hpp", + "hqx", + "hta", + "htaccess", + "htc", + "htm", + "html", + "htpasswd", + "htt", + "htx", + "in", + "inc", + "info", + "ini", + "ink", + "java", + "js", + "jsp", + "key", + "log", + "logfile", + "m3u", + "m4", + "m4a", + "mak", + "map", + "model", + "msg", + "nfo", + "nsi", + "info", + "old", + "pas", + "patch", + "perl", + "php", + "php2", + "php3", + "php4", + "php5", + "php6", + "phtml", + "pix", + "pl", + "pm", + "po", + "pwd", + "py", + "qmail", + "rb", + "rbl", + "rbw", + "readme", + "reg", + "rss", + "rtf", + "ruby", + "session", + "setup", + "sh", + "shtm", + "shtml", + "sql", + "ssh", + "stm", + "style", + "svg", + "tcl", + "text", + "threads", + "tmpl", + "tpl", + "txt", + "ubb", + "vbs", + "xhtml", + "xml", + "xrc", + "xsl"}; + public static final String[] MIME_CODE = + {"xml", "php", "asp", "json", "wiki"}; + public static final String[] MIME_HTML = + {"htm"}; + public static final String[] MIME_PICTURE = { + "png", "jpeg", "jpg", "ico", "gif", "bmp", + "tiff" + }; + public static final String[] MIME_MUSIC = + {"mp3", "avi", "flac", "mpga"}; + public static final String[] MIME_VIDEO = + {"mp4", "mkv", "wmw"}; + public static final String[] MIME_ARCHIVE = { + "zip", "tar", "gz", "bz2", "rar", "7z" + }; + public static String[] USER_MIME_TEXT; +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/Patterns.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/Patterns.java new file mode 100644 index 0000000..ab85741 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/util/Patterns.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.util; + +import java.util.regex.Pattern; + +public class Patterns { + public static final int COLOR_NUMBER = 0xffff6600; + public static final int COLOR_KEYWORD = 0xff2f6f9f; + public static final int COLOR_ATTR = 0xff4f9fcf; + public static final int COLOR_ATTR_VALUE = 0xffd44950; + public static final int COLOR_STRING = 0xffd44950; + public static final int COLOR_COMMENT = 0xff999999; + + // Strings + public static final Pattern GENERAL_STRINGS = Pattern.compile("\"(.*?)\"|'(.*?)'"); + + public static final Pattern HTML_OPEN_TAGS = Pattern.compile( + "<([A-Za-z][A-Za-z0-9]*)\\b[^>]*>"); + public static final Pattern HTML_CLOSE_TAGS = Pattern.compile( + "]*>"); + public static final Pattern HTML_ATTRS = Pattern.compile( + "(\\S+)=[\"']?((?:.(?![\"']?\\s+(?:\\S+)=|[>\"']))+.)[\"']?"); + + //static final Pattern CSS_STYLE_NAME= Pattern.compile( + // "[ \\t\\n\\r\\f](.+?)\\{([^\\)]+)\\}"); + public static final Pattern CSS_ATTRS = Pattern.compile( + "(.+?):(.+?);"); + public static final Pattern CSS_ATTR_VALUE = Pattern.compile( + ":[ \t](.+?);"); + + public static final Pattern NUMBERS = Pattern.compile( + "\\b(\\d*[.]?\\d+)\\b"); + public static final Pattern CSS_NUMBERS = Pattern.compile( + "/^auto$|^[+-]?[0-9]+\\.?([0-9]+)?(px|em|ex|%|in|cm|mm|pt|pc)?$/ig"); + public static final Pattern GENERAL_KEYWORDS = Pattern.compile( + "\\b(alignas|alignof|and|and_eq|asm|auto|bitand|bitorbool|break|case|catch|char|" + + "char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype" + + "|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|" + + "false|float|for|friend|function|goto|if|inline|int|mutable|namespace|new|noexcept|" + + "not|not_eq|nullptr|operator|or|or_eq|private|protected|public|register|" + + "reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast" + + "|struct|switch|template|this|thread_local|throw|true|try|typedef|typeid|typename" + + "|union|unsigned|using|var|virtual|void|volatile|wchar_t|while|xor|xor_eq)\\b"); + // Comments + public static final Pattern XML_COMMENTS = Pattern.compile("(?s)"); + public static final Pattern GENERAL_COMMENTS = Pattern.compile( + "/\\*(?:.|[\\n\\r])*?\\*/|//.*"); +} diff --git a/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/view/CapitalizedTextView.java b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/view/CapitalizedTextView.java new file mode 100644 index 0000000..0102a88 --- /dev/null +++ b/Turbo Editor/src/main/java/com/vmihalachi/turboeditor/view/CapitalizedTextView.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2013 Vlad Mihalachi + * + * This file is part of Turbo Editor. + * + * Turbo Editor 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. + * + * Turbo Editor 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 Turbo Editor. If not, see . + */ + +package com.vmihalachi.turboeditor.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.TextView; + +public class CapitalizedTextView extends TextView { + + public CapitalizedTextView(final Context context) { + super(context); + } + + public CapitalizedTextView(final Context context, final AttributeSet attrs) { + super(context, attrs); + } + + public CapitalizedTextView(final Context context, final AttributeSet attrs, final int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public void setText(final CharSequence text, final BufferType type) { + super.setText(text.toString().toUpperCase(), type); + } +} diff --git a/Turbo Editor/src/main/res/drawable-hdpi/ic_action_redo.png b/Turbo Editor/src/main/res/drawable-hdpi/ic_action_redo.png new file mode 100644 index 0000000000000000000000000000000000000000..f52a806766476400d6acc186ba72a8fe8fbaa095 GIT binary patch literal 729 zcmV;~0w(>5P)xK~!jg?btnN6hRoq@n52`vJi`WX|PB{45(mdWo0LpHYye> zL{Mx@rC5j-VrQcUL$I*16l=l8GC_r)XbKA(5lNx(BbZps9@${-c4se_IpzMa+`P-a z?>^7$&Fsu}EiW(om+4L|pjkQwQqwVznvQ|gq&6^wDeSCTAf~z=E!2*S+Oze z+tc;S4D|s4IIYNti2=%e-a_E5yyp|u2JjxLh+QFMz`TgE`DVF#2>?WF8+>7cv-eU z83SjqJ!^lk`t{!oM{pHgSzHr86H}y&fdjerZTyP4K?6SHXV(59h@XxvQe>bk zDmQ4rj39bmMe!65;$bWE{d?=z`!%M8aj;OeK+zKz&9!H%-lTxa;%T47TxE(3Rz z?o|mXGB9UlX)uBKz=Z00000 LNkvXXu0mjf(pE)) literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-hdpi/ic_action_tick.png b/Turbo Editor/src/main/res/drawable-hdpi/ic_action_tick.png new file mode 100644 index 0000000000000000000000000000000000000000..3511bc6ad128f4b213b56801276d686599833f06 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s%*9TgAsieWw;%dH0CG7CJR*yM z%CCbkqm#z$3ZS55iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0w10X`wF z|EUTl*o3$OO_nMN@(X5QWMdas(Xg^{$SEo=DJ?6n=$*V{_r7Dt&m?yqI|WqL?&;zf z;&J@#m4keT6hvGux{I#arWF=F=l}nUdQs9B1n#}bI+SB+p6DpBa&>pP!rzxqE#wU> z&oN(~`1ys${r@}nzdLikXt}fVPqPO%4gT>iIr`}R&eyjDGXp=^yI!mp<(e;|B`@l= zUo?H~e-Q?T_0>Gl54WCA*WDwyszTzC_eSOCu5XTd#Lhhv<|A~BW8n!4ppzIpUHx3v IIVCg!0Q?EXN&o-= literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-hdpi/ic_action_undo.png b/Turbo Editor/src/main/res/drawable-hdpi/ic_action_undo.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa7f7cff2a9b0d06a1ade494795a54fc1b303b3 GIT binary patch literal 716 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 literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-hdpi/ic_launcher.png b/Turbo Editor/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5ae957539af950b231f5255bf5f25c8975ff92 GIT binary patch literal 5581 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 X0)Gr=#}C9k00000NkvXXu0mjfF@CxO literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-mdpi/ic_action_tick.png b/Turbo Editor/src/main/res/drawable-mdpi/ic_action_tick.png new file mode 100644 index 0000000000000000000000000000000000000000..70e77032ab41f33023454f19f99c6768e7eca50c GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy%*9TgAsieWw;%dH0CG7CJR*yM z%CCbkqm#z$3ZS55iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0vc0X`wF z|0xCx)AEl4O%p2#@(X5QViQ)evi1!L3y+BEoiusP?t{lqpYcCt>jzX3<>}%WVsZNI zBu~Bu10H7Q$Wubo#Gd_+e|qTV&Zd_2!m4E{o8zPI3VbN~HtVp|2iv{f+btikci)-c z7FVdQ I&MBb@003H}O8@`> literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-mdpi/ic_action_undo.png b/Turbo Editor/src/main/res/drawable-mdpi/ic_action_undo.png new file mode 100644 index 0000000000000000000000000000000000000000..ceed2ef5852e0406410f91b45c2822feee8f0a1c GIT binary patch literal 485 zcmVm@!yIi5{)QOY_HZ)D7*oQD7=Fg z5E@iUjp!&O5)lm=ga^=}CAy=Sl}s^X#u~eXlib{5&b{A1XU=?QY7wE6(bZA)e}LZv z(1*G20O&3$zJYNJV5>@iq6+k;#Gi3irFaoQTKomexM>%_yZA&({HkhksAV`|FV->H z!hKJ;#T^cD-wMD0wlUlSKssI}Roq3c-)8|p9h*&v7cAkrglHXOn8GY-IK@gXL`3AR zdPM9+#6?6LN5tp{xml|b5eLol^Lcqimkg#Ljv`{D1&H&AIE{#*teherc*LTlnfftP z;x(k>68q@EbXGzcD}KNNcChwI061yxV_6ULny|{KOFqdb8CCc-)9@?tUi#Zk0ZcXb zyG{T!B!=`V>4UZcG_Wdh!woreq0A4-XClvvck>Pu0bG0mrqnR1x&oDq}1Frt5e bpAGN^7Ap>2%{QLE00000NkvXXu0mjfqFTj7 literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-mdpi/ic_drawer.png b/Turbo Editor/src/main/res/drawable-mdpi/ic_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..fb681ba2639897cc4646d3784b97bbe16f5d4e91 GIT binary patch literal 2837 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 literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-mdpi/ic_launcher.png b/Turbo Editor/src/main/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c4fb8fcdbeb7fc559a7b7ff1039ee7b0186078b1 GIT binary patch literal 3165 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 literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-xhdpi/ic_action_undo.png b/Turbo Editor/src/main/res/drawable-xhdpi/ic_action_undo.png new file mode 100644 index 0000000000000000000000000000000000000000..bbcbcd15f81d62f562402944bf771b188c189b55 GIT binary patch literal 926 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4_%8d>IhOP>|E9PEw zTD?^u)ydN1$% zO#ZPvD?r;bka3#yPxeD6?E3|;co~H(P_xi0sf(?BsI#bb`RDz|XB?{C)Ae)G9;O_z zOLa@F_RHwrIhbnG{m|gO$c>h*hH()S1K%9Zt?3O7l@*)GwELrS+p2vgN|%2)w&rLk zF}yjL>Fqk>Xkg)f2I-d4^oQF;Ut9mVFI>~^o*EYv!f>NIcv_c%at+&mZD9|-wnC0} zUEjazKfF49G?W=mcNfG<^iEHm^DKqO{^8}GS}FGryE-;+vOXAX(Y&T={=+#O-NE8= zTr&-3ZhSvyyZE9UHk}Rp>ee@w7ck|owy5Vqq)M~8|Ti$y|Zt{JL{bAYk zKW~rVGNa?6d2hn@hYRlT)P7)^k`}-sao)!M?ClML3PlPlPjG#($Up2TkPxv# zbc^xS?H?653Qjz7^7OWt_I%NORtaG)mA7{S6WF7^TFjX=&w_7xl8Z%l%4(-@QJwCq z8%5X6&Qsmkx#--lOs*?IB5$AaXhezWmzoE-Hr$y%OKN3};ic1(7kZ~{c;KrM!FK*q wK9kFSnYXEoRj;aQ5?)^K4KTrx3?ahhyAu}|3Rwpj0rL`rr>mdKI;Vst0Qt$2Hvj+t literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-xhdpi/ic_drawer.png b/Turbo Editor/src/main/res/drawable-xhdpi/ic_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..b9bc3d70f1d29fec2e4530e5d1809edc8e15ad35 GIT binary patch literal 1056 zcmbVLy>HV%6u%0oKud=rkbnW5+yx|J`<&Q`t(wY-lQsgURT^lJI@GnVjg{JG>??6I zp$-TJMs}p`%!m$vm_Q6HNWhFgdkGtJ{wp^s;CS4?Jv|~pY7%o}Gu+V}T4Zw+(*J#qF zbyIVQ&)caDpZFm|128?4gtpVh6t3cRFVMN~yDvHDxjMHbTcQ<~aLb$PMtHGXYdGDu zqq^M8bvT`9jKIg#hKaus#9E?rJzkB;saoJ*&xE#ht{+s>T7V@IVJP$2j3Xih6@^DR zSy9k6D2YfCMD{8fl+$EIlk#xzaLileu4#3%GVsNAI@h8!)C8f^>F}K_Poi}Jsj8ZC zNK%GbWa6!W+DRser-lqBj-AL0sYe2sGTN(TljTGkrXC2cz{u9QL)^TGi#6lg%WHWNueXLCl!K`-2J4y{%G}?URu}iTxOyX?%IG|Ni z=hzAFdahPhWYd&UB`ZouDIio33t8338aX7(id>P097kc5Tt2T#qN-LD1EI21DCNpU z)l>>nF>e%+ImA|jnA(AZhkiZgcYrM%i`7aIwke4kglr5uV4+1QiCZLur9}l^v24c+ zQpMHug8KQIIP&gcw-ON__A0D-M?~=N%==jPf2t<1V1%?i{%V(@iuGVB9yUMQ9F7kT z*vv$1ICdVt{>%oeRyB=A^5xqTV+_DEZ*K2>+`fG7_s{+D?GHCbcTc|H-@OlOr+<7J z`MUh8J-U;h90BvQ$x;pMJp@l5JO^O;{&-)=znWYD7w()l&fdzcq%&JB*UV?dmF)v& C(MM7%_uv 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 Zx~gHGJ+(+X3Y@%Cm>60bwCZ^w{sU1IDIWj; literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-xxhdpi/ic_action_redo.png b/Turbo Editor/src/main/res/drawable-xxhdpi/ic_action_redo.png new file mode 100644 index 0000000000000000000000000000000000000000..2ee0a355279766fa69fbf84f92893429ec15310a GIT binary patch literal 1345 zcmah}Yc!Mz82-M`j2UC(lFQ7vtj#4WGiSys*UEL78WNJ*W~`7LOhabUWrndfm#m3| ztZPfjPPtTM15J?y>x3bNx`Dz)DELeqsTEG3&Wk2xhlR- z5f+h9AqDI!2BK(OYjbD(SMnjfK`=$>?S0F8v^!$mLGT1%v@HLu#~`!J4#k6qdFuC6 zMvK~anPG0JUg|NY$MyFWT8K#tyzo_R^7Y#!4~z`rgm>acuU08;zz!>%qBbKn`GtN+ zzyO+DyIG=C?h~AK70E^0%}}M-wJL=wkp?pohWEz*D!5%4y)|Z@IO!tNl z3U>(Ss8TD5`*T-sxbvJ2`&~h_qa>&S@`gF*kg~yo=-qtNmI&(vd$L*s7zp|2T=KDa z{Y>Oj`AcVyO|=;vDh6MJ8-vTvwvDPK9^3RmEK?PSisqx?Kpg+U24}rBMT8zV)O*VFE;{lu7x-K3V`-OpPXV-;iFfH4!XvP2)<4iRlZ#)NOG)kZZH^zu2x(ICrd899 zG8>tOC+r|vuW3mvQ)dX|%vEAZy80AUWFp->YoPMnQAg@EvgY>Ud@xU;*4_@Mm3Y?b zjr9$9RdT|Tm)bwy4`&9N2EYW-dSpvXf~Y6TR6NIBIf_1z!O=`o+uxqHIXkV@BwZp5 zSvKvor1zcKzCeF$-&PsSKBYHv8m#9GlQk{jR}e{gHWd4Sa=6476gW=2vd%Tjz%bU= z1u?wFi~u7282xciem#LhC^d!_6XP3aE0iWVmxkeyMe!JHfVe2c#gytS`nXc*;6#yUQ?H^gcodA#ZQ*q zNsm8r-27(%x2!}6rkVknpDz3D^TPli@=E)$SbbJ^KY2a(ee8_z*y_cOoMB>RwZpCb zBF4kad7|-kZnh3=(i_pL&(t-@s?zhNsEohmOsIw3J(>mL@L&$!(|jqRZd)#hHbrV* j`QxqS|24sX3qoqkb)EbOY}KDt)Ez+e@NpNo($oJ1Nb^*} literal 0 HcmV?d00001 diff --git a/Turbo Editor/src/main/res/drawable-xxhdpi/ic_action_tick.png b/Turbo Editor/src/main/res/drawable-xxhdpi/ic_action_tick.png new file mode 100644 index 0000000000000000000000000000000000000000..37f0cc30fc4778ec012df3cd7a99a81293eabd11 GIT binary patch literal 777 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 OLt8^ny;;>h?*9PLX + + + + + + + + + diff --git a/Turbo Editor/src/main/res/layout/activity_home.xml b/Turbo Editor/src/main/res/layout/activity_home.xml new file mode 100644 index 0000000..c3d605f --- /dev/null +++ b/Turbo Editor/src/main/res/layout/activity_home.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/Turbo Editor/src/main/res/layout/activity_licenses.xml b/Turbo Editor/src/main/res/layout/activity_licenses.xml new file mode 100644 index 0000000..fbc805f --- /dev/null +++ b/Turbo Editor/src/main/res/layout/activity_licenses.xml @@ -0,0 +1,30 @@ + + + + diff --git a/Turbo Editor/src/main/res/layout/activity_select_file.xml b/Turbo Editor/src/main/res/layout/activity_select_file.xml new file mode 100644 index 0000000..fbc805f --- /dev/null +++ b/Turbo Editor/src/main/res/layout/activity_select_file.xml @@ -0,0 +1,30 @@ + + + + diff --git a/Turbo Editor/src/main/res/layout/demo_changelog_fragment_dialogstandard.xml b/Turbo Editor/src/main/res/layout/demo_changelog_fragment_dialogstandard.xml new file mode 100644 index 0000000..0a9a1ba --- /dev/null +++ b/Turbo Editor/src/main/res/layout/demo_changelog_fragment_dialogstandard.xml @@ -0,0 +1,7 @@ + + diff --git a/Turbo Editor/src/main/res/layout/dialog_fragment_edittext.xml b/Turbo Editor/src/main/res/layout/dialog_fragment_edittext.xml new file mode 100644 index 0000000..6b02437 --- /dev/null +++ b/Turbo Editor/src/main/res/layout/dialog_fragment_edittext.xml @@ -0,0 +1,50 @@ + + + + + + + + + +